<!DOCTYPE html>
<!--
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.
-->
<!-- Brooklyn SHA-1: GIT_SHA_1 -->
<html>
<head>
    <meta charset='utf-8'/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="Brooklyn Web Console (Javascript GUI)">

    <title>Brooklyn JS REST client</title>

    <link rel="stylesheet" href="/assets/css/styles.css">
    <link rel="stylesheet" href="/assets/css/brooklyn.css">
    <style>
        body {
            padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */
        }
    </style>

    <!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
    <!--[if lt IE 9]>
    <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
</head>
<body>

<div class="navbar navbar-fixed-top">
    <div class="navbar-inner">
        <div class="userName-top"><span id="user"></span> | <a href="/logout" id="logout-link">Log out</a></div>
        <div class="container">
            <a class="logo" href="#" title="Brooklyn, Version 0.8.1-SNAPSHOT"><!-- Logo added via CSS --></a> <!-- BROOKLYN_VERSION -->
            <div class="menubar-top">
                <ul class="nav">
                    <li><a href="#v1/home" class="nav1 nav1_home">Home</a></li>
                    <li><a href="#v1/applications" class="nav1 nav1_apps">Applications</a></li>
                    <li><a href="#v1/catalog" class="nav1 nav1_catalog">Catalog</a></li>
                    <li class="dropdown">
                        <a href="#" class="nav1 nav1_script dropdown-toggle" data-toggle="dropdown">Script</a>
                        <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
                            <li><a href="#v1/apidoc" class="nav1 nav1_apidoc">REST API</a></li>
                            <li><a href="#v1/script/groovy" class="nav1 nav1_groovy">Groovy</a></li>
                        </ul>
                    </li>
                    <li><a href="#v1/help" class="nav1 nav1_help"><b>?</b></a></li>
                </ul>
            </div>
        </div>
    </div>
</div>

<div id="main-content">
    <div id="application-content"></div>
    <div id="server-caution-overlay"></div>
</div>

<!-- load our code with require.js. data-main is replaced with optimised file at build -->
<script type="text/javascript" data-main="assets/js/config.js" src="assets/js/libs/require.js"></script>

</body>
</html>
