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

<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: 600px; height: 20px; border: none;" scrolling="no">
          </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 %]
