(function (global) {
  'use strict';

  const nonce = window['dfBootstrapNonce'];

  let policy = {createScriptURL: url => url};
  if (global.trustedTypes) {
    policy = global.trustedTypes.createPolicy('dialogflow#messenger', policy);
  }

  var CUSTOM_ELEMENTS_ADAPTER_URL =
      'https://static.dialogflow.com/common/messenger/webcomponentsjs/2.1.3/custom-elements-es5-adapter.js';
  var WEBCOMPONENTS_LOADER_URL =
      'https://static.dialogflow.com/common/messenger/webcomponentsjs/2.1.3/webcomponents-loader.js';
  var MESSENGER_URL =
      'https://www.gstatic.com/dialogflow-console/fast/messenger/messenger-internal.min.js?v=4';

  var loadDfMessenger = function () {
    var elementScript = document.createElement('script');
    elementScript.addEventListener('load', onMessengerLoaded, false);
    elementScript.src = policy.createScriptURL(MESSENGER_URL);
    if (nonce) {
      elementScript.setAttribute('nonce', nonce);
    }
    global.document.body.insertBefore(elementScript, null);
  };

  var onMessengerLoaded = function () {
    window.dispatchEvent(new Event('dfMessengerLoaded'))
  };

  var loadWebComponentPolyfills = function () {
    var customElementsAdapterTag = document.createElement('script');
    if (global.customElements) {
      // Import custom elements adapter which is needed for Custom element
      // classes transpiled to ES5.
      customElementsAdapterTag.src = policy.createScriptURL(CUSTOM_ELEMENTS_ADAPTER_URL);
      if (nonce) {
        customElementsAdapterTag.setAttribute('nonce', nonce);
      }
      document.head.appendChild(customElementsAdapterTag);
    }
    // Import web components loader which loads polyfills based on browser
    // support.
    const webComponentsLoaderTag = document.createElement('script');
    webComponentsLoaderTag.src = policy.createScriptURL(WEBCOMPONENTS_LOADER_URL);
    if (nonce) {
      webComponentsLoaderTag.setAttribute('nonce', nonce);
    }
    global.document.head.appendChild(webComponentsLoaderTag);
  };

  global.addEventListener('WebComponentsReady', loadDfMessenger, false);

  var raf = global.requestAnimationFrame || global.mozRequestAnimationFrame ||
      global.webkitRequestAnimationFrame || global.msRequestAnimationFrame;
  if (raf) {
    raf(function () {
      global.setTimeout(loadWebComponentPolyfills, 0);
    });
  } else {
    global.addEventListener('load', loadWebComponentPolyfills);
  }
})(window);