<div metal:define-macro="appyNavigate" tal:condition="python: totalNumber &gt; batchSize" tal:attributes="align dright">
  <tal:comment replace="nothing">
     Buttons for navigating among a list of elements (next, back, first, last, etc).
  </tal:comment>
  <table class="listNavigate"
         tal:define="mustSortAndFilter  python: ajaxHookId == 'queryResult';
                     sortKey            sortKey|python:'';
                     sortOrder          sortOrder|python:'';
                     filterKey          filterKey|python:'';
                     sortAndFilter      python: test(mustSortAndFilter, ',\'%s\',\'%s\',\'%s\'' % (sortKey, sortOrder, filterKey), '')">
    <tr valign="middle">
      <tal:comment replace="nothing">Go to the first page</tal:comment>
      <td tal:condition="python: (startNumber != 0) and (startNumber != batchSize)"><img style="cursor:pointer"
          tal:attributes="src string: $appUrl/ui/arrowLeftDouble.png;
                        title python: _('goto_first');
                        onClick python: navBaseCall.replace('**v**', '0'+sortAndFilter)"/></td>
      <tal:comment replace="nothing">Go to the previous page</tal:comment>
      <td tal:define="sNumber python: startNumber - batchSize"
          tal:condition="python: startNumber != 0"><img style="cursor:pointer"
          tal:attributes="src string: $appUrl/ui/arrowLeftSimple.png;
                          title python: _('goto_previous');
                          onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
      <tal:comment replace="nothing">Explain which elements are currently shown</tal:comment>
      <td class="discreet">&nbsp;
        <span tal:replace="python: startNumber+1"/>
        <img tal:attributes="src string: $appUrl/ui/to.png"/>
        <span tal:replace="python: startNumber+len(objs)"/>&nbsp;<b>//</b>
        <span tal:replace="python: totalNumber"/>&nbsp;&nbsp;
      </td>
      <tal:comment replace="nothing">Go to the next page</tal:comment>
      <td tal:define="sNumber python: startNumber + batchSize"
          tal:condition="python: sNumber &lt; totalNumber"><img style="cursor:pointer"
          tal:attributes="src string: $appUrl/ui/arrowRightSimple.png;
                          title python: _('goto_next');
                          onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
      <tal:comment replace="nothing">Go to the last page</tal:comment>
      <td tal:define="lastPageIsIncomplete python: totalNumber % batchSize;
                    nbOfCompletePages python: totalNumber/batchSize;
                    nbOfCountedPages python: test(lastPageIsIncomplete, nbOfCompletePages, nbOfCompletePages-1);
                    sNumber python: (nbOfCountedPages*batchSize)"
          tal:condition="python: (startNumber != sNumber) and (startNumber != sNumber-batchSize)"><img style="cursor:pointer"
          tal:attributes="src string: $appUrl/ui/arrowRightDouble.png;
                          title python: _('goto_last');
                          onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
    </tr>
  </table>
</div>

<div metal:define-macro="objectNavigate" tal:condition="request/nav|nothing">
  <tal:comment replace="nothing">
     Buttons for going to next/previous elements if this one is among bunch of referenced or searched objects.
     currentNumber starts with 1.
  </tal:comment>
  <table class="objectNavigate"
         tal:define="navInfo   tool/getNavigationInfo;
                 currentNumber navInfo/currentNumber;
                 totalNumber   navInfo/totalNumber;
                 firstUrl      navInfo/firstUrl;
                 previousUrl   navInfo/previousUrl;
                 nextUrl       navInfo/nextUrl;
                 lastUrl       navInfo/lastUrl;
                 sourceUrl     navInfo/sourceUrl;
                 backText      navInfo/backText">
    <tr valign="middle">
      <tal:comment replace="nothing">Go to the source URL (search or referred object)</tal:comment>
      <td tal:condition="sourceUrl"><a tal:attributes="href sourceUrl"><img
          tal:attributes="src string: $appUrl/ui/gotoSource.png;
                          title python: backText + ' : ' + _('goto_source')"/></a></td>
      <tal:comment replace="nothing">Go to the first page</tal:comment>
      <td tal:condition="firstUrl"><a tal:attributes="href firstUrl"><img
          tal:attributes="src string: $appUrl/ui/arrowLeftDouble.png;
                          title python: _('goto_first')"/></a></td>
      <tal:comment replace="nothing">Go to the previous page</tal:comment>
      <td tal:condition="previousUrl"><a tal:attributes="href previousUrl"><img
          tal:attributes="src string: $appUrl/ui/arrowLeftSimple.png;
                          title python: _('goto_previous')"/></a></td>
      <tal:comment replace="nothing">Explain which element is currently shown</tal:comment>
      <td class="discreet">&nbsp;
        <span tal:replace="python: currentNumber"/>&nbsp;<b>//</b>
        <span tal:replace="python: totalNumber"/>&nbsp;&nbsp;
      </td>
      <tal:comment replace="nothing">Go to the next page</tal:comment>
      <td tal:condition="python: nextUrl"><a tal:attributes="href nextUrl"><img
          tal:attributes="src string: $appUrl/ui/arrowRightSimple.png;
                          title python: _('goto_next')"/></a></td>
      <tal:comment replace="nothing">Go to the last page</tal:comment>
      <td tal:condition="lastUrl"><a tal:attributes="href lastUrl"><img
          tal:attributes="src string: $appUrl/ui/arrowRightDouble.png;
                          title python: _('goto_last')"/></a></td>
    </tr>
  </table>
</div>

<tal:comment replace="nothing">
   This macro displays up/down arrows in a table header column for sorting a given column.
   It requires variables "sortable", 'filterable' and 'fieldName'.
</tal:comment>
<metal:sortAndFilter define-macro="sortAndFilter" tal:define="fieldName widget/name">
  <tal:sort condition="sortable">
  <img tal:attributes="src string: $appUrl/ui/sortDown.gif;
                       onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'asc\',\'%s\'' % (fieldName, filterKey))"
       tal:condition="python: (sortKey != fieldName) or (sortOrder == 'desc')"
       style="cursor:pointer"/>
  <img tal:attributes="src string: $appUrl/ui/sortUp.gif;
                       onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'desc\',\'%s\'' % (fieldName, filterKey))"
       tal:condition="python: (sortKey != fieldName) or (sortOrder == 'asc')"
       style="cursor:pointer"/>
  </tal:sort>
  <tal:filter condition="filterable">
    <input type="text" size="7"
           tal:attributes="id python: '%s_%s' % (ajaxHookId, fieldName);
                           value python: test(filterKey == fieldName, filterValue, '')"/>
    <img tal:attributes="src string: $appUrl/ui/funnel.png;
                         onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'%s\',\'%s\'' % (sortKey, sortOrder, fieldName))"
         style="cursor:pointer"/>
  </tal:filter>
</metal:sortAndFilter>