[%# 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.
  #%]

[%# INTERFACE:
  # queryshare_groups: list of groups the user may share queries with
  #                    (id, name).
  # bless_group_ids: list of group ids the user may bless.
  #%]

[% IF user.can_bless %]
  <script type="text/javascript"><!--
    function update_checkbox(group) {
      var bless_groups = [[% bless_group_ids.join(",") FILTER js %]];
      var checkbox = document.getElementById(group.name.replace(/share_(\d+)/, "force_$1"));

      if (bz_isValueInArray(bless_groups, group.value)) {
        YAHOO.util.Dom.removeClass(checkbox.parentNode, "bz_default_hidden");
      } else {
        YAHOO.util.Dom.addClass(checkbox.parentNode, "bz_default_hidden");
        checkbox.checked = false;
      }
    } //-->
  </script>
[% END %]

<p>Your saved searches are as follows:</p>

  <table id="saved_search_prefs">
    <tr class="column_header">
      <th>Search</th>
      <th>Run</th>
      <th>Edit</th>
      <th>Forget</th>
      <th>Show in Footer</th>
      [% may_share = user.in_group(Param('querysharegroup')) && queryshare_groups.size %]
      [% IF may_share %]
        <th>Share With a Group</th>
      [% END %]
      [% Hook.process('saved-header') %]
    </tr>

    <tr>
      <td>My [% terms.Bugs %]</td>
      <td>
        [% filtered_username = user.login FILTER uri %]
        <a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">Run</a>
      </td>
      <td></td>
      <td></td>
      <td class="center">
        <input type="checkbox" name="showmybugslink" value="1"
               [%+ 'checked="checked"' IF user.showmybugslink %]>
      </td>
      [% IF may_share %]
        <td>&mdash;</td>
      [% END %]
      [% Hook.process('saved-row') %]
    </tr>

    [% FOREACH q = user.queries %]
      <tr [% 'class="shared_search"' IF q.shared_with_group.id %]>
        <td>[% q.name FILTER html %]</td>
        <td>
          <a href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=[% q.name FILTER uri %]
                   [% IF q.shared_with_group.id %]&amp;sharer_id=[% user.id FILTER uri %][% END %]">Run</a>
        </td>
        <td>
          <a href="query.cgi?[% q.edit_link FILTER html %]&amp;known_name=
                   [% q.name FILTER uri %]">Edit</a>
        </td>
        <td>
          [% IF q.used_in_whine %]
            Remove from <a href="editwhines.cgi">whining</a> first
          [% ELSE %]
            <a href="buglist.cgi?cmdtype=dorem&amp;remaction=forget&amp;namedcmd=
                     [% q.name FILTER uri %]&amp;token=
                     [% issue_hash_token([q.id, q.name]) FILTER uri %]">Forget</a>
          [% END %]
        </td>
        <td class="center">
          <input type="checkbox" 
                 name="link_in_footer_[% q.id FILTER html %]"
                 value="1"
                 alt="[% q.name FILTER html %]"
                 [% " checked" IF q.link_in_footer %]>
        </td>
        [% IF may_share %]
          <td>
            <select name="share_[% q.id FILTER html %]"
              [% IF user.can_bless %] onchange="update_checkbox(this);"[% END %]>
              <option value="">Don't share</option>
              [% FOREACH group = queryshare_groups %]
                <option value="[% group.id %]"
                        [% ' selected="selected"' 
                           IF q.shared_with_group.id == group.id %]
                >[% group.name FILTER html %]</option>
              [% END %]
            </select>
            [% IF q.shared_with_group.id %]
              (<a href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=
                 [% q.name FILTER uri %]&amp;sharer_id=
                 [% user.id FILTER uri %]">Link</a>)
            [% END %]
            [% IF user.can_bless %]
              <span [% IF !bless_group_ids.grep("^$q.shared_with_group.id\$").0
                     %]class="bz_default_hidden"[% END %]>
                <input type="checkbox" id="force_[% q.id FILTER html %]"
                       name="force_[% q.id FILTER html %]" value="1">
                <label for="force_[% q.id FILTER html %]">Add to footer</label>
              </span>
            [% END %]
            [% IF q.shared_with_users %]
              (shared with [% q.shared_with_users FILTER html %]
              [%+ q.shared_with_users > 1 ? "users" : "user" %])
            [% END %]
          </td>
        [% END %]
        [% Hook.process('saved-row') %]
      </tr>
    [% END %]
  </table>

[% IF user.can_bless %]
  <p>Note that for every search that has the "Add to footer" selected, a
     link to the shared search is added to the footer of every user that is
     a direct member of the group at the time you click Submit Changes.</p>
[% END %]

[% IF user.queries_available.size %]
  <p>You may use these searches saved and shared by others:</p>

  <table id="shared_search_prefs">
    <tr class="column_header">
      <th>Search</th>
      <th>Shared By</th>
      <th>Shared To</th>
      <th>Run</th>
      <th>Edit</th>
      <th>Show in Footer</th>
    </tr>

    [% FOREACH q = user.queries_available %]
      <tr>
        <td>[% q.name FILTER html %]</td>
        <td>[% q.user.identity FILTER html %]</td>
        <td>[% q.shared_with_group.name FILTER html %]</td>
        <td>
          <a href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=
                   [% q.name FILTER uri %]&amp;sharer_id=
                   [% q.user.id FILTER uri %]">Run</a>
        </td>
        <td>
          <a href="query.cgi?[% q.edit_link FILTER html %]&amp;known_name=
                   [% q.name FILTER uri %]">Edit</a>
        </td>
        <td class="center">
          <input type="checkbox" 
                 name="link_in_footer_[% q.id FILTER html %]"
                 value="1"
                 alt="[% q.name FILTER html %]"
                 [% " checked" IF q.link_in_footer %]>
        </td>
      </tr>
    [% END %]
  </table>
[% ELSE %]
  <p>No searches are shared with you by other users.</p>
[% END %]
