{% extends "base.html" %}

{% block js_media %}
    <script type="text/javascript" src="{{ ACE_URL }}/ace.js"></script>
    {{ form.media.js }}
    {% compress js %}
        <script type="text/javascript">
            $(function () {
                function format(state) {
                    if (!state.id) return state.text; // optgroup
                    return state.text;
                }

                window.previous_template = '';

                function update_language_template() {
                    var source = $('textarea#id_source');
                    if (source.val() == window.previous_template.replace(/\r/g, '') || source.val() == '') {
                        var lang_id = $('#id_language').val();
                        var code = localStorage.getItem('submit:' + $('#id_language').val());

                        function update_submit_area(code) {
                            window.previous_template = code;
                            source.val(code);
                            window.ace_source.getSession().setValue(code);
                        }

                        if (code != null) {
                            update_submit_area(code);
                        } else {
                            $.get('{{ url('language_template_ajax') }}', {
                                id: lang_id
                            }).done(function (template) {
                                update_submit_area(template);
                            });
                        }
                    }
                }

                function makeDisplayData(data) {
                    var site_data = data.attr('data-info');
                    var judge_data = data.attr('data-judge-info');
                    var display_data = site_data || judge_data;
                    return display_data;
                }

                function formatSelection(state) {
                    if (!state.id) return state.text; // optgroup
                    var data = makeDisplayData($("option[data-id=" + state.id + "]"));
                    return $('<span>').append($('<b>').text(state.text), ' (', data, ')');
                }

                // Terrible hack, adapted from https://github.com/select2/select2/issues/4436
                $.fn.select2.amd.define('select2/data/customAdapter', ['select2/results', 'select2/utils'], function (Result, Utils) {
                    RefPresenter = function ($element, options, dataAdapter) {
                        RefPresenter.__super__.constructor.call(this, $element, options, dataAdapter);
                    };
                    Utils.Extend(RefPresenter, Result);
                    RefPresenter.prototype.bind = function (container, $container) {
                        container.on('results:focus', function (params) {
                            var data = makeDisplayData($("option[data-id=" + params.data.id + "]"));
                            $("#result-version-info").text(data);
                        });
                        RefPresenter.__super__.bind.call(this, container, $container);
                    };
                    return RefPresenter;
                });

                var customAdapter = $.fn.select2.amd.require('select2/data/customAdapter');

                $("#id_language").select2({
                    templateResult: format,
                    templateSelection: formatSelection,
                    resultsAdapter: customAdapter
                });

                $('#id_language').on('select2:open', function (evt) {
                    var dropdown = $('.select2-dropdown');
                    if (!$('#result-version-info').length)
                        dropdown.append($("<span id=\"result-version-info\">"));
                    dropdown.attr('id', 'language-select2');
                });

                $('#id_judge').on('select2:open', function (evt) {
                    var dropdown = $('.select2-dropdown');
                    $('#result-version-info').remove();
                    dropdown.attr('id', 'judge-select2');
                });

                $('#id_language').change(function () {
                    var lang = $("#id_language").find("option:selected").attr('data-ace');
                    window.ace_source.getSession().setMode("ace/mode/" + lang);
                    update_language_template();
                });

                $('#ace_source').on('ace_load', function (e, editor) {
                    update_language_template();
                    editor.commands.addCommand({
                        name: 'save',
                        bindKey: {win: 'Ctrl-S', mac: 'Command-S'},
                        exec: function () {
                            localStorage.setItem('submit:' + $('#id_language').val(), editor.getSession().getValue());
                        }
                    });
                    editor.getSession().setUseWrapMode(true);
                    editor.setFontSize(14);
                    editor.setPrintMarginColumn(100);
                    editor.focus();
                });

                $(window).resize(function () {
                    $('#ace_source').height(Math.max($(window).height() - 353, 100));
                }).resize();

                $('#problem_submit').submit(function (event) {
                    if ($('#id_source').val().length > 65536) {
                        alert("{{ _('Your source code must contain at most 65536 characters.') }}");
                        event.preventDefault();
                        $('#problem_submit').find(':submit').attr('disabled', false);
                    }
                });
            });
        </script>
    {% endcompress %}
{% endblock %}

{% block media %}
    {{ form.media.css }}
    {% compress css %}
        <style media="screen">
            #submit-wrapper {
                margin-top: 0.7em;
            }

            #submit-wrapper #editor, #submit-wrapper #language {
                margin-top: 4px;
            }

            #id_language {
                width: 100%;
            }

            #result-version-info {
                border-bottom: 1px solid rgb(148, 148, 148);
                margin: 0px 1em;
                color: #757575;
                font-weight: 600;
                padding: 0.2em 0;
                text-align: right;
            }

            #language-select2 .select2-results__message {
                white-space: nowrap
            }

            #language-select2.select2-dropdown--above {
                display: flex;
                flex-direction: column-reverse;
            }

            #language-select2 .select2-results__option {
                color: #757575 !important;
                background: white !important;
            }

            #language-select2 .select2-results__option--highlighted {
                text-decoration: underline;
            }

            #language-select2 .select2-results__option[aria-selected=true] {
                font-weight: bold;
                color: black !important;
            }

            #language-select2 .select2-results__option {
                padding: 4px 0px;
            }

            #language-select2 .select2-results__options {
                overflow-y: visible !important;
            }

            #language-select2 .select2-results__option {
                break-inside: avoid-column;
            }

            #language-select2 .select2-results {
                -webkit-columns: 10 7em;
                -moz-columns: 10 7em;
                columns: 10 7em;
                padding-left: 1.5em;
                padding-top: 0.5em;
            }
        </style>
    {% endcompress %}
{% endblock %}

{% block body %}
    <br>
    {% if not no_judges %}
        {% if default_lang not in form.fields.language.queryset %}
            <div class="alert alert-warning alert-dismissable">
                <a class="close">x</a>
                {% trans trimmed default_language=default_lang.name %}
                    <b>Warning!</b> Your default language, <b>{{ default_language }}</b>,
                    is unavailable for this problem and has been deselected.
                {% endtrans %}
            </div>
        {% endif %}

        {% if request.in_contest and submission_limit %}
            {% if submissions_left > 0 %}
                <div class="alert alert-warning alert-dismissable">
                    <a class="close">x</a>
                    {% trans left=submissions_left %}
                        You have {{ left }} submission left
                        {% pluralize %}
                        You have {{ left }} submissions left
                    {% endtrans %}
                </div>
            {% else %}
                <div class="alert alert-warning alert-dismissable">
                    <a class="close">x</a>
                    {{ _('You have 0 submissions left') }}
                </div>
            {% endif %}
        {% endif %}
    {% endif %}

    <form id="problem_submit" action="" method="post" class="form-area">
        {% csrf_token %}
        {{ form.non_field_errors() }}
        <div id="submit-wrapper">
            <div id="editor">
                {{ form.source.errors }}
                {{ form.source }}
            </div>
            {% if not no_judges %}
                <div id="language">
                    {{ form.language.errors }}
                    <div id="language-select">
                        <select id="id_language" name="language">
                            {% for lang in form.fields.language.queryset %}
                                <option value="{{ lang.id }}" data-id="{{ lang.id }}" data-name="{{ lang.name }}"
                                        data-info="{{ lang.info }}" data-ace="{{ lang.ace }}"
                                        data-judge-info="{{ runtime_versions(lang.runtime_versions()) }}"
                                        {% if lang.id == default_lang.id %}selected{% endif %}>{{ lang.name }}</option>
                            {% endfor %}
                        </select>
                    </div>
                </div>
            {% endif %}
        </div>

        <hr>

        {% if no_judges %}
            <span style="color: red">{{ _('No judge is available for this problem.') }}</span>
        {% else %}
            <div class="submit-bar">
                {{ form.judge }}
                <input type="submit" value="{{ _('Submit!') }}" class="button"
                       {% if request.in_contest and submission_limit and not submissions_left %}disabled{% endif %}>
            </div>
        {% endif %}
    </form>
{% endblock %}