<%-- /*
 * 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.
 */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
<nav class="menu" aria-label="${sling:encode(properties.title,'HTML_ATTR')}">
    <a class="menu-label toggle-hidden toggle-${fn:replace(properties.title,' ','-')}" data-target="#${fn:replace(properties.title,' ','-')}-nav">
        <sling:encode value="${properties.title}" mode="HTML" />
    </a>
    <c:set var="hidden" value="is-hidden" />
    <c:forEach var="item" items="${sling:listChildren(sling:getRelativeResource(resource,'links'))}">
        <c:if test="${fn:startsWith(slingRequest.requestURI,item.valueMap.link)}">
            <c:set var="hidden" value="" />
        </c:if>
        <c:forEach var="alternative" items="${item.valueMap.alternatives}">
            <c:if test="${fn:startsWith(slingRequest.requestURI,alternative)}">
                <c:set var="hidden" value="" />
            </c:if>
        </c:forEach>
    </c:forEach>
    <sling:adaptTo var="currentUser" adaptable="${slingRequest.resourceResolver}" adaptTo="org.apache.sling.cms.AuthorizableWrapper" />
    <ul id="${fn:replace(properties.title,' ','-')}-nav" class="menu-list ${hidden}">
        <c:forEach var="item" items="${sling:listChildren(sling:getRelativeResource(resource,'links'))}">
            <c:set var="selected" value="" />
            <c:if test="${fn:startsWith(slingRequest.requestURI,item.valueMap.link)}">
                <c:set var="selected" value="is-active" />
            </c:if>
            <c:forEach var="alternative" items="${item.valueMap.alternatives}">
                <c:if test="${fn:startsWith(slingRequest.requestURI,alternative)}">
                    <c:set var="selected" value="is-active" />
                </c:if>
            </c:forEach>
            <c:set var="enabled" value="${currentUser.administrator || empty item.valueMap.enabledGroups}" />
            <c:if test="${not empty item.valueMap.enabledGroups && !currentUser.administrator}">
                <c:set var="enabled" value="${false}" />
                <c:forEach var="group" items="${item.valueMap.enabledGroups}">
                    <c:forEach var="userGroup" items="${currentUser.groupNames}">
                        <c:if test="${group == userGroup}">
                            <c:set var="enabled" value="${true}" />
                        </c:if>
                    </c:forEach>
                </c:forEach>
            </c:if>
            <c:if test="${enabled}">
                <li><a href="${item.valueMap.link}" class="${selected} nav-link-${fn:replace(item.valueMap.text,' ','-')}">${item.valueMap.text}</a></li>
            </c:if>
        </c:forEach>
    </ul>
</nav>
