<!-- Navigation -->
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
    <div class="container topnavlinks">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>

            <a class="fa fa-home fa-lg navbar-brand" href="../docs/home.html">&nbsp;<span class="projectTitle"> {{site.topnav_title}}</span></a>

        </div>
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right">
                <!-- entries without drop-downs appear here -->
                <!-- conditional logic to control which topnav appears for the audience defined in the configuration file.-->
                {% include custom/conditions.html %}
                <li class="dropdown">
                    {% for entry in githubrepos_dropdowns %}
                    {% for subcategory in entry.subcategories %}
                    {% if subcategory.audience contains audience and subcategory.product contains product and subcategory.platform contains platform and subcategory.version contains version and subcategory.output contains "web" %}
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ subcategory.title }}<b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        {% for subitem in subcategory.items %}
                        {% if subitem.audience contains audience and subitem.product contains product and subitem.platform contains platform and subcategory.version contains version and subitem.output contains "web" %}
                        {% if subitem.external_url %}
                        <li><a href="{{subitem.external_url}}" target="_blank">{{subitem.title}}</a></li>
                        {% elsif page.url contains subitem.url %}
                        <li class="dropdownActive"><a href="{{subitem.url}}">{{subitem.title}}</a></li>
                        {% else %}
                        <li><a href="{{subitem.url | replace: "/",""}}">{{subitem.title}}</a></li>
                        {% endif %}
                        {% endif %}
                        {% endfor %}
                        {% endif %}

                    </ul>
                </li>
                {% endfor %}
                {% endfor %}


                <li class="dropdown">
                    {% for entry in javadoc_dropdowns %}
                    {% for subcategory in entry.subcategories %}
                    {% if subcategory.audience contains audience and subcategory.product contains product and subcategory.platform contains platform and subcategory.version contains version and subcategory.output contains "web" %}
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ subcategory.title }}<b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        {% for subitem in subcategory.items %}
                        {% if subitem.audience contains audience and subitem.product contains product and subitem.platform contains platform and subcategory.version contains version and subitem.output contains "web" %}
                        {% if subitem.external_url %}
                        <li><a href="{{subitem.external_url}}" target="_blank">{{subitem.title}}</a></li>
                        {% elsif page.url contains subitem.url %}
                        <li class="dropdownActive"><a href="{{subitem.url}}">{{subitem.title}}</a></li>
                        {% else %}
                        <li><a href="{{subitem.url | replace: "/",""}}">{{subitem.title}}</a></li>
                        {% endif %}
                        {% endif %}
                        {% endfor %}
                        {% endif %}

                    </ul>
                </li>
                {% endfor %}
                {% endfor %}


                <!-- entries with drop-downs appear here -->
                <!-- conditional logic to control which topnav appears for the audience defined in the configuration file.-->

                <li class="dropdown">
                    {% for entry in topnav_dropdowns %}
                    {% for subcategory in entry.subcategories %}
                    {% if subcategory.audience contains audience and subcategory.product contains product and subcategory.platform contains platform and subcategory.version contains version and subcategory.output contains "web" %}
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ subcategory.title }}<b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        {% for subitem in subcategory.items %}
                        {% if subitem.audience contains audience and subitem.product contains product and subitem.platform contains platform and subcategory.version contains version and subitem.output contains "web" %}
                        {% if subitem.external_url %}
                        <li><a href="{{subitem.external_url}}" target="_blank">{{subitem.title}}</a></li>
                        {% elsif page.url contains subitem.url %}
                        <li class="dropdownActive"><a href="{{subitem.url}}">{{subitem.title}}</a></li>
                        {% else %}
                        <li><a href="{{subitem.url | replace: "/",""}}">{{subitem.title}}</a></li>
                        {% endif %}
                        {% endif %}
                        {% endfor %}
                        {% endif %}

                    </ul>
                </li>
                {% endfor %}
                {% endfor %}


                <!-- special insertion -->

               {% if site.project == "mydoc_designers" or site.project == "mydoc_writers" %}
                {% comment %}
                {% include custom/mydoc/custom_menu.html %}
                {% endcomment %}
                {% endif %}
                {% include feedback.html %}

                <!--uncomment this block if you want simple search instead of algolia-->
                <li>
                     <!--start search-->
                    <div id="search-demo-container">
                        <input type="text" id="search-input" placeholder="{{site.data.strings.search_placeholder_text}}">
                        <ul id="results-container"></ul>
                    </div>
                    <script src="../js/jekyll-search.js" type="text/javascript"></script>
                    <script type="text/javascript">
                        SimpleJekyllSearch.init({
                            searchInput: document.getElementById('search-input'),
                            resultsContainer: document.getElementById('results-container'),
                            dataSource: '../search.json',
                            searchResultTemplate: '<li><a href="{url}" title="{{page.title | replace: "'", "\"}}">{title}</a></li>',
                        noResultsText: '{{site.data.strings.search_no_results_text}}',
                                limit: 10,
                                fuzzy: true,
                        })
                    </script>
                     <!--end search-->
                </li>

            {% comment %}
                {% include frameescape.html %}
                {% endcomment %}
        </div>
        <!-- /.container -->
</nav>
