<!--
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 Entity - Server Pool</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>
        <li><a href="#sensors" data-toggle="tab">Sensors</a></li>
        <li><a href="#effectors" data-toggle="tab">Effectors</a></li>
      </ul>

      <div class="tab-content">
        <div class="tab-pane active" id="configKeys"></div>
        <div class="tab-pane" id="sensors"></div>
        <div class="tab-pane" id="effectors"></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.entities, "brooklyn.entity.pool.ServerPool");
            $("#summary").html(brooklyn.typeSummary(item));
            item.config.forEach(function (element) { $("#configKeys").append(brooklyn.configKeyCard(element)); });
            item.sensors.forEach(function (element) { $("#sensors").append(brooklyn.sensorCard(element)); });
            if (item.effectors != undefined) {
                item.effectors.forEach(function (element) { $("#effectors").append(brooklyn.effectorCard(element)); });
            }
        });
    </script>
  </body>
</html>
