text: var ManageAccountDialog = {};
  
  /**
   * Displays the logged in page if the user is logged in,
   * displays the login page otherwise.
   */
  ManageAccountDialog.display = function (logged_in_username, onSuccess) {
    if (logged_in_username == null) {
      ManageAccountDialog.tryLoginWithCookies(onSuccess);
    } else {
      ManageAccountDialog.displayLoggedIn(logged_in_username);
    }
  };
  
  
  ManageAccountDialog.tryLoginWithCookies = function (onSuccess) {
    // Try with cookies first.
    const discardWaiter = DialogSystem.showBusy($.i18n('wikibase-account/connecting-to-wikibase'));
    Refine.postCSRF(
        "command/wikidata/login",
        {"wb-api-endpoint": WikibaseManager.getSelectedWikibaseApi()},
        function (data) {
          discardWaiter();
          if (data.logged_in) {
            onSuccess(data.username);
            ManageAccountDialog.displayLoggedIn(data.username);
          } else {
            // If failed, then login with username/password.
            ManageAccountDialog.displayPasswordLogin(onSuccess);
          }
        });
  };
  
  ManageAccountDialog.initCommon = function (elmts) {
    elmts.dialogHeader.text($.i18n('wikibase-account/dialog-header', WikibaseManager.getSelectedWikibaseName()));
    elmts.explainLogIn.html($.i18n('wikibase-account/explain-log-in',
        WikibaseManager.getSelectedWikibaseMainPage(), WikibaseManager.getSelectedWikibaseName()));
    elmts.cancelButton.text($.i18n('wikibase-account/close'));
  };
  
  ManageAccountDialog.displayLoggedIn = function (logged_in_username) {
    var frame = $(DOM.loadHTML("wikidata", "scripts/dialogs/logged-in-dialog.html"));
    var elmts = DOM.bind(frame);
    ManageAccountDialog.initCommon(elmts);
    elmts.loggedInAs.text($.i18n('wikibase-account/logged-in-as'));
    elmts.logoutButton.text($.i18n('wikibase-account/log-out'));
  
    var level = DialogSystem.showDialog(frame);
    var dismiss = function () {
      DialogSystem.dismissUntil(level - 1);
    };
  
    elmts.loggedInUsername
        .text(logged_in_username)
        .attr('href', WikibaseManager.getSelectedWikibaseRoot() + 'User:' + logged_in_username);
  
    elmts.cancelButton.click(function (e) {
      dismiss();
    });
  
    elmts.logoutButton.click(function () {
      frame.hide();
      Refine.postCSRF(
          "command/wikidata/login",
          $.param({
            "logout": "true",
            "wb-api-endpoint": WikibaseManager.getSelectedWikibaseApi()
          }),
          function (data) {
            frame.show();
            if (!data.logged_in) {
              dismiss();
            }
          });
    });
  };
  
  ManageAccountDialog.displayPasswordLogin = function (onSuccess) {
    const frame = $(DOM.loadHTML("wikidata", "scripts/dialogs/password-login-dialog.html"));
    const elmts = DOM.bind(frame);
    ManageAccountDialog.initCommon(elmts);
    elmts.explainBotPasswords.html($.i18n('wikibase-account/explain-bot-passwords', WikibaseManager.getSelectedWikibaseRoot() + 'Special:BotPasswords'));
    elmts.explainOwnerOnlyConsumerLogin.html($.i18n('wikibase-account/explain-owner-only-consumer-login'));
    elmts.invalidCredentials.text($.i18n('wikibase-account/invalid-credentials'));
    elmts.invalidCredentials.hide();
    elmts.usernameLabel.text($.i18n('wikibase-account/username-label'));
    elmts.usernameInput.attr("placeholder", $.i18n('wikibase-account/username-placeholder'));
    elmts.passwordLabel.text($.i18n('wikibase-account/password-label'));
    elmts.passwordInput.attr("placeholder", $.i18n('wikibase-account/password-placeholder'));
    elmts.rememberMe.text($.i18n('wikibase-account/remember-me'));
    elmts.passwordRememberMeTitle.attr("title", $.i18n('wikibase-account/password-remember-me-title'));
    elmts.loginButton.text($.i18n('wikibase-account/log-in'));
    elmts.usernameInput.focus();
  
    // We don't support logging in with owner-only consumer if the target Wikibase doesn't support OAuth.
    if (!WikibaseManager.getSelectedWikibaseOAuth()) {
      elmts.dialogFooter.hide();
    }
  
    var level = DialogSystem.showDialog(frame);
    var dismiss = function () {
      DialogSystem.dismissUntil(level - 1);
    };
  
    elmts.cancelButton.click(function (e) {
      dismiss();
    });
  
    elmts.explainOwnerOnlyConsumerLogin.click(function (e) {
      dismiss();
      ManageAccountDialog.displayOwnerOnlyConsumerLogin(onSuccess);
    });
  
    elmts.loginForm.submit(function (e) {
      frame.hide();
      let formArr = elmts.loginForm.serializeArray();
      let username = elmts.usernameInput.val();
      if (!username.contains("@")) {
        alert($.i18n('wikibase-account/bot-passwords-alert'));
      }
      formArr.push({name: "wb-api-endpoint", value: WikibaseManager.getSelectedWikibaseApi()});
      Refine.postCSRF(
          "command/wikidata/login",
          $.param(formArr),
          function (data) {
            if (data.logged_in) {
              dismiss();
              onSuccess(data.username);
            } else {
              frame.show();
              elmts.invalidCredentials.show();
            }
          });
      e.preventDefault();
    });
  };
  
  ManageAccountDialog.displayOwnerOnlyConsumerLogin = function (onSuccess) {
    var frame = $(DOM.loadHTML("wikidata", "scripts/dialogs/owner-only-consumer-login-dialog.html"));
    var elmts = DOM.bind(frame);
    ManageAccountDialog.initCommon(elmts);
    elmts.explainOwnerOnlyConsumerWiki.html($.i18n('wikibase-account/explain-owner-only-consumer-wiki',
        WikibaseManager.getSelectedWikibaseOAuth().registration_page));
    elmts.explainPasswordLogin.html($.i18n('wikibase-account/explain-password-login'));
    elmts.invalidCredentials.text($.i18n('wikibase-account/invalid-credentials'));
    elmts.invalidCredentials.hide();
    elmts.consumerTokenLabel.text($.i18n('wikibase-account/consumer-token-label'));
    elmts.consumerTokenInput.attr("placeholder", $.i18n('wikibase-account/consumer-token-placeholder'));
    elmts.consumerSecretLabel.text($.i18n('wikibase-account/consumer-secret-label'));
    elmts.consumerSecretInput.attr("placeholder", $.i18n('wikibase-account/consumer-secret-placeholder'));
    elmts.accessTokenLabel.text($.i18n('wikibase-account/access-token-label'));
    elmts.accessTokenInput.attr("placeholder", $.i18n('wikibase-account/access-token-placeholder'));
    elmts.accessSecretLabel.text($.i18n('wikibase-account/access-secret-label'));
    elmts.accessSecretInput.attr("placeholder", $.i18n('wikibase-account/access-secret-placeholder'));
    elmts.rememberMe.text($.i18n('wikibase-account/remember-me'));
    elmts.ownerOnlyConsumerRememberMeTitle.attr("title", $.i18n('wikibase-account/owner-only-consumer-remember-me-title'));
    elmts.loginButton.text($.i18n('wikibase-account/log-in'));
    elmts.consumerTokenInput.focus();
  
    var level = DialogSystem.showDialog(frame);
    var dismiss = function () {
      DialogSystem.dismissUntil(level - 1);
    };
  
    elmts.cancelButton.click(function (e) {
      dismiss();
    });
  
    elmts.explainPasswordLogin.click(function (e) {
      dismiss();
      ManageAccountDialog.displayPasswordLogin(onSuccess);
    });
  
    elmts.loginForm.submit(function (e) {
      frame.hide();
      let formArr = elmts.loginForm.serializeArray();
      formArr.push({name: "wb-api-endpoint", value: WikibaseManager.getSelectedWikibaseApi()});
      Refine.postCSRF(
          "command/wikidata/login",
          $.param(formArr),
          function (data) {
            if (data.logged_in) {
              dismiss();
              onSuccess(data.username);
            } else {
              frame.show();
              elmts.invalidCredentials.show();
            }
          });
      e.preventDefault();
    });
  };
  
  /**
   * Checks if the user is logged in or not.
   *
   * The callback needs to react to both cases.
   */
  ManageAccountDialog.isLoggedIn = function (callback) {
    $.get(
        "command/wikidata/login",
        {"wb-api-endpoint": WikibaseManager.getSelectedWikibaseApi()},
        function (data) {
          if (data.logged_in) {
            // make sure that the user is logged in to the selected Wikibase
            callback(data.username)
          } else {
            callback(null);
          }
        });
  };
  
  /**
   * The onSuccess callback is called if and only if the user is logged in.
   */
  ManageAccountDialog.ensureLoggedIn = function (onSuccess) {
    ManageAccountDialog.isLoggedIn(function (logged_in_username) {
      if (logged_in_username == null) {
        ManageAccountDialog.display(null, onSuccess);
      } else {
        onSuccess(logged_in_username);
      }
    });
  };
  
  ManageAccountDialog.checkAndLaunch = function () {
    ManageAccountDialog.isLoggedIn(function (logged_in_username) {
      ManageAccountDialog.display(logged_in_username, function (success) {
      });
    });
  };
  