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

[%# Define strings that will serve as the title and header of this page %]
[% title = BLOCK %]
  Attachment [% attachment.id %] Details for [% terms.Bug %] [%+ attachment.bug_id %]
  &ndash; [% attachment.description FILTER html %]
[% END %]
[% header = BLOCK %]
  Attachment [% attachment.id %] Details for
  [%+ "$terms.Bug ${attachment.bug_id}" FILTER bug_link(attachment.bug_id) FILTER none %]
[% END %]
[% subheader = BLOCK %][% attachment.bug.short_desc FILTER html %][% END %]

[% PROCESS global/header.html.tmpl
  title = title
  header = header
  subheader = subheader
  generate_api_token = 1
  doc_section = "using/editing.html#attachments"
  javascript_urls = ['js/attachment.js', 'js/field.js']
  style_urls = ['skins/standard/bug.css']
  yui = [ 'autocomplete' ]
  bodyclasses = "no_javascript"
%]

[%# No need to display the Diff button and iframe if the attachment is not a patch. %]
[% use_patchviewer = (feature_enabled('patch_viewer') && attachment.ispatch) ? 1 : 0 %]
[% can_edit = attachment.validate_can_edit %]
[% editable_or_hide = can_edit ? "" : " bz_hidden_option" %]

<script src="[% 'js/status-bubble.js' FILTER mtime %]"></script>
<script>
  window.addEventListener('message', handleStatusBubbleMessage, false);
</script>

<form method="post" action="attachment.cgi" onsubmit="normalizeComments();">
  <input type="hidden" name="id" value="[% attachment.id %]">
  <input type="hidden" name="action" value="update">
  <input type="hidden" name="contenttypemethod" value="manual">
  <input type="hidden" name="delta_ts" value="[% attachment.modification_time FILTER html %]">
  [% IF user.id %]
    <input type="hidden" name="token" value="[% issue_hash_token([attachment.id, attachment.modification_time]) FILTER html %]">
  [% END %]

  <div id="attachment_info" class="attachment_info [% IF can_edit %] edit[% ELSE %] read[% END%]">
    <div id="attachment_attributes">
      <div id="attachment_information_read_only" class="[% "bz_private" IF attachment.isprivate %]">
        <div class="title">
          [% "[patch]" IF attachment.ispatch%] 
          <span class="[% "bz_obsolete" IF attachment.isobsolete %]" title="[% "obsolete" IF attachment.isobsolete %]">              
            [% attachment.description FILTER html %]
          </span>
          [% IF can_edit %]
            <span class="bz_edit">(<a href="javascript:toggle_attachment_details_visibility()">edit details</a>)</span>
          [% END %]
        </div>
        <div class="details">
          [% attachment.filename FILTER html %] ([% attachment.contenttype FILTER html %]),
          [% IF attachment.datasize %]
            [%+ attachment.datasize FILTER unitconvert %]
          [% ELSE %]
            <em>deleted</em>
          [% END %], created by [%+ INCLUDE global/user.html.tmpl who = attachment.attacher %] on [%+ attachment.attached FILTER time %]
          [% IF attachment.isprivate %];
            <span class="bz_private">only visible to <strong>[% Param('insidergroup') FILTER html %]</strong> members</span>
          [% END %]
        </div>
      </div>
      <div id="attachment_information_edit">
        <span class="bz_hide">
          (<a href="javascript:toggle_attachment_details_visibility();">hide</a>)
        </span>
        <div id="attachment_description">
          <label for="description">Description:</label>&nbsp;
          [% INCLUDE global/textarea.html.tmpl
            id             = 'description'
            name           = 'description'
            minrows        = 3
            cols           = 25
            wrap           = 'soft'
            classes        = 'block' _ editable_or_hide
            defaultcontent = attachment.description
          %]          
        </div>

          <div id="attachment_filename">
            <label for="filename">Filename:</label>
            <input type="text" size="20"  class="text block[% editable_or_hide %]"
                   id="filename" name="filename"
                   value="[% attachment.filename FILTER html %]">     
          </div>

          <div id="attachment_mimetype">
            <label for="contenttypeentry">MIME Type:</label>
            <input type="text" size="20" class="text block[% editable_or_hide %]"
                   id="contenttypeentry" name="contenttypeentry"
                   value="[% attachment.contenttype FILTER html %]">                   
          </div>
          
          <div id="attachment_creator">
            <span class="label">Creator:</span>
            [%+ INCLUDE global/user.html.tmpl who = attachment.attacher %]
          </div>

          <div id="attachment_created">
            <span class="label">Created:</span>
            [%+ attachment.attached FILTER time %]
          </div>

          <div id="attachment_size">
            <span class="label">Size:</span>
            [% IF attachment.datasize %]
              [%+ attachment.datasize FILTER unitconvert %]
            [% ELSE %]
              <em>deleted</em>
            [% END %]
          </div>

          <div id="attachment_ispatch">
            <input type="checkbox" id="ispatch" name="ispatch" value="1"
                   [%+ 'checked="checked"' IF attachment.ispatch %]>
                   <label for="ispatch">patch</label>
          </div>

        <div class="readonly">
          <div class="checkboxes">
            <div id="attachment_isobsolete">
              <input type="checkbox" id="isobsolete" name="isobsolete" value="1"                     
                     [%+ 'checked="checked"' IF attachment.isobsolete %]>
                <label for="isobsolete">obsolete</label>
            </div>

            [% IF user.is_insider %]
              <div id="attachment_isprivate">
                <input type="checkbox" id="isprivate" name="isprivate" value="1"
                       [%+ 'checked="checked"' IF attachment.isprivate %]>
                [% IF can_edit %]
                  <label for="isprivate">private (only visible to
                    <strong>[% Param('insidergroup') FILTER html %]</strong>)
                  </label>
                [% ELSE %]
                  <span class="label">Is Private:</span>
                  [%+ attachment.isprivate ? "yes" : "no" %]
                [% END %]
              </div>
            [% END %]
          </div>
        </div>                    
      </div>

      <div id="attachment_view_window">
        [% IF !attachment.datasize %]
          <div><b>The content of this attachment has been deleted.</b></div>
        [% ELSIF !Param("allow_attachment_display") %]
          <div id="view_disabled">
            <p><b>
              The attachment is not viewable in your browser due to security
              restrictions enabled by your [% terms.Bugzilla %] administrator.
            </b></p>
            <p><b>
              In order to view the attachment, you first have to
              <a href="attachment.cgi?id=[% attachment.id %]">download it</a>.
            </b></p>
          </div>
        [% ELSIF attachment.is_viewable %]
          <div>
            [% INCLUDE global/textarea.html.tmpl
              id      = 'editFrame'
              name    = 'comment'
              classes   = 'bz_default_hidden'
              minrows = 10
              cols    = 80
              wrap    = 'soft'
              disabled = 'disabled'
              defaultcontent = (attachment.contenttype.match('^text\/')) ?
                                 attachment.data.replace('(.*\n|.+)', '>$1') : undef
            %]
            [% IF attachment.contenttype == 'text/plain' AND is_safe_url(attachment.data) %]
              <p>
                <a href="[% attachment.data FILTER html %]">
                  [% IF attachment.datasize < 120 %]
                    [% attachment.data FILTER html %]
                  [% ELSE %]
                    [% attachment.data FILTER truncate(80) FILTER html %]
                    ...
                    [% attachment.data.match('.*(.{20})$').0 FILTER html %]
                  [% END %]
                </a>
              </p>
            [% ELSIF attachment.contenttype == "text/html" %]
              [%# For security reasons (clickjacking, embedded scripts), we never
                # render HTML pages from here. The source code is displayed instead. %]
              [% INCLUDE global/textarea.html.tmpl
                 id      = 'viewFrame'
                 minrows = 10
                 cols    = 80
                 defaultcontent = attachment.data
                 readonly = 'readonly'
              %]
            [% ELSE %]
              <iframe id="viewFrame" src="attachment.cgi?id=[% attachment.id %]" sandbox>
                <b>You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
                <a href="attachment.cgi?id=[% attachment.id %]">View the attachment on a separate page</a>.</b>
              </iframe>
            [% END %]

            [% IF use_patchviewer %]
              <iframe id="viewDiffFrame" class="bz_default_hidden"></iframe>
            [% END %]

            [% IF user.id %]
[%# if WEBKIT_CHANGES %]
              [% IF attachment.ispatch %]
              <button type="button" id="viewPrettyPatchButton"
                      onclick="viewPrettyPatch([% attachment.id %]);">View Formatted Diff</button>
              [% END %]
[%# endif // WEBKIT_CHANGES %]
              <button type="button" id="editButton" class="bz_default_hidden"
                      onclick="editAsComment([% use_patchviewer %]);">Edit Attachment As Comment</button>
              <button type="button" id="undoEditButton" class="bz_default_hidden"
                      onclick="undoEditAsComment([% use_patchviewer %]);">Undo Edit As Comment</button>
              <button type="button" id="redoEditButton" class="bz_default_hidden"
                      onclick="redoEditAsComment([% use_patchviewer %]);">Redo Edit As Comment</button>
            [% END %]

            [% IF use_patchviewer %]
              <button type="button" id="viewDiffButton" class="bz_default_hidden"
                      onclick="viewDiff([% attachment.id %], [% use_patchviewer %]);">View Attachment As Diff</button>
            [% END %]
            <button type="button" id="viewRawButton" class="bz_default_hidden"
                    onclick="viewRaw([% use_patchviewer %]);">View Attachment As Raw</button>

            <script type="text/javascript">
              [% IF user.id %]
                document.getElementById('editFrame').disabled = false;
                YAHOO.util.Dom.removeClass("editButton", "bz_default_hidden");
              [% END %]
              YAHOO.util.Dom.removeClass("viewDiffButton", "bz_default_hidden");
            </script>
          </div>
        [% ELSE %]
          <div id="noview">
            <p><b>
              Attachment is not viewable in your browser because its MIME type 
              ([% attachment.contenttype FILTER html %]) is not one that your browser is 
              able to display.
            </b></p>
            <p><b>
              <a href="attachment.cgi?id=[% attachment.id %]">Download the attachment</a>.
            </b></p>
          </div>
        [% END %]
      </div>
      <div id="attachment_comments_and_flags">
        [% IF user.id %]
[%# if WEBKIT_CHANGES %]
            [% IF attachment.ispatch %]
        Bot Status:

        <div class="statusBubble">
          <iframe src="https://webkit-queues.webkit.org/status-bubble/[% attachment.id %]"
                  style="width: 0px; height: 20px; border: none;" scrolling="no" onload="handleStatusBubbleLoad(this)">
          </iframe>
          <iframe src="https://ews.webkit.org/status-bubble/[% attachment.id %]/"
                  style="width: 0px; height: 20px; border: none;" scrolling="no" onload="handleStatusBubbleLoadNewEWS(this)">
          </iframe>
        </div>
        <br>
            [% END %]
[%# endif // WEBKIT_CHANGES %]
          <div id="smallCommentFrame" >
            <label for="comment">Comment (on the [% terms.bug %]):</label>
            [% classNames = 'block' %]
            [% classNames = "$classes bz_private" IF attachment.isprivate %]
            [% INCLUDE bug/comment.html.tmpl
               bug     = attachment.bug
               minrows = 10
               cols    = 80
               classes = classNames
               wrap    = 'soft'
            %]
            [% IF NOT attachment.bug.cc.contains(user.login) %]
              <input type="checkbox" id="addselfcc" name="addselfcc"
                [%~ ' checked="checked"'
                    IF user.settings.state_addselfcc.value == 'always'
                       || (!attachment.bug.user.has_any_role
                           && user.settings.state_addselfcc.value == 'cc_unless_role') %]>
              <label for="addselfcc">Add me to CC list</label>
            [% END %]
            [% Hook.process('after_comment_textarea') %]
          </div>
        [% END %]
        <div id="attachment_flags">
          [% IF attachment.flag_types.size > 0 %]
              [% PROCESS "flag/list.html.tmpl" flag_types = attachment.flag_types
                                               read_only_flags = !can_edit
              %]
     
          [% END %]
        </div>

        [% Hook.process('form_before_submit') %]

        [% IF user.id %]       
          <div id="update_container">
            <input type="submit" value="Submit" id="update">
          </div>
        [% END %]        
      </div>        
    </div>
  </div>
</form>

<div id="attachment_actions">
  <span class="label">Actions:</span>
  <a href="attachment.cgi?id=[% attachment.id %]">View</a>
[%# if WEBKIT_CHANGES %]
  [% IF attachment.ispatch %]
    | <a href="attachment.cgi?id=[% attachment.id %]&amp;action=prettypatch">Formatted Diff</a>
  [% END %]
[%# endif // WEBKIT_CHANGES %]
  [% IF use_patchviewer %]
    | <a href="attachment.cgi?id=[% attachment.id %]&amp;action=diff">Diff</a>
  [% END %]
  [% IF Param("allow_attachment_deletion")
        && user.in_group('admin')
        && attachment.datasize > 0 %]
    | <a href="attachment.cgi?id=[% attachment.id %]&amp;action=delete">Delete</a>
  [% END %]
  [% Hook.process('action') %]
</div>

<div id="attachment_list">
  Attachments on [% "$terms.bug ${attachment.bug_id}" FILTER bug_link(attachment.bug_id) FILTER none %]:
  [% FOREACH a = attachments %]
    [% IF a.isobsolete %]
      <span class="bz_obsolete">
    [% END %]
    [% IF a.id == attachment.id %]
      [%+ a.id FILTER html %]
    [% ELSE %]
      <a href="attachment.cgi?id=[% a.id FILTER uri %]&amp;action=edit"
         title="[% a.description FILTER html %]">[% a.id FILTER html %]</a>
    [% END %]
    [% IF a.isobsolete %]
      </span>
    [% END %]
    [% " |" UNLESS loop.last() %]
  [% END %]
</div>
[% IF can_edit %]
  <script type="text/javascript">
    <!--
      YAHOO.util.Dom.removeClass( document.body, "no_javascript" );
      // toggle_attachment_details_visibility( ); // WEBKIT_CHANGES
    -->
  </script>
[% END %]
[% Hook.process('end') %]

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