<!--
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="plugins" class="clearfix">

  <div id="frame">
      <ul>
      <li class="entry" ng-class="{changed: plugin.changed}" ng-repeat="plugin in type.plugins">
        <a ng-click="selectPlugin(plugin)">
          <span>{{ plugin.name }}</span>
        </a>
        <ul class="detail" ng-show="plugin.open">
          <li ng-repeat="(key, value) in plugin.properties" ng-class="{odd: $odd}">
            <dl class="clearfix">
              <dt>{{ key }}:</dt>
              <!--<dd ng-repeat="v in value">{{v}}</dd><!-- is AN ARRAY!!-->
              <dd>{{value}}</dd>
            </dl>
          </li>
          <li class="stats clearfix" ng-show="plugin.stats">
            <span>stats:</span>
            <ul>
              <li ng-repeat="(key, value) in plugin.stats" ng-class="{odd: $odd}">
                  <dl class="clearfix">
                      <dt>{{key}}:</dt>
                      <dd>{{value}}</dd>
                  </dl>
              </li>
            </ul>
          </li>
        </ul>
      </ul>
  </div>

  <div id="navigation" class="clearfix">

    <ul>
        <li ng-repeat="type in types" class="{{type.lower}}">
            <a ng-click="selectPluginType(type)" rel="{{type.name}}">{{type.name}}
                <span ng-show="type.changes">{{type.changes}}</span>
            </a>
        </li>
        <li class="PLUGINCHANGES"><a ng-click="startRecording()">Watch Changes</a></li>
        <li class="RELOAD"><a ng-click="refresh()">Refresh Values</a></li>
    </ul>
  
  </div>

  <div id="recording" ng-show="isRecording">
    <div class="wrapper clearfix">

      <p class="loader">Watching for Changes</p>
      <button class="primary" ng-click="stopRecording()">Stop &amp; Show Changes</button>

    </div>
    <div id="blockUI"></div>
  </div>

</div>
