{% set hide_left_bar = True %}
{% extends g.theme.master %}

{% block title %}{{c.user.username}} / Preferences{% endblock %}

{% block header %}User Preferences for {{c.user.username}}{% endblock %}

{% block content %}
  {% if g.theme.password_change_form %}
  <div class="grid-20">
    <h2>Change Password</h2>
    {{ g.theme.password_change_form.display() }}
  </div>
  {% endif %}
  {% if g.theme.upload_key_form %}
  <div class="grid-20">
    <h2>Upload ssh public key</h2>
    {{ g.theme.upload_key_form.display() }}
  </div>
  {% endif %}

  {% if tg.config.get('auth.method', 'local') == 'local' %}
      <br style="clear:both"/>
      <h2>API Token</h2>
      {% if api_token %}
        <p>
          <b>API Key:</b><br/>
          {{api_token.api_key}}<br/>
          <b>Secret Key:</b><br/>
          {{api_token.secret_key}}<br/>
        </p>
        <form method="POST" action="del_api_token" class="grid-18">
          <input type="submit" value="Delete API Token">
        </form>
      {% else %}
        <p>No API token generated</p>
      {% endif %}
      <form method="POST" action="gen_api_token" class="grid-18">
        <input type="submit" value="(Re)generate API Token">
      </form>
  {% endif %}

  <div style="clear:both"></div>

  <h2>Authorized Third-party Applications</h2>
  {% for access_tok in authorized_applications %}
    <div>
      <h3>{{access_tok.consumer_token.name}}</h3>
      {{access_tok.consumer_token.description_html}}
      {{ c.revoke_access.display(value=access_tok) }}
      <br style="clear:both"/>
  </div>
 {% endfor %}
    {% if not authorized_applications %}<p>No authorized third-party applications</p>{% endif %}


  <h2>Subscriptions</h2>
  {% if subscriptions %}
    {{c.form.display(action='update_subscriptions', value=dict(subscriptions=subscriptions))}}
  {% else%}
    <p>No subscriptions.</p>
  {% endif %}
  <br/>
  <div style="clear:both">&nbsp;</div>
  <form action="update" method="post">
        {% if tg.config.get('auth.method', 'local') == 'local' %}
        <label class="grid-4">Display Name</label>
        <div class="grid-18">
          <input name="preferences.display_name" value="{{c.user.display_name}}" type="text">
        </div>
        {% endif %}
        <label class="grid-4">Email Format</label>
        <div class="grid-18">
          <select name="preferences.email_format">
            <option value="plain" {{'selected' if c.user.preferences.email_format == 'plain' else ''}}>Plain Text</option>
            <option value="html" {{'selected' if c.user.preferences.email_format == 'html' else ''}}>HTML</option>
            <option value="both" {{'selected' if c.user.preferences.email_format == 'both' else ''}}>Combined</option>
          </select>
        </div>
        {% if tg.config.get('auth.method', 'local') == 'local' %}
        <label class="grid-4">Page Size</label>
        <div class="grid-18">
          <select name="preferences.results_per_page">
            {% for per_page in [25, 50, 100, 250] %}
                <option {% if per_page == c.user.preferences.results_per_page %}selected="selected"{% endif %}
                   value="{{per_page}}">{{per_page}}</option>
            {% endfor %}
          </select>
        </div>
        {% endif %}
    
    {% if tg.config.get('auth.method', 'local') == 'local' %}
      {% for a in c.user.email_addresses %}
        <input name="addr-{{loop.index0}}.ord" value="{{loop.index0}}" type="hidden"/>
      {% endfor %}
      {% if c.user.email_addresses %}
        <h3 class="grid-18">Email Addresses</h3>
        <table class="grid-18">
          <tr>
            <th>Primary?</th>
            <th>Address</th>
            <th>Confirmed</th>
            <th></th>
          </tr>
          {% for a in c.user.email_addresses %}
          <tr>
            {% set obj = c.user.address_object(a) %}
            <td>{{lib.radio_button('primary_addr', None, a, c.user.preferences.email_address)}}</td>
            <td>{{a}}</td>
            {% if obj %}
            <td>
              {% if obj.confirmed %}
                yes
              {% else %}
                no (<a href="{{g.url('/auth/send_verification_link', a=a)}}">verify</a>)
              {% endif %}
            </td>
            {% else %}
              <td>Unknown addr obj {{a}}</td>
            {% endif %}
            <td>{{lib.submit_button('Delete', 'addr-%s.delete' % i)}}</td>
          </tr>
          {% endfor %}
        </table>
        {% endif %}
        <div class="grid-18">
        {{lib.text_field('new_addr.addr', 'New Email Address')}}
        {{lib.submit_button('Claim Address', name='new_addr.claim')}}
        </div>

        {% if c.user.open_ids %}
        <h3 class="grid-18">OpenIDs Claimed</h3>
        <table class="grid-18">
          <tr>
            <th>OpenID</th>
            <th></th>
          </tr>
          {% for oid in c.user.open_ids %}
            {% set obj = c.user.openid_object(oid) %}
          <tr>
            <td>{{oid}}</td>
            <td>{{lib.submit_button('Delete', 'oid-%s.delete' % loop.index0)}}</td>
          </tr>
          {% endfor %}
        </table>
        {% endif %}
        <div class="grid-18">
        <a href="/auth/claim_oid">Claim New OpenID</a>
        </div>
    {% endif %}
    <div class="grid-18">
    {{lib.submit_button('Save Changes')}}
    </div>
  </form>
{% endblock %}
