{% extends 'bootstrap/base.html' %}

{% block title %}
  {% if title %}{{ title }}{% else %}Nordix Open Labs{% endif %}
{% endblock %}

{% block navbar %}
  <nav class="navbar navbar-default navbar-fixed-top">
    <div class="container">

    <div class="navbar-header">
    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
    </button>
    </div>

      <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
        <ul class="nav navbar-nav navbar-left">
          <li><a href="{{ url_for('main.index') }}">Home</a></li>
          <li><a href="{{ url_for('main.gettingstarted') }}">Getting Started</a></li>
          <li><a href="{{ url_for('main.blog') }}">Blog</a></li>
          <li><a href="{{ url_for('main.thelabs') }}">The Labs</a></li>
          <li><a href="{{ url_for('main.software') }}">Software</a></li>
          <!-- <li><a href="{{ url_for('main.stats') }}">Statistics</a></li> -->
          <li><a href="{{ url_for('main.faq') }}">FAQ</a></li>
        </ul>
        <ul class="nav navbar-nav navbar-right">
          {% if current_user.is_anonymous %}
          <li><a href="{{ url_for('user.register') }}">Register</a></li>
          <li><a href="{{ url_for('user.login') }}">Login</a></li>
          {% else %}
          <li><a href="{{ url_for('user.profile', username=current_user.username) }}">Profile</a></li>
          <li><a href="{{ url_for('booking.newbooking', username=current_user.username) }}">New Booking</a></li>
          <li><a href="{{ url_for('booking.bookings', username=current_user.username) }}">My Bookings</a></li>
          <li><a href="{{ url_for('user.logout') }}">Logout</a></li>
          {% endif %}
        </ul>
      </div>
    </div>

    <div class="navbar navbar-default navbar-fixed-bottom">
      <div class="container">
        <p class="text-ad" style="text-align:center;">Powered by <a href="https://www.openstack.org/" target="_blank">OpenStack</a>.&nbsp&nbsp&nbspHosted on <a href="https://www.citynetwork.eu/" target="_blank">City Network</a>.&nbsp&nbsp&nbspIn collaboration with <a href="https://www.est.tech/" target="_blank">Ericsson Software Technology</a>.</p>
      </div>
    </div>
  </nav>
{% endblock %}

{% block content %}
  <div class="jumbotron" style="background:white">
  </div>
    <div class="container">
      <div class="jumbotron">
        <center>
        <a href="https://www.nordix.org/" target="_blank">
        <img src="/static/images/nordix-logo.png" alt="https://www.nordix.org/" style="width:100px;height:100px;" />
        </a>
        <h2><b><font color="black">[nolabs]</font></b></h2>
        </center>
      </div>

        {% with messages = get_flashed_messages(with_categories=true) %}
        {% if messages %}
            {% for category, message in messages %}
            <div class="alert alert-{{ category }}" role="alert">{{ message }}</div>
            {% endfor %}
        {% endif %}
        {% endwith %}
        {# application content needs to be provided in the app_content block #}
        {% block app_content %}{% endblock %}
    </div>
{%- endblock %}
