{#-
       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 %}Create an Account{% endblock %}

{% block header %}Create an Account{% endblock %}

{% block content %}
<div class="grid-20">
  {{ c.form.display() }}
</div>
{% endblock %}

{% block extra_js %}
  <script type="text/javascript">
    /*<![CDATA[*/
    $('#create_account').submit(function () {
      if (!$('#username').attr('value').match(/^[a-zA-Z0-9]+$/)) {
        alert('Username can only contain numbers and letters.');
        return false;
      }
      if ($('#password').attr('value').length < 8) {
        alert('Password must be at least 8 characters long.');
        return false;
      }
      if ($('#password').attr('value') !== $('#confirm_password').attr('value')) {
        alert('Password and Confirm Password must match.');
        return false;
      }
    });
    /*]]>*/
  </script>
{% endblock %}
