[%# The contents of this file are subject to the Mozilla Public
  # License Version 1.1 (the "License"); you may not use this file
  # except in compliance with the License. You may obtain a copy of
  # the License at http://www.mozilla.org/MPL/
  #
  # Software distributed under the License is distributed on an "AS
  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  # implied. See the License for the specific language governing
  # rights and limitations under the License.
  #
  # The Original Code is the Bugzilla Bug Tracking System.
  #
  # The Initial Developer of the Original Code is Netscape Communications
  # Corporation. Portions created by Netscape are
  # Copyright (C) 1998 Netscape Communications Corporation. All
  # Rights Reserved.
  #
  # Contributor(s): Myk Melez <myk@mozilla.org>
  #                 Frédéric Buclin <LpSolit@gmail.com>
  #                 Guy Pyrzak <guy.pyrzak@gmail.com>
  #%]

[% PROCESS global/variables.none.tmpl %]

[%# 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 %]
[% 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
  doc_section = "attachments.html"
  javascript_urls = ['js/attachment.js', 'js/field.js']
  style_urls = ['skins/standard/attachment.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) %]
[% 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 %]
          [% 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_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 %]">
                <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 %]
            <script type="text/javascript">
              <!--
              var patchviewerinstalled = 0;
              var attachment_id = [% attachment.id %];
              if (typeof document.getElementById == "function") {
                [% IF use_patchviewer %]
                  var patchviewerinstalled = 1;
                  document.write('<iframe id="viewDiffFrame" class="bz_default_hidden"><\/iframe>');
                [% END %]
                [% IF user.id %]
                  document.write('<button type="button" id="editButton" onclick="editAsComment(patchviewerinstalled);">Edit Attachment As Comment<\/button>');
                  document.write('<button type="button" id="undoEditButton" onclick="undoEditAsComment(patchviewerinstalled);" class="bz_default_hidden">Undo Edit As Comment<\/button>');
                  document.write('<button type="button" id="redoEditButton" onclick="redoEditAsComment(patchviewerinstalled);" class="bz_default_hidden">Redo Edit As Comment<\/button>');
                  var editFrame = document.getElementById('editFrame');
                  if (editFrame) {
                    editFrame.disabled = false;
                  }
                [% END %]
                [% IF use_patchviewer %]
                  document.write('<button type="button" id="viewDiffButton" onclick="viewDiff(attachment_id, patchviewerinstalled);">View Attachment As Diff<\/button>');
                [% END %]
                document.write('<button type="button" id="viewRawButton" onclick="viewRaw(patchviewerinstalled);" class="bz_default_hidden">View Attachment As Raw<\/button>');
              }
              //-->
            </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 %]
          <div id="smallCommentFrame" >
            <label for="comment">Comment (on the [% terms.bug %]):</label>
            [% classNames = 'block' %]
            [% classNames = "$classes bz_private" IF attachment.isprivate %]
            [% INCLUDE global/textarea.html.tmpl
              id      = 'comment'
              name    = 'comment'
              minrows = 10
              cols    = 80
              wrap    = 'soft'
              classes = classNames          
            %]
          </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 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 == attachment.id %]
      [%+ a %]
    [% ELSE %]
      <a href="attachment.cgi?id=[% a %]&amp;action=edit">[% a %]</a>
    [% 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( );
    -->
  </script>
[% END %]
[% Hook.process('end') %]

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