<!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.
  -->
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Qpid Management Login</title>
    <link rel="icon" type="image/png" href="images/qpid-favicon.png" />
    <link rel="stylesheet" href="dojo/dojo/resources/dojo.css">
    <link rel="stylesheet" href="dojo/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="css/common.css" media="screen">
    <script>
        function getContextPath()
        {
            var contextPath = "/";
            var documentURL = document.URL;
            var managementPageStart = documentURL.lastIndexOf("/");
            var firstSlashPos = documentURL.indexOf("/", documentURL.indexOf("//") + 2);
            if (managementPageStart > firstSlashPos)
            {
                contextPath = documentURL.substring(firstSlashPos, managementPageStart + 1);
            }
            return contextPath;
        }

        var dojoConfig = {
            tlmSiblingOfDojo: false,
            parseOnLoad: true,
            async: true,
            baseUrl: getContextPath(),
            packages: [
                {
                    name: "dojo",
                    location: "dojo/dojo"
                },
                {
                    name: "dijit",
                    location: "dojo/dijit"
                },
                {
                    name: "dojox",
                    location: "dojo/dojox"
                },
                {
                    name: "qpid",
                    location: "js/qpid"
                }
            ]
        };

    </script>
    <script src="dojo/dojo/dojo.js">
    </script>

    <script>
        require(["dijit/form/Button",
                 "dijit/layout/BorderContainer",
                 "dijit/layout/ContentPane",
                 "dijit/TitlePane",
                 "dojox/layout/TableContainer",
                 "qpid/common/footer"]);
    </script>

</head>
<body class="claro">

<div id="pageLayout" data-dojo-type="dijit.layout.BorderContainer" data-dojo-props="design: 'headline', gutters: false">
    <div data-dojo-type="dijit.layout.ContentPane" data-dojo-props="region:'top', isLayoutContainer:true">
        <div class="header"></div>
        <div id="login" style="float: right"></div>
    </div>
    <div data-dojo-type="dijit.layout.ContentPane" data-dojo-props="region:'center', isLayoutContainer:true">
        <div style="width:350px; margin-left: auto; margin-right: auto;">
            <div data-dojo-type="dijit.TitlePane" data-dojo-props="title:'Logout', toggleable: false" >
                <div class="dijitDialogPaneContentArea">
                    You have been successfully logged out.
                </div>
                <div class="dijitDialogPaneActionBar qpidDialogPaneActionBar">
                    <button data-dojo-type="dijit.form.Button" type="submit" id="logoutButton" onclick="window.location = 'index.html';">Login again</button>
                </div>
            </div>
        </div>
        <div data-dojo-type="dijit.layout.ContentPane" data-dojo-props="region:'bottom', isLayoutContainer:true">
            <div qpid-type="footer"></div>
        </div>
    </div>
</div>

</body>
</html>
