{{!
* 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.
}}

<div id="main">
  <div id="top-nav">
    <div class="navbar navbar-static-top">
      <div class="navbar-inner">
        <div class="container">
          <a {{translateAttr href="topnav.logo.href"}} target="_blank"><img id="logo" src="/img/logo-small.gif"></a>
          <a class="brand" {{translateAttr href="topnav.logo.href"}} target="_blank">{{t app.name}}</a>
            {{#if App.router.loggedIn}}
              <a class="brand cluster-name" href="#">
                - {{clusterName}}
              </a>
            {{/if}}
          <ul class="nav">
            <li class="right"><a class="help" {{translateAttr href="topnav.help.href"}} target="_blank">Help</a></li>
            {{#if App.router.loggedIn}}
            <li class="right"><a class="help" href="" {{action logoff}}>Sign out</a></li>
            {{/if}}
            <li class="right">{{loginName}}</li>
          </ul>
        </div>
      </div>
    </div>
  </div>
  <div class="container">
    <div id="content">
      {{outlet}}
    </div>
  </div>
</div>


