(function () {
  "use strict";

  var ROOT_SELECTOR = ".xdget-loginUserForm.standard-form";
  var MAX_READY_FRAMES = 120;

  function hasValue(input) {
    return Boolean(input && String(input.value || "").trim());
  }

  function getState(root, selector, fieldNames, needsConsent) {
    var section = root.querySelector(selector);
    if (!section) return null;

    var button = section.querySelector(".form-buttons .btn-success");
    var fields = fieldNames.map(function (name) {
      return section.querySelector('input[name="' + name + '"]');
    });
    var consent = needsConsent
      ? section.querySelector('.global-confirm-checkbox[name="pdpConfirmCheckbox"]')
      : null;

    if (!button || fields.some(function (field) { return !field; }) || (needsConsent && !consent)) {
      return null;
    }

    return {
      button: button,
      consent: consent,
      fields: fields
    };
  }

  function isComplete(state) {
    return state.fields.every(hasValue) && (!state.consent || state.consent.checked);
  }

  function setButtonState(state) {
    var enabled = isComplete(state);
    state.button.disabled = !enabled;
    state.button.setAttribute("aria-disabled", enabled ? "false" : "true");
  }

  function init(root) {
    if (root.dataset.psv5LoginValidation === "1") return true;

    var login = getState(root, ".login-form", ["email", "password"], false);
    var register = getState(root, ".register-form", ["email", "first_name", "last_name"], true);
    if (!login || !register) return false;

    function sync() {
      setButtonState(login);
      setButtonState(register);
    }

    root.dataset.psv5LoginValidation = "1";
    root.addEventListener("input", sync);
    root.addEventListener("change", sync);
    window.addEventListener("pageshow", sync);
    window.addEventListener("focus", sync);
    sync();
    return true;
  }

  function boot() {
    var frame = 0;

    function findForm() {
      var root = document.querySelector(ROOT_SELECTOR);
      if (root && init(root)) return;
      frame += 1;
      if (frame < MAX_READY_FRAMES) window.requestAnimationFrame(findForm);
    }

    findForm();
  }

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", boot, { once: true });
  } else {
    boot();
  }
}());
