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

[% filtered_desc = blocked_tree.$bugid.short_desc FILTER html %]
[% PROCESS global/header.html.tmpl
   title           = "Dependency tree for $terms.Bug $bugid"
   header          = "Dependency tree for 
                      <a href=\"show_bug.cgi?id=$bugid\">$terms.Bug $bugid</a>"
   javascript_urls = ["js/expanding-tree.js"]
   style_urls      = ["skins/standard/dependency-tree.css"]
   subheader      = filtered_desc
   doc_section = "hintsandtips.html#dependencytree"
%]

[% PROCESS depthControlToolbar %]
  
[% INCLUDE tree_section ids=dependson_ids type=1 %]
 
[% INCLUDE tree_section ids=blocked_ids type=2 %] 

[% PROCESS depthControlToolbar %]

[% PROCESS global/footer.html.tmpl %]

[%###########################################################################%]
[%# Tree-drawing blocks                                                     #%]
[%###########################################################################%]

[% BLOCK tree_section %]
  [%# INTERFACE
    #   - ids: a list of bug IDs to be displayed as children
    #   - type: the type of tree. 1 = depends on, 2 = blockeds
    # GLOBALS
    #   - seen: Maintains a global hash of bugs that have been displayed
    #%]
  [% global.seen = {} %]
  [%# Display the tree of bugs that this bug depends on. %]
  <h3>
    <a href="show_bug.cgi?id=[% bugid %]">[% terms.Bug %] [%+ bugid %]</a> 
    [% IF type == 1 %]
        [% tree_name = "dependson_tree" %]
        [% IF ids.size %]
            depends on 
        [% ELSE %]
            does not depend on any [% 'open ' IF hide_resolved %][% terms.bugs %].
        [% END %]
    [% ELSIF type == 2 %]
        [% tree_name = "blocked_tree" %]
        [% IF ids.size %] 
            blocks 
        [% ELSE %]
            does not block any [% 'open ' IF hide_resolved %][% terms.bugs %].
        [% END %]
    [% END %]
    [% IF ids.size %]
        [%+ (ids.size == 1) ? "one" : ids.size %]
        [%+ IF hide_resolved %]open[% END %]
        [%+ (ids.size == 1) ? terms.bug : terms.bugs %]:
    [% END %] 
  </h3>
  [% IF ids.size %]
    [%# 27 chars is the length of buglist.cgi?tweak=&bug_id=" %]
    [% use_post = (ids.join(",").length > constants.CGI_URI_LIMIT - 27 ) ? 1 : 0 %]
    [% IF use_post %]
      <form action="buglist.cgi" method="post">
      <input type="hidden" name="bug_id" value="[% ids.join(",") %]">
    [% END %]

    [% IF maxdepth -%]Up to [% maxdepth %] level[% "s" IF maxdepth > 1 %] deep | [% END -%]
    [% IF use_post %]
      <button>view as [% terms.bug %] list</button>
      [% IF user.in_group('editbugs') && ids.size > 1 %]
        | <button type="submit" name="tweak" value="1">change several</button>
      [% END %]
      </form>
    [% ELSE %]
      <a href="buglist.cgi?bug_id=[% ids.join(",") %]">view as [% terms.bug %] list</a>
      [% IF user.in_group('editbugs') && ids.size > 1 %]
        | <a href="buglist.cgi?bug_id=[% ids.join(",") %]&amp;tweak=1">change several</a>
      [% END %]
    [% END %]

    <ul class="tree">
      [% INCLUDE display_tree tree=$tree_name %]
    </ul>
  [% END %]
[% END %]


[% BLOCK display_tree %]
  [%# INTERFACE
    #   - bugid: the ID of the bug being displayed
    #   - tree: a hash of bug objects and of bug dependencies
    #%]
  [% bug = tree.$bugid %]
  <li>
    [%- INCLUDE bullet bugid=bugid tree=tree -%]
    <span class="summ[% "_deep" IF tree.dependencies.$bugid.size %]" 
          id="[% bugid FILTER html %]" 
          [% IF global.seen.$bugid %]
            onMouseover="duplicatedover('[% bugid FILTER html %]')"
            onMouseout="duplicatedout('[% bugid FILTER html %]')"
          [% END %]>
      [%- INCLUDE buglink bug=bug bugid=bugid %]
    </span>
    [% IF global.seen.$bugid %]
      <b><a title="Already displayed above; click to locate"
            onclick="duplicated('[% bugid FILTER html %]')"
            href="#b[% bugid %]">(*)</a></b>
    [% ELSIF tree.dependencies.$bugid.size %]
      <ul>
        [% FOREACH depid = tree.dependencies.$bugid %]
          [% INCLUDE display_tree bugid=depid %]
        [% END %]
      </ul>
    [% END %]
  </li>
  [% global.seen.$bugid = 1 %]
[% END %]

[% BLOCK bullet %]
  [% IF tree.dependencies.$bugid.size && ! global.seen.$bugid %]
    [% extra_class = " b_open" %]
    [% extra_args = 'onclick="return doToggle(this, event)"' %] 
  [% END %]
  <a id="b[% bugid %]" 
     class="b [%+ extra_class FILTER none %]"
     title="Click to expand or contract this portion of the tree. Hold down the Ctrl key while clicking to expand or contract all subtrees."
     [% extra_args FILTER none %]>&nbsp;&nbsp;</a>
[% END %]

[% BLOCK buglink %]
  [% isclosed = !bug.isopened %]
  [% FILTER closed(isclosed) -%]
    <a title="[% INCLUDE buginfo bug=bug %]"
       href="show_bug.cgi?id=[% bugid %]">
      <b>[%- bugid %]:</b>
      <span class="summ_text">[%+ bug.short_desc FILTER html %]</span>
      <span class="summ_info">[[% INCLUDE buginfo %]]</span>
    </a>
    <a href="showdependencytree.cgi?id=[% bugid FILTER uri %]"
       class="tree_link">
      <img src="skins/standard/dependency-tree/tree.png"
           title="See dependency tree for [% terms.bug %] [%+ bugid FILTER html %]">
    </a>
  [% END %]
[% END %]

[% BLOCK buginfo %]
  [% display_value("bug_status", bug.bug_status) FILTER html -%]
  [%- IF bug.resolution %] [%+ display_value("resolution", bug.resolution) FILTER html %][% END %];
  [%-%] assigned to [% bug.assigned_to.login FILTER email FILTER html %]
  [% IF Param("usetargetmilestone") AND bug.target_milestone %]
    [%-%]; target: [% bug.target_milestone FILTER html %]
  [% END %]
[% END %]

[%###########################################################################%]
[%# Block for depth control toolbar                                         #%]
[%###########################################################################%]

[% BLOCK depthControlToolbar %]
 <table cellpadding="3" border="0" cellspacing="0" bgcolor="#e0e0e0">
   <tr>
   [%# Hide/show resolved button
       Swaps text depending on the state of hide_resolved %]
   <td align="center">
   <form method="get" action="showdependencytree.cgi"
           style="display: inline; margin: 0px;">
     <input name="id" type="hidden" value="[% bugid %]">
     [% IF maxdepth %]
       <input name="maxdepth" type="hidden" value="[% maxdepth %]">
     [% END %]
     <input type="hidden" name="hide_resolved" value="[% hide_resolved ? 0 : 1 %]">
     <input type="submit" id="toggle_visibility"
            value="[% IF hide_resolved %]Show[% ELSE %]Hide[% END %] Resolved">
   </form>
   </td>

   <td>
     Max Depth:
   </td>

   <td>
     &nbsp;
   </td>

   <td>
   <form method="get" action="showdependencytree.cgi"
         style="display: inline; margin: 0px;">
     [%# set to one form %]
     <input type="submit" id="change_maxdepth"
       value="&nbsp;1&nbsp;" 
       [% "disabled" IF realdepth < 2 || maxdepth == 1 %]>
     <input name="id" type="hidden" value="[% bugid %]">
     <input name="maxdepth" type="hidden" value="1">
     <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
   </form>
   </td>

   <td>
   <form method="get" action="showdependencytree.cgi"
         style="display: inline; margin: 0px;">
     [%# Minus one form
         Allow subtracting only when realdepth and maxdepth > 1 %]
     <input name="id" type="hidden" value="[% bugid %]">
     <input name="maxdepth" type="hidden" value="[%
         maxdepth == 1 ? 1
                       : ( maxdepth ? maxdepth - 1 : realdepth - 1 )
     %]">
     <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
     <input type="submit" id="decrease_depth" value="&nbsp;&lt;&nbsp;"
       [% "disabled" IF realdepth < 2 || ( maxdepth && maxdepth < 2 ) %]>
   </form>
   </td>

   <td>
   <form method="get" action="showdependencytree.cgi"
         style="display: inline; margin: 0px;">
     [%# Limit entry form: the button cannot do anything when total depth
         is less than two, so disable it %]
     <input name="maxdepth" size="4" maxlength="4" value="[%
         maxdepth > 0 && maxdepth <= realdepth ? maxdepth : ""
     %]">
     <input name="id" type="hidden" value="[% bugid %]">
     <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
     <noscript>
       <input type="submit" id="change_depth" value="Change"
              [% "disabled" IF realdepth < 2 %]>
     </noscript>
   </form>
   </td>

   <td>
   <form method="get" action="showdependencytree.cgi"
         style="display: inline; margin: 0px;">
     [%# plus one form
         Disable button if total depth < 2, or if depth set to unlimited %]
     <input name="id" type="hidden" value="[% bugid %]">
     [% IF maxdepth %]
       <input name="maxdepth" type="hidden" value="[% maxdepth + 1 %]">
     [% END %]
     <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
     <input type="submit" id="increase_depth" value="&nbsp;&gt;&nbsp;" 
        [% "disabled" IF realdepth < 2 || !maxdepth || maxdepth >= realdepth %]>
   </form>
   </td>

   <td>
   <form method="get" action="showdependencytree.cgi"
         style="display: inline; margin: 0px;">
     [%# Unlimited button %]
     <input name="id" type="hidden" value="[% bugid %]">
     <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
     <input type="submit" id="remove_limit"
       value="&nbsp;Unlimited&nbsp;"
       [% "disabled" IF maxdepth == 0 || maxdepth == realdepth %]>
   </form>
   </td>
 </tr>
</table>

[% END %]
