{#-
       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.
-#}
{% from 'allura:templates/jinja_master/lib.html' import canonical_tag %}
{% set hide_left_bar = True %}
{% extends g.theme.master %}

{% block head %}
    {{ canonical_tag() }}
{% endblock %}

{% block title %}{{neighborhood.name}} / Create a Project{% endblock %}

{% block header %}Create a Project{% endblock %}

{% block content %}
  {% if c.show_phone_verification_overlay %}
    {% do g.register_forge_js('js/jquery-ui-1.13.2.min.js') %}
    {% do g.register_js('js/jquery.lightbox_me.js') %}
    <div id="phone_verification_overlay" class="ui-widget-content">
      <h2 class="dark title">Phone Verification Required</h2>
      <iframe src="{{neighborhood.url_prefix}}phone_verification_fragment"></iframe>
    </div>
    <script type="text/javascript">
      $(function () {
        $('#phone_verification_overlay').draggable().lightbox_me({
          closeClick: false,
          closeEsc: false,
          centered: true
        });
      });
    </script>
  {% endif %}
  {{c.add_project.display(action=neighborhood.url()+'register',value=form_data,neighborhood=neighborhood)}}
{% endblock %}
