{#-
       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 %}

<script type="text/javascript" src="{{g.app_static('js/delete.js')}}"></script>

    <h1 class="title" >
        <span> Are you sure you want to delete this {% if folder_object %} folder? {% elif file_object %} file? {% endif %} </span>
    </h1>

<div id="delete_folder_popup"  >
<form id ='delete_folder_form' method="post" {% if folder_object %} action="{{c.app.url}}delete_folder" {% elif file_object %} action="{{c.app.url}}delete_file" {% endif %} onsubmit="return ConfirmDeleteFolder();" >
<div class="modal-dialog">
    <!-- Modal content-->
    <div class="modal-content">
    <div class="modal-header">
        <a class="icon close" href="#" title="Close" data-dismiss="modal"><i class="fa fa-close"></i></a>
    </div>
    <div class="modal-body grid-13">
        <p>
    
            <label for="delete">This is an irreversible action. If you are sure then type 'DELETE'.</label>
            <input type="text" id="delete_id" autofocus />

            <span id="error_message" class="modal-form-error"></span>
        </p>
    </div>
    {% if folder_object %}
        <input type="hidden" name="folder_id" id='delete_folder_id' value="{{folder_object._id}}" />
    {% elif file_object %}
        <input type="hidden" name="file_id" id='delete_file_id' value="{{file_object._id}}" />
    {% endif %}
    <div class="modal-footer grid-13">
        <p>
                 <input type="submit" id="submit_btn" value="Ok"/>
                 <a href="#" class="close">Cancel</a>
        </p>
    </div>
    </div>
</div>
{{lib.csrf_token()}}
</form>
</div>


