{#-
       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.
-#}
{% extends 'allura:templates/repo/repo_master.html' %}
{% block title %}
{{c.project.name}} / {{c.app.config.options.mount_label}} / Commit {{commit.shorthand_id()}}
{% endblock %}

{% block header -%}
Commit <a href="{{commit.url()}}">{{commit.shorthand_id()}}</a> {{commit_labels(commit)}}
{%- endblock %}

{% block extra_js %}
{{ super() }}
<script type="text/javascript">$(function() {
    {% set path = request.params.get('path', '') %}
    {% if status == 'ready' %}
        {% if 'no-redirect' not in request.params %}
            $(document).ready(function() {
                window.location.href = '{{c.app.repo.tarball_url(revision, path)}}';
            });
        {% endif %}
    {% else %}
        var opts = {
            lines: 9, // The number of lines to draw
            length: 4, // The length of each line
            width: 2, // The line thickness
            radius: 3, // The radius of the inner circle
            rotate: 0, // The rotation offset
            color: '#555', // #rgb or #rrggbb
            speed: 1, // Rounds per second
            trail: 60, // Afterglow percentage
            shadow: false, // Whether to render a shadow
            hwaccel: false, // Whether to use hardware acceleration
            className: 'spinner', // The CSS class to assign to the spinner
            zIndex: 2e9, // The z-index (defaults to 2000000000)
            top: 10, // Top position relative to parent in px
            left: 10 // Left position relative to parent in px
        };
        var spinner = new Spinner(opts).spin($('#snapshot_status')[0]);
        var delay = 500;
        function check_status() {
            $.get('{{commit.url()}}tarball_status?path={{path}}', function(data) {
                if (data.status !== 'na') {
                    spinner.stop();
                    $('#snapshot_status h2').hide();
                    $('#snapshot_status h2.' + data.status).show();
                    {% if 'no-redirect' not in request.params %}
                        window.location.href = '{{c.app.repo.tarball_url(revision, path)}}';
                    {% endif %}
                } else {
                    if (delay < 60000){
                        delay = delay * 2;
                    }
                    if (delay >= 16000) {
                      // we've been waiting at least 15 seconds
                      $('#snapshot_status form').show();
                    }
                    window.setTimeout(check_status, delay);
                }
            });
        }
        window.setTimeout(check_status, delay);
    {% endif %}
});
</script>
{% endblock %}

{% block content %}
{% set path = request.params.get('path', '') %}
<div id='snapshot_status'>
    <h2 class="busy">Generating snapshot...</h2>
    <h2 class="ready">Your download will begin shortly, or use this <a href="{{c.app.repo.tarball_url(revision, path)}}">direct link</a>.</h2>
    <h2 class="na">Checking snapshot status...</h2>
    <form action="tarball" method="post">
      <p>We're having trouble finding that snapshot. Would you like to resubmit?</p>
      <input type="hidden" name="path" value="{{path}}" />
      <input type="submit" value="Resubmit Snapshot Request" />
    </form>
</div>
{% endblock %}

{% block extra_css %}
<style type="text/css">
    #snapshot_status h2 {
        padding-left: 33px;
        display: none;
    }
    #snapshot_status .{{ status }} {
        display: block;
    }
    #snapshot_status form {
      display: none;
      margin-left: 20px;
    }
    #snapshot_status form p {
      padding-left: 0;
    }
</style>
{% endblock %}
