<html>
  <head>
    <script type="text/javascript">
      var initialized = false;
      var sendAndSumitRequested = false;

      function initialize() {
        window.addEventListener('message', function(event) {
          if (!event.data || event.data.type != 'gaia_saml_api_reply')
            return;
          var response = event.data.response;
          if (response.result != 'initialized' ||
              response.version != 1 ||
              response.keyTypes.indexOf('KEY_TYPE_PASSWORD_PLAIN') == -1) {
            return;
          }
          initialized = true;
          if (sendAndSumitRequested)
            send_and_submit();
        });

        window.setTimeout(function() {
          window.postMessage({
              type: 'gaia_saml_api',
              call: {method: 'initialize', requestedVersion: 1}}, '/');
        }, 0);
      }

      function send_and_submit() {
        if (!initialized) {
          sendAndSumitRequested = true;
          return;
        }
        var form = document.forms[0];
        var token = form.elements['RelayState'].value;
        var user = form.elements['Email'].value;
        var password = form.elements['Password'].value;
        window.setTimeout(function() {
          window.postMessage({
              type: 'gaia_saml_api',
              call: {method: 'add',
                     token: token,
                     user: user,
                     passwordBytes: password,
                     keyType: 'KEY_TYPE_PASSWORD_PLAIN'}}, '/');
           form.submit();
         }, 0);
      }
    </script>
  </head>
  <body onload="initialize();">
    <form method=post action="$Post">
      <input type=hidden name=RelayState value="$RelayState">
      User: <input type=text id=Email name=Email>
      <!-- The dummy input is part of a regression test: The password scraper
           picks up the contents of the first type=password input field. The
           credentials passing API should overrule the password scraper and
           ensure that the user's actual password is used instead.
           See http://crbug.com/490737 -->
      Dummy: <input type=password id=Dummy name=Dummy>
      Password: <input type=password id=Password name=Password>
      <input id=Submit type=button value="Login" onclick="send_and_submit();"/>
    </form>
  </body>
</html>
