<!--
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="logging" class="clearfix">


  <div id="frame">

    <div class="block">
      <h2><span>{{watcher}}</span></h2>
      <ul class="tree jstree">
        <li class="jstree-leaf level-{{logger.level.toLowerCase()}}" ng-class="{'jstree-last':$last}" ng-repeat="logger in logging" ng-include="'logger.html'"></li>
      </ul>
    </div>
  </div>
</div>

  <script type="text/ng-template"  id="logger.html">
      <ins class="trigger jstree-icon">&nbsp;</ins>
      <a ng-click="toggleOptions(logger)" class="trigger {{logger.level.toLowerCase() }}" ng-class="{null:!logger.level, set: logger.set}" title="{{ logger.name }}" rel="{{logger.level}}">
        <span class="ns">{{logger.name}}</span>
        <span class="name" ng-show="logger.short">{{ logger.short }}</span>
        <span class="name" ng-show="!logger.short"><em>empty</em></span>
      </a>

      <div class="selector-holder" ng-class="{open:logger.showOptions}">
        <div class="selector">
          <a class="trigger" ng-click="toggleOptions(logger)"><span><em>{{logger.level || "null"}}</em></span></a>
          <div ng-show="logger.showOptions">
          <ul>
            <li ng-repeat="level in levels track by level.pos">
              <a ng-click="setLevel(logger, level.name)">{{level.name}}</a>
            </li>
            <li class="unset"><a ng-click="setLevel(logger, 'unset')">UNSET</a></li>
          </ul>
          <a class="close" ng-click="toggleOptions(logger)"><span>[x]</span></a>
          </div>
        </div>
      </div>
      <ul>
        <li class="jstree-leaf level-{{logger.level.toLowerCase()}}" ng-class="{'jstree-last':$last}" ng-repeat="logger in logger.children" ng-include="'logger.html'"></li>
      </ul>
  </script>
