{#-
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
-#}
{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
<div class="edit_markdown_form">
  <form id="edit_{{ action[-4:] }}" method="post" action="{{action}}"
        enctype="multipart/form-data">
    {% if show_subject %}
    <input name="{{ widget.context_for(widget.fields.subject)['rendered_name'] }}" style="width:97%"
           value="{{value and (value.subject or '(no subject)')}}"/>
    {% endif %}
    {{widget.display_field(widget.fields.text)}}
    <input type="hidden" class="original_value" value="{{value.text}}">
    <span class="arw"><span></span></span>
    <div style="clear:both"></div>
    <a href="#" class="btn link attachment_form_add_button">Add attachments</a>
    <input type="file" class="text attachment_form_fields" style="display:none" multiple name="{{att_name}}" {% if att_id %}id="{{att_id}}"{% endif %}/>
    <br>
    <input type="submit" value="{{submit_text}}" />
    {% if primary_artifact and c.user and c.user != c.user.anonymous() and not primary_artifact.subscribed() %}
      <label class="subscribe">
        <input type="checkbox" name="subscribe" class="subscribe-checkbox">Subscribe to this {{ primary_artifact.type_name }}
      </label>
    {% endif %}
    <a href="#" class="ui-button btn link cancel_edit_post">Cancel</a>
  {% if widget.antispam %}{% for fld in g.antispam.extra_fields() %}
  {{fld}}{% endfor %}{% endif %}
    {{lib.csrf_token()}}
  </form>
</div>
