<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        {% if page_description %}<meta name="description" content="{{ page_description }}">{% endif %}
        {% if site_author %}<meta name="author" content="{{ site_author }}">{% endif %}
        <!-- This is broken by doc revisioning.
        {% if canonical_url %}<link rel="canonical" href="{{ canonical_url }}">{% endif %} -->
        {% if favicon %}<link rel="shortcut icon" href="{{ favicon }}">
        {% else %}<link rel="shortcut icon" href="{{ base_url }}/img/favicon.ico">{% endif %}

	    <title>{% if page_title %}{{ page_title }} - {% endif %}{{ site_name }}</title>

        <link href="{{ base_url }}/css/bootstrap-3.0.3.min.css" rel="stylesheet">
        <link rel="stylesheet" href="{{ base_url }}/css/highlight.css">
        <link href="{{ base_url }}/css/base.css" rel="stylesheet">
        <link href="{{ base_url }}/css/custom.css" rel="stylesheet">
        <link href="{{ base_url }}/css/v2.css" rel="stylesheet">
        <link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
        {%- for path in extra_css %}
        <link href="{{ path }}" rel="stylesheet">
        {%- endfor %}

        <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
        <!--[if lt IE 9]>
            <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
            <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
        <![endif]-->

        {% if google_analytics %}
            <script>
                (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
                (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
                m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
                })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

                ga('create', '{{ google_analytics[0] }}', '{{ google_analytics[1] }}');
                ga('send', 'pageview');
            </script>
        {% endif %}
    </head>

{% if page_title != None %}
    <body class="{{ page_title }}">
{% else %}
    <body class="home">
{% endif %}

        {% include 'main-banner.html' %}

        {% include "nav.html" %}

        {% set full_width_page_titles = [None, 'Quick Start', 'About', 'Talks', 'Documentation', 'Download', 'Community', 'Events'] %}

        <div class="container">
            {% if page_title == None %}
                {% include "landing.html" %}
            {% elif meta and meta.html %}
                {% include meta.html[0] %}
            {% elif page_title == 'About' %}
                {% include "about.html" %}
            {% elif page_title == 'Talks' %}
                {% include "talks.html" %}
            {% elif page_title == 'Quick Start' %}
                {% include "quick-start.html" %}
            {% elif page_title == 'Documentation' %}
                {% include "documentation.html" %}
            {% elif page_title == 'Download' %}
                {% include "download.html" %}
            {% elif page_title == 'Community' %}
                {% include "community.html" %}
            {% elif page_title == 'Events' %}
                {% include "events.html" %}
            {% else %}
                <div class="row">
                    <div class="col-md-3 v2-sidebar sidebar-container">{% include "toc.html" %}</div>

                    <div class="col-md-9" role="main">
                        <div class="doc-header">
                            {% include 'breadcrumbs.html' %}
                        </div>
                        {% if config.extra.version != 'latest' and config.extra.version != 'develop' %}
                          {% for version in config.extra.versions %}
                            {% if config.extra.version == version.branch %}
                              <div class="alert alert-danger">
                                This is an old version of the documentation ({{ version.label }})!
                                <a href="/latest{{ page.abs_url }}">
                                   Click here to read the newest version.
                                </a>
                              </div>
                            {% endif %}
                          {% endfor %}
                        {% endif %}
                        {% block content %}
                            {{ content }}
                        {% endblock %}
                        <div class="row">
                            {% include 'next_prev_links.html' %}
                        </div>
                        {% include 'footer.html' %}
                    </div>
                </div>
            {% endif %}
            {% if page_title in full_width_page_titles or (meta and meta.html) %}
                {% include 'footer.html' %}
            {% endif %}
        </div>

        <script src="{{ base_url }}/js/jquery-1.10.2.min.js"></script>
        <script src="{{ base_url }}/js/bootstrap-3.0.3.min.js"></script>
        <script src="{{ base_url }}/js/highlight.pack.js"></script>
        <script src="{{ base_url }}/js/base.js"></script>
        <script src="{{ base_url }}/js/custom.js"></script>

        {%- for path in extra_javascript %}
            <script src="{{ path }}"></script>
        {%- endfor %}

    </body>
</html>
