{#-
       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.
-#}
{% set hide_left_bar = True %}
{% extends g.theme.master %}

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