[%# This Source Code Form is subject to the terms of the Mozilla Public
  # License, v. 2.0. If a copy of the MPL was not distributed with this
  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
  #
  # This Source Code Form is "Incompatible With Secondary Licenses", as
  # defined by the Mozilla Public License, v. 2.0.
  #%]

[% RETURN IF !bug %]

[% IF bottom_navigator == 1 %]
  <ul class="related_actions">
    <li><a href="show_bug.cgi?format=multiple&amp;id=
                [% bug.bug_id FILTER uri %]">Format For Printing</a></li>
    <li>&nbsp;-&nbsp;<a href="show_bug.cgi?ctype=xml&amp;id=
                        [% bug.bug_id  FILTER uri %]">XML</a></li>
    <li>&nbsp;-&nbsp;<a href="enter_bug.cgi?cloned_bug_id=
                        [% bug.bug_id  FILTER uri %]">Clone This 
                        [% terms.Bug %]</a></li>
    [%# Links to more things users can do with this bug. %]
    [% Hook.process("links") %]
    <li>&nbsp;-&nbsp;<a href="#">Top of page </a></li>
    </ul>
[% END %]

[% SET my_search = user.recent_search_for(bug) %]
[% IF my_search %]
  <div class="navigation">
  [% SET last_bug_list = my_search.bug_list %]
  [% SET this_bug_idx = lsearch(last_bug_list, bug.id) %]
  <b>[% terms.Bug %] List:</b>

  ([% this_bug_idx + 1 %] of [% last_bug_list.size %])

  [% IF this_bug_idx > 0 %]
    <a href="show_bug.cgi?id=
             [%- last_bug_list.first FILTER uri %]&amp;list_id=
[%# if WEBKIT_CHANGES %]
             [%- my_search.id FILTER uri %]">|&laquo;&nbsp;First</a>
[%# endif // WEBKIT_CHANGES %]
  [% ELSE %]
[%# if WEBKIT_CHANGES %]
    <span class="navigation_link">|&laquo;&nbsp;First</span>
[%# endif // WEBKIT_CHANGES %]
  [% END %]

  [% IF this_bug_idx + 1 < last_bug_list.size %]
    <a href="show_bug.cgi?id=
             [%- last_bug_list.last FILTER uri %]&amp;list_id=
[%# if WEBKIT_CHANGES %]
             [%- my_search.id FILTER uri %]">Last&nbsp;&raquo;|</a>
[%# endif // WEBKIT_CHANGES %]
  [% ELSE %]
[%# if WEBKIT_CHANGES %]
    <span class="navigation_link">Last&nbsp;&raquo;|</span>
[%# endif // WEBKIT_CHANGES %]
  [% END %]

  [% IF this_bug_idx > 0 %]
    [% prev_bug = this_bug_idx - 1 %]
    <a href="show_bug.cgi?id=
             [%- last_bug_list.$prev_bug FILTER uri %]&amp;list_id=
[%# if WEBKIT_CHANGES %]
             [%- my_search.id FILTER uri %]">&laquo;&nbsp;Prev</a>
[%# endif // WEBKIT_CHANGES %]
  [% ELSE %]
[%# if WEBKIT_CHANGES %]
    <span class="navigation_link">&laquo;&nbsp;Prev</span>
[%# endif // WEBKIT_CHANGES %]
  [% END %]

  [% IF this_bug_idx + 1 < last_bug_list.size %]
    [% next_bug = this_bug_idx + 1 %]
    <a href="show_bug.cgi?id=
             [%- last_bug_list.$next_bug FILTER uri %]&amp;list_id=
[%# if WEBKIT_CHANGES %]
             [%- my_search.id FILTER uri %]">Next&nbsp;&raquo;</a>
[%# endif // WEBKIT_CHANGES %]
  [% ELSE %]
[%# if WEBKIT_CHANGES %]
    <span class="navigation_link">Next&nbsp;&raquo;</span>
[%# endif // WEBKIT_CHANGES %]
  [% END %]

  &nbsp;&nbsp;<a href="buglist.cgi?regetlastlist=
              [%- my_search.id FILTER uri %]">Show last search results</a>
  </div>
[% END %]
