{% extends "admin/base_site_login.html" %}
{% load i18n admin_static %}

{% block extrastyle %}{{ block.super }}
<link rel="stylesheet" type="text/css" href="/static/suit/bootstrap/css/bootstrap.min.css" media="all"/>
<link rel="stylesheet" type="text/css" href="{% static "planetstack.css" %}" />
<script src="{% static 'suit/js/jquery-1.9.1.min.js' %}"></script>
<script src="http://code.jquery.com/ui/1.11.0/jquery-ui.js"></script>
{% endblock %}


{% block bodyclass %}login{% endblock %}

{% block nav-global %}{% endblock %}

{% block content_title %}{% endblock %}

{% block breadcrumbs %}{% endblock %}

{% block content %}
{% if form.errors and not form.non_field_errors and not form.this_is_the_login_form.errors %}
<p class="errornote">
{% blocktrans count counter=form.errors.items|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
</p>
{% endif %}

{% if form.non_field_errors or form.this_is_the_login_form.errors %}
{% for error in form.non_field_errors %}
<p class="errornote">
    {{ error }}
</p>
{% endfor %}
{% for error in form.this_is_the_login_form.errors %}
<p class="errornote">
    {{ error }}
</p>
{% endfor %}
{% endif %}
<div id="wrap">
<div id="content-main">
<h1><i class="icon-lock icon-white"></i> OpenCloud</h1>
<form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %}
  <div class="form-row">
    {% if not form.this_is_the_login_form.errors %}{{ form.username.errors }}{% endif %}
     {{ form.username }}
  </div>
  <div class="form-row">
    {% if not form.this_is_the_login_form.errors %}{{ form.password.errors }}{% endif %}
     {{ form.password }}
    <input type="hidden" name="this_is_the_login_form" value="1" />
    <input type="hidden" name="next" value="{{ next }}" />
  </div>
  <div class="submit-row">
    <input type="submit" class="btn btn-info" value="{% trans 'SIGN IN' %}" />
  </div>
        <div id="requestAccountLink">{% trans 'Request a new Account' %}</div>
</form>

<div id="request-account-form" title="Request an Account" style="display: none;">
	<form>
		<fieldset>
			<div class="request-form-row">
				<label for="request-first-name">First Name</label>
				<input type="text" name="request-first-name" id="request-first-name">
			</div>
			 <div class="request-form-row">
                                <label for="request-last-name">Last Name</label>
                                <input type="text" name="request-last-name" id="request-last-name">
                        </div>
			 <div class="request-form-row">
                                <label for="request-email">Email</label>
                                <input type="text" name="request-email" id="request-email">
                        </div>
			 <div class="request-form-row">
                                <label for="request-site-name">Site</label><br>
				<select id="request-site-name" name="request-site-name">
                                    <option>---------</option>
                                    {% for site in sites %}
                                        {% if site.allowNewUsers %}
                                            <option>{{ site.name }}</option>
                                        {% endif %}
                                    {% endfor %}
				</select>
                        </div>
			<div class="submit-row">
    				<input id ="request-signup" class="btn btn-info" value="SIGN UP">
  			</div>
		</fieldset>
	</form>
</div>
</div>
</div>


<script type="text/javascript">
$(function() {
	initRequest();
});
function initRequest(){
	$.ajax({
			url: '/tenantview',
			dataType: 'json',
			success: function (data) {
				var sites = data['sitesToBeRequested'];
				console.log(sites);
				for (site in sites){
					$("#request-site-name").append("<option>" + site + "</option>");
				}
			}
		});
}
$("#requestAccountLink").unbind().click(function(){
	$("#request-account-form").dialog({
					autoOpen: false,
					modal: true,
					dialogClass: "requestDialog",
				});
				$("#request-account-form").dialog("open");
})
$("#request-signup").unbind().click(function(){
							$.ajax({
								url: '/requestaccess/',
								dataType: 'json',
								data: {
									email: $("#request-email").val(),
									firstname: $("#request-first-name").val(),
									lastname: $("#request-last-name").val(),
									site: $("#request-site-name").val(),
									csrfmiddlewaretoken: "{{ csrf_token }}", // < here 
									state: "inactive"
								},
								async: false,
								type: 'POST',
								success: function (response) {
                                                                    if (response && response.error) {
                                                                        if (response.error == "already_approved") {
                                                                            alert("Your request has already been proccessed and approved. We are sending you another email with a new temporary password");
                                                                            return;
                                                                        } else if (response.error == "already_pending") {
                                                                            alert("Your request is already pending and awaiting approval");
                                                                            return;
                                                                        } else if (response.error == "is_deleted") {
                                                                            alert("Your user record is in a deleted state. Please contact OpenCloud support");
                                                                            return;
                                                                        }
                                                                    }
								    $("#request-account-form").dialog("close");
								    alert("Your request has been submitted");
								},
								error:function (xhr, textStatus, thrownError){
         							   alert("Error:", textStatus + " " + xhr.responseText);
        						        }
							});
})
document.getElementById('id_username').focus()
</script>
</div>
</div>
{% endblock %}
