<!--
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="viewer">
    <div class="block">
      <h2><span>{{watcher}}</span></h2>
    </div>
    <table class="has-data" border="0" cellpadding="0" cellspacing="0">
      <thead>
        <tr>
          <th class="time">Time (<span>{{timezone}}</span>)</th>
          <th class="level">Level</th>
          <th class="core">Core</th>
          <th class="logger">Logger</th>
          <th class="message">Message</th>
        </tr>
      </thead>
      <tbody ng-repeat="event in events">
        <tr ng-click="toggleRow(event)" class="{{event.trace ? 'has-trace': ''}} {{'level-'+event.level.toLowerCase()}}">
          <td class="span"><a><span>{{ timezone == "UTC" ? event.utc_time : event.local_time }}</span></a></td>
          <td class="level span"><a><span>{{ event.level }} {{event.showTrace}}</span></span></a></td>
          <td class="span"><a><span>{{ event.core }}</span></a></td>
          <td class="span"><a><span><abbr title="{{event.logger}}">{{event.loggerBase}}</abbr></span></a></td>
          <td class="message span"><a><span>{{ event.message }}</span></a></td>
        </tr>
        <tr class="trace" ng-show="event.showTrace && event.trace">
          <td colspan="4"><pre>{{event.trace}}</pre></td>
        </tr>
      </tbody>
      <tfoot>
        <tr ng-show="events.length==0">
          <td colspan="4">No Events available</td>
        </tr>
      </thead>
    </table>
    <div id="footer" class="clearfix">
      <div id="state" class="loader">Last Check: {{sinceDisplay}}</div>
      <div id="date-format" ng-click="toggleTimezone()"><a ng-class="{on: timezone=='UTC'}">Show dates in UTC</a></div>
    </div>
  </div>
</div>
