<!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' and config.extra.version != 'master' %}
                          {% for version in config.extra.versions %}
                            {% if config.extra.version == version.dir %}
                              <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>
