{#-
       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 %}
{% set current_menu_item = '/auth/user_info' %}
{% extends "allura:templates/user_account_base.html" %}

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

{% block header %}Contacts of {{c.user.username}} {% endblock %}

{% block content %}
  {{ super() }}
  <div class="grid-20">
    <h2>Personal Contacts</h2>
    <h3>Skype account</h3>

    {{g.theme.skype_account_form.display(action="skype_account",
          initial_value=c.user.get_pref('skypeaccount'))}}

    {%if c.user.get_pref('socialnetworks') or c.user.get_pref('telnumbers') or c.user.get_pref('webpages') %}
      <h3>Other existing contacts</h3>
        <table>
          <tr>
            <thead>
              <th>Type</th>
              <th>Contact</th>
              <th>Actions</th>
            </thead>
          </tr>
          {% for sn in c.user.get_pref('socialnetworks') %}
             {{g.theme.remove_socialnetwork_form.display(action="remove_social_network", account=sn.accounturl, socialnetwork=sn.socialnetwork)}}
          {% endfor %}

          {% for tn in c.user.get_pref('telnumbers') %}
              {{g.theme.remove_textvalue_form.display(action="remove_telnumber", value=tn, label="Telephone number")}}
          {%endfor%}

          {% for ws in c.user.get_pref('webpages') %}
              {{g.theme.remove_textvalue_form.display(action="remove_webpage", value=ws, label="Website url")}}
          {%endfor%}
        </table>
    {% endif %}

    <h3>Add a social network account</h3>
    {{g.theme.add_socialnetwork_form.display(action="add_social_network")}}
    <h3>Add a telephone number</h3>
    {{g.theme.add_telnumber_form.display(action="add_telnumber")}}
    <h3>Add a personal website</h3>
    {{g.theme.add_website_form.display(action="add_webpage")}}
  </div>
{% endblock %}
