{#-
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
-#}
{% set hide_left_bar = True %}
{% extends g.theme.master %}

{% block title %}{{ config['site_name'] }} Multifactor Login{% endblock %}

{% block header %}Multifactor Login{% endblock %}

{% block content %}
<form method="post" action="/auth/do_multifactor">
    <h2>Enter your Multifactor Authentication Code</h2>
    <p>
    <span class="totp">Please enter the {{ config['auth.multifactor.totp.length'] }}-digit code from your authenticator app:</span>
    <span class="recovery">Please enter a recovery code:</span>
    <br>
    {% if c.form_errors['code'] %}
        <span class="fielderror">{{ c.form_errors['code'] }}</span><br>
    {% endif %}
    <input type="text" name="code" autofocus autocomplete="off"/>
    <input type="hidden" name="return_to" value="{{ return_to }}"/>
    <br>
    <input type="submit" value="Log In">
    <span class="alternate-links">
        <span class="totp">
            or <a href="#" class="show-recovery">use a recovery code</a>
        </span>
        <span class="recovery">
            or <a href="#" class="show-totp">use an authenticator app code</a>
        </span>
    </span>
    <input type="hidden" name="mode" value="{{ mode }}"/>
    {{ lib.csrf_token() }}
    </p>
</form>

{% endblock %}

{% block extra_css %}
<style type="text/css">
    .{{ 'recovery' if mode == 'totp' else 'totp' }} {
        display: none;
    }
    .alternate-links {
        /* align with floated button */
        display: inline-block;
        margin: 6px 10px;
    }
</style>
{% endblock %}

{% block extra_js %}
<script type="text/javascript">
  $(function() {
      $('.show-recovery').click(function(e){
          $('.recovery').show();
          $('.totp').hide();
          $('.fielderror').empty()
          $('input[name=mode]').val('recovery');
          $('input[name=code]').focus();
      });
      $('.show-totp').click(function(e){
          $('.totp').show();
          $('.recovery').hide();
          $('.fielderror').empty()
          $('input[name=mode]').val('totp');
          $('input[name=code]').focus();
      });
  });
</script>
{% endblock %}