{% 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 %}
  <ul id="account-nav-menu" class="b-hornav droppy">
      {% for item in menu -%}
      <li id="{{ item.tabid }}">
      <a href="{{ item.target }}">
          {{ item.title }}
          <div class="marker{% if item.target.rstrip('/') == request.path.rstrip('/') %} current{% endif %}"></div>
      </a>
      </li>
      {%- endfor %}
   </ul>

  {% 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 %}
