{#-
       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>
  {% if limit %}
  <div>
    {% set cur_page = page / limit %}
    {% set num_pages = count / limit %}
    <div class="span-3">Page {{1 + cur_page}} of {{1 + num_pages}}</div>
    <div class="span-16 tright last" id="discuss">
      {% if num_pages and cur_page > 0 %}
        <a href="?page={{page - limit}}">&larr; Prev</a>
      {% endif %}
      {% if num_pages and cur_page < num_pages %}
      <a href="?page={{page + limit}}">Next &rarr;</a>
      {% endif %}
    </div>
  </div>
  {% endif %}
  {% if show_moderate and h.has_access(value, 'moderate') %}
  <div class="title-pane closed">
    <span class="title">Moderate thread</span>
    <div class="content">
      {{widgets.moderate_thread.display(value=value, action=value.url()+'moderate')}}
    </div>
  </div>
  {% endif %}
</div>
