/* Minification failed. Returning unminified contents.
(12989,10-11): run-time error JS1010: Expected identifier: .
(12989,10-11): run-time error JS1195: Expected expression: .
(12990,10-11): run-time error JS1010: Expected identifier: .
(12990,10-11): run-time error JS1195: Expected expression: .
(12993,10-11): run-time error JS1010: Expected identifier: .
(12993,10-11): run-time error JS1195: Expected expression: .
(12996,11-12): run-time error JS1010: Expected identifier: .
(12996,11-12): run-time error JS1195: Expected expression: .
(13010,11-12): run-time error JS1010: Expected identifier: .
(13010,11-12): run-time error JS1195: Expected expression: .
(13011,4-8): run-time error JS1034: Unmatched 'else'; no 'if' defined: else
(13022,9-10): run-time error JS1010: Expected identifier: .
(13022,9-10): run-time error JS1195: Expected expression: .
 */
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
            ) {
                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");

                        setTimeout(function () {
                            nextItem.find(".itemImage .icon").get(0).setAttribute("tabindex", "0");
                            nextItem.find(".itemImage .icon").focus();
                        }, 100);

                        $(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";
        });
    }
});

$(window).load(function () {
    // Mett logo.
    $(".mett").setColor({ color: settings.colors.mettLogo });

    // RoyalSlider.
    $(".royalSlider").css("height", "auto");

    $.fn.initializeMaintenance();

    $.fn.initializeHelpdeskWidget();
});

$(window).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).scroll($.fn.initializeScrolling);

    $("body").keydown(function (e) {
        // Close shortcut menus on esc press
        if (e.keyCode == 27) {
            $("#shortcuts > li > a").removeClass("active");
            $("#shortcuts > li > .dropDown.show").removeClass("show").find("a, button").last().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").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();

    // Internal page anchors.
    $(".editorContent a.anchor-link").initializeInternalPageAnchors();

    // 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();

    // Color pickers.
    $(".colorPicker").initializeColorPickers();

    // 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").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();

    // 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().find("label").append("&nbsp;").append($(".privacyLink"));

    $("[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())
                .load(function () {
                    $("#spacerTop").height($("#top").height());
                });
        }

        $("#bottom .editorContent img").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
            .unbind("hover")
            .hover(function () {
                if (currentObject.hasClass("delayed")) {
                    clearTimeout(timeout);

                    timeout = setTimeout(function () {
                        currentObject.addClass("expanded");
                    }, 400);
                }
            })
            .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.unbind("click").click(function () {
                                            button.find("a")[0].click();

                                            return false;
                                        });
                                    } else {
                                        // Input button.
                                        dropDownLink.html(button.find("input").val());

                                        dropDownLink.unbind("click").click(function () {
                                            button.find("input").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=" + globals.url);
                }

                // 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.unbind("click").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.unbind("click").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.unbind("click").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.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.unbind("click").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) {
                                    fetchFollowersData();
                                })
                                .fail(function () {
                                    $.fn.showError(arguments + ". (500.52)", "console");
                                });

                            // Re-initialize checkbox after update.
                            followCheckbox = followButton.find("input:checkbox");
                            followCheckbox.click();

                            updateFollowButton(followButton);
                        });

                        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).hover(
                            function () {
                                voteButton.val(settings.buttons.voteText).attr("title", settings.buttons.voteText);
                                voteButton.parent().removeClass("icon-cancel").addClass("icon-thumbs-up");
                            },
                            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).hover(
                            function () {
                                voteButton.val(settings.buttons.unVoteText).attr("title", settings.buttons.unVoteText);
                                voteButton.parent().removeClass("icon-check").addClass("icon-cancel");
                            },
                            function () {
                                voteButton.val(settings.buttons.votedText).attr("title", settings.buttons.votedText);
                                voteButton.parent().removeClass("icon-cancel").addClass("icon-check");
                            }
                        );
                    };

                    // Initial state.
                    if (voteSubmitButton.hasClass("deleteVote")) voted();

                    voteButton.unbind("click").click(function () {
                        if (voteSubmitButton.hasClass("deleteVote")) voted();
                        else vote();

                        voteSubmitButton.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).hover(
                        function () {
                            signUpButton.val(settings.buttons.signUpText).attr("title", settings.buttons.signUpText);
                            signUpButton.parent().removeClass("icon-cancel").addClass("icon-user-add");
                        },
                        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).hover(
                        function () {
                            signUpButton.val(settings.buttons.signOffText).attr("title", settings.buttons.signOffText);
                            signUpButton.parent().removeClass("icon-check").addClass("icon-cancel");
                        },
                        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.unbind("click").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.unbind("click").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.unbind("click").click(function () {
                            // Re-initialize checkbox after update.
                            favoriteCheckbox = favoriteButton.parent().find("input:checkbox");
                            favoriteCheckbox.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.unbind("click").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);
        });

        // 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");

                // 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;
                                }

                                // 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)
                    .unbind("click")
                    .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").focus();
                        } else sendAttendStatus();

                        $("#btnAttendAllRecurringEvents")
                            .unbind("click")
                            .on("click", function () {
                                eventAttendAll = true;

                                $(".overlayAttendAllOrSingle").addClass("hide");
                                sendAttendStatus();
                            });

                        $("#btnAttendOnlyThisEvent")
                            .unbind("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.unbind("click").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").each(function () {
        var button = $(this);

        button.parent(".button").removeClass("hide");
        button.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.unbind("click").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.unbind("click").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"))
                .unbind("click")
                .click(function () {
                    button.click();

                    return false;
                });

            // Add link to drop down.
            button.parent().append(link.removeClass("hide"));
        });

        // Settings link in drop down menu.
        dropDownMenu
            .find(".settings")
            .unbind("click")
            .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.unbind("click").click(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 &&
                        dropDownMenu.parent().parent().hasClass("active")
                    )
                        theThis.click();
                });

                $("body").keydown(function (e) {
                    if (e.keyCode == 27 && dropDownMenu.parent().parent().hasClass("active")) theThis.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.unbind("click").click(function () {
            history.back();

            return false;
        });
    });

    // Accept conditions button.
    container
        .find(".acceptConditions input:submit")
        .unbind("click")
        .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).hover(
            function () {
                followButtonInput.val(settings.buttons.followText).attr("title", settings.buttons.followText);
                followButton.removeClass("icon-cancel").addClass("icon-check");
            },
            function () {
                followButtonInput.val(settings.buttons.followText).attr("title", settings.buttons.followText);
                followButton.removeClass("icon-cancel").addClass("icon-check");
            }
        );
    };

    // Following.
    var following = function () {
        followButton.removeClass("follow icon-bell").addClass("following icon-check");
        followButtonInput.val(settings.buttons.followingText).attr("title", settings.buttons.followingText);

        $(followButton).hover(
            function () {
                followButtonInput.val(settings.buttons.unFollowText).attr("title", settings.buttons.unFollowText);
                followButton.removeClass("icon-check").addClass("icon-cancel");
            },
            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.unbind("click").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);

                    output.append(userCheckbox).append(userLabel.prepend(userAvatar));

                    output.append('<div class="clear" />');

                    $("#followersOverlay .overlayItemContent .usersList").append(output);
                });

                // User checkboxes.
                $(".userCheckbox")
                    .change(function () {
                        var cb = $(this),
                            cbStatus = $(this)[0].checked;

                        $.ajax({
                            url: "/api/notification/SetNotification",
                            data: {
                                sectionID: settings.section.ID,
                                contentPageID: settings.section.itemID,
                                userKey: $(this).data("id"),
                                status: cbStatus,
                                token: $("input[name='__RequestVerificationToken']").val(),
                            },
                        }).done(function (data) {
                            var followButton;

                            if (cbStatus == false) {
                                cb.parent().find("label").addClass("disabledUser");
                                followButton = $(".button.following");
                            } else {
                                cb.parent().find("label").removeClass("disabledUser");
                                followButton = $(".button.follow");
                            }

                            var followCheckbox = followButton.find("input:checkbox");
                            followCheckbox.click();

                            updateFollowButton(followButton);
                        });
                    })
                    .initializeSwitchery();

                $("#followersOverlay").showFollowersOverlay({ showOverlay: true });
                $("#followersOverlay").initializeFollowersOverlay();
            });
        });
    } 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).hover(
                function () {
                    followButtonInput.val(settings.buttons.followText).attr("title", settings.buttons.followText);
                    followButton.removeClass("icon-cancel").addClass("icon-check");
                },
                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).hover(
                function () {
                    followButtonInput.val(settings.buttons.unFollowText).attr("title", settings.buttons.unFollowText);
                    followButton.removeClass("icon-check").addClass("icon-cancel");
                },
                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.unbind("click").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(),
                },
            })
                .success(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.unbind("click").click(function () {
            // Re-initialize checkbox after update.
            followCheckbox = followButton.find("input:checkbox");
            followCheckbox.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")
                    .unbind("click")
                    .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.
                        //tabContent.find(':focusable').eq(0).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")
                    .unbind("click")
                    .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")
                    .unbind("click")
                    .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")
                .unbind("click")
                .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");

                        allDescenants.unbind("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.unbind("blur").blur(function () {
                            setTimeout(function () {
                                if (
                                    !$.contains(shortcut.parent()[0], $(":focus")[0]) &&
                                    dropDownMenu.hasClass("show")
                                ) {
                                    shortcut.click();
                                }
                            }, 40);
                        });
                    }

                    return false;
                });

            // Favorites.
            if (container.find(".favorites").length > 0) {
                container
                    .find(".favorites")
                    .unbind("click")
                    .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.unbind("blur").blur(function () {
                                setTimeout(function () {
                                    if (!$.contains(shortcut.parent()[0], $(":focus")[0])) {
                                        shortcut.click();
                                    }
                                }, 40);
                            });
                        } else {
                            // Hide.
                            shortcut.removeClass("active").attr("aria-expanded", "false");
                            dropDownContent.removeClass("show").addClass("hide");

                            // Reset.
                            allDescenants.unbind("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.unbind("click").click(function () {
                        if (settings.user.ID != -1) {
                            var flagLinkSpan = flagLink.find("span");

                            flagLink.addClass("loader");
                            flagLinkSpan.text(flagLinkSpan.text() + " " + settings.various.loadingText);
                            flagLink.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")
                    .unbind("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")
            .unbind("click")
            .click(function () {
                $("#cookieSettingsOverlay").initializeCookieSettingsOverlay({ showOverlay: true });
            });
    }
};

// Initialize search.
$.fn.initializeSearch = function () {
    var container = $(this);

    if (container.find("input:text").length > 0) {
        // Skip link.
        $("#skipLinkSearchField").click(function () {
            container.find("input:text:last").focus();

            return false;
        });

        container.find("input:text").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 (container.selector == "#top .search") {
                submitButton.unbind("click").click(function () {
                    searchField.showSearchAnim();

                    createSearchInfoContainer();

                    var searchInfoContainer = $("#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 {
                        var encodedInput = encodeURIComponent(searchField.val());
                        document.location.href = "/shortcuts/search_search.aspx?search=" + encodedInput;

                        removeSearchInfoContainer();
                    }
                });
            } else if (container.selector == ".sectionOptions .search") {
                var clearBtn = container.find(".clear-search-button");

                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");
                });

                clearBtn.on("click", function (e) {
                    e.preventDefault();

                    searchField.val("");
                    searchField.focus();
                    submitButton.parent().addClass("hide");
                    searchField.showSearchAnim();

                    location.href = location.href;
                });
            }

            searchField.prop("placeholder", settings.fields.searchFieldText);

            // Enter action.
            searchField.submitOnEnter();
        });
    } else $("#skipLinkSearchField").remove();
};

function createSearchInfoContainer() {
    var searchInfoContainer = $("<div />"),
        closeButton = $("<span />");

    searchInfoContainer.attr({
        id: "searchInfoContainer",
        role: "alert",
    });

    closeButton.addClass("icon-cancel before closeButton");
    closeButton.attr({
        role: "button",
        "aria-label": settings.liveSearch.hideMessage,
        tabindex: -1,
    });

    closeButton.click(function () {
        searchInfoContainer.animate({ opacity: 0 }, 200, function () {
            searchInfoContainer.remove();
        });

        return false;
    });

    searchInfoContainer.append(closeButton);

    $("#top .field.search > input").attr("aria-describedby", "searchInfoContainer");

    searchInfoContainer.insertAfter($("#top .field.search > input"));
}

function removeSearchInfoContainer() {
    $("#searchInfoContainer").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").focus();
            } else {
                container.find(".email input:text").focus();
            }
        }, 500);

        container.find(".email input:text").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").keydown(function () {
                    inputsToDescribe.removeAttr("aria-describedby");
                    errorField.removeClass("danger");
                    errorField.find("input:text, input:password, textarea").removeAttr("aria-invalid");
                });

                errorField.find("select").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")
                    .unbind("click")
                    .on("click", function () {
                        for (instance in CKEDITOR.instances) {
                            var editor = CKEDITOR.instances[instance];
                            if (editor) editor.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",
                    });
                }, 150);

                // 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")
                    .unbind("click")
                    .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);

                        setTimeout(function () {
                            container.find("#saveComment input:submit").click();
                        }, 200);
                    });

                // Show split fields.
                $(".commentsSplitView").removeClass("hide");
            }

            // Save comment (without files).
            container
                .find(".button.saveWithoutHandler input:submit")
                .unbind("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;
                        }
                    }
                });

            // 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")
                .unbind("change")
                .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").change();
                });

            // Alternative name.
            container
                .find(".commentAuthor input:text")
                .unbind("blur")
                .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").unbind("click");

        // Save button.
        var saveInput = button.find("input:first, a:first");

        saveInput.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,
        minimumStrength = 4,
        maximumStrength = 5;

    $(this).each(function () {
        var passwordField = $(this),
            passwordInput = passwordField.find("input"),
            passwordToggle = passwordField.find(".passwordToggle");

        if (passwordInput.parent().hasClass("passwordRequirements")) {
            var characterCountRequirement = $(".characterRule"),
                capitalCountRequirement = $(".capitalRule"),
                numberCountRequirement = $(".numberRule"),
                specialCharacterRequirement = $(".specialCharacterRule");

            passwordInput.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");
                    capitalCountRequirement.removeClass("danger success");
                    numberCountRequirement.removeClass("danger success");
                    specialCharacterRequirement.removeClass("danger success");
                    passwordField.removeClass("danger success");
                    passwordInput.removeAttr("aria-invalid");
                }

                // Requirements feedback.
                if (password.length > 0) {
                    // Minimum length.
                    if (strength.hasMinimumLength) characterCountRequirement.addClass("success");

                    // Contains capital.
                    if (strength.hasCapital) capitalCountRequirement.addClass("success");

                    // Contains number.
                    if (strength.hasNumber) numberCountRequirement.addClass("success");

                    // Contains special caracter.
                    if (strength.hasSpecialCharacter) specialCharacterRequirement.addClass("success");
                }

                // Length feedback.
                passwordField.find(".passwordCharacters").html(charactersLeft);
                passwordField.find(".charactersLeft").removeClass("hide");
            });

            passwordInput.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");
                        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.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.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();
            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 color pickers.
$.fn.initializeColorPickers = function () {
    var colorPickers = $(this);

    colorPickers.each(function () {
        var colorPicker = $(this),
            colorInput = $(this).find("input:text"),
            color = $(this).find(".color"),
            previewSelector = colorPicker.data("colorpicker-preview-selector"),
            defaultColor = colorInput.data("colorpicker-default-color");

        if (colorInput.val() != "#FFFFFF") {
            // Set preview color.
            color.css("background", colorInput.val());
        }

        // Restore default color if field is empty.
        colorInput.blur(function () {
            if (($(this).val() == "" || $(this).val() == "Transparent") && defaultColor != undefined) {
                // Set default color.
                colorInput.val(defaultColor);
                color.css("background", defaultColor);

                // Reset live preview.
                if (previewSelector != undefined) {
                    // Live preview.
                    if (/ a|h1|h2|legend/g.test(previewSelector)) $(previewSelector).css("color", defaultColor);
                    else $(previewSelector).css("background", defaultColor);
                }
            }
        });

        // Change color picker value when a valid hex value is typed or pasted.
        colorInput.keyup(function () {
            if ($.fn.isHex(colorInput.val())) colorPicker.colpickSetColor(colorInput.val());
        });

        // Initialize color picker.
        colorPicker.colpick({
            layout: "hex",
            submit: 0,
            color: colorInput.val(),
            onChange: function (hsb, hex, rgb, el) {
                if (previewSelector != undefined) {
                    // Live preview.
                    if (/ a|h1|h2|legend/g.test(previewSelector)) $(previewSelector).css("color", "#" + hex);
                    else $(previewSelector).css("background", "#" + hex);
                }

                // Set color.
                colorInput.val("#" + hex).change();
                color.css("background", "#" + hex);
            },
        });
    });
};

// Initialize portalSelector.
$.fn.initializePortalSelector = function () {
    var portalSelector = $(this);

    portalSelector.unbind("change").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)) {
        // 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;

    // Don't enable Switchery in the Threedotfive theme.
    if ($("html").hasClass("threedotfive")) {
        $(this).attr("role", "switch");
        $(this).parents(".field").addClass("switch");

        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.keydown(function (aEvent) {
            if (aEvent.keyCode == 13 || aEvent.keyCode == 32) {
                theObject.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,
                                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;
                                }
                            }

                            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").unbind("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")
                                    .unbind("click")
                                    .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")
                    .unbind("click")
                    .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").focus().select();
                } else {
                    overlay.find(".overlayItemTitle").attr("tabindex", "-1").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.unbind("click").click(function () {
                // Re-enable scrolling.
                $("body").removeClass("overlayOpen");

                // Hide overlay.
                overlay.addClass("hide");

                $.fn.restoreLastFocus();

                if (closeButton.is("A")) {
                    return false;
                }
            });

            overlay.find(".overlayItemContent").scroll(function () {
                if ($(".overlayItemContent").scrollTop() > 0) overlay.find("h1, .toolbarBottom").addClass("scrollable");
                else overlay.find("h1, .toolbarBottom").removeClass("scrollable");
            });

            // Close overlay.
            overlay.unbind("click").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.click();
                    }
                }
            });
        });
    });
};

// 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.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().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)
        .unbind("click")
        .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;
        });
};

$.fn.initializeInternalPageAnchors = function () {
    $(".section").addClass("anchor-links");
    $(".anchor-link").parent().css({ position: "relative", "z-index": "0" });
};

// 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).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");

        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.unbind("click").click(function () {
                checked = likeButton.data("checked") ? false : true;

                updateStatus(likeButton, checked);

                $.ajax({
                    url: "/api/notification/SetLike",
                    data: {
                        sectionID: settings.section.ID,
                        contentPageID: itemID,
                        status: checked,
                        token: $("input[name='__RequestVerificationToken']").val(),
                    },
                })
                    .done(function (aData) {
                        updateData(aData);
                    })
                    .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");
            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"
            )
                .unbind("click")
                .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" && $.trim(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);
            }
        });
    });
};

$.fn.initializeFollowersOverlay = function () {
    var followersOverlay = $(this);

    if (followersOverlay.data("initialized")) return;

    followersOverlay.find(".button.close").click(function () {
        fetchFollowersData();
    });

    followersOverlay.data("initialized", true);
};

$.fn.showFollowersOverlay = function (options) {
    var followersOverlay = $(this);

    if (options.showOverlay) {
        $.fn.saveLastFocus();

        $("body").addClass("overlayOpen");
        followersOverlay.removeClass("hide");

        followersOverlay.tabGuard();

        followersOverlay
            .find("[tabindex]:not([tabindex=-1]):visible, button:visible, input:visible, a:visible")
            .first()
            .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.unbind("click").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")
            .unbind("click")
            .click(function () {
                $("#footer .cookiePolicy a")[0].click();

                return false;
            });
    }

    // Cancel button in overlay.
    cookieSettingsOverlay
        .find(".toolbarBottom .close input:button")
        .unbind("click")
        .click(function () {
            // Re-enable scrolling.
            $("body").removeClass("overlayOpen");

            // Hide overlay.
            cookieSettingsOverlay.addClass("hide");

            $.fn.restoreLastFocus();
        });

    // Save button in overlay.
    cookieSettingsOverlay
        .find(".toolbarBottom .saveCookieSettings input:button")
        .unbind("click")
        .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");

        cookieSettingsOverlay.tabGuard();

        cookieSettingsOverlay
            .find("[tabindex]:not([tabindex=-1]):visible, button:visible, input:visible, a:visible")
            .first()
            .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']";

    // 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")
            .unbind("click")
            .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"><span class="nav-label">' +
                            settings.section.previousItem +
                            '</span><br><span class="title">' +
                            data[i][2] +
                            "</span></a>"
                    );
                else if (data[i][4] == "next")
                    itemButton = $(
                        '<a href="' +
                            data[i][3] +
                            '" class="item-nav next"><span class="nav-label">' +
                            settings.section.nextItem +
                            '</span><br><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.mett4.nl/widget.umd.js";
        document.body.appendChild(helpdeskScript);
        helpdeskScript.onload = function () {
            var widget = document.createElement("chat-widget");
            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://www.toegankelijkheidscertificaat.nl/mett/audit/" 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.unbind("mousedown").mousedown(function () {
        // Cancel blur event.
        passwordInput.addClass("cancelBlur");

        if (passwordToggle.hasClass("icon-awesome-eye")) {
            // Show password.
            passwordToggle.removeClass("icon-awesome-eye").addClass("icon-awesome-eye-off");
            passwordInput.attr("type", "text");
        } else {
            // Hide password.
            passwordToggle.removeClass("icon-awesome-eye-off").addClass("icon-awesome-eye");
            passwordInput.attr("type", "password");
        }

        setTimeout(function () {
            passwordInput.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");
        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");
        }
    }
};
;
// Add splice functionality to String.
String.prototype.splice = function (idx, rem, s) {
    return this.slice(0, idx) + s + this.slice(idx + Math.abs(rem));
};

// Get querystring value.
$.fn.getQueryString = function (value) {
    return decodeURI(
        window.location.search.replace(
            new RegExp("^(?:.*[&\\?]" + encodeURI(value).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"),
            "$1"
        )
    );
};

// Get anchor value.
$.fn.getAnchor = function (value) {
    return decodeURI(
        window.location.href.replace(
            new RegExp("^(?:.*[&#]" + encodeURI(value).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"),
            "$1"
        )
    );
};

// Get generated unique ID.
$.fn.getUniqueID = function () {
    var date = new Date();
    var uniqueID = date.getFullYear() + date.getMonth() + date.getDate() + date.getTime();

    // Return unique ID.
    return uniqueID.toString();
};

// Get file types.
$.fn.getFileType = function (value) {
    value = value.replace(".", "");
    var fileType = "";

    // Check extension.
    switch (value) {
        case "pdf":
            fileType = "pdf";
            break;

        case "doc":
        case "docx":
            fileType = "word";
            break;

        case "xls":
        case "xlsx":
            fileType = "excel";
            break;

        case "ppt":
        case "pptx":
            fileType = "powerpoint";
            break;

        case "jpg":
        case "jpeg":
        case "png":
        case "gif":
        case "bmp":
            fileType = "image";
            break;

        case "zip":
        case "rar":
            fileType = "archive";
            break;

        case "mp3":
        case "wav":
        case "flac":
        case "ogg":
            fileType = "audio";
            break;

        case "avi":
        case "mkv":
        case "mov":
        case "mpeg":
        case "mp4":
            fileType = "video";
            break;
    }

    return fileType;
};

// Remove HTML.
$.fn.removeHTML = function (value) {
    if (typeof value != "undefined" && value != null && value != "") {
        return value.replace(/<(?:.|\n)*?>/gm, "");
    }
};

// Remove special characters.
$.fn.removeSpecialCharacters = function (value, type) {
    if (value != "") {
        if (type == "email") {
            return value.replace(/[^a-zA-Z0-9-_@.&+]/g, "");
        } else {
            return value.replace(/[^a-zA-Z0-9-_ ]/g, "");
        }
    }
};

$.fn.replaceSpecialCharacters = function (value) {
    var non_asciis = {
        a: "[àáâãäå]",
        ae: "æ",
        c: "ç",
        e: "[èéêë]",
        i: "[ìíîï]",
        n: "ñ",
        o: "[òóôõö]",
        oe: "œ",
        u: "[ùúûűü]",
        y: "[ýÿ]",
    };

    for (i in non_asciis) {
        value = value.replace(new RegExp(non_asciis[i], "g"), i);
    }

    return value;
};

// Actions before saving.
$.fn.save = function (options) {
    var defaults = {
        loader: true,
        afterHandler: false,
        afterUpload: false,
        pluploadRequired: false,
        handler: "",
        validationGroup: "",
    };

    var options = $.extend(defaults, options);

    var button = $(this);
    var container = $(this).parent();
    var toolbar = container.parents(".toolbar");
    var valid = true;

    if (!options.afterHandler && !options.afterUpload) {
        // Validate page.
        if (typeof Page_ClientValidate == "function" && !Page_ClientValidate(options.validationGroup)) {
            valid = false;
        }
    }

    if (valid) {
        // Remove save warning.
        window.onbeforeunload = null;
        $(window).data("beforeunload", window.onbeforeunload);

        // 1. Prepare for save, use handler if needed.
        if (!options.afterHandler && !options.afterUpload) {
            // Set data from multi selects.
            $.fn.setMultiSelectsData();

            // Show loader.
            if (options.loader && toolbar.find(".loader").length > 0) {
                if (toolbar.attr("id") == "toolbarBottom") toolbar.css("min-height", "75px");

                toolbar.find(".button").hide();
                toolbar.find(".loader").show();
            }

            // Errors.
            $.fn.initializeErrors();

            // Check if the use of a handler is needed.
            if (options.handler.length > 0) {
                // Use handler and come back to this function when done.
                container.find(".submitButton").saveWithHandler({ handler: options.handler });

                return;
            }
        }

        // 2. Upload files.
        if (
            $(".uploader").length > 0 &&
            !options.afterUpload &&
            button.parent(".button").data("save-plupload-submit")
        ) {
            var upload = false;

            // Show warning when user tries to close or refresh the window.
            window.onbeforeunload = function () {
                return settings.warnings.cancelUploadText;
            };

            $(window).data("beforeunload", window.onbeforeunload);

            // Uploaders.
            $(".uploader").each(function () {
                var uploader = $(this).pluploadQueue();

                if (uploader.total.uploaded == 0 && uploader.files.length > 0) {
                    // Upload files.
                    uploader.start();
                    upload = true;
                } else {
                    // Nothing to upload.
                    $(this).addClass("done");
                }
            });

            if (upload) {
                // Upload in progress, come back to this function when done.
                return;
            } else {
                // No files to upload.
                if (options.pluploadRequired) {
                    // Show error.
                    $.fn.showError(settings.errors.noFileErrorText + " (500.40)");

                    toolbar.find(".loader").hide();
                    toolbar.find(".button").show();

                    return false;
                } else {
                    // Continue saving.
                    button = toolbar.find(".submitButton");
                    options.afterUpload = true;
                }
            }
        }

        // 3. Default save after handler or upload.
        if (options.afterHandler || options.afterUpload) {
            // Remove upload warning.
            window.onbeforeunload = null;
            $(window).data("beforeunload", window.onbeforeunload);

            // Upload status.
            $(".uploadStatus").val(200);

            // Click default save button.
            button[0].click();
        }
    } else {
        // Show errors.
        $(".error").initializeErrors();
    }
};

// Save with handler.
$.fn.saveWithHandler = function (options) {
    var button = $(this);

    if ($(".itemID").length > 0 && $(".itemID:last").val().length == 0) {
        switch (options.handler) {
            // Comment.
            case "commentWithFile":
                if (
                    $("#addComment .commentFieldEditor .editor iframe").contents().find("body").text() != "" &&
                    $.fn.mettHCaptchaIsValid()
                ) {
                    $.ajax({
                        type: "POST",
                        url: "/HandlerCommentsAddItem.ashx?",
                        data: {
                            pid: $("#addComment .currentItemID").val(),
                            nameUser: $("#addComment .commentAuthor input:text").val(),
                            namePage: $("#addComment .commentFieldEditor .editor iframe")
                                .contents()
                                .find("body")
                                .html(),
                            token: $("input[name='__RequestVerificationToken']").val(),
                        },
                    })
                        .done(function (data) {
                            if (
                                typeof data.contentPageID !== "undefined" &&
                                data.contentPageID != null &&
                                data.contentPageID !== "" &&
                                data.contentPageID != "error"
                            ) {
                                // Set values.
                                $("#addComment .upload .itemID").val(data.contentPageID);
                                $("#addComment .itemAdded input:checkbox").prop("checked", true);

                                // Continue with default save action.
                                button.save({ afterHandler: true });
                            } else {
                                // Error.
                                $.fn.showError(settings.errors.generalErrorText + " (500.3)");
                            }
                        })
                        .fail(function () {
                            $.fn.showError(settings.errors.generalErrorText + " (500.4)");
                        });
                } else {
                    var errors = [];

                    if ($("#addComment .commentFieldEditor .editor iframe").contents().find("body").text() == "")
                        errors.push(settings.errors.noCommentText + " (500.24)");

                    if (!$.fn.mettHCaptchaIsValid()) errors.push(settings.errors.invalidHCaptchaText + " (500.106)");

                    $.fn.showError(errors.join("<br />"));

                    // Hide loader & show buttons.
                    button.parents(".toolbar").find(".loader").hide();
                    button.parents(".toolbar").find(".button").show();
                }

                break;

            // Forum topic.
            case "forum":
                if ($("#forum .field.topic input:text").val().length > 0) {
                    $.ajax({
                        type: "GET",
                        url: "/HandlerDiscussionAddItem.ashx?",
                        data: {
                            namePage: $("#forum .field.topic input:text").val(),
                            token: $("input[name='__RequestVerificationToken']").val(),
                        },
                    })
                        .done(function (data) {
                            if (
                                typeof data.contentPageID !== "undefined" &&
                                data.contentPageID != null &&
                                data.contentPageID !== "" &&
                                data.contentPageID != "error"
                            ) {
                                // Set values.
                                $("#forum .itemID").val(data.contentPageID);
                                $("#forum .itemAdded input:checkbox").prop("checked", true);

                                // Continue with default save action.
                                button.save({ afterHandler: true });
                            } else {
                                // Error.
                                $.fn.showError(settings.errors.generalErrorText + " (500.1)");
                            }
                        })
                        .fail(function () {
                            $.fn.showError(settings.errors.generalErrorText + " (500.2)");
                        });
                }

                break;

            // Map marker.
            case "marker":
                var titleText = "";

                if ($("#marker .field.markerTitle input:text, #marker .field.projectTitle input:text").length > 0)
                    titleText = $(
                        "#marker .field.markerTitle input:text, #marker .field.projectTitle input:text"
                    ).val();

                if (titleText.length > 0) {
                    $.ajax({
                        type: "POST",
                        url: "/api/ContentPages",
                        data: {
                            action: "add",
                            pageType: "mapMarker",
                            sectionID: $("#marker .sectionIDs").val(),
                            titleText: titleText,
                            token: $("input[name='__RequestVerificationToken']").val(),
                        },
                    })
                        .done(function (data) {
                            data = JSON.parse(data);

                            if (
                                typeof data.contentPageID !== "undefined" &&
                                data.contentPageID != null &&
                                data.contentPageID !== "" &&
                                data.contentPageID != "error"
                            ) {
                                // Set values.
                                $("#marker .itemID").val(data.contentPageID);

                                // Continue with default save action.
                                button.save({ afterHandler: true });
                            } else {
                                // Error.
                                $.fn.showError(settings.errors.generalErrorText + " (500.5)");
                            }
                        })
                        .fail(function () {
                            $.fn.showError(settings.errors.generalErrorText + " (500.6)");
                        });
                }

                break;

            // Notifications.
            case "notifications":
                if (typeof changedNotifications != "undefined") {
                    // Save changed notifications in hidden field.
                    $(".changedCheckboxes").val(JSON.stringify(changedNotifications));

                    // Continue with default save action.
                    button.save({ afterHandler: true });
                } else {
                    // Error.
                    $.fn.showError(settings.errors.generalErrorText + " (500.28)");
                }

                break;

            // eParticipation item.
            case "eParticipation":
                if (
                    $("#eParticipation .field.projectTitle input:text").val().length > 0 &&
                    $("#eParticipation .field.projectDescription textarea").val().length > 0
                ) {
                    $.ajax({
                        type: "POST",
                        url: "/api/ContentPages",
                        data: {
                            action: "add",
                            pageType: "eParticipatie",
                            sectionID: settings.section.ID,
                            titleText: $("#eParticipation .field.projectTitle input:text").val(),
                            briefDescription: $("#eParticipation .field.projectDescription textarea").val(),
                            token: $("input[name='__RequestVerificationToken']").val(),
                        },
                    })
                        .done(function (data) {
                            data = JSON.parse(data);

                            if (
                                typeof data.contentPageID !== "undefined" &&
                                data.contentPageID != null &&
                                data.contentPageID !== "" &&
                                data.contentPageID != "error"
                            ) {
                                // Set values.
                                $("#eParticipation .itemID").val(data.contentPageID);

                                // Continue with default save action.
                                button.save({ afterHandler: true });
                            } else {
                                // Error.
                                $.fn.showError(settings.errors.generalErrorText + " (500.32)");
                            }
                        })
                        .fail(function () {
                            $.fn.showError(settings.errors.generalErrorText + " (500.33)");
                        });
                }

                break;

            // Documents.
            case "documents":
                if ($("#documents .field.folderName input:text").val().length > 0) {
                    $.ajax({
                        type: "GET",
                        url: "/handlerdownloadadditem.ashx?",
                        data: {
                            pid: $("#documents .multiSelectDestinationIDs").val(),
                            name: $("#documents .field.folderName input:text").val(),
                            token: $("input[name='__RequestVerificationToken']").val(),
                        },
                    })
                        .done(function (data) {
                            if (
                                typeof data.contentPageID !== "undefined" &&
                                data.contentPageID != null &&
                                data.contentPageID !== "" &&
                                data.contentPageID != "error"
                            ) {
                                // Set values.
                                $("#documents .itemID").val(data.contentPageID);
                                $("#documents .itemAdded input:checkbox").prop("checked", true);

                                // Continue with default save action.
                                button.save({ afterHandler: true });
                            } else {
                                // Error.
                                $.fn.showError(settings.errors.generalErrorText + " (500.36)");
                            }
                        })
                        .fail(function () {
                            $.fn.showError(settings.errors.generalErrorText + " (500.37)");
                        });
                }

                break;
        }
    } else {
        // Continue with default save action.
        button.save({ afterHandler: true });
    }
};

// Place data from multi selects in hidden fields.
$.fn.setMultiSelectsData = function () {
    $(".multiSelect").each(function (i) {
        var hiddenField = $(
            "#" + $(this).find(".destination").attr("id").replace("listPickerDestination", "listPickerSelectedItems")
        ).val("");

        // Add selected items to hidden field.
        $(this)
            .find(".combinedSelect option:selected")
            .each(function () {
                hiddenField.val(hiddenField.val() + ";" + $(this).val());
            });

        if ($(this).hasClass("rightsSelect")) {
            var adminRoleID = $(this)
                .find(".combinedSelect option:contains('" + settings.roles.administrators + "')")
                .val();
            var moderatorRoleID = $(this)
                .find(".combinedSelect option:contains('" + settings.roles.moderators + "')")
                .val();

            if (adminRoleID != undefined && moderatorRoleID != undefined) {
                var selectedRoles = hiddenField.val().split(";");
                var adminHasRights = false;
                var moderatorHasRights = false;

                $.each(selectedRoles, function (j) {
                    if (selectedRoles[j] == adminRoleID) {
                        adminHasRights = true;
                    }

                    if (selectedRoles[j] == moderatorRoleID) {
                        moderatorHasRights = true;
                    }
                });

                if (!adminHasRights) {
                    // Administrators always have read, add, edit, delete, comment, vote & rate rights.
                    hiddenField.val(hiddenField.val() + ";" + adminRoleID);
                }

                if (!moderatorHasRights) {
                    // Moderators also always have read, add, edit, delete, comment, vote & rate rights.
                    hiddenField.val(hiddenField.val() + ";" + moderatorRoleID);
                }
            }
        }
    });
};

// Update progress bar.
$.fn.updateProgressBar = function (options) {
    // Default values.
    var defaults = {
        progress: 0,
        showPercentage: true,
    };

    var options = $.extend(defaults, options);
    var progressContainer = $(this);
    var progressBar = $(this).find(".progressBar");

    // Update progress bar.
    progressBar.stop().animate({ left: (options.progress / 100) * progressContainer.width() }, 1000);

    if (options.showPercentage) {
        // Show percentage.
        progressBar.html('<span class="progressPercentage">' + options.progress + "%</span>");
    }

    if (options.progress >= 100) {
        // Show ready message.
        $(".allDone").removeClass("hide");
    }
};

// Submit form when <enter> is pressed.
$.fn.submitOnEnter = function (options) {
    var input = $(this),
        container = input.parent();

    // If it's a mention textarea, use parent as container.
    if (container.is(".mtaContainer")) container = container.parent();

    input.focus(function () {
        // Clear input value if the value is default.
        if (
            input.parents(".search").length > 0 &&
            (input.val() == settings.fields.searchFieldText || input.val() == input.attr("data-search-default"))
        )
            input.val("");
    });

    input.blur(function () {
        if (input.val() == "" && input.parents(".search").length > 0) {
            // Restore original input value.
            if (input.attr("data-search-default") != undefined) input.val(input.attr("data-search-default"));
        }
    });

    input.keypress(function (e) {
        var keyCode;

        if (window.event) keyCode = window.event.keyCode;
        else if (e) keyCode = e.which;

        // Enter.
        if (keyCode == 13) {
            if ($("#searchInfoContainer").length == 0) createSearchInfoContainer();

            var searchInfoContainer = $("#searchInfoContainer"),
                searchInfoContainerText =
                    '<span class="searchInfoText">' +
                    settings.liveSearch.minimumSearchLengthText.replace(
                        "{0}",
                        settings.liveSearch.minimumSearchLength
                    ) +
                    "</span>";

            if (input.val() != "" && input.val().length > 2) {
                var submitButton;
                var searchPage;

                $(this).showSearchAnim();

                searchInfoContainer.stop().css({ opacity: 0, left: "100vw" });
                searchInfoContainer.find(".closeButton").attr("tabindex", -1);
                searchInfoContainer.find(".searchInfoText").remove();

                if (input.parents("#top, #searchContainer").length > 0) {
                    // Global search.
                    searchPage = "/shortcuts/search_search.aspx?search=" + encodeURIComponent(input.val());

                    if (container.find("input:button").length > 0) submitButton = container.find("input:button:first");
                    else submitButton = container.find("a:first");
                } else {
                    // Module search.
                    if (container.find("a").length > 0) submitButton = container.find("a:first");
                    else if (container.find("input:submit").length > 0)
                        submitButton = container.find("input:submit:first");
                    else {
                        // Failover.
                        submitButton = $(
                            ".button.save:last a, .button.save:last input:submit, .button.login:last input:submit"
                        );
                    }
                }

                if (searchPage) window.location = searchPage;
                else {
                    // Submit.
                    e.preventDefault();
                    submitButton[0].click();
                }
            } else {
                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;
        }
    });
};

$.fn.showSearchAnim = function () {
    // Replace search icon with animation
    var theThis = $(this),
        loadingAnim = $("<span />");

    loadingAnim.addClass("searchLoader");

    if ($(this).attr("id") == "shortcutSearch") {
        var searchField = $("#shortcutSearch").parent();
        searchField.append(loadingAnim);

        searchButton = searchField.find(".button").addClass("hide");
    } else {
        var searchField = $("[id$=_txtSearch]").parent();
        searchField.prepend(loadingAnim);
    }

    document.body.style.cursor = "wait";

    // Replace back on ESC
    $(document).on("keyup", function (event) {
        if (event.keyCode == 27) {
            $(".searchLoader").remove();

            theThis.parent().find(".button").removeClass("hide");

            document.body.style.cursor = "default";

            return false;
        }
    });
};

// Set the color of an image or other element.
$.fn.setColor = function (options) {
    // Default values.
    var defaults = {
        color: "#ffffff",
        opacity: 1,
    };

    var options = $.extend(defaults, options);

    if ($(this).length > 0) {
        if ($(this).is("img")) {
            var image = $(this);

            // Draw canvas.
            var canvas = document.createElement("canvas");
            canvas.width = image.width();
            canvas.height = image.height();

            // Draw new image.
            if (canvas.getContext && image.width() != 0 && image.height() != 0) {
                var canvasContext = canvas.getContext("2d");
                canvasContext.drawImage(image[0], 0, 0, image.width(), image.height());

                var currentImage = canvasContext.getImageData(0, 0, image.width(), image.height());
                var newImage = canvasContext.getImageData(0, 0, image.width(), image.height());
                var newColor = $.fn.hexToRGB(options.color);

                // Replace current color with new color.
                for (var i = 0, j = newImage.data.length; i < j; i += 4) {
                    if (newImage.data[i + 3] > 0) {
                        newImage.data[i] = (currentImage.data[i] / 255) * newColor.R;
                        newImage.data[i + 1] = (currentImage.data[i + 1] / 255) * newColor.G;
                        newImage.data[i + 2] = (currentImage.data[i + 2] / 255) * newColor.B;
                    }
                }

                // Save new image.
                canvasContext.putImageData(newImage, 0, 0);

                image.attr("src", canvas.toDataURL("image/png"));

                // Show image.
                image.show();
            }
        } else {
            var newColor = $.fn.hexToRGB(options.color);

            // Set element background.
            $(this).css(
                "background",
                "rgba(" + newColor.R + ", " + newColor.G + ", " + newColor.B + ", " + options.opacity + ")"
            );
        }
    }
};

// Return RGB color from HEX input.
$.fn.hexToRGB = function (hex) {
    var rgb = parseInt(hex.replace(/^#/, ""), 16);

    return {
        R: (rgb >>> 16) & 0xff,
        G: (rgb >>> 8) & 0xff,
        B: rgb & 0xff,
    };
};

// Check if value is a HEX color.
$.fn.isHex = function (value) {
    var isHex = /^#[0-9A-F]{6}$/i.test(value);

    return isHex;
};

// Fixed path when scrolling.
$.fn.fixedPath = function () {
    if (!$("html").hasClass("desktop") || !$("html").hasClass("threedotfive")) return;

    if ($(window).width() < 1000) return;

    if ($(document).scrollTop() > $("#royalSlider").outerHeight())
        $("#pathOptions")
            .css({ top: $("#top").outerHeight() })
            .addClass("scrolling");
    else $("#pathOptions").removeClass("scrolling");
};

// Remember focussed ID, so we can set the focus after an AJAX postback (Web guidelines).
$.fn.rememberFocus = function () {
    if (
        typeof document.activeElement != null &&
        document.activeElement != null &&
        document.activeElement.id != "" &&
        typeof document.activeElement.attributes["data-ignore-ajax-focus"] == "undefined"
    )
        settings.focussedObjectID = document.activeElement.id;
    else settings.focussedObjectID = null;
};

// Restore focus on element after AJAX postback (Web guidelines).
$.fn.restoreFocus = function () {
    if (
        typeof settings.focussedObjectID != "undefined" &&
        settings.focussedObjectID != null &&
        $.trim(settings.focussedObjectID) != "" &&
        settings.focussedObjectID.indexOf("$") == -1
    ) {
        setTimeout(function () {
            $("#" + settings.focussedObjectID).focus();
        }, 200);
    }
};

// Create and show loader.
$.fn.showLoader = function (arguments) {
    if (typeof arguments._updatePanelsToUpdate != "undefined" && arguments._updatePanelsToUpdate != null) {
        var updatePanel = $("#" + arguments._updatePanelsToUpdate[0].split("$").join("_"));

        if (updatePanel.hasClass("updatePanel")) {
            if (updatePanel.css("position") == "static") {
                updatePanel.css({ position: "relative" });
            }

            // Create loader.
            var loader = $("<div />");
            loader.addClass("loader update");
            loader.attr("role", "status");

            var screenReaderContent = $("<span>");
            screenReaderContent.addClass("screenReaderContent");
            screenReaderContent.text(settings.buttons.savingText);

            loader.append(screenReaderContent);

            // Create scroll.
            var loaderScroll = function () {
                var offsetTop = $(document).scrollTop() + $(window).height() / 2 - loader.offset().top;

                // Always keep default margin of 20 pixels.
                if (offsetTop > loader.height() - 30) {
                    offsetTop = loader.height() - 30;
                }

                if (offsetTop < 20) {
                    offsetTop = 20;
                }

                loader.css({
                    backgroundPosition: "center " + offsetTop + "px",
                });
            };

            // Show loader.
            updatePanel.append(loader.show());

            // Append scroll function.
            $(document).scroll(loaderScroll);
            loaderScroll();
        }
    }
};

// Create & show message.
$.fn.showMessage = function (options) {
    // Default values.
    var defaults = {
        content: "",
        className: "alert warning",
        showCloseButton: false,
        showHideButton: false,
        showActionButton: false,
        hideButtonText: settings.buttons.hideMessageText,
        actionButtonText: settings.buttons.actionButtonText,
        actionButtonLink: "",
        autoHideAfter: 5000,
        cookieID: -1,
    };

    var options = $.extend(defaults, options);
    var container = $(this);
    var message = $(
        '<div class="message ' +
            options.className +
            '"><div class="messageContent">' +
            options.content +
            '</div><div class="messageButtons"></div></div>'
    );

    if ($.cookie("mettSystemMessage") == options.cookieID) {
        // Don't show if there's a cookie for this specific message.
        return;
    }

    // Close button.
    if (options.showCloseButton) {
        var closeButton = $("<div />");
        var closeButtonInput = $("<input />");

        closeButton.attr("class", "button cancel ghost icon-cancel-circled before");
        closeButtonInput.attr("type", "button");
        closeButtonInput.val(settings.buttons.closeMessageText);

        closeButtonInput.unbind("click").click(function () {
            $(".message").remove();
        });

        message.find(".messageButtons").append(closeButton.append(closeButtonInput));
    }

    // Hide button.
    if (options.showHideButton) {
        var hideButton = $("<div />");
        var hideButtonInput = $("<input />");
        var hideButtonText = options.hideButtonText;

        hideButton.attr("class", "button hideButton ghost icon-cancel-circled before");
        hideButtonInput.attr("type", "button");
        hideButtonInput.val(hideButtonText);

        hideButtonInput.unbind("click").click(function () {
            if (options.cookieID != -1) {
                // Remove previous system message cookies.
                $.removeCookie("mettSystemMessage", { path: "/" });

                // Expire 1 month from now.
                var expiryDate = new Date();
                expiryDate.setTime(expiryDate.getTime() + 3600 * 1000 * 24 * 30);

                // Set new system message cookie.
                $.cookie("mettSystemMessage", options.cookieID, { expires: expiryDate, path: "/" });
            }

            $(".message").remove();
        });

        message.find(".messageButtons").append(hideButton.append(hideButtonInput));
    }

    // Action button.
    if (options.showActionButton) {
        var actionButton = $("<div />");
        var actionButtonInput = $("<input />");
        var actionButtonText = options.actionButtonText;

        actionButton.attr("class", "button actionButton general icon-forward before");
        actionButtonInput.attr("type", "button");
        actionButtonInput.val(actionButtonText);

        if (options.actionButtonLink != "") {
            actionButtonInput.unbind("click").click(function () {
                window.open(options.actionButtonLink);
            });
        }

        message.find(".messageButtons").append(actionButton.append(actionButtonInput));
    }

    setTimeout(function () {
        message.css({ display: "block", top: -(message.outerHeight() + 5) });
        message.stop(true).animate({ top: 0 }, 500);
    }, 50);

    // Remove previous messages.
    $(".message").remove();

    // Show message.
    container.append(message);

    if (options.autoHideAfter > 0) {
        // Auto hide.
        setTimeout(function () {
            message.stop(true).animate({ top: -(message.outerHeight() + 5) }, 1000);
        }, options.autoHideAfter);
    }
};

// Show error.
$.fn.showError = function (error, type) {
    if (type == "console") {
        console.log(error);
    } else {
        $.fn.alert(error);
    }
};

// Set system role names.
$.fn.setSystemRoleNames = function () {
    var roleNames = $(this);

    roleNames.each(function () {
        var roleName = $(this);

        // Check for required fields.
        if (roleName.data("required") != undefined && roleName.data("required")) {
            roleName.addClass("disabled");
        }

        // Change role name if needed.
        switch (roleName.text().toLowerCase()) {
            case "community-administrators":
                roleName.text(settings.roles.administrators);
                break;

            case "community-moderators":
                roleName.text(settings.roles.moderators);
                break;

            case "community-authenticated":
                roleName.text(settings.roles.authenticated);
                break;

            case "community-everyone":
                roleName.text(settings.roles.everyone);
                break;

            case "community-roleless":
                roleName.text(settings.roles.roleless);
                break;

            case "community-senders":
                roleName.text(settings.roles.senders);
                break;
        }
    });
};

// Set responsive video frame size.
$.fn.setVideoFrameSize = function () {
    $(this).each(function () {
        var videoFrame = $(this);

        if (typeof videoFrame.data("aspectRatio") == "undefined" || videoFrame.data("aspectRatio") == null) {
            return;
        }

        videoFrame.css({
            height: videoFrame.width() / videoFrame.data("aspectRatio"),
        });
    });
};

// Place last handler as first.
$.fn.placeLastHandlerFirst = function (handlerType) {
    if (typeof handlerType == "undefined" || handlerType == null || $.trim(handlerType) == "") {
        handlerType = "click";
    }

    $(this).each(function () {
        var targetObject = $(this);
        var objectEvents = $._data(targetObject[0], "events");

        if (typeof objectEvents != "undefined" && targetObject != null) {
            var eventsArray = objectEvents[handlerType];

            if (typeof eventsArray != "undefined" && eventsArray != null && eventsArray.length > 1) {
                eventsArray.unshift(eventsArray.pop());
            }
        }
    });
};

// Add vote to poll question.
$.fn.setPollVote = function (aObject, pollID) {
    var theObject = $(aObject);
    var value = theObject.find("input:checked").val();

    if (value == null || value == "" || value == undefined) {
        return;
    }

    theObject.find("input[type='submit']").parent().replaceWith('<div class="loader show"></div>');

    // Talk to handler.
    $.getJSON(
        "/HandlerGlobal.ashx?",
        {
            action: "pollVote",
            value: value,
            pollID: pollID,
            preventCache: new Date().getTime(),
            token: $("input[name='__RequestVerificationToken']").val(),
        },
        function (data) {
            document.location.reload();
        }
    );
};

// Change element type.
$.fn.changeElementType = function (newType) {
    $(this).each(function () {
        var attrs = {};
        var events = {};

        $.each(this.attributes, function (idx, attr) {
            attrs[attr.nodeName] = attr.nodeValue;
        });

        events = $._data(this, "events");

        $(this).replaceWith(function () {
            return $("<" + newType + "/>", attrs).append($(this).contents());
        });

        for (eventType in events) {
            for (var i = 0; i < events[eventType].length; i++) {
                $(this)[eventType](events[eventType][i].handler);
            }
        }
    });
};

// Get real width and height of browser.
$.fn.viewport = function () {
    var element = window,
        attribute = "inner";

    if (!("innerWidth" in window)) {
        attribute = "client";
        element = document.documentElement || document.body;
    }

    return {
        width: element[attribute + "Width"],
        height: element[attribute + "Height"],
    };
};

// Custom alert function.
$.fn.alert = function (message, title) {
    var alertMessage = message;
    var alertTitle = settings.various.alertOverlayTitle;

    if (title != undefined) {
        alertTitle = title;
    }

    // Remove previous alert messages.
    $(".alertOverlay").remove();

    // Create new alert message.
    var alertOverlay = $(
        '<div class="overlay alertOverlay" aria-modal="true" role="overlay"><div class="overlayContent" /></div>'
    );
    var closeButton = $(
        '<a href="#" class="button close info icon-cancel-circled iconOnly before pointer"><span class="screenReaderContent">' +
            settings.buttons.closeText +
            "</span></a>"
    );
    var continueButton = $(
        '<div class="button continue general before"><input type="button" value="' +
            settings.buttons.closeText +
            '" ></div>'
    );

    continueButton
        .find("input:button")
        .unbind("click")
        .click(function () {
            closeButton.click();
        });

    alertOverlay
        .find(".overlayContent")
        .append(closeButton)
        .append('<h1 class="overlayItemTitle">' + alertTitle + "</h1>");
    alertOverlay.find(".overlayContent").append("<p>" + alertMessage + '</p><div class="toolbar toolbarBottom" >');
    alertOverlay.find(".toolbarBottom").append(continueButton).show();

    // Show message.
    $("body").append(alertOverlay);
    $(".alertOverlay").initializeOverlays();
};

// Custom confirm function.
$.fn.confirm = function (message, forceClose) {
    var trigger = $(this);

    // Remove previous confirm messages.
    $(".confirmOverlay").remove();

    if (trigger.data("confirmed") != undefined) {
        // Reset.
        trigger.removeData("confirmed");

        // Continue.
        return true;
    } else {
        // Create new confirm message.
        var continueText = settings.buttons.continueText;
        var continueClass = "general icon-forward";

        if (trigger.data("continue-text") != undefined) {
            continueText = trigger.data("continue-text");
        }

        if (trigger.data("continue-class") != undefined) {
            continueClass = trigger.data("continue-class");
        }

        var confirmOverlay = $(
            '<div class="overlay confirmOverlay" aria-modal="true" role="overlay"><div class="overlayContent" /></div>'
        );
        var closeButton = $(
            '<a href="#" class="button close info icon-cancel-circled iconOnly before pointer"><span class="screenReaderContent">' +
                settings.buttons.closeText +
                "</span></a>"
        );
        var cancelButton = $(
            '<div class="button cancel info icon-cancel-circled before"><input type="button" value="' +
                settings.buttons.cancelText +
                '" ></div>'
        );
        var continueButton = $(
            '<div class="button continue ' +
                continueClass +
                ' before"><input type="button" value="' +
                continueText +
                '" ></div>'
        );

        cancelButton
            .find("input:button")
            .unbind("click")
            .click(function () {
                $(".confirmOverlay").click();
            });

        continueButton
            .find("input:button")
            .unbind("click")
            .click(function () {
                trigger.data("confirmed", "true");

                // Re-enable scrolling.
                $("body").removeClass("overlayOpen");

                if (forceClose != null && forceClose) {
                    closeButton.click();
                } else {
                    if (trigger.is("a")) {
                        trigger[0].click();
                    } else {
                        trigger.click();
                    }
                }

                $.fn.restoreLastFocus();
            });

        confirmOverlay
            .find(".overlayContent")
            .append(closeButton)
            .append(
                '<h1 class="overlayItemTitle">' +
                    settings.various.warningOverlayTitle +
                    "</h1><p>" +
                    message +
                    '</p><div class="toolbar toolbarBottom" >'
            );
        confirmOverlay.find(".toolbarBottom").append(cancelButton).append(continueButton).show();

        // Show message.
        $("body").append(confirmOverlay);
        $(".confirmOverlay").initializeOverlays();

        // Wait for confirmation.
        return false;
    }
};

// Create clickable links.
$.fn.createClickableLinks = function (options) {
    // Default values.
    var defaults = {
        target: "_blank",
    };

    var options = $.extend(defaults, options);
    var regEx1, regEx2, regEx3;
    var replacedItemCount = 0;

    // URLs starting with http://, https://, or ftp://.
    regEx1 = /(^|[^\"])(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;

    // URLs starting with www. (without //).
    regEx2 = /(^|[^\/])(www\.[-A-Z0-9+&@#\/%?=~_|!:,.;]+(\b|$))/gim;

    // Mailto links.
    regEx3 = /(([a-zA-Z0-9\-\_\.])+@[a-zA-Z\_]+?(\.[a-zA-Z]{2,6})+)/gim;

    $(this).each(function () {
        var content = $(this);
        var newContent = content.html();

        if (
            content.length > 0 &&
            content.html().length > 0 &&
            (regEx1.test(newContent) || regEx2.test(newContent) || regEx3.test(newContent))
        ) {
            newContent = newContent.replace(regEx1, '$1<a href="$2" target="' + options.target + '">$2</a>');
            newContent = newContent.replace(regEx2, '$1<a href="http://$2" target="' + options.target + '">$2</a>');
            //newContent = newContent.replace(regEx3, "<a href=\"mailto:$1\">$1</a>");
            replacedItemCount += 1;

            // Replace.
            content.html(newContent);

            if ($("#groups").length > 0 || $("#documents-v3").length > 0) content.find(".tagUsers").mentionTextArea();
        }
    });

    if (
        replacedItemCount > 0 &&
        ($(".no-touch").length > 0 || $(".touch.desktop").length > 0) &&
        $("*[data-user-id]").length > 0
    ) {
        // Re-initialize tagged users from cache.
        if (settings.userDialog.instance != null) {
            settings.userDialog.instance.init();
        }
    }

    // Return.
    return $(this);
};

// Set alternating rows in a list/table.
$.fn.setAlternatingRows = function (options) {
    $(this).each(function (i) {
        var row = $(this);

        row.removeClass("alternate");

        if (i % 2) {
            row.addClass("alternate");
        }
    });
};

// Create a custom drop down.
$.fn.createDropDown = function (aOptions, aDefaultValue, aRequired) {
    // <options> expects an array: [ [text1, value1], [text2, value2], [text3, value3] ].
    if ($.isArray(aOptions)) {
        $(this).each(function () {
            var theTargetElement = $(this);
            var theID = theTargetElement.attr("id") + "_dropDown";

            // If it has been initialized before, remove old dropDown.
            $("#" + theID).remove();

            var theDropDown = $('<select id="' + theID + '" class="dynamicDropdown">');
            theDropDown.change(function () {
                theTargetElement.val($(this).val());
            });

            for (var theIndex in aOptions) {
                var theSelected = "";
                if (aOptions[theIndex][1] == aDefaultValue) theSelected = "selected";

                theDropDown.append(
                    $(
                        '<option value="' +
                            aOptions[theIndex][1] +
                            '" ' +
                            theSelected +
                            ">" +
                            aOptions[theIndex][0] +
                            "</option>"
                    )
                );
            }

            theDropDown.insertAfter(theTargetElement);
            theTargetElement.hide();

            if ($.trim(theTargetElement.val()) != "") {
                theDropDown.val(theTargetElement.val());

                if (theDropDown.val() == null) {
                    if (typeof aDefaultValue != "undefined" && aDefaultValue != null) theDropDown.val(aDefaultValue);
                    else theDropDown.val(aOptions[0][1]);

                    theDropDown.change();
                }
            }

            if (aRequired && theTargetElement.data("requiredInitialized") !== true) {
                $("[id$='_btnEdit'], [id$='_btnAdd'], [id$='_btnEditSection'], [id$='_btnAddSection']").click(
                    function () {
                        if ($.trim(theTargetElement.val()) == "") {
                            if ($(".errorMessage ul").length == 0)
                                $(".errorMessage").html(
                                    "<h2>Let op:</h2><div><p>Het formulier kon niet verzonden worden. Los de volgende punten op en verstuur het formulier opnieuw.</p></div><ul></ul>"
                                );

                            $(".errorMessage li." + theTargetElement.attr("id") + "_warning").remove();
                            $(".errorMessage ul").append(
                                '<li class="' +
                                    theTargetElement.attr("id") +
                                    '_warning">' +
                                    $.trim($("label[for='" + theTargetElement.attr("id") + "'").html()) +
                                    " " +
                                    settings.errors.isRequiredText +
                                    "</li>"
                            );

                            theTargetElement.parents(".field:first").addClass("danger");

                            $(".errorMessage").css({
                                visibility: "visible",
                                display: "block",
                            });

                            $(this).parent().show();
                            $(".loader").hide();

                            setTimeout(function () {
                                $("html, body").scrollTop(0);
                            }, 40);

                            return false;
                        }
                    }
                );

                theTargetElement.data("requiredInitialized", true);
            }
        });
    }

    return $(this);
};

// File size formatting.
$.fn.convertFileSize = function (options) {
    var defaults = {
        fileSize: 0,
        numberOfDecimals: 2,
    };

    var options = $.extend(defaults, options);
    var formattedFileSize = 0;

    if (options.fileSize > 0 && options.fileSize != null) {
        var i = Math.floor(Math.log(options.fileSize) / Math.log(1024));

        if (i > 2) {
            // GB or TB.
            options.numberOfDecimals = 2;
        }

        formattedFileSize =
            (options.fileSize / Math.pow(1024, i)).toFixed(options.numberOfDecimals) * 1 +
            " " +
            ["B", "kB", "MB", "GB", "TB"][i];
    }

    return formattedFileSize.toString().replace(".", settings.decimalSeparator);
};

// Change font size.
$.fn.changeFontSize = function (value) {
    if ($.isNumeric(value)) {
        $(this).each(function () {
            var element = $(this);
            var fontSize = parseInt(element.css("font-size"));

            if (value > 0)
                // Increment font size.
                element.css({ "font-size": fontSize + value, height: "auto" });
            // Decrement font size.
            else element.css({ "font-size": fontSize - Math.abs(value), height: "auto" });
        });

        // Re-initialize spacers.
        $.fn.initializeSpacers({ resize: true });
    }
};

// Validate various form field types.
$.fn.fieldValidator = function (type, value) {
    var regEx = "";
    var returnValue = false;

    switch (type) {
        case "email":
            regEx = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
            break;

        case "tel":
            regEx = /^\(?(\d{3})\)?[-\. ]?(\d{3})[-\. ]?(\d{4})$/;
            break;

        case "url":
            regEx = /^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}/;
            break;
    }

    if (regEx != "") {
        returnValue = regEx.test(value);
    }

    return returnValue;
};

// Mobile check.
$.fn.mobileCheck = function () {
    var check = false;

    (function (a) {
        if (
            /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(
                a
            ) ||
            /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(
                a.substr(0, 4)
            )
        )
            check = true;
    })(navigator.userAgent || navigator.vendor || window.opera);

    return check;
};

// Create custom tooltips.
$.fn.createTooltip = function () {
    var elements = $(this);

    elements.each(function () {
        var element = $(this);
        var content = element.attr("title");

        if (content == undefined) {
            content = element.attr("alt");
        }

        if (content != undefined && content != "") {
            element
                .hover(
                    function () {
                        // Hover.
                        element.data("tipText", content);
                        $('<span class="tooltip"></span>').text(content).appendTo("body").fadeIn("slow");
                    },
                    function () {
                        // Hover out.
                        $(".tooltip").remove();
                    }
                )
                .mousemove(function (e) {
                    var mouseX = e.pageX + 20;
                    var mouseY = e.pageY + 10;

                    $(".tooltip").css({
                        top: mouseY,
                        left: mouseX,
                    });
                });
        }
    });
};

function getUrlParameter(param) {
    var pageUrl = window.location.search.substring(1),
        urlVariables = pageUrl.split("&"),
        parameterName,
        i;

    for (i = 0; i < urlVariables.length; i++) {
        parameterName = urlVariables[i].split("=");

        if (parameterName[0] === param) {
            return parameterName[1] === undefined ? true : decodeURIComponent(parameterName[1]);
        }
    }
}

function onImageError(elem) {
    $(elem).prop("src", "/communities/common/themes/mett%20responsive/images/various/transparent.png");

    return true;
}

$.fn.saveLastFocus = function () {
    var currentFocus = $(":focus");

    if (currentFocus.length > 0) $(document).data("lastFocusElement", currentFocus[0]);
    else $(document).data("lastFocusElement", undefined);
};

$.fn.restoreLastFocus = function () {
    var lastFocus = $(document).data("lastFocusElement");

    if (lastFocus) {
        lastFocus.focus();
    }
};

$.fn.validUrl = function (value) {
    var pattern = new RegExp(
        "^(?:(?:https?|ftp|file)?:?//|www.|ftp.)(?:([-A-Z0-9+&@#/%=~_|$?!:,.]*)|[-A-Z0-9+&@#/%=~_|$?!:,.])*(?:([-A-Z0-9+&@#/%=~_|$?!:,.]*)|[A-Z0-9+&@#/%=~_|$])",
        "i"
    );

    return !!pattern.test(value);
};

function generatetUniqueProxyToken() {
    var n = "",
        D = new Date(),
        S = "000" + D.getMilliseconds();
    S = S.substr(S.length - 3);

    var n = S + D.getTime().toString();
    n = n.substr(0, parseInt(S.charAt(2)) + 3) + S + n.substr(parseInt(S.charAt(2)) + 3);

    return n;
}

$.fn.loadEditorConfig = function (configName) {
    var editor = $(this);

    editor.each(function () {
        var editorID = $(this).find("textarea").prop("id");

        CKEDITOR.instances[editorID].destroy();
        CKEDITOR.replace(editorID, {
            customConfig: "/ckeditor/config_" + configName + ".js",
        });
    });
};
;
// 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").click();
		}
	}

	// Toggle button.
	$("#top .hamburger")
		.unbind("click")
		.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").bind("keydown", bodyKeyDown);

				$("#top .columns, #mobileSlideOut").tabGuard();

				setTimeout(function () {
					$("#mobileSlideOut").find("[tabindex]:not([tabindex=-1]):visible, button:visible, input:visible, a:visible").first().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");
				$(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");
				$(this)
					.find(".screenReaderContent")
					.html(" " + settings.menu.hamburgerExpandText);

				// Enable scrolling.
				$("body").removeClass("noScroll");
				$("body").unbind("keydown", bodyKeyDown);

				// 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"));
		menuItem.addClass('arrowContainer');
		arrow.find("span").text(settings.menu.toggleSubPagesText + ' ' + settings.various.ofText + ' ' + menuItemLink.text());
		menuItemLink.attr('aria-expanded', 'false');

		arrow.unbind("click").click(function () {
			// Toggle icon.
			if (arrow.hasClass("icon-up-open-big")) {
				arrow.removeClass("icon-up-open-big").addClass("icon-down-open-big");
				menuItem.removeClass('open');
				menuItemLink.attr('aria-expanded', 'false');
			} else {
				arrow.removeClass("icon-down-open-big").addClass("icon-up-open-big");
				menuItem.addClass('open');
				menuItemLink.attr('aria-expanded', 'true');
			}

			// 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.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"></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.mouseenter(function()
		{
			if ($(this).parent().find('.dropDown').length > 0)
				$(this).parent().find('a:eq(0)').attr('aria-expanded', 'true');
		});

		arrow.unbind("click").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.unbind("click").click(function() {
							if (mainMenuItem.parents("#mobileMenu").length > 0) {
								// Close mobile menu.
								$("#top .hamburger").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)
				.unbind("click")
				.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.unbind("click").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.unbind("click").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 (horizontalContainer.hasClass("row"))
			{
				staticSubMenuContainer.height("auto");
				horizontalContainer.removeClass("row");
				subMenu.appendTo(staticSubMenuContainer);
				horizontalContainer.stop().css({ opacity: 0 }).animate({ opacity: 1 }, 200);
			}
		}
	};

	$(window).resize(updatePosition);
	$(window).scroll(updatePosition);
}

$.fn.initializeSubMenu = function()
{
	var subMenu = $(this);

	if (subMenu.length == 0) {
		return;
	}

	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]").unbind("click").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.focus();
				lastSibling.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.mouseenter(function () {
			parent.removeClass('hideDropDown');

			$(document).unbind("keyup", onDocumentKeyUp).bind("keyup", onDocumentKeyUp);
		});

		parent.mouseleave(function () {
			parent.removeClass('hideDropDown');

			$(document).unbind("keyup", onDocumentKeyUp);
		});

		parent.bind("keyup", onKeyUp);

		if (parentButton.closest('#shortcuts').length ||
			parentButton.closest('.dropDownMenu').length)
		{
			return;
		}
		else
		{
			parentButton.hover(function()
			{
				parentButton.attr("aria-expanded", "true");
			});

			parentButton.mouseout(function()
			{
				parentButton.attr("aria-expanded", "false");
			});
		}

		dropDown.find("a").each(function () {
			var currentLink = $(this);

			if (currentLink.data("handlersInitialized")) {
				return;
			}

			currentLink.hover(function () {
				parentButton.attr("aria-expanded", "true");
				currentLink.bind("keyup", onKeyUp);
			});

			currentLink.mouseout(function () {
				parentButton.attr("aria-expanded", "false");
			});

			currentLink.focus(function () {
				parent.addClass("focus");
				parentButton.attr("aria-expanded", "true");
				currentLink.bind("keyup", onKeyUp);
			});

			currentLink.blur(function () {
				parent.removeClass("focus");
				parentButton.attr("aria-expanded", "false");
				currentLink.unbind("keyup", onKeyUp);
			});

			currentLink.data("handlersInitialized", true);
		});
	});
};

$.fn.calculateMainMenuDropdownPosition = function () {
	$(this).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).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("userid") + "#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")
            .unbind("click")
            .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")
                    .unbind("click")
                    .on("click", function () {
                        var profileEditLink = $('a[id*="_lnkEditProfile"]').attr("href");

                        window.location = profileEditLink + "#tab=settingsTab";
                    });

                return false;
            });

        $("#toolbarTop .button.edit-privacy-settings")
            .unbind("click")
            .click(function () {
                var profileEditLink = $('a[id*="_lnkEditProfile"]').attr("href");

                window.location = profileEditLink + "#tab=settingsTab";

                return false;
            });

        $("#toolbarTop .button.show-privacy-levels")
            .unbind("click")
            .click(function () {
                $("#users.item.profile .toolbar .button.privacy-levels").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")
            .unbind("click")
            .click(function () {
                $("#toolbarBottom .button.login input").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"))
            .append($(".field.memo"));
        $("#settingsTabContent").append($("#profileFiles"));
        //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
                .unbind("click")
                .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.unbind("click").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.unbind("change").change(function () {
                setTimeout(function () {
                    filterUsers();
                }, 0);
            });
        }

        // 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-filter before float left"
                    ),
                    sortOrderFilterButtonInput = $("<input />")
                        .prop("type", "button")
                        .prop("aria-label", settings.buttons.sortByText)
                        .val(settings.buttons.sortByText);

                sortOrderFilterButtonInput.unbind("click").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.unbind("click").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;
    }

    user.find(".username input:text, .email input:text").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").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.unbind("click").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).load(function()
{
	// Create thumbnails (window.load prevents preloading issues).
	setTimeout(function()
	{
		$(".section .itemImage").not(".updateImage").createModuleThumbnails();
	}, 1000);
});

$(document).ready(function()
{
	// Initialize.
	$.fn.initializeModules();

	if (typeof Sys != "undefined" && typeof Sys.WebForms != "undefined")
	{
		// After AJAX call.
		Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, e)
		{
			$.fn.initializeModules();

			// Create thumbnails.
			setTimeout(function()
			{
				$(".section .itemImage").not(".updateImage").createModuleThumbnails();
			}, 1000);
		});
	}
});

// Initialize modules.
$.fn.initializeModules = function()
{
	if ($('#eParticipation').length > 0 && !settings.section.enableViewOptionsBar)
		$('.sortByWrapper').addClass('hide');

	// 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").unbind("click").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');
				$(this).parent().parent().find('input').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.unbind('change').change(function()
			{
				setTimeout(function()
				{
					__doPostBack(sorterName, '');
				}, 0);
			});
		}

		// 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 float left');
				var tagFilterButtonInput = $('<input />').prop('type', 'button').prop('aria-label', settings.buttons.filterByTagText).val(settings.buttons.filterByText);

				tagFilterButtonInput.unbind('click').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.change();
				}
			}
		}

		// Category filter.
		if ($('.sectionOptions .categoryFilter').length > 0)
		{
			var categoryFilter = $('.sectionOptions .categoryFilter');

			if ($('.sectionOptions .button.applyCategoryFilter').length == 0)
			{
				var categoryFilterButton = $('<div />').addClass('button applyCategoryFilter icon-awesome-filter before float left');
				var categoryFilterButtonInput = $('<input />').prop('type', 'button').prop('aria-label', settings.buttons.filterByCategoryText).val(settings.buttons.filterByText);

				categoryFilterButtonInput.unbind('click').click(function()
				{
					document.location.href = "?category=" + encodeURIComponent(categoryFilter.val());
				});

				categoryFilterButton.append(categoryFilterButtonInput);
				categoryFilterButton.insertAfter(categoryFilter);
			}
		}

		if ($(".sectionOptions").find("select, input:text").length == 0)
		{
			// Less margin.
			$(".sectionOptions").addClass("lessMargin");
		}

		$(".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');
			$('.button.viewToggle a').attr('title', settings.various.filesListCompleteText).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');
			$('.button.viewToggle a').attr('title', settings.various.filesListCompactText).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').unbind('click').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).attr('title', viewTypeLabel);
			vtBtn.find('a .screenReaderContent').text(viewTypeLabel);

			if (typeof(vtButtonThumbnailSize) != "undefined")
			{
				$('.itemImage').removeClass('micro mini small medium large').addClass(vtButtonThumbnailSize);

				$('.itemImage').createModuleThumbnails();
			}

			return false;
		});
	}

	// 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").unbind("click").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.unbind("click").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.unbind("click").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.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)
		{
			item.find(".commentCount, .addComment, .itemCommentCount").unbind("click").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());
		var totalCommentCount = parseInt($(".addCommentCount").data("total-comment-count") || $(".addCommentCount").html());
		var 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);
	}

	// Updates.
	$(".widget-updates").find(".update").each(function()
	{
		$(this).createClickableLinks();
	});

	// Message.
	if ($(".showMessage").length > 0)
	{
		var showMessage = $(".showMessage");

		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']").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.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');
			}

			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.focus(function()
		{
			if (inputField.val() == settings.fields.commentFieldText)
			{
				inputField.val("");
			}
		});

		inputField.blur(function()
		{
			if (inputField.val() == "")
			{
				inputField.stop(true);
				inputField.val(settings.fields.commentFieldText);
			}
		});

		submitButton.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').unbind('click').on('click', function()
	{
		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');

			$(document).unbind('click').on('click', function(event)
			{
				if (!sectionFilterOptions.contains(event.target) && !sectionFiltersButton.contains(event.target))
				{
					hideSectionFiltersPopup();
				}
			});

			$('body').keydown(function(e)
			{
				if (e.keyCode == 27 && $(sectionFiltersButton).hasClass('filtersActive'))
					hideSectionFiltersPopup();
			});
		}
		else
			$(this).find('> a').attr('aria-expanded', 'false');

		return false;
	});

	function hideSectionFiltersPopup()
	{
		$('#sectionFilterOptions').removeClass('visible');
		$('#sectionFiltersButton').removeClass('filtersActive');
		$('#sectionFiltersButton > a').attr('aria-expanded', 'false');
	}

	if ($('.sectionOptions .tagFilter').length === 0)
		$('.sectionFilterOptions .tagPickerWrapper').addClass('hide');

	if ($('.sectionOptions .categoryFilter').length === 0)
		$('.sectionFilterOptions .mapCategoryPickerWrapper').addClass('hide');

	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');
	}

	if ($('.sectionFilterOptions').find('> .sectionFilterWrapper:not(.hide)').length === 0)
		$('.sectionFilters').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 resetFiltersLink = $('<a />');
			resetFiltersLink.addClass('resetFilters');
			resetFiltersLink.prop('href', '#');
			resetFiltersLink.text(settings.buttons.resetFiltersLinkText);

			resetFiltersLink.unbind('click').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();

				event.preventDefault();
			});

			$('#sectionFilterOptions').prepend(resetFiltersLink);
		}
	}
};
;
var mettWidgets;

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,

		init: function(aObject)
		{
			this.mObject = aObject;

			if(this.prepareTemplate() == false)
				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";

				$.ajax({url: theUrl, dataType: "json"})
				.done(function (data)
				{
					theThis.onLoad(data, aHideLoader, aForceTemplateReload);

					if(typeof aCallback == "function")
						aCallback(data);
				});
			}
		},

		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":
					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;
				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();
			}

			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")
			{
				var theTwitterObject = {};

				theTwitterObject[this.apiVar("twitterType")] = this.apiVar("twitterQuery");
				theTwitterObject.count = parseInt(this.apiVar("topn"));
				theTwitterObject.template = this.mItemTemplate;

				if(this.apiVar("filterRetweets") == true)
				{
					if(this.apiVar("twitterType") == "query")
						theTwitterObject[this.apiVar("twitterType")] = theTwitterObject[this.apiVar("twitterType")] + " -filter:retweets";
					else
						theTwitterObject.retweets = 0;
				}

				if(this.apiVar("showAvatar") === true)
					theTwitterObject.avatar_size = settings.widgets.avatarSize;

				if(this.apiVar("twitterType") == "query" && typeof this.apiVar("twitterLanguage") != null && this.apiVar("twitterLanguage") != null && this.apiVar("twitterLanguage") != "")
					theTwitterObject.lang = this.apiVar("twitterLanguage");

				theWidgetObject.find(".itemTemplate, .noItemTemplate").remove();

				if(!aHideLoader)
				{
					this.mObject.html(theWidgetObject);
					this.replaceVars();
				}

				this.mObject.find(".twitterContent").tweet(theTwitterObject).bind("loaded", function (aEvent)
				{
					if($(aEvent.target).find("li").length == 0)
					{
						$(aEvent.target).find("ul.tweet_list:first").append(theThis.mNoItemTemplate);

						if(theThis.apiVar("autoHide") == true)
							theThis.mObject.hide();
					}
					else if(theThis.apiVar("autoHide") == true)
					{
						theThis.mObject.show();
					}

					theThis.replaceVars();

					$(window).resize();
				});
			}
			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)
					{
						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").unbind("click").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.focus();
							return;
						}

						targetItem.find("a, button, input[type=button], input[type=submit], input[type=reset]").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.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").unbind("click").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").unbind("click").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").unbind("click").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").unbind("click").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");
					});
				}
			});

			// Sort favorite up or down.
			theThis.mObject.find(".button.favoriteUp input, .button.favoriteDown input").each(function(i)
			{
				var button = $(this);

				button.unbind("click").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").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").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");
					});
				}
			});

			// 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(".twitterContent").length == 0)
				return;

			if(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 (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)).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)).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).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).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").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").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).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;

			this.mButtonPlayPause.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: theTargetHeight}, 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: theTargetHeight}, 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).height() > theTallestHeight)
						theTallestHeight = $(this).height();
				});

				if(theAllItemsInitialized)
				{
					var targetHeight = theTallestOuterHeight;

					if (this.mCarouselControlsContainer != null)
						targetHeight += this.mCarouselControlsContainer.outerHeight();

					var heightToCheck = parseInt(this.mCarouselObject[0].style.height);

					if (this.mCarouselControlsContainer && this.mCarouselControlsContainer.outerHeight())
						heightToCheck -= this.mCarouselControlsContainer.outerHeight();

					if (theTallestOuterHeight != 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(theTargetObject.height() != theThis.mCarouselObject.height())
					{
						var theTargetHeight = theTargetObject.outerHeight();

						if(theThis.mCarouselControlsContainer != null)
							theTargetHeight += theThis.mCarouselControlsContainer.outerHeight();

						this.mAutoHeightIsAnimating = true;

						this.mCarouselObject.animate({height: theTargetHeight}, 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.click(function (e) {
					e.preventDefault();

					theThis.clearSelection();

					theThis.animateTo("previous");
				});
			}

			if (this.mButtonRight != null) {
				this.mButtonRight.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();
		});
	}
});

// 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)
	{
		initializeColorPickers();

		$('.txtColorPicker').keypress(function(event)
		{
			if (event.which == '13')
				event.preventDefault();
		});
	}
};

// 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");
		}
	}
};

// 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.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.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');

		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'
		}

		var options = $.extend(defaults, options);

		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: 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).change();
				dateTimeField.find('.month').val(month).change();
				dateTimeField.find('.year').val(year).change();
				dateTimeField.find('.hour').val(hour).change();
				dateTimeField.find('.minute').val(minute).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).change();
		dateTimeField.find('.month').val(month).change();
		dateTimeField.find('.year').val(year).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").unbind("click").click(function()
	{
		$.fn.setMultiSelectsData();
	});

	// Save as new template button.
	$(".templateToolbar .button.saveAsNewTemplate input:submit").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").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").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").unbind("click").click(function() {
			window.location.href = globals.url.substring(0, globals.url.lastIndexOf("/"));

			return false;
		});
	}

	// Update progress bar.
	if (container.find(".progress").length > 0)
	{
		$(".stopTask").unbind("click").click(function ()
		{
			$.ajax(
			{
				type:	"GET",
				url: 	"/api/longrunningtasks/stopTask",
				data:
				{
					taskid:	$.fn.getQueryString("taskid"),
					token: 	$("input[name='__RequestVerificationToken']").val()
				}
			}).done(function(data)
			{

			});

			$(this).unbind("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.blur(function()
		{
			if (pageTitle.val().length != 0)
			{
				if (pageName.val().length == 0)
					pageName.val(pageTitle.val()).keyup().blur();

				if (pageMenuTitle.val().length == 0)
					pageMenuTitle.val(pageTitle.val()).keyup();

				if (pageDescription.val().length == 0)
					pageDescription.val(pageTitle.val()).keyup();
			}
		});

		pageName.blur(function()
		{
			// Remove special characters from page name.
			if (pageName.val().length != 0)
				pageName.val($.fn.replaceSpecialCharacters(pageName.val()).toLowerCase());
		});

		// Page type selection.
		$("#generalTabContent .pageTypes").initializeCMSPageTypes();

		// Layout selection.
		$("#appearanceTabContent .layouts").initializeCMSLayouts();

		// Header edit.
		$("#appearanceTabContent .headers .toolbar .button.cancel a, #appearanceTabContent .headers .toolbar .button.save a").click(function()
		{
			$(this).parent().find("input").click();

			return false;
		});

		// Comment, voting & rating rights.
		$("#securityTabContent").append($("#optionsTabContent .commentRights, #optionsTabContent .votingRights, #optionsTabContent .ratingRights"));

		// Comment rights.
		$("#optionsTabContent .commentOptions .containerToggle").click(function()
		{
			$("#securityTabContent .commentRights").toggleClass("hide");
		});

		// Voting rights.
		$("#optionsTabContent .votingOptions .containerToggle").click(function()
		{
			$("#securityTabContent .votingRights").toggleClass("hide");
		});

		// Rating rights.
		$("#optionsTabContent .ratingOptions .containerToggle").click(function()
		{
			$("#securityTabContent .ratingRights").toggleClass("hide");
		});

		// Security buttons.
		$("#optionsTabContent .button.security").click(function()
		{
			$("#securityTab a")[0].click();

			return false;
		});

		// Notifications.
		$("#optionsTabContent .followOptions").insertAfter($("#notificationTabContent .notificationOptions legend:first")).removeClass("hide");

		$("#notificationTabContent .notificationCenter").unbind("click").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").change(function()
		{
			// Toggle module options.
			$.fn.toggleCMSModuleOptions(
			{
				pageTypeID:	parseInt($(this).val())
			});
		});

		// Copy rights.
		$("#generalTabContent .button.copyRights input:submit").unbind("click").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").unbind("change").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").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.unbind("click").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]").unbind("change").change(function()
			{
				var checked = $(this).prop("checked"),
					exportLink = $("<a />");

					exportLink.attr("href", "javascript:$('.button.export input')[0].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.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).unbind("change").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").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)
	{
		// 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").change(function()
		{
			registration.find(".enableExternalPage input:checkbox").click();
		});
	}
};

// 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.change();
				}).fail(function()
				{
					$.fn.showError(settings.errors.getSectionsErrorText + " (500.45)");
				});

				// Select section.
				linkSections.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.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 module = $("<div class=\"module icon-pagetype-" + pageType.val() + " before\" />");

			module.attr("data-pagetype-id", pageType.val());
			module.html("<br />" + pageType.html());

			// Page type selection.
			module.unbind("click").click(function()
			{
				$(".module").removeClass("selected");
				module.addClass("selected");

				// Select page type in drop down list.
				pageTypes.find("select").val(module.data("pagetype-id")).change();

				if ($(".item.add").length > 0)
				{
					$(".pageTypeID input").val(pageType.val());
					$(".pageTypeName input").val(pageType.html());
				}
			});

			// Place default page first.
			if (pageType.val() == 14)
				module.insertBefore(pageTypes.find(".module:first"));
			else
				pageTypes.append(module);
		});

		$(".pageType").removeClass("hide");
	}

	// Edit.
	if ($(".pageTypeID input").val() != "" && $(".pageTypeName input").val() != "")
	{
		var module = $("<div class=\"module icon-pagetype-" + $(".pageTypeID input").val() + " selected before\" />");
		module.html("<br />" + $(".pageTypeName input").val());

		$(".pageType").append(module).removeClass("hide");
	}
};

// 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.unbind("click").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']").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']").change().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']").click();
				});
			}
		}

		$.fn.togglePanoPlatform($("[id$='_chkIsPanoPage']"), resetValues);

		$("[id$='_chkIsPanoPage']").change(function()
		{
			$.fn.togglePanoPlatform($(this), true);
		});

		$("[id$=_ddlPanoPages]").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").keyup(function()
		{
			globals.pageChanged = true;
		});
	}
};

// Item delete.
$.fn.initializeItemDelete = function()
{
	var container = $(this);

	container.find(".button.save a").unbind("click").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').hover(function()
					{
						$(this).css('background-color', color.toHEXA().toString(0));
					},
					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').hover(function()
					{
						$(this).css('color', color.toHEXA().toString(0));
					},
					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').hover(function()
					{
						$(this).css('color', color.toHEXA().toString(0));
					},
					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)').hover(function()
					{
						$(this).css('background-color', color.toHEXA().toString(0));
						$(this).css('border-color', color.toHEXA().toString(0));
					},
					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').hover(function()
					{
						$(this).css('background-color', $(this).closest('.settingsField').find('.buttonColor input').val());
					},
					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)').hover(function()
					{
						$(this).find('> *').attr('style', 'color: ' + color.toHEXA().toString(0) + ' !important');
					},
					function()
					{
						$(this).find('> *').attr('style', 'color: ' + $(this).closest('.settingsField').find('.buttonTextColor input').val() + ' !important');
					});

					inputFieldWrapper.closest('.settingsField').find('.settingsPreview > .button.outline').hover(function()
					{
						$(this).find('> *').attr('style', 'color: #fff !important');
					},
					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();

    if ($("#registrations.item").length > 0) $(".itemContent").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.unbind("click").click(function () {
                if (element.prop("type") == "radio") {
                    elementValueLabel.removeClass("hide");
                    elementValueInput.removeClass("hide");
                } else {
                    elementValueInput.val("");
                    elementValueLabel.toggleClass("hide");
                    elementValueInput.toggleClass("hide");
                }

                elementValueInput.focus();
            });

            // Hide "other" input field when another radio button is clicked.
            field
                .find(".answer input:radio")
                .not(".other")
                .unbind("click")
                .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")
            .unbind("click")
            .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();

                // Check captcha.
                if (!$.fn.mettHCaptchaIsValid()) {
                    $(".field.captcha").addClass("danger");
                    return false;
                }

                // 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();
                                    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>"
                                    )
                                );
                            }
                        }
                    });

                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.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.
        formsSection
            .find(".delete")
            .unbind("click")
            .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")
            .unbind("click")
            .click(function () {
                // Open overlay.
                row.showEditorFormResult();

                return false;
            });
    });

    // Print button in overlay.
    formResultOverlay
        .find(".button.print input:button")
        .unbind("click")
        .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").click();
            }, 50);
        });
};

// Initialize editor forms add & edit.
$.fn.initializeEditorFormsAddEdit = function () {
    var form = $(this);

    if (form.length > 0) {
        // 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").change(function () {
            if ($(this).val() == "1") {
                $(".field.send").addClass("hide");
            } else {
                if ($(".field.sendTo input").val() == "") {
                    $(".field.sendTo input").val("naam@domein.nl");
                }

                $(".field.send").removeClass("hide");
            }
        });

        $(".field.purpose select").change();

        // Send to field.
        $(".field.sendTo input")
            .unbind("click")
            .click(function () {
                if ($(this).val() == "naam@domein.nl") {
                    $(this).val("");
                }
            });

        $(".field.sendTo input")
            .unbind("blur")
            .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").click(function () {
                            var exportLink = $("<a />");
                            exportLink
                                .attr("href", "javascript:$('.button.export a')[0].click();")
                                .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";
            }
        }
    }

    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")
                    .unbind("click")
                    .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 = $(data);

            formData.find(".field 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").change(function () {
            $(".field.allUsers input:text").val(
                globals.domain + "/shortcuts/users_adduser.aspx?userkey=" + $(this).val()
            );
        });

        $(".field.training select").change(function () {
            if ($(this).val() == "Ja") {
                $(".field.confirm")
                    .removeClass("hide")
                    .find("input:checkbox")
                    .prop("checked", false)
                    .change()
                    .initializeSwitchery();
            } else {
                $(".field.confirm").addClass("hide").find("input:checkbox").prop("checked", false).change();
                $("#toolbarBottom").removeClass("hide");
            }
        });

        $(".field.confirm input:checkbox").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").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").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").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").change();
        });

        $(".field.domainEmail select").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").change();
        $(".field.domain input").blur();
        $(".field.owner select, .field.requester select, .field.domainEmail select").change();
    }
};

// Initialize custom (old) forms.
$.fn.checkRequiredFields = function () {
    $.each($(".field"), function () {
        if (
            $(this).hasClass("hide") ||
            $(this).parents(".hide").length > 0 ||
            settings.section.isAdd ||
            settings.section.isEdit ||
            settings.section.isDelete ||
            settings.section.isCMSAdd ||
            settings.section.isCMSEdit ||
            settings.section.isSettings
        )
            return;

        if ($.trim($(this).find("label").text()).endsWith(" *")) $(this).find("input").prop("required", true);
    });
};

$.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;
}
;
$.fn.initializeStatistics = function ()
{
	if (typeof settings.statistics.instance == "undefined" || settings.statistics.instance == null)
		settings.statistics.instance = new StatisticsManager();

	$(".statistics").unbind("click").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.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");
			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.mouseover(function ()
					{
						theThis.onBarMouseOver($(this));
					})
					.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").unbind("click").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.unbind("click").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.unbind("click").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.unbind("blur").blur(function () {
					setTimeout(function () {
						if (!$.contains(shortcut.parent()[0], $(":focus")[0])) {
							shortcut.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.unbind("blur").blur(function () {
				setTimeout(function () {
					if (!$.contains(shortcut.parent()[0], $(":focus")[0])) {
						shortcut.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.unbind("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);
			}
		})
		.error(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()
		}

	})
	.error(function()
	{
		$.fn.showError(settings.errors.updatesDateErrorText + " (500.39)", "console");
	});
}
;
/*!
 * ASP.NET SignalR JavaScript Library v2.2.1
 * http://signalr.net/
 *
 * Copyright (c) .NET Foundation. All rights reserved.
 * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 *
 */
(function(n,t,i){function w(t,i){var u,f;if(n.isArray(t)){for(u=t.length-1;u>=0;u--)f=t[u],n.type(f)==="string"&&r.transports[f]||(i.log("Invalid transport: "+f+", removing it from the transports list."),t.splice(u,1));t.length===0&&(i.log("No transports remain within the specified transport array."),t=null)}else if(r.transports[t]||t==="auto"){if(t==="auto"&&r._.ieVersion<=8)return["longPolling"]}else i.log("Invalid transport: "+t.toString()+"."),t=null;return t}function b(n){return n==="http:"?80:n==="https:"?443:void 0}function a(n,t){return t.match(/:\d+$/)?t:t+":"+b(n)}function k(t,i){var u=this,r=[];u.tryBuffer=function(i){return t.state===n.signalR.connectionState.connecting?(r.push(i),!0):!1};u.drain=function(){if(t.state===n.signalR.connectionState.connected)while(r.length>0)i(r.shift())};u.clear=function(){r=[]}}var f={nojQuery:"jQuery was not found. Please ensure jQuery is referenced before the SignalR client JavaScript file.",noTransportOnInit:"No transport could be initialized successfully. Try specifying a different transport or none at all for auto initialization.",errorOnNegotiate:"Error during negotiation request.",stoppedWhileLoading:"The connection was stopped during page load.",stoppedWhileNegotiating:"The connection was stopped during the negotiate request.",errorParsingNegotiateResponse:"Error parsing negotiate response.",errorDuringStartRequest:"Error during start request. Stopping the connection.",stoppedDuringStartRequest:"The connection was stopped during the start request.",errorParsingStartResponse:"Error parsing start response: '{0}'. Stopping the connection.",invalidStartResponse:"Invalid start response: '{0}'. Stopping the connection.",protocolIncompatible:"You are using a version of the client that isn't compatible with the server. Client version {0}, server version {1}.",sendFailed:"Send failed.",parseFailed:"Failed at parsing response: {0}",longPollFailed:"Long polling request failed.",eventSourceFailedToConnect:"EventSource failed to connect.",eventSourceError:"Error raised by EventSource",webSocketClosed:"WebSocket closed.",pingServerFailedInvalidResponse:"Invalid ping response when pinging server: '{0}'.",pingServerFailed:"Failed to ping server.",pingServerFailedStatusCode:"Failed to ping server.  Server responded with status code {0}, stopping the connection.",pingServerFailedParse:"Failed to parse ping server response, stopping the connection.",noConnectionTransport:"Connection is in an invalid state, there is no transport active.",webSocketsInvalidState:"The Web Socket transport is in an invalid state, transitioning into reconnecting.",reconnectTimeout:"Couldn't reconnect within the configured timeout of {0} ms, disconnecting.",reconnectWindowTimeout:"The client has been inactive since {0} and it has exceeded the inactivity timeout of {1} ms. Stopping the connection."};if(typeof n!="function")throw new Error(f.nojQuery);var r,h,o=t.document.readyState==="complete",e=n(t),c="__Negotiate Aborted__",u={onStart:"onStart",onStarting:"onStarting",onReceived:"onReceived",onError:"onError",onConnectionSlow:"onConnectionSlow",onReconnecting:"onReconnecting",onReconnect:"onReconnect",onStateChanged:"onStateChanged",onDisconnect:"onDisconnect"},v=function(n,i){if(i!==!1){var r;typeof t.console!="undefined"&&(r="["+(new Date).toTimeString()+"] SignalR: "+n,t.console.debug?t.console.debug(r):t.console.log&&t.console.log(r))}},s=function(t,i,r){return i===t.state?(t.state=r,n(t).triggerHandler(u.onStateChanged,[{oldState:i,newState:r}]),!0):!1},y=function(n){return n.state===r.connectionState.disconnected},l=function(n){return n._.keepAliveData.activated&&n.transport.supportsKeepAlive(n)},p=function(i){var f,e;i._.configuredStopReconnectingTimeout||(e=function(t){var i=r._.format(r.resources.reconnectTimeout,t.disconnectTimeout);t.log(i);n(t).triggerHandler(u.onError,[r._.error(i,"TimeoutException")]);t.stop(!1,!1)},i.reconnecting(function(){var n=this;n.state===r.connectionState.reconnecting&&(f=t.setTimeout(function(){e(n)},n.disconnectTimeout))}),i.stateChanged(function(n){n.oldState===r.connectionState.reconnecting&&t.clearTimeout(f)}),i._.configuredStopReconnectingTimeout=!0)};if(r=function(n,t,i){return new r.fn.init(n,t,i)},r._={defaultContentType:"application/x-www-form-urlencoded; charset=UTF-8",ieVersion:function(){var i,n;return t.navigator.appName==="Microsoft Internet Explorer"&&(n=/MSIE ([0-9]+\.[0-9]+)/.exec(t.navigator.userAgent),n&&(i=t.parseFloat(n[1]))),i}(),error:function(n,t,i){var r=new Error(n);return r.source=t,typeof i!="undefined"&&(r.context=i),r},transportError:function(n,t,r,u){var f=this.error(n,r,u);return f.transport=t?t.name:i,f},format:function(){for(var t=arguments[0],n=0;n<arguments.length-1;n++)t=t.replace("{"+n+"}",arguments[n+1]);return t},firefoxMajorVersion:function(n){var t=n.match(/Firefox\/(\d+)/);return!t||!t.length||t.length<2?0:parseInt(t[1],10)},configurePingInterval:function(i){var f=i._.config,e=function(t){n(i).triggerHandler(u.onError,[t])};f&&!i._.pingIntervalId&&f.pingInterval&&(i._.pingIntervalId=t.setInterval(function(){r.transports._logic.pingServer(i).fail(e)},f.pingInterval))}},r.events=u,r.resources=f,r.ajaxDefaults={processData:!0,timeout:null,async:!0,global:!1,cache:!1},r.changeState=s,r.isDisconnecting=y,r.connectionState={connecting:0,connected:1,reconnecting:2,disconnected:4},r.hub={start:function(){throw new Error("SignalR: Error loading hubs. Ensure your hubs reference is correct, e.g. <script src='/signalr/js'><\/script>.");}},typeof e.on=="function")e.on("load",function(){o=!0});else e.load(function(){o=!0});r.fn=r.prototype={init:function(t,i,r){var f=n(this);this.url=t;this.qs=i;this.lastError=null;this._={keepAliveData:{},connectingMessageBuffer:new k(this,function(n){f.triggerHandler(u.onReceived,[n])}),lastMessageAt:(new Date).getTime(),lastActiveAt:(new Date).getTime(),beatInterval:5e3,beatHandle:null,totalTransportConnectTimeout:0};typeof r=="boolean"&&(this.logging=r)},_parseResponse:function(n){var t=this;return n?typeof n=="string"?t.json.parse(n):n:n},_originalJson:t.JSON,json:t.JSON,isCrossDomain:function(i,r){var u;return(i=n.trim(i),r=r||t.location,i.indexOf("http")!==0)?!1:(u=t.document.createElement("a"),u.href=i,u.protocol+a(u.protocol,u.host)!==r.protocol+a(r.protocol,r.host))},ajaxDataType:"text",contentType:"application/json; charset=UTF-8",logging:!1,state:r.connectionState.disconnected,clientProtocol:"1.5",reconnectDelay:2e3,transportConnectTimeout:0,disconnectTimeout:3e4,reconnectWindow:3e4,keepAliveWarnAt:2/3,start:function(i,h){var a=this,v={pingInterval:3e5,waitForPageLoad:!0,transport:"auto",jsonp:!1},d,y=a._deferral||n.Deferred(),b=t.document.createElement("a"),k,g;if(a.lastError=null,a._deferral=y,!a.json)throw new Error("SignalR: No JSON parser found. Please ensure json2.js is referenced before the SignalR.js file if you need to support clients without native JSON parsing support, e.g. IE<8.");if(n.type(i)==="function"?h=i:n.type(i)==="object"&&(n.extend(v,i),n.type(v.callback)==="function"&&(h=v.callback)),v.transport=w(v.transport,a),!v.transport)throw new Error("SignalR: Invalid transport(s) specified, aborting start.");return(a._.config=v,!o&&v.waitForPageLoad===!0)?(a._.deferredStartHandler=function(){a.start(i,h)},e.bind("load",a._.deferredStartHandler),y.promise()):a.state===r.connectionState.connecting?y.promise():s(a,r.connectionState.disconnected,r.connectionState.connecting)===!1?(y.resolve(a),y.promise()):(p(a),b.href=a.url,b.protocol&&b.protocol!==":"?(a.protocol=b.protocol,a.host=b.host):(a.protocol=t.document.location.protocol,a.host=b.host||t.document.location.host),a.baseUrl=a.protocol+"//"+a.host,a.wsProtocol=a.protocol==="https:"?"wss://":"ws://",v.transport==="auto"&&v.jsonp===!0&&(v.transport="longPolling"),a.url.indexOf("//")===0&&(a.url=t.location.protocol+a.url,a.log("Protocol relative URL detected, normalizing it to '"+a.url+"'.")),this.isCrossDomain(a.url)&&(a.log("Auto detected cross domain url."),v.transport==="auto"&&(v.transport=["webSockets","serverSentEvents","longPolling"]),typeof v.withCredentials=="undefined"&&(v.withCredentials=!0),v.jsonp||(v.jsonp=!n.support.cors,v.jsonp&&a.log("Using jsonp because this browser doesn't support CORS.")),a.contentType=r._.defaultContentType),a.withCredentials=v.withCredentials,a.ajaxDataType=v.jsonp?"jsonp":"text",n(a).bind(u.onStart,function(){n.type(h)==="function"&&h.call(a);y.resolve(a)}),a._.initHandler=r.transports._logic.initHandler(a),d=function(i,o){var c=r._.error(f.noTransportOnInit);if(o=o||0,o>=i.length){o===0?a.log("No transports supported by the server were selected."):o===1?a.log("No fallback transports were selected."):a.log("Fallback transports exhausted.");n(a).triggerHandler(u.onError,[c]);y.reject(c);a.stop();return}if(a.state!==r.connectionState.disconnected){var p=i[o],h=r.transports[p],v=function(){d(i,o+1)};a.transport=h;try{a._.initHandler.start(h,function(){var i=r._.firefoxMajorVersion(t.navigator.userAgent)>=11,f=!!a.withCredentials&&i;a.log("The start request succeeded. Transitioning to the connected state.");l(a)&&r.transports._logic.monitorKeepAlive(a);r.transports._logic.startHeartbeat(a);r._.configurePingInterval(a);s(a,r.connectionState.connecting,r.connectionState.connected)||a.log("WARNING! The connection was not in the connecting state.");a._.connectingMessageBuffer.drain();n(a).triggerHandler(u.onStart);e.bind("unload",function(){a.log("Window unloading, stopping the connection.");a.stop(f)});i&&e.bind("beforeunload",function(){t.setTimeout(function(){a.stop(f)},0)})},v)}catch(w){a.log(h.name+" transport threw '"+w.message+"' when attempting to start.");v()}}},k=a.url+"/negotiate",g=function(t,i){var e=r._.error(f.errorOnNegotiate,t,i._.negotiateRequest);n(i).triggerHandler(u.onError,e);y.reject(e);i.stop()},n(a).triggerHandler(u.onStarting),k=r.transports._logic.prepareQueryString(a,k),a.log("Negotiating with '"+k+"'."),a._.negotiateRequest=r.transports._logic.ajax(a,{url:k,error:function(n,t){t!==c?g(n,a):y.reject(r._.error(f.stoppedWhileNegotiating,null,a._.negotiateRequest))},success:function(t){var i,e,h,o=[],s=[];try{i=a._parseResponse(t)}catch(c){g(r._.error(f.errorParsingNegotiateResponse,c),a);return}if(e=a._.keepAliveData,a.appRelativeUrl=i.Url,a.id=i.ConnectionId,a.token=i.ConnectionToken,a.webSocketServerUrl=i.WebSocketServerUrl,a._.pollTimeout=i.ConnectionTimeout*1e3+1e4,a.disconnectTimeout=i.DisconnectTimeout*1e3,a._.totalTransportConnectTimeout=a.transportConnectTimeout+i.TransportConnectTimeout*1e3,i.KeepAliveTimeout?(e.activated=!0,e.timeout=i.KeepAliveTimeout*1e3,e.timeoutWarning=e.timeout*a.keepAliveWarnAt,a._.beatInterval=(e.timeout-e.timeoutWarning)/3):e.activated=!1,a.reconnectWindow=a.disconnectTimeout+(e.timeout||0),!i.ProtocolVersion||i.ProtocolVersion!==a.clientProtocol){h=r._.error(r._.format(f.protocolIncompatible,a.clientProtocol,i.ProtocolVersion));n(a).triggerHandler(u.onError,[h]);y.reject(h);return}n.each(r.transports,function(n){if(n.indexOf("_")===0||n==="webSockets"&&!i.TryWebSockets)return!0;s.push(n)});n.isArray(v.transport)?n.each(v.transport,function(t,i){n.inArray(i,s)>=0&&o.push(i)}):v.transport==="auto"?o=s:n.inArray(v.transport,s)>=0&&o.push(v.transport);d(o)}}),y.promise())},starting:function(t){var i=this;return n(i).bind(u.onStarting,function(){t.call(i)}),i},send:function(n){var t=this;if(t.state===r.connectionState.disconnected)throw new Error("SignalR: Connection must be started before data can be sent. Call .start() before .send()");if(t.state===r.connectionState.connecting)throw new Error("SignalR: Connection has not been fully initialized. Use .start().done() or .start().fail() to run logic after the connection has started.");return t.transport.send(t,n),t},received:function(t){var i=this;return n(i).bind(u.onReceived,function(n,r){t.call(i,r)}),i},stateChanged:function(t){var i=this;return n(i).bind(u.onStateChanged,function(n,r){t.call(i,r)}),i},error:function(t){var i=this;return n(i).bind(u.onError,function(n,r,u){i.lastError=r;t.call(i,r,u)}),i},disconnected:function(t){var i=this;return n(i).bind(u.onDisconnect,function(){t.call(i)}),i},connectionSlow:function(t){var i=this;return n(i).bind(u.onConnectionSlow,function(){t.call(i)}),i},reconnecting:function(t){var i=this;return n(i).bind(u.onReconnecting,function(){t.call(i)}),i},reconnected:function(t){var i=this;return n(i).bind(u.onReconnect,function(){t.call(i)}),i},stop:function(i,h){var a=this,v=a._deferral;if(a._.deferredStartHandler&&e.unbind("load",a._.deferredStartHandler),delete a._.config,delete a._.deferredStartHandler,!o&&(!a._.config||a._.config.waitForPageLoad===!0)){a.log("Stopping connection prior to negotiate.");v&&v.reject(r._.error(f.stoppedWhileLoading));return}if(a.state!==r.connectionState.disconnected)return a.log("Stopping connection."),t.clearTimeout(a._.beatHandle),t.clearInterval(a._.pingIntervalId),a.transport&&(a.transport.stop(a),h!==!1&&a.transport.abort(a,i),l(a)&&r.transports._logic.stopMonitoringKeepAlive(a),a.transport=null),a._.negotiateRequest&&(a._.negotiateRequest.abort(c),delete a._.negotiateRequest),a._.initHandler&&a._.initHandler.stop(),delete a._deferral,delete a.messageId,delete a.groupsToken,delete a.id,delete a._.pingIntervalId,delete a._.lastMessageAt,delete a._.lastActiveAt,a._.connectingMessageBuffer.clear(),s(a,a.state,r.connectionState.disconnected),n(a).triggerHandler(u.onDisconnect),a},log:function(n){v(n,this.logging)}};r.fn.init.prototype=r.fn;r.noConflict=function(){return n.connection===r&&(n.connection=h),r};n.connection&&(h=n.connection);n.connection=n.signalR=r})(window.jQuery,window),function(n,t,i){function s(n){n._.keepAliveData.monitoring&&l(n);u.markActive(n)&&(n._.beatHandle=t.setTimeout(function(){s(n)},n._.beatInterval))}function l(t){var i=t._.keepAliveData,u;t.state===r.connectionState.connected&&(u=(new Date).getTime()-t._.lastMessageAt,u>=i.timeout?(t.log("Keep alive timed out.  Notifying transport that connection has been lost."),t.transport.lostConnection(t)):u>=i.timeoutWarning?i.userNotified||(t.log("Keep alive has been missed, connection may be dead/slow."),n(t).triggerHandler(f.onConnectionSlow),i.userNotified=!0):i.userNotified=!1)}function e(n,t){var i=n.url+t;return n.transport&&(i+="?transport="+n.transport.name),u.prepareQueryString(n,i)}function h(n){this.connection=n;this.startRequested=!1;this.startCompleted=!1;this.connectionStopped=!1}var r=n.signalR,f=n.signalR.events,c=n.signalR.changeState,o="__Start Aborted__",u;r.transports={};h.prototype={start:function(n,r,u){var f=this,e=f.connection,o=!1;if(f.startRequested||f.connectionStopped){e.log("WARNING! "+n.name+" transport cannot be started. Initialization ongoing or completed.");return}e.log(n.name+" transport starting.");n.start(e,function(){o||f.initReceived(n,r)},function(t){return o||(o=!0,f.transportFailed(n,t,u)),!f.startCompleted||f.connectionStopped});f.transportTimeoutHandle=t.setTimeout(function(){o||(o=!0,e.log(n.name+" transport timed out when trying to connect."),f.transportFailed(n,i,u))},e._.totalTransportConnectTimeout)},stop:function(){this.connectionStopped=!0;t.clearTimeout(this.transportTimeoutHandle);r.transports._logic.tryAbortStartRequest(this.connection)},initReceived:function(n,i){var u=this,f=u.connection;if(u.startRequested){f.log("WARNING! The client received multiple init messages.");return}u.connectionStopped||(u.startRequested=!0,t.clearTimeout(u.transportTimeoutHandle),f.log(n.name+" transport connected. Initiating start request."),r.transports._logic.ajaxStart(f,function(){u.startCompleted=!0;i()}))},transportFailed:function(i,u,e){var o=this.connection,h=o._deferral,s;this.connectionStopped||(t.clearTimeout(this.transportTimeoutHandle),this.startRequested?this.startCompleted||(s=r._.error(r.resources.errorDuringStartRequest,u),o.log(i.name+" transport failed during the start request. Stopping the connection."),n(o).triggerHandler(f.onError,[s]),h&&h.reject(s),o.stop()):(i.stop(o),o.log(i.name+" transport failed to connect. Attempting to fall back."),e()))}};u=r.transports._logic={ajax:function(t,i){return n.ajax(n.extend(!0,{},n.signalR.ajaxDefaults,{type:"GET",data:{},xhrFields:{withCredentials:t.withCredentials},contentType:t.contentType,dataType:t.ajaxDataType},i))},pingServer:function(t){var e,f,i=n.Deferred();return t.transport?(e=t.url+"/ping",e=u.addQs(e,t.qs),f=u.ajax(t,{url:e,success:function(n){var u;try{u=t._parseResponse(n)}catch(e){i.reject(r._.transportError(r.resources.pingServerFailedParse,t.transport,e,f));t.stop();return}u.Response==="pong"?i.resolve():i.reject(r._.transportError(r._.format(r.resources.pingServerFailedInvalidResponse,n),t.transport,null,f))},error:function(n){n.status===401||n.status===403?(i.reject(r._.transportError(r._.format(r.resources.pingServerFailedStatusCode,n.status),t.transport,n,f)),t.stop()):i.reject(r._.transportError(r.resources.pingServerFailed,t.transport,n,f))}})):i.reject(r._.transportError(r.resources.noConnectionTransport,t.transport)),i.promise()},prepareQueryString:function(n,i){var r;return r=u.addQs(i,"clientProtocol="+n.clientProtocol),r=u.addQs(r,n.qs),n.token&&(r+="&connectionToken="+t.encodeURIComponent(n.token)),n.data&&(r+="&connectionData="+t.encodeURIComponent(n.data)),r},addQs:function(t,i){var r=t.indexOf("?")!==-1?"&":"?",u;if(!i)return t;if(typeof i=="object")return t+r+n.param(i);if(typeof i=="string")return u=i.charAt(0),(u==="?"||u==="&")&&(r=""),t+r+i;throw new Error("Query string property must be either a string or object.");},getUrl:function(n,i,r,f,e){var h=i==="webSockets"?"":n.baseUrl,o=h+n.appRelativeUrl,s="transport="+i;return!e&&n.groupsToken&&(s+="&groupsToken="+t.encodeURIComponent(n.groupsToken)),r?(o+=f?"/poll":"/reconnect",!e&&n.messageId&&(s+="&messageId="+t.encodeURIComponent(n.messageId))):o+="/connect",o+="?"+s,o=u.prepareQueryString(n,o),e||(o+="&tid="+Math.floor(Math.random()*11)),o},maximizePersistentResponse:function(n){return{MessageId:n.C,Messages:n.M,Initialized:typeof n.S!="undefined"?!0:!1,ShouldReconnect:typeof n.T!="undefined"?!0:!1,LongPollDelay:n.L,GroupsToken:n.G}},updateGroups:function(n,t){t&&(n.groupsToken=t)},stringifySend:function(n,t){return typeof t=="string"||typeof t=="undefined"||t===null?t:n.json.stringify(t)},ajaxSend:function(t,i){var h=u.stringifySend(t,i),c=e(t,"/send"),o,s=function(t,u){n(u).triggerHandler(f.onError,[r._.transportError(r.resources.sendFailed,u.transport,t,o),i])};return o=u.ajax(t,{url:c,type:t.ajaxDataType==="jsonp"?"GET":"POST",contentType:r._.defaultContentType,data:{data:h},success:function(n){var i;if(n){try{i=t._parseResponse(n)}catch(r){s(r,t);t.stop();return}u.triggerReceived(t,i)}},error:function(n,i){i!=="abort"&&i!=="parsererror"&&s(n,t)}})},ajaxAbort:function(n,t){if(typeof n.transport!="undefined"){t=typeof t=="undefined"?!0:t;var i=e(n,"/abort");u.ajax(n,{url:i,async:true,timeout:1e3,type:"POST"});n.log("Fired ajax abort async = "+t+".")}},ajaxStart:function(t,i){var h=function(n){var i=t._deferral;i&&i.reject(n)},s=function(i){t.log("The start request failed. Stopping the connection.");n(t).triggerHandler(f.onError,[i]);h(i);t.stop()};t._.startRequest=u.ajax(t,{url:e(t,"/start"),success:function(n,u,f){var e;try{e=t._parseResponse(n)}catch(o){s(r._.error(r._.format(r.resources.errorParsingStartResponse,n),o,f));return}e.Response==="started"?i():s(r._.error(r._.format(r.resources.invalidStartResponse,n),null,f))},error:function(n,i,u){i!==o?s(r._.error(r.resources.errorDuringStartRequest,u,n)):(t.log("The start request aborted because connection.stop() was called."),h(r._.error(r.resources.stoppedDuringStartRequest,null,n)))}})},tryAbortStartRequest:function(n){n._.startRequest&&(n._.startRequest.abort(o),delete n._.startRequest)},tryInitialize:function(n,t,i){t.Initialized&&i?i():t.Initialized&&n.log("WARNING! The client received an init message after reconnecting.")},triggerReceived:function(t,i){t._.connectingMessageBuffer.tryBuffer(i)||n(t).triggerHandler(f.onReceived,[i])},processMessages:function(t,i,r){var f;u.markLastMessage(t);i&&(f=u.maximizePersistentResponse(i),u.updateGroups(t,f.GroupsToken),f.MessageId&&(t.messageId=f.MessageId),f.Messages&&(n.each(f.Messages,function(n,i){u.triggerReceived(t,i)}),u.tryInitialize(t,f,r)))},monitorKeepAlive:function(t){var i=t._.keepAliveData;i.monitoring?t.log("Tried to monitor keep alive but it's already being monitored."):(i.monitoring=!0,u.markLastMessage(t),t._.keepAliveData.reconnectKeepAliveUpdate=function(){u.markLastMessage(t)},n(t).bind(f.onReconnect,t._.keepAliveData.reconnectKeepAliveUpdate),t.log("Now monitoring keep alive with a warning timeout of "+i.timeoutWarning+", keep alive timeout of "+i.timeout+" and disconnecting timeout of "+t.disconnectTimeout))},stopMonitoringKeepAlive:function(t){var i=t._.keepAliveData;i.monitoring&&(i.monitoring=!1,n(t).unbind(f.onReconnect,t._.keepAliveData.reconnectKeepAliveUpdate),t._.keepAliveData={},t.log("Stopping the monitoring of the keep alive."))},startHeartbeat:function(n){n._.lastActiveAt=(new Date).getTime();s(n)},markLastMessage:function(n){n._.lastMessageAt=(new Date).getTime()},markActive:function(n){return u.verifyLastActive(n)?(n._.lastActiveAt=(new Date).getTime(),!0):!1},isConnectedOrReconnecting:function(n){return n.state===r.connectionState.connected||n.state===r.connectionState.reconnecting},ensureReconnectingState:function(t){return c(t,r.connectionState.connected,r.connectionState.reconnecting)===!0&&n(t).triggerHandler(f.onReconnecting),t.state===r.connectionState.reconnecting},clearReconnectTimeout:function(n){n&&n._.reconnectTimeout&&(t.clearTimeout(n._.reconnectTimeout),delete n._.reconnectTimeout)},verifyLastActive:function(t){if((new Date).getTime()-t._.lastActiveAt>=t.reconnectWindow){var i=r._.format(r.resources.reconnectWindowTimeout,new Date(t._.lastActiveAt),t.reconnectWindow);return t.log(i),n(t).triggerHandler(f.onError,[r._.error(i,"TimeoutException")]),t.stop(!1,!1),!1}return!0},reconnect:function(n,i){var f=r.transports[i];if(u.isConnectedOrReconnecting(n)&&!n._.reconnectTimeout){if(!u.verifyLastActive(n))return;n._.reconnectTimeout=t.setTimeout(function(){u.verifyLastActive(n)&&(f.stop(n),u.ensureReconnectingState(n)&&(n.log(i+" reconnecting."),f.start(n)))},n.reconnectDelay)}},handleParseFailure:function(t,i,u,e,o){var s=r._.transportError(r._.format(r.resources.parseFailed,i),t.transport,u,o);e&&e(s)?t.log("Failed to parse server response while attempting to connect."):(n(t).triggerHandler(f.onError,[s]),t.stop())},initHandler:function(n){return new h(n)},foreverFrame:{count:0,connections:{}}}}(window.jQuery,window),function(n,t){var r=n.signalR,u=n.signalR.events,f=n.signalR.changeState,i=r.transports._logic;r.transports.webSockets={name:"webSockets",supportsKeepAlive:function(){return!0},send:function(t,f){var e=i.stringifySend(t,f);try{t.socket.send(e)}catch(o){n(t).triggerHandler(u.onError,[r._.transportError(r.resources.webSocketsInvalidState,t.transport,o,t.socket),f])}},start:function(e,o,s){var h,c=!1,l=this,a=!o,v=n(e);if(!t.WebSocket){s();return}e.socket||(h=e.webSocketServerUrl?e.webSocketServerUrl:e.wsProtocol+e.host,h+=i.getUrl(e,this.name,a),e.log("Connecting to websocket endpoint '"+h+"'."),e.socket=new t.WebSocket(h),e.socket.onopen=function(){c=!0;e.log("Websocket opened.");i.clearReconnectTimeout(e);f(e,r.connectionState.reconnecting,r.connectionState.connected)===!0&&v.triggerHandler(u.onReconnect)},e.socket.onclose=function(t){var i;this===e.socket&&(c&&typeof t.wasClean!="undefined"&&t.wasClean===!1?(i=r._.transportError(r.resources.webSocketClosed,e.transport,t),e.log("Unclean disconnect from websocket: "+(t.reason||"[no reason given]."))):e.log("Websocket closed."),s&&s(i)||(i&&n(e).triggerHandler(u.onError,[i]),l.reconnect(e)))},e.socket.onmessage=function(t){var r;try{r=e._parseResponse(t.data)}catch(u){i.handleParseFailure(e,t.data,u,s,t);return}r&&(n.isEmptyObject(r)||r.M?i.processMessages(e,r,o):i.triggerReceived(e,r))})},reconnect:function(n){i.reconnect(n,this.name)},lostConnection:function(n){this.reconnect(n)},stop:function(n){i.clearReconnectTimeout(n);n.socket&&(n.log("Closing the Websocket."),n.socket.close(),n.socket=null)},abort:function(n,t){i.ajaxAbort(n,t)}}}(window.jQuery,window),function(n,t){var i=n.signalR,u=n.signalR.events,e=n.signalR.changeState,r=i.transports._logic,f=function(n){t.clearTimeout(n._.reconnectAttemptTimeoutHandle);delete n._.reconnectAttemptTimeoutHandle};i.transports.serverSentEvents={name:"serverSentEvents",supportsKeepAlive:function(){return!0},timeOut:3e3,start:function(o,s,h){var c=this,l=!1,a=n(o),v=!s,y;if(o.eventSource&&(o.log("The connection already has an event source. Stopping it."),o.stop()),!t.EventSource){h&&(o.log("This browser doesn't support SSE."),h());return}y=r.getUrl(o,this.name,v);try{o.log("Attempting to connect to SSE endpoint '"+y+"'.");o.eventSource=new t.EventSource(y,{withCredentials:o.withCredentials})}catch(p){o.log("EventSource failed trying to connect with error "+p.Message+".");h?h():(a.triggerHandler(u.onError,[i._.transportError(i.resources.eventSourceFailedToConnect,o.transport,p)]),v&&c.reconnect(o));return}v&&(o._.reconnectAttemptTimeoutHandle=t.setTimeout(function(){l===!1&&o.eventSource.readyState!==t.EventSource.OPEN&&c.reconnect(o)},c.timeOut));o.eventSource.addEventListener("open",function(){o.log("EventSource connected.");f(o);r.clearReconnectTimeout(o);l===!1&&(l=!0,e(o,i.connectionState.reconnecting,i.connectionState.connected)===!0&&a.triggerHandler(u.onReconnect))},!1);o.eventSource.addEventListener("message",function(n){var t;if(n.data!=="initialized"){try{t=o._parseResponse(n.data)}catch(i){r.handleParseFailure(o,n.data,i,h,n);return}r.processMessages(o,t,s)}},!1);o.eventSource.addEventListener("error",function(n){var r=i._.transportError(i.resources.eventSourceError,o.transport,n);this===o.eventSource&&(h&&h(r)||(o.log("EventSource readyState: "+o.eventSource.readyState+"."),n.eventPhase===t.EventSource.CLOSED?(o.log("EventSource reconnecting due to the server connection ending."),c.reconnect(o)):(o.log("EventSource error."),a.triggerHandler(u.onError,[r]))))},!1)},reconnect:function(n){r.reconnect(n,this.name)},lostConnection:function(n){this.reconnect(n)},send:function(n,t){r.ajaxSend(n,t)},stop:function(n){f(n);r.clearReconnectTimeout(n);n&&n.eventSource&&(n.log("EventSource calling close()."),n.eventSource.close(),n.eventSource=null,delete n.eventSource)},abort:function(n,t){r.ajaxAbort(n,t)}}}(window.jQuery,window),function(n,t){var r=n.signalR,e=n.signalR.events,o=n.signalR.changeState,i=r.transports._logic,u=function(){var n=t.document.createElement("iframe");return n.setAttribute("style","position:absolute;top:0;left:0;width:0;height:0;visibility:hidden;"),n},f=function(){var i=null,f=1e3,n=0;return{prevent:function(){r._.ieVersion<=8&&(n===0&&(i=t.setInterval(function(){var n=u();t.document.body.appendChild(n);t.document.body.removeChild(n);n=null},f)),n++)},cancel:function(){n===1&&t.clearInterval(i);n>0&&n--}}}();r.transports.foreverFrame={name:"foreverFrame",supportsKeepAlive:function(){return!0},iframeClearThreshold:50,start:function(n,r,e){var l=this,s=i.foreverFrame.count+=1,h,o=u(),c=function(){n.log("Forever frame iframe finished loading and is no longer receiving messages.");e&&e()||l.reconnect(n)};if(t.EventSource){e&&(n.log("Forever Frame is not supported by SignalR on browsers with SSE support."),e());return}o.setAttribute("data-signalr-connection-id",n.id);f.prevent();h=i.getUrl(n,this.name);h+="&frameId="+s;t.document.documentElement.appendChild(o);n.log("Binding to iframe's load event.");o.addEventListener?o.addEventListener("load",c,!1):o.attachEvent&&o.attachEvent("onload",c);o.src=h;i.foreverFrame.connections[s]=n;n.frame=o;n.frameId=s;r&&(n.onSuccess=function(){n.log("Iframe transport started.");r()})},reconnect:function(n){var r=this;i.isConnectedOrReconnecting(n)&&i.verifyLastActive(n)&&t.setTimeout(function(){if(i.verifyLastActive(n)&&n.frame&&i.ensureReconnectingState(n)){var u=n.frame,t=i.getUrl(n,r.name,!0)+"&frameId="+n.frameId;n.log("Updating iframe src to '"+t+"'.");u.src=t}},n.reconnectDelay)},lostConnection:function(n){this.reconnect(n)},send:function(n,t){i.ajaxSend(n,t)},receive:function(t,u){var f,e,o;if(t.json!==t._originalJson&&(u=t._originalJson.stringify(u)),o=t._parseResponse(u),i.processMessages(t,o,t.onSuccess),t.state===n.signalR.connectionState.connected&&(t.frameMessageCount=(t.frameMessageCount||0)+1,t.frameMessageCount>r.transports.foreverFrame.iframeClearThreshold&&(t.frameMessageCount=0,f=t.frame.contentWindow||t.frame.contentDocument,f&&f.document&&f.document.body)))for(e=f.document.body;e.firstChild;)e.removeChild(e.firstChild)},stop:function(n){var r=null;if(f.cancel(),n.frame){if(n.frame.stop)n.frame.stop();else try{r=n.frame.contentWindow||n.frame.contentDocument;r.document&&r.document.execCommand&&r.document.execCommand("Stop")}catch(u){n.log("Error occurred when stopping foreverFrame transport. Message = "+u.message+".")}n.frame.parentNode===t.document.body&&t.document.body.removeChild(n.frame);delete i.foreverFrame.connections[n.frameId];n.frame=null;n.frameId=null;delete n.frame;delete n.frameId;delete n.onSuccess;delete n.frameMessageCount;n.log("Stopping forever frame.")}},abort:function(n,t){i.ajaxAbort(n,t)},getConnection:function(n){return i.foreverFrame.connections[n]},started:function(t){o(t,r.connectionState.reconnecting,r.connectionState.connected)===!0&&n(t).triggerHandler(e.onReconnect)}}}(window.jQuery,window),function(n,t){var r=n.signalR,u=n.signalR.events,e=n.signalR.changeState,f=n.signalR.isDisconnecting,i=r.transports._logic;r.transports.longPolling={name:"longPolling",supportsKeepAlive:function(){return!1},reconnectDelay:3e3,start:function(o,s,h){var a=this,v=function(){v=n.noop;o.log("LongPolling connected.");s?s():o.log("WARNING! The client received an init message after reconnecting.")},y=function(n){return h(n)?(o.log("LongPolling failed to connect."),!0):!1},c=o._,l=0,p=function(i){t.clearTimeout(c.reconnectTimeoutId);c.reconnectTimeoutId=null;e(i,r.connectionState.reconnecting,r.connectionState.connected)===!0&&(i.log("Raising the reconnect event"),n(i).triggerHandler(u.onReconnect))},w=36e5;o.pollXhr&&(o.log("Polling xhr requests already exists, aborting."),o.stop());o.messageId=null;c.reconnectTimeoutId=null;c.pollTimeoutId=t.setTimeout(function(){(function e(s,h){var g=s.messageId,nt=g===null,k=!nt,tt=!h,d=i.getUrl(s,a.name,k,tt,!0),b={};(s.messageId&&(b.messageId=s.messageId),s.groupsToken&&(b.groupsToken=s.groupsToken),f(s)!==!0)&&(o.log("Opening long polling request to '"+d+"'."),s.pollXhr=i.ajax(o,{xhrFields:{onprogress:function(){i.markLastMessage(o)}},url:d,type:"POST",contentType:r._.defaultContentType,data:b,timeout:o._.pollTimeout,success:function(r){var h,w=0,u,a;o.log("Long poll complete.");l=0;try{h=o._parseResponse(r)}catch(b){i.handleParseFailure(s,r,b,y,s.pollXhr);return}(c.reconnectTimeoutId!==null&&p(s),h&&(u=i.maximizePersistentResponse(h)),i.processMessages(s,h,v),u&&n.type(u.LongPollDelay)==="number"&&(w=u.LongPollDelay),f(s)!==!0)&&(a=u&&u.ShouldReconnect,!a||i.ensureReconnectingState(s))&&(w>0?c.pollTimeoutId=t.setTimeout(function(){e(s,a)},w):e(s,a))},error:function(f,h){var v=r._.transportError(r.resources.longPollFailed,o.transport,f,s.pollXhr);if(t.clearTimeout(c.reconnectTimeoutId),c.reconnectTimeoutId=null,h==="abort"){o.log("Aborted xhr request.");return}if(!y(v)){if(l++,o.state!==r.connectionState.reconnecting&&(o.log("An error occurred using longPolling. Status = "+h+".  Response = "+f.responseText+"."),n(s).triggerHandler(u.onError,[v])),(o.state===r.connectionState.connected||o.state===r.connectionState.reconnecting)&&!i.verifyLastActive(o))return;if(!i.ensureReconnectingState(s))return;c.pollTimeoutId=t.setTimeout(function(){e(s,!0)},a.reconnectDelay)}}}),k&&h===!0&&(c.reconnectTimeoutId=t.setTimeout(function(){p(s)},Math.min(1e3*(Math.pow(2,l)-1),w))))})(o)},250)},lostConnection:function(n){n.pollXhr&&n.pollXhr.abort("lostConnection")},send:function(n,t){i.ajaxSend(n,t)},stop:function(n){t.clearTimeout(n._.pollTimeoutId);t.clearTimeout(n._.reconnectTimeoutId);delete n._.pollTimeoutId;delete n._.reconnectTimeoutId;n.pollXhr&&(n.pollXhr.abort(),n.pollXhr=null,delete n.pollXhr)},abort:function(n,t){i.ajaxAbort(n,t)}}}(window.jQuery,window),function(n){function r(n){return n+e}function s(n,t,i){for(var f=n.length,u=[],r=0;r<f;r+=1)n.hasOwnProperty(r)&&(u[r]=t.call(i,n[r],r,n));return u}function h(t){return n.isFunction(t)?null:n.type(t)==="undefined"?null:t}function u(n){for(var t in n)if(n.hasOwnProperty(t))return!0;return!1}function f(n,t){var i=n._.invocationCallbacks,r,f;u(i)&&n.log("Clearing hub invocation callbacks with error: "+t+".");n._.invocationCallbackId=0;delete n._.invocationCallbacks;n._.invocationCallbacks={};for(f in i)r=i[f],r.method.call(r.scope,{E:t})}function i(n,t){return new i.fn.init(n,t)}function t(i,r){var u={qs:null,logging:!1,useDefaultPath:!0};return n.extend(u,r),(!i||u.useDefaultPath)&&(i=(i||"")+"/signalr"),new t.fn.init(i,u)}var e=".hubProxy",o=n.signalR;i.fn=i.prototype={init:function(n,t){this.state={};this.connection=n;this.hubName=t;this._={callbackMap:{}}},constructor:i,hasSubscriptions:function(){return u(this._.callbackMap)},on:function(t,i){var u=this,f=u._.callbackMap;return t=t.toLowerCase(),f[t]||(f[t]={}),f[t][i]=function(n,t){i.apply(u,t)},n(u).bind(r(t),f[t][i]),u},off:function(t,i){var e=this,o=e._.callbackMap,f;return t=t.toLowerCase(),f=o[t],f&&(f[i]?(n(e).unbind(r(t),f[i]),delete f[i],u(f)||delete o[t]):i||(n(e).unbind(r(t)),delete o[t])),e},invoke:function(t){var i=this,r=i.connection,e=n.makeArray(arguments).slice(1),c=s(e,h),f={H:i.hubName,M:t,A:c,I:r._.invocationCallbackId},u=n.Deferred(),l=function(f){var e=i._maximizeHubResponse(f),h,s;n.extend(i.state,e.State);e.Progress?u.notifyWith?u.notifyWith(i,[e.Progress.Data]):r._.progressjQueryVersionLogged||(r.log("A hub method invocation progress update was received but the version of jQuery in use ("+n.prototype.jquery+") does not support progress updates. Upgrade to jQuery 1.7+ to receive progress notifications."),r._.progressjQueryVersionLogged=!0):e.Error?(e.StackTrace&&r.log(e.Error+"\n"+e.StackTrace+"."),h=e.IsHubException?"HubException":"Exception",s=o._.error(e.Error,h),s.data=e.ErrorData,r.log(i.hubName+"."+t+" failed to execute. Error: "+s.message),u.rejectWith(i,[s])):(r.log("Invoked "+i.hubName+"."+t),u.resolveWith(i,[e.Result]))};return r._.invocationCallbacks[r._.invocationCallbackId.toString()]={scope:i,method:l},r._.invocationCallbackId+=1,n.isEmptyObject(i.state)||(f.S=i.state),r.log("Invoking "+i.hubName+"."+t),r.send(f),u.promise()},_maximizeHubResponse:function(n){return{State:n.S,Result:n.R,Progress:n.P?{Id:n.P.I,Data:n.P.D}:null,Id:n.I,IsHubException:n.H,Error:n.E,StackTrace:n.T,ErrorData:n.D}}};i.fn.init.prototype=i.fn;t.fn=t.prototype=n.connection();t.fn.init=function(t,i){var e={qs:null,logging:!1,useDefaultPath:!0},u=this;n.extend(e,i);n.signalR.fn.init.call(u,t,e.qs,e.logging);u.proxies={};u._.invocationCallbackId=0;u._.invocationCallbacks={};u.received(function(t){var f,o,e,i,s,h;t&&(typeof t.P!="undefined"?(e=t.P.I.toString(),i=u._.invocationCallbacks[e],i&&i.method.call(i.scope,t)):typeof t.I!="undefined"?(e=t.I.toString(),i=u._.invocationCallbacks[e],i&&(u._.invocationCallbacks[e]=null,delete u._.invocationCallbacks[e],i.method.call(i.scope,t))):(f=this._maximizeClientHubInvocation(t),u.log("Triggering client hub event '"+f.Method+"' on hub '"+f.Hub+"'."),s=f.Hub.toLowerCase(),h=f.Method.toLowerCase(),o=this.proxies[s],n.extend(o.state,f.State),n(o).triggerHandler(r(h),[f.Args])))});u.error(function(n,t){var i,r;t&&(i=t.I,r=u._.invocationCallbacks[i],r&&(u._.invocationCallbacks[i]=null,delete u._.invocationCallbacks[i],r.method.call(r.scope,{E:n})))});u.reconnecting(function(){u.transport&&u.transport.name==="webSockets"&&f(u,"Connection started reconnecting before invocation result was received.")});u.disconnected(function(){f(u,"Connection was disconnected before invocation result was received.")})};t.fn._maximizeClientHubInvocation=function(n){return{Hub:n.H,Method:n.M,Args:n.A,State:n.S}};t.fn._registerSubscribedHubs=function(){var t=this;t._subscribedToHubs||(t._subscribedToHubs=!0,t.starting(function(){var i=[];n.each(t.proxies,function(n){this.hasSubscriptions()&&(i.push({name:n}),t.log("Client subscribed to hub '"+n+"'."))});i.length===0&&t.log("No hubs have been subscribed to.  The client will not receive data from hubs.  To fix, declare at least one client side function prior to connection start for each hub you wish to subscribe to.");t.data=t.json.stringify(i)}))};t.fn.createHubProxy=function(n){n=n.toLowerCase();var t=this.proxies[n];return t||(t=i(this,n),this.proxies[n]=t),this._registerSubscribedHubs(),t};t.fn.init.prototype=t.fn;n.hubConnection=t}(window.jQuery,window),function(n){n.signalR.version="2.2.1"}(window.jQuery);
