<!--
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 xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title>Brooklyn Policy - Service Restarter</title>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="../items.css" type="text/css" media="screen"/>
  </head>
  <body>
    <div id="container">
      <div id="header">
        <div id="identity">
          <a href="http://brooklyncentral.github.com/" rel="home">Brooklyn</a>
        </div>
      </div>

      <div id="summary"></div>

      <ul class="nav nav-tabs">
        <li class="active"><a href="#configKeys" data-toggle="tab">Config Keys</a></li>
      </ul>

      <div class="tab-content">
        <div id="configKeys"></div>
      </div>

    </div>

    <script src="../../../style/js/underscore-min.js" type="text/javascript"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
    <script src="../common.js" type="text/javascript"></script>
    <script src="../items.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            var item = brooklyn.findItemOfType(items.policies, "brooklyn.policy.ha.ServiceRestarter");
            $("#summary").html(brooklyn.typeSummary(item));
            item.config.forEach(function (element) { $("#configKeys").append(brooklyn.configKeyCard(element)); });
        });
    </script>
  </body>
</html>
