{#-
       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 %}
{% set screenshots = project.get_screenshots() %}
{% if draggable and screenshots.__len__() > 1 %}
  <p>Drag screenshots to sort.</p>
{% endif %}
<div class="{% if draggable %}sortable{% endif %}">
  {% for ss in screenshots %}
  <div data-ss-id="{{ ss._id }}" class="screenshot">
    <div class="image">
      <a href="{{project.url()}}screenshot/{{h.urlquote(ss.filename)}}"><img src="{{project.url()}}screenshot/{{h.urlquote(ss.filename)}}/thumb" alt="Screenshot thumbnail"/></a>
      {% if not edit %}
      <br>
      {{ss.caption}}
      {% endif %}
    </div>
    {% if edit %}
    <div class="controls">
      <form action="edit_screenshot" method="post">
        <input type="hidden" value="{{ss._id}}" name="id">
        <input type="text" value="{{ss.caption}}" name="caption"><br>
        <input type="submit" value="Save Changes">
        {{lib.csrf_token()}}
      </form>
      <form action="delete_screenshot" method="post">
        <input type="hidden" value="{{ss._id}}" name="id">
        <input type="submit" value="Delete">
        {{lib.csrf_token()}}
      </form>
    </div>
    {% endif %}
  </div>
  {% endfor %}
</div>
{% if screenshots.__len__() %}<hr>{% endif %}
