## 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.


#if ( $data.getUser().hasLoggedIn() )
<nav class="w3-navbar w3-theme">
          <li><a  href="$link.setPage("Index.vm")">Home</a></li>
          <li class="w3-dropdown-hover">
            <a href="#">Administration <i class="fa fa-caret-down"></i></a>
            <div class="w3-dropdown-content w3-white w3-card-4">
              ## every user can change their password
               <a href="$link.setPage("Password.vm")">Update Password <i class="fa fa-unlock"></i></a>
          #if ( $data.getACL().hasRole("turbineadmin") )
              <a href="$link.setPage("user,FluxUserList.vm")">User List <div class="w3-right"><i class="fa fa-users"></i></div></a>
              <a href="$link.setPage("role,FluxRoleList.vm")">User Roles <div class="w3-right"><i class="fa fa-user-plus"></i></div></a>
              <a href="$link.setPage("user,FluxUserForm.vm")?mode=insert">Add User <div class="w3-right"><i class="fa fa-user"></i></div></a>
              #end
            </div>
          </li>
          #if ( $data.getACL().hasRole("turbineuser") )
          <li class="w3-dropdown-hover">
            <a href="#">Records <i class="fa fa-caret-down"></i></a>
            <div class="w3-dropdown-content w3-white w3-card-4">
               <a href="$link.setAction("ShowRecords")">Show Records <i class="fa fa-unlock"></i></a>
            </div>
          </li>
          #end
          
          <li class="w3-right"><a href="$link.setAction("LogoutUser")">Logout</a></li>
          
</nav>
#else
<nav class="w3-navbar w3-theme">
          <li><a  href="$link.setPage("Index.vm")">Home</a></li>
          <li class="w3-right"><a href="$link.setPage("Login.vm")">Login</a></li>
</nav>

#end
