{% extends 'base.html.twig' %}
{# {% block title %}{% endblock %} #}
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('assets/css/slider.css') }}?v=1.0.0"/>
<!-- Link Swiper's CSS -->
<link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.min.css" />
<style>
.aniBG {
position: fixed;
top:0;
left:0;
width:100%;
height:100%;
/*background-size: contain;*/
background-size: 50%;
background-position: center;
opacity: 0.3;
z-index: 1;
}
.aniBG.type_signs {
background-image:url('{{ asset('assets/img/bg/signs.png') }}');
}
.aniBG.type_auto {
background-image:url('{{ asset('assets/img/bg/car.png') }}');
animation: aniBGAnimAuto 6s infinite;
}
.aniBG.type_code {
background-image:url('{{ asset('assets/img/bg/licence.png') }}');
animation: aniBGAnimCode 6s infinite;
}
.aniBG.type_moto {
background-image:url('{{ asset('assets/img/bg/moto.png') }}');
animation: aniBGAnimMoto 6s infinite;
}
body.type_moto .aniBG.type_code, body.type_moto .aniBG.type_auto,
body.type_code .aniBG.type_auto, body.type_code .aniBG.type_moto,
body.type_auto .aniBG.type_code, body.type_auto .aniBG.type_moto {
display: none;
}
.homeSubType {
display: none;
}
.remainingPlaces {
position: absolute;
right: -1px;
bottom: 0px;
line-height: initial;
background: white;
text-align: center;
padding: 3px 9px;
font-size: 11px;
border-radius: 3px 0 0 3px;
color: #c61c61;
}
@keyframes aniBGAnimAuto {
0% {
opacity:0;
}
25% {
opacity:1;
}
50% {
opacity:0;
}
}
@keyframes aniBGAnimCode {
0% {
opacity:0;
}
25% {
opacity:0;
}
50% {
opacity:1;
}
75% {
opacity:0;
}
}
@keyframes aniBGAnimMoto {
0% {
opacity:0;
}
50% {
opacity:0;
}
75% {
opacity:1;
}
100% {
opacity:0;
}
}
.homeSubType img {
width: 80%;
background: #0a58ca;
border-radius: 10px;
padding: 15%;
transform: translate(0, 250%);
transition-duration:2s;
}
.homeSubType button {
width: 27%;
text-align: center;
}
.homeSubType button span {
margin-top: 20px;
display: block;
font-weight: bold;
font-size: 23px;
}
.homeSubType_inner {
display: flex;
align-items: center;
justify-content: center;
padding: 40px 0px;
overflow: hidden;
}
body[class*="type_"] .homeSubType img {
transform: translate(0, 0);
}
body.type_auto .homeSubType button:last-child img {
transition-delay: 0.5s;
}
body.type_code .homeSubType button:first-child img {
transition-delay: 1s;
}
body.type_code .homeSubType button:last-child img {
transition-delay: 1.5s;
}
#homeChoosedType_auto .auto,
#homeChoosedType_auto .manuelle,
#homeChoosedType_code .stage,
#homeChoosedType_code .online {
opacity:0;
position: absolute;
width: 18%;
background: #c61e61;
border-radius: 7px;
padding: 2%;
z-index: 1;
top: 1%;
margin-left: -2%;
}
.homeChoosedType {
background: #36165a;
width: 50%;
margin: auto;
padding: 0 15%;
border-radius: 0 0px 10px 10px;
position: relative;
display: none;
}
div#homeChoosedType_auto img.car,
div#homeChoosedType_code img.code,
div#homeChoosedType_moto img.moto {
width: 100%;
}
#homeChoosedType_auto .auto,
#homeChoosedType_auto .manuelle,
#homeChoosedType_code .stage,
#homeChoosedType_moto .moto_a2,
#homeChoosedType_code .online {
animation: animHomeChoosedTypeIcon 10s infinite;
}
#homeChoosedType_moto .moto_a2 {
position: absolute;
z-index: 2;
background: #c61e61;
color: #fff;
border-radius: 7px;
padding: 1%;
text-align: center;
font-weight: bold;
font-size: 2.2em;
}
@keyframes animHomeChoosedTypeIcon {
0% {
transform: translate(0, 0);
}
20% {
transform: translate(10px, 7px);
}
80% {
transform: translate(-10px, 3px);
}
100% {
transform: translate(0px, 0px);
}
}
.homeChoosedType i.close {
position: absolute;
z-index: 2;
background: #fff;
right: -3px;
font-size: 2em;
padding: 0 19px;
border-radius: 3px;
color: #36165a;
font-weight: bold;
cursor: pointer;
}
.subType_cta {
text-align: center;
padding-top: 30px;
font-weight: bold;
font-size: 23px;
animation: focus-in-expand 2s;
}
@media all and (max-width:640px){
.homeChoosedType i.close {
font-size: 1em;
padding: 0 9px;
}
#homeChoosedType_moto .moto_a2 {
font-size: 1.2em;
}
.homeChoosedType {
width: 60%;
}
.subType_cta {
padding-top: 20px;
font-size: 19px;
}
.homeSubType_inner {
padding: 20px 0px;
}
.homeSubType button {
}
.homeSubType button span {
font-size: 17px;
}
.between {
text-align: center;
font-size: 13px;
}
#homeSubType_code button {
width: 50%;
}
#home_examDates .infWrp {
flex-direction: column;
width: 100%;
padding: 10px;
}
#home_examDates .swiper-slide .btn {
width: 100%;
border: none !important;
}
#home_examDates .centerName, #home_examDates .date {
line-height: normal;
}
}
@-webkit-keyframes focus-in-expand {
0% {
letter-spacing: -0.5em;
-webkit-filter: blur(12px);
filter: blur(12px);
opacity: 0;
}
100% {
-webkit-filter: blur(0px);
filter: blur(0px);
opacity: 1;
}
}
@keyframes focus-in-expand {
0% {
letter-spacing: -0.5em;
-webkit-filter: blur(12px);
filter: blur(12px);
opacity: 0;
}
100% {
-webkit-filter: blur(0px);
filter: blur(0px);
opacity: 1;
}
}
.no_pack_img_wrp {
padding: 12%;
background: #e2e2e2;
}
.no_pack_img_wrp img {
width: 50% !important;
margin: auto;
display: block;
}
#home_boost_wrp .slidecontainer {
width: 100%; /* Width of the outside container */
height: 25px;
}
/* The slider itself */
#home_boost_wrp .slider {
appearance: none;
width: 100%;
height: 15px;
outline: none;
opacity: 0.7;
-webkit-appearance: none;
-webkit-transition: .2s;
transition: opacity .2s;
border-radius: 10px;
background: repeating-linear-gradient(to right, red 0%, blue 50%, red 100%);
width: 100%;
background-size: 200% auto;
background-position: 0 100%;
animation: gradientAnimation 2s infinite;
animation-fill-mode: forwards;
animation-timing-function: linear;
cursor: grab;
/*
background: #d3d3d3;
-webkit-transition: .2s;
transition: opacity .2s;
border-radius: 10px;*/
}
/* Mouse-over effects */
#home_boost_wrp .slider:hover {
opacity: 1; /* Fully shown on mouse-over */
}
#home_boost_wrp .slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 32px;
height: 32px;
background: #36165a;
cursor: pointer;
border-radius: 50%;
border: 3px solid #fff;
}
#home_boost_wrp .slider::-moz-range-thumb {
width: 32px;
height: 32px;
background: #36165a;
cursor: pointer;
border-radius: 50%;
border: 3px solid #fff;
}
#home_boost_wrp {
padding-bottom: 30px;
}
#home_examDates .infWrp {
width: calc(100% - 78px);
display: flex;
float: left;
justify-content: center;
position: relative;
}
#home_examDates .date {
margin-left: 20px;
}
#home_examDates .centerName {
margin-left: 10px;
}
@keyframes home_boost_wrpSliderAnim {
0%{
transform: scale(1);
}
70%{
transform: scale(1);
}
75%{
transform: scale(0.5);
}
80%{
transform: scale(1);
}
85%{
transform: scale(0.5);
}
90%{
transform: scale(1);
}
100%{
transform: scale(1);
}
}
#home_boost_wrp h2 {
text-align: center;
margin: 40px auto 20px;
}
#home_boost_wrp, #home_boost_choices > li {
display: none;
}
#home_examDates .swiper-slide.full {
background: gray;
}
#home_examDates .swiper-slide.full .btn {
background: #3d3d3d;
}
ul#home_boost_choices {
text-align: center;
list-style: none;
padding: 0;
}
ul#home_boost_choices ul {
padding: 0;
list-style: none;
}
img.boost_icn {
background: #2196f3;
border-radius: 7px;
margin-bottom: 10px;
margin-top: 20px;
width: 90px;
padding: 17px;
animation: home_boost_wrpSliderAnim 3s infinite;
-moz-animation: home_boost_wrpSliderAnim 3s infinite;
}
ul#home_boost_choices .infos {
font-size: 13px;
}
button#home_boost_confirm {
margin: auto;
display: block;
font-weight: bold;
text-transform: uppercase;
font-size: 23px;
color: #989898;
}
.aniBG,
#page_top_wrp,
#page_bottom_wrp {
/*display: none;*/
}
div#updatingQuestionsModal .modal-body {background: red;color: #fff;}
h5#updatingQuestionsModalLabel {
color: red;
}
</style>
{% endblock %}
{% block pageTop %}
<p>{{"Passez votre examen en 1 jour avec ESR Auto Moto"|trans}}</p>
{% endblock %}
{% block body %}
<!-- Swiper -->
<div id="home_slider" class="swiper mySwiper">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="block block_voiture">
{{"Voiture"|trans}}
<button data-type="auto" type="button" class="btn choose_type_btn">{{"Choisir"|trans}}</button>
</div>
</div>
<div class="swiper-slide codeSlide">
<div class="block block_code">
{{"Code de la route"|trans}}
<button data-type="code" type="button" class="btn choose_type_btn">{{"Choisir"|trans}}</button>
</div>
</div>
<div class="swiper-slide">
<div class="block block_moto">
{{"Moto"|trans}}
<button data-type="moto" type="button" class="btn choose_type_btn">{{"Choisir"|trans}}</button>
</div>
</div>
</div>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
<div class="container">
<div id="has_code_wrp">
<h2 id="has_code_wrp_title">{{"Avez-vous déjà votre code ?"|trans}}</h2>
<div class="inner">
<button type="button" data-type="yes" class="btn">{{"Oui"|trans}}</button>
<button type="button" data-type="no" class="btn">{{"Non"|trans}}</button>
</div>
</div>
<div id="needCodeFirstWarning">{{"Vous devez passer votre code en premier"|trans}}</div>
<div id="homeChoosedType_auto" class="homeChoosedType">
<i class="close">x</i>
<img class="auto" src="{{ asset('assets/img/icons/automatic-transmission.png') }}" />
<img class="manuelle" src="{{ asset('assets/img/icons/manual-transmission.png') }}" />
<img class="car" src="{{ asset('assets/img/icons/eco-car.png') }}" />
</div>
<div id="homeChoosedType_code" class="homeChoosedType">
<i class="close">x</i>
<img class="stage" src="{{ asset('assets/img/icons/fast.png') }}" />
<img class="online" src="{{ asset('assets/img/icons/laptop.png') }}" />
<img class="code" src="{{ asset('assets/img/icons/driving-license.png') }}" />
</div>
<div id="homeChoosedType_moto" class="homeChoosedType">
<i class="close">x</i>
<div class="moto_a2">A2</div>
<img class="moto" src="{{ asset('assets/img/icons/motorbike.png') }}" />
</div>
<div id="homeSubType_auto" class="homeSubType">
<div class="subType_cta">{{"Que la force soit avec vous !"|trans}}</div>
<div class="homeSubType_inner">
<button type="button" data-subType="auto" class="btn">
<img src="{{ asset('assets/img/icons/automatic-transmission.png') }}" />
<span>{{"Automatique"|trans}}</span>
</button>
<div class="between">{{"Ou bien"|trans}}</div>
<button type="button" data-subType="manuelle" class="btn">
<img src="{{ asset('assets/img/icons/manual-transmission.png') }}" />
<span>{{"Manuel"|trans}}</span>
</button>
</div>
</div>
<div id="homeSubType_code" class="homeSubType">
<div class="subType_cta">{{"Passez votre examen en 1 jour !"|trans}}</div>
<div class="homeSubType_inner">
<button type="button" data-subType="stage" class="btn">
<img src="{{ asset('assets/img/icons/fast.png') }}" />
<span>{{"Stage code 1 jour"|trans}}</span>
</button>
<div class="between">{{"Ou bien"|trans}}</div>
<button type="button" data-subType="online" class="btn">
<img src="{{ asset('assets/img/icons/laptop.png') }}" />
<span>{{"Code en ligne"|trans}}</span>
</button>
</div>
</div>
<div id="home_boost_wrp">
<h2 id="home_boost_title">{{"Choisissez votre Boost"|trans}}</h2>
<div class="slidecontainer">
<input type="range" min="1" max="3" value="3" step="1" class="slider" id="home_boost_range">
</div>
<ul id="home_boost_choices">
<li data-level="1">
<img src="{{ asset('assets/img/icons/forward.png')}}" class="boost_icn" />
<h4>{{"C. Libre"|trans}}</h4>
<ul class="infos">
{# <li>Examen après 6 mois</li> #}
<li>{{"Envie de programmer votre passage à l'examen, et de prendre votre temps ?<br />Ces formations sont faites pour vous. Au moyen d'un suivi personnalisé, vous apprendrez à votre rythme et selon vos attentes. Les premières leçons seront programmées pour environ 1an après inscription."|trans|raw}}</li>
</ul>
</li>
<li data-level="2">
<img src="{{ asset('assets/img/icons/fast-forward.png')}}" class="boost_icn" />
<h4>{{"Accéléré"|trans}}</h4>
<ul class="infos">
{# <li>Examen après 2 mois</li> #}
<li>{{"Envie de programmer votre passage à l'examen sur votre agenda ?<br />Ces formations sont faites pour vous. Au moyen d'un suivi personnalisé, vous apprendrez à votre rythme en prévoyant bien à l'avance vos disponibilités. Les premières leçons seront programmées pour environ 2 mois après inscription."|trans|raw}}</li>
</ul>
</li>
<li data-level="3">
<img src="{{ asset('assets/img/icons/boost.png')}}" class="boost_icn" />
<h4>{{"Super accéléré"|trans}}</h4>
<ul class="infos">
{# <li>Examen avant 2 mois</li> #}
<li>{{"Vous êtes pressé de passer votre permis ?<br />Ces formations sont faites pour vous ! Vous progressez en un temps record, avec un programme complet spécialement conçu pour vous et ce format. Une date vous est directement donnée, et votre formation commence maintenant."|trans|raw}}</li>
</ul>
</li>
</ul>
<button type="button" id="home_boost_confirm" class="btn">{{"Valider"|trans}}</button>
</div>
<div id="home_examDates_wrp">
<h2 id="home_examDates_title">{{"Dates d'examen"|trans}}</h2>
<div class="nav_wrp">
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
<div class="monthChooser">{{"Mois"|trans}}</div>
<div id="home_examDates">
<div class="swiper-wrapper">
{# {% for examDate in examDates %}
<div class="swiper-slide" data-date="{{examDate.date|date('Y-m-d')}}">
{{examDate.date|date('d-m-Y')}}
<div class="btn choose_ExamDate_btn">Choisir</div>
</div>
{% endfor %} #}
</div>
</div>
<div id="examDates_statuts">
<div class="free">{{"Libre"|trans}}</div>
<div class="temporary">{{"Temporaire"|trans}}</div>
<div class="full">{{"Saturée"|trans}}</div>
</div>
</div>
<div id="home_packs_wrp">
<h2 id="home_packs_title">{{"Packs"|trans}}</h2>
<ul id="home_packs_list">
{% for pack in packs %}
<li data-id="{{pack.id}}" class="pack pack_id_{{pack.id}} pack_{{pack.category}} subtype_{{pack.type}} boost_{{pack.boost}}">
<div class="left_wrp">
{% if pack.image %}
<img src="{{ asset('assets/img/packs/') ~ pack.image }}" class="pack_img" />
{% else %}
<div class="no_pack_img_wrp"><img src="{{ asset('assets/img/icons/no-image.png') }}" /></div>
{% endif %}
</div>
<div class="center_wrp">
<h5>{{pack.name}} {% if pack.duration > 0 %}{{pack.duration}}H{% endif %}<i class="pack_infos">?</i></h5>
<div class="description">{{pack.description|raw}}</div>
<div class="long_description">{{pack.LongDescription|raw}}</div>
{# <div class="description">{{pack.description|striptags|slice(0, 80)|raw}}</div> #}
</div>
<div class="right_wrp">
<span class="pack_price">{{pack.price}} €</span>
<button data-id="{{pack.id}}" type="button" class="btn choose_pack_btn">{{"Choisir"|trans}}</button>
</div>
<ul class="pack_availabilities"></ul>
<div class="pack_warning"></div>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endblock %}
{% block pageBottom %}
<div class="swiper-wrapper">
<div class="swiper-slide blue">
<a href="https://moncompteformation.gouv.fr" target="_Blank">
<img src="{{ asset('assets/img/cpf.png') }}" />
<p>{{"Votre permis de conduite <span class=\"highlighted\">gratuit</span> ?<br />C’est possible grâce au CPF !"|trans|raw}}</p>
</a>
</div>
<div class="swiper-slide yellow">
<a href="https://moncompteformation.gouv.fr" target="_Blank">
<img src="{{ asset('assets/img/logo_ecole_de_conduite.png') }}" />
<p>{{"Un enseignement de <span class=\"highlighted\">qualité</span> et une information claire et transparente"|trans|raw}}</p>
</a>
</div>
<div class="swiper-slide red">
<a href="https://travail-emploi.gouv.fr/formation-professionnelle/acteurs-cadre-et-qualite-de-la-formation-professionnelle/article/qualiopi-marque-de-certification-qualite-des-prestataires-de-formation" target="_Blank">
<img src="{{ asset('assets/img/LogoQualiopi.png') }}" />
<p>{{"Marque de certification <span class=\"highlighted\">qualité</span> des prestataires de formation"|trans|raw}}</p>
</a>
</div>
<div class="swiper-slide red2">
<a href="https://getalma.eu/" target="_Blank">
<img src="{{ asset('assets/img/logo-alma.png') }}" />
<p>{{"Payez votre formation <span class=\"highlighted\">en 3 fois</span> grâce à Alma"|trans|raw}}</p>
</a>
</div>
</div>
{% endblock %}
{% block footerJavascripts %}
<!-- Updating Questions Modal -->
<div class="modal fade" id="updatingQuestionsModal" tabindex="-1" role="dialog" aria-labelledby="updatingQuestionsModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="updatingQuestionsModalLabel">Attention !</h5>
<button type="button" class="btn close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
Les questions de l'examen sont actuellement en cours de mise à jour...
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Fermer</button>
</div>
</div>
</div>
</div>
<!-- ! Updating Questions Modal -->
<!-- Login Modal -->
<div class="modal fade" id="loginModal" tabindex="-1" role="dialog" aria-labelledby="loginModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="loginModalLabel">{{"Identification"|trans}}</h5>
<button type="button" class="btn close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<h3 class="insent_sentence">{{"Vous y êtes presque !<br />Identifiez-vous pour passer au paiement."|trans|raw}}</h3>
<form id="popup_login_form">
<div class="form-group">
<label for="login_username">{{"Login"|trans}}</label>
<input type="email" id="login_username" class="form-control" />
</div>
<div class="form-group">
<label for="login_password">{{"Mot de passe"|trans}}</label>
<input type="password" id="login_password" class="form-control" />
</div>
</form>
<div class="other">
{{"Vous n'avez pas encore de compte ?<br /><a href=\"#\" class=\"open_registrationPopup\">Cliquez ici</a> pour vous inscrire"|trans|raw}}
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{"Annuler"|trans}}</button>
<button id="popup_login_btn" type="button" class="btn btn-primary">{{"Connexion"|trans}}</button>
</div>
</div>
</div>
</div>
<!-- ! Login Modal -->
<!-- Registration Modal -->
<div class="modal fade" id="registrationModal" tabindex="-1" role="dialog" aria-labelledby="registrationModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="registrationModalLabel">{{"Inscription"|trans}}</h5>
<button type="button" class="btn close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<h3 class="insent_sentence">{{"Plus qu'une seule étape !<br />Inscrivez-vous pour passer au paiement."|trans|raw}}</h3>
<form id="popup_register_form">
<div class="form-group">
<label for="registration_username">{{"Email"|trans}}</label>
<input type="email" id="registration_username" class="form-control" />
</div>
<div class="form-group">
<label for="registration_password">{{"Mot de passe"|trans}}</label>
<input type="password" id="registration_password" class="form-control" />
</div>
<div class="form-group">
<label for="registration_phone">Téléphone</label>
<input type="text" id="registration_phone" class="form-control" name="registration_phone" />
</div>
<div class="form-group">
<label for="registration_partner">{{"Code parrainage"|trans}}</label>
<input type="text" id="registration_partner" class="form-control" />
</div>
</form>
<div class="other">
{{"Vous avez déjà un compte ?<br /><a href=\"#\" class=\"open_loginPopup\">Cliquez ici</a> pour vous connecter"|trans|raw}}
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{"Annuler"|trans}}</button>
<button id="popup_register_btn" type="button" class="btn btn-primary">{{"Valider"|trans}}</button>
</div>
</div>
</div>
</div>
<!-- ! Registration Modal -->
<!-- Months Modal -->
<div class="modal fade" id="monthsModal" tabindex="-1" role="dialog" aria-labelledby="monthsModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="monthsModalLabel">{{"Choisissez un mois"|trans}}</h5>
<button type="button" class="close btn" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<ul id="monthsModal_list">
{% for examMonth in examMonths %}
<li>
<button type="button" class="btn btn-info" data-date="{{examMonth.date}}">{{examMonth.readable}}</button>
</li>
{% endfor %}
</ul>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{"Annuler"|trans}}</button>
</div>
</div>
</div>
</div>
<!-- ! Months Modal -->
<!-- Availability Details Modal -->
<div class="modal fade" id="availabilityDetailsModal" tabindex="-1" role="dialog" aria-labelledby="availabilityDetailsModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="availabilityDetailsModalLabel">{{"Détails de la disponibilité"|trans}}</h5>
<button type="button" class="close btn" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<table id="availabilityDetailsModal_list">
<thead>
<tr>
<td>{{"Date"|trans}}</td>
<td>{{"Heure de début"|trans}}</td>
<td>{{"Heure de fin"|trans}}</td>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{"Fermer"|trans}}</button>
</div>
</div>
</div>
</div>
<!-- ! Availability Details Modal -->
<!-- Pack Details Modal -->
<div class="modal fade" id="packDetailsModal" tabindex="-1" role="dialog" aria-labelledby="packDetailsModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="packDetailsModalLabel">{{"Détails du pack"|trans}}</h5>
<button type="button" class="close btn" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<h6 class="choosedDate_dyn"></h6>
<div class="pack_long_description">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{"Fermer"|trans}}</button>
</div>
</div>
</div>
</div>
<!-- ! Pack Details Modal -->
<!-- Swiper JS -->
<script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
<!-- Initialize Swiper -->
<script>
var swiper = new Swiper("#home_slider", {
loop: true,
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
breakpoints: {
1024: {
slidesPerView: 3,
loop: false,
},
}
});
swiper.on('transitionEnd', function () {
$('#has_code_wrp').slideUp();
});
var bottomPageSwiper = new Swiper("#page_bottom_wrp", {
loop: true,
autoplay: {
delay: 1500,
disableOnInteraction: true,
},
speed: 1000,
//effect: 'fade',
//fadeEffect: {
// crossFade: true
//},
slidesPerView: 1
});
</script>
<script>
$(document).ready(function($){
function localStorageAvailable() {
if (typeof(Storage) !== "undefined") {
return true;
} else {
return false;
}
}
if (localStorageAvailable()) {
var dontShowUpdatingQuestionsModal = localStorage.dontShowUpdatingQuestionsModal;
if(!dontShowUpdatingQuestionsModal){
//$('#updatingQuestionsModal').modal('show');
}
$('#updatingQuestionsModal').on('hidden.bs.modal', function() {
localStorage.dontShowUpdatingQuestionsModal = true;
});
}
{% if app.user %}
window.loggedIn = true;
{% endif %}
var datesSwiper;
var availabilitiesSwiper = null;
function animateBlocks(){
$('#choiceBlocks_wrp').slideDown();
$('#choiceBlocks_wrp block_1, #choiceBlocks_wrp block_2').addClass('animate');
setTimeout(function(){
$('#choiceBlocks_wrp block_1, #choiceBlocks_wrp block_2').removeClass('animate');
}, 10000);
}
$('i.pack_infos').on('click', function(e){
var packID = $(this).closest('li').attr('data-id');
$('#packDetailsModal .modal-body .pack_long_description').html($('#home_packs_list li.pack_id_'+packID+' .long_description').html());
$('#packDetailsModal').modal('show');
});
$('.homeSubType button').on('click', function(e){
window.subType = $(this).attr('data-subType');
$('.homeSubType').slideUp();
$('#homeChoosedType_'+window.choosedType+' img.'+window.subType).css({'opacity':1});
$('#home_packs_wrp li').each(function(i, e){
if(!$(e).hasClass('subtype_'+window.subType)){
$(e).slideUp();
}
});
updateWinHash('subType', window.subType);
if(window.subType == 'online'){
window.choosedDate = null;
window.choosedDateID = null;
$('#home_packs_list .pack_availabilities').slideUp().html('');
$('#home_packs_wrp').slideDown();
customScrollTo($('#home_packs_wrp'));
} else if(window.choosedType == 'auto'){
/*$('#home_examDates_wrp, .choose_ExamDate_btn').slideDown();*/
$('#home_boost_wrp').slideDown();
customScrollTo($('#home_examDates_wrp'));
} else {
getExamDates('code');
customScrollTo($('#home_examDates_wrp'));
}
});
$('.open_registrationPopup').on('click', function(e){
e.preventDefault();
$('#loginModal').modal('hide');
$('#registrationModal').modal('show');
});
$('.monthChooser').on('click', function(e){
$('#monthsModal').modal('show');
});
$('body').on('click', '.pack_availabilities i.infos', function(e){
availabilitiesSwiper.autoplay.stop();
var rawData = $(this).closest('.swiper-slide').attr('data-raw');
rawData = JSON.parse(rawData);
$('#availabilityDetailsModal_list tbody').html('');
$.each(rawData, function(k, d){
$('#availabilityDetailsModal_list tbody').append('<tr><td>'+d[2]+'</td><td>'+d[0]+'H</td><td>'+d[1]+'H</td></tr>');
});
$('#availabilityDetailsModal').modal('show');
});
$('#monthsModal_list button').on('click', function(e){
if($(this).closest('li').hasClass('disabled')) return false;
$('#home_packs_list .pack_availabilities, #home_packs_list .pack_warning').slideUp().html('');
$('#home_packs_wrp').slideUp();
getExamDates(window.choosedType, $('#home_boost_range').val(), $(this).attr('data-date'));
});
$('.open_loginPopup').on('click', function(e){
e.preventDefault();
$('#registrationModal').modal('hide');
$('#loginModal').modal('show');
});
$(document).on('click', '.choose_ExamDate_btn' , function(e){
e.preventDefault();
if($(this).closest('.swiper-slide').hasClass('full')) return false;
//datesSwiper.autoplay = false;
datesSwiper.autoplay.stop();
$('#home_examDates_wrp .swiper-slide.selected').removeClass('selected');
$(this).closest('.swiper-slide').addClass('selected');
/*$('#home_examDates_wrp li:not(.selected)').slideUp();*/
window.choosedDate = $(this).closest('.swiper-slide').attr('data-date');
window.choosedDateID = $(this).closest('.swiper-slide').attr('data-dateID');
$('.choosedDate_dyn').html($(this).closest('.swiper-slide').attr('data-dateFr'));
$('#home_packs_list .pack_availabilities, #home_packs_list .pack_warning').slideUp().html('');
$('#home_packs_wrp').slideDown();
customScrollTo($(".homeChoosedType"));
});
$('#has_code_wrp button').on('click', function(){
$('#has_code_wrp button.selected').removeClass('selected');
$(this).addClass('selected');
window.hasCode = $(this).attr('data-type');
if(window.hasCode == 'yes'){
$('#home_slider, #has_code_wrp, #needCodeFirstWarning').slideUp();
$('#homeChoosedType_'+window.choosedType).slideDown();
if(window.choosedType != 'moto'){
updateWinHash('type', 'auto');
$('#homeSubType_'+window.choosedType).slideDown();
//customScrollTo($('#homeChoosedType_'+window.choosedType));
} else {
updateWinHash('type', 'moto');
getExamDates('moto');
//customScrollTo($('#home_examDates_wrp'));
}
$([document.documentElement, document.body]).animate({
scrollTop: 0
}, 1000);
$('body').addClass('type_'+window.choosedType);
} else {
$('#needCodeFirstWarning').slideDown();
//window.talbiJSAlert.show('warning', "Vous devez passer votre code en premier");
swiper.slideTo( 2,1000,false );
//swiper.slideTo( $('.codeSlide').index(),1000,false );
customScrollTo($("#home_slider"));
}
});
var boostVals = ['none', 'fast', 'superFast'];
$('#home_boost_confirm').on('click', function(){
$('#homeChoosedType_auto').append($('#home_boost_choices li[data-level="'+$('#home_boost_range').val()+'"]').find('img.boost_icn'));
var boostVal = boostVals[$('#home_boost_range').val() - 1];
updateWinHash('boost', boostVal);
var today = new Date();
var year = today.getFullYear();
var month = today.getMonth();
var day = '01';//today.getDate();
if(boostVal == 'none'){
var dateFrom = new Date(year + 1, month, day);
} else if(boostVal == 'fast'){
var dateFrom = new Date(year, month + 2, day);
}
if(boostVal != 'superFast'){
$('#monthsModal_list li').each(function(i, e){
var tDate = new Date($(e).find('button').attr('data-date')+'-01');
if(tDate < dateFrom) $(e).addClass('disabled');
});
}
getExamDates('auto', $('#home_boost_range').val());
$('#home_packs_wrp li').each(function(i, e){
if(!$(e).hasClass('boost_'+boostVal)){
$(e).slideUp();
}
});
$('#home_boost_wrp').slideUp();
});
$('#home_boost_range').on('change', function(){
updateHomeBoost();
});
updateHomeBoost();
function updateHomeBoost(){
var level = $('#home_boost_range').val();
$('#home_boost_choices > li').slideUp();
$('#home_boost_choices li[data-level="'+level+'"]').slideDown();
}
function getExamDates(type, boost=null, month=null){
window.talbiJSLoading.show();
$.ajax({
url: '/api/getExamDates',
type: 'POST',
dataType: 'json',
data: { type:type, boost:boost, month:month},
success: function(r){
window.talbiJSLoading.hide();
if(r.examDates){
var examDatesKeys = Object.keys(r.examDates);
$('#home_examDates_wrp .swiper-wrapper').html('');
$('#home_examDates_wrp').slideUp();
if(examDatesKeys.length > 0){
for (var ix in r.examDates) {
var e = r.examDates[ix];
if(e.status == -1){
var dateFinal = e.dateStrn;
var dateFr = e.dateStrn;
var dataDate = e.date;
var dExamCenter = '';
} else {
var ev = new Date(e.date.split('T')[0]);
var dateFinal = ev.toLocaleDateString();
var dateFr = ev.toLocaleDateString();
var dataDate = e.date.split('T')[0];
var dExamCenter = '<div class="centerName">'+e.centerName+' à '+e.time+'</div>';
}
var remainingPlaces = e.places - e.booked;
var full = remainingPlaces > 0 ? '' : 'full';
var waiting = (e.status == 2 || e.status == -1) ? 'waiting' : '';
$('#home_examDates_wrp .swiper-wrapper').append(
'<div class="swiper-slide '+full+' '+waiting+'" data-dateID="'+e.dateID+'" data-date="'+dataDate+'" data-dateFr="'+dateFr+'"><div class="infWrp"><div class="remainingPlaces">'+remainingPlaces+' {{"place"|trans}}'+(remainingPlaces == 1 ? '' : 's')+'</div><div class="date">'+dateFinal+'</div>'+dExamCenter+'</div><div class="btn choose_ExamDate_btn">Choisir</div></div>'
);
}
if(datesSwiper) datesSwiper.destroy();
datesSwiper = new Swiper("#home_examDates", {
loop: false,
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
//longSwipes: true,
autoplay: {
delay: 1000,
disableOnInteraction: true,
},
breakpoints: {
1420: {
slidesPerView: 3,
loop: false,
},
1024: {
slidesPerView: 2,
loop: false,
},
720: {
slidesPerView: 1,
loop: false,
},
}
});
//datesSwiper.slideTo( 1,1000,false );
datesSwiper.autoplay.start();
} else {
$('#home_packs_wrp').slideUp();
$('#home_examDates_wrp .swiper-wrapper').append(
'<div class="alert alert-warning">Aucune date trouvée</div>'
);
}
if(month){
$('#monthsModal').modal('hide');
}
$('#home_examDates_wrp, .choose_ExamDate_btn').slideDown();
} else if(r.error) {
window.talbiJSAlert.show('danger', r.error);
} else {
window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
}
},
error: function(r){
window.talbiJSLoading.hide();
window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
}
});
}
$('.choose_type_btn').on('click', function(){
window.choosedType = $(this).attr('data-type');
if(window.choosedType != 'code'){
$('#has_code_wrp').slideDown();
$('.choose_ExamDate_btn').slideUp();
customScrollTo($("#home_slider"));
} else {
$('#needCodeFirstWarning').slideUp();
$('#home_slider, #has_code_wrp').slideUp();
$('#homeChoosedType_'+window.choosedType).slideDown();
$('#homeSubType_'+window.choosedType).slideDown();
$('body').addClass('type_'+window.choosedType);
updateWinHash('type', 'code');
$([document.documentElement, document.body]).animate({
scrollTop: 0
}, 1000);
}
$('#home_slider > .selected').removeClass('selected');
$(this).closest('div').addClass('selected');
$('#home_packs_wrp').slideUp();
$('#home_packs_wrp li').each(function(i, e){
if($(e).hasClass('pack_'+window.choosedType)){
$(e).slideDown();
} else {
$(e).slideUp();
}
});
});
$('.homeChoosedType i.close').on('click', function(){
window.location.href = '/';
});
$('#popup_register_btn').on('click', function(){
var username = $('#registration_username').val();
var password = $('#registration_password').val();
var phone = $('#registration_phone').val();
var partnerCode = $('#registration_partner').val();
if(username == ''){
window.talbiJSAlert.show('warning', "Vous devez saisir votre adresse email.");
return false;
} else if(password == ''){
window.talbiJSAlert.show('warning', "Vous devez saisir votre mot de passe.");
return false;
}
window.talbiJSLoading.show('Inscription');
$.ajax({
url: '/api/registration',
type: 'POST',
dataType: 'json',
data: { username:username, password:password, partnerCode:partnerCode, phone:phone},
success: function(r){
window.talbiJSLoading.hide();
if(r.user){
window.talbiJSAlert.show('success', "Bienvenue", 2000);
window.loggedIn = true;
$('#registrationModal').modal('toggle');
if(r.isPartner) {
window.isPartner = true;
window.affiliate = r.user;
chooseAvailability();
} else {
ajaxLogin(username, password);
}
} else if(r.error) {
window.talbiJSAlert.show('danger', r.error);
} else {
window.talbiJSAlert.show('danger', "Une erreur s'est produite, veuillez vérifier vos données.", 4000);
}
},
error: function(r){
window.talbiJSLoading.hide();
window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
}
});
});
$('#popup_login_btn').on('click', function(){
var login_username = $('#login_username').val();
var login_password = $('#login_password').val();
ajaxLogin(login_username, login_password);
});
function ajaxLogin(login_username, login_password){
window.talbiJSLoading.show('Identification');
$.ajax({
url: '/api/login',
type: 'POST',
dataType: 'json',
contentType: "application/json",
data: JSON.stringify({email:login_username, password:login_password}),
success: function(r){
window.talbiJSLoading.hide();
if(r.user){
window.talbiJSAlert.show('success', "Bienvenue", 2000);
window.loggedIn = true;
$('#loginModal').modal('toggle');
if(r.isPartner){
window.isPartner = true;
$('#registrationModalLabel').text('Inscription filleul');
$('#registration_partner').slideUp().remove();
$('#registrationModal').modal('show');
} else {
chooseAvailability();
}
} else {
window.talbiJSAlert.show('danger', 'Identifiants incorrects');
}
},
error: function(r){
window.talbiJSLoading.hide();
window.talbiJSAlert.show('danger', 'Identifiants incorrects');
}
});
}
$('.choose_pack_btn').on('click', function(){
$this = $(this);
if(window.choosedType == 'code'){
$('#home_packs_list li.selected').removeClass('selected');
$this.closest('li').addClass('selected');
if(window.loggedIn){
if(window.isPartner){
$('#registrationModal').modal('show');
} else {
chooseAvailability();
}
} else {
$('#loginModal').modal('toggle');
}
return;
}
var $availabilitiesTarget = $this.closest('li').find('.pack_availabilities');
$availabilitiesTarget.html('<div class="swiper-wrapper"></div>');
//$('#home_packs_list li.selected .pack_availabilities').slideUp().html('');
$('#home_packs_list li.selected .pack_availabilities').slideUp();
$('#home_packs_list li.selected .pack_warning').slideUp();
var choosedPack = $this.attr('data-id');
window.talbiJSLoading.show('Recherche des disponibilités');
$.ajax({
url: '/api/getAvailabilities',
type: 'POST',
dataType: 'json',
data: {pack:choosedPack, date:window.choosedDate, dateID:window.choosedDateID},
success: function(r){
window.talbiJSLoading.hide();
$this.closest('li').addClass('selected');
if(r.availabilities.length > 0){
if(document.querySelector("#home_packs_list li.pack_id_"+choosedPack+" .pack_availabilities").swiper) {
availabilitiesSwiper.removeAllSlides();
}
availabilitiesSwiper = new Swiper("#home_packs_list li.pack_id_"+choosedPack+" .pack_availabilities", {
//slidesPerView: 3,
spaceBetween: 20,
autoplay: {
delay: 1000,
disableOnInteraction: true,
},
breakpoints: {
640: {
slidesPerView: 1,
loop: false,
},
1024: {
slidesPerView: 3,
loop: false,
},
}
});
var availabilitiesSwiperContent = '';
r.availabilities.forEach(function(e){
availabilitiesSwiperContent += '<div data-raw=\''+JSON.stringify(e.raw)+'\' class="swiper-slide"><i class="infos">?</i><span class="from">Du '+e.start.date+' à '+e.start.hour+'H</span><span class="to">Au '+e.end.date+' à '+e.end.hour+'H</span><span class="btn choose_availability_btn">Réserver</span></div>';
});
availabilitiesSwiper.appendSlide(availabilitiesSwiperContent);
availabilitiesSwiper.update(true);
$availabilitiesTarget.slideDown();
} else {
$this.closest('li').find('.pack_warning').html('{{"Aucune disponibilité trouvée, merci de choisir une autre date d\'examen ou bien un autre pack"|trans}}').slideDown();
//window.talbiJSAlert.show('warning', "Aucune disponibilité trouvée, merci de choisir une autre date d'examen ou bien un autre pack", 3000);
}
},
error: function(r){
window.talbiJSLoading.hide();
window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
}
})
});
$(document).on('click', '.choose_availability_btn', function(){
window.selectedAvailability = $(this).closest('div');
if(window.loggedIn){
if(window.isPartner){
$('#registrationModal').modal('show');
} else {
chooseAvailability();
}
} else {
$('#loginModal').modal('toggle');
}
});
function chooseAvailability(){
var rawData, ajTarget;
if(window.choosedType == 'code'){
rawData = {};
ajTarget = 'bookCodeAvailability';
} else {
rawData = window.selectedAvailability.attr('data-raw');
ajTarget = 'bookAvailability';
}
var examDate = window.choosedDate;
var examDateID = window.choosedDateID;
var pack = $('#home_packs_list li.selected .choose_pack_btn').attr('data-id');
var affiliate = window.affiliate;
window.talbiJSLoading.show();
$.ajax({
url: '/api/'+ajTarget,
type: 'POST',
dataType: 'json',
data: {examDate:examDate, examDateID:examDateID, rawData:rawData, pack:pack, affiliate:affiliate},
success: function(r){
window.talbiJSLoading.hide();
if(r.success){
if(window.isPartner){
window.talbiJSAlert.show('success', "Lien de paiement envoyé par mail", 5000);
} else {
document.location.href = '/checkout/' + r.success;
}
} else if(r.errors){
window.talbiJSAlert.show('danger', r.errors.join('\n'));
} else {
window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
}
},
error: function(r){
window.talbiJSLoading.hide();
window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
}
});
}
function customScrollTo($element, timeOut=1000){
$([document.documentElement, document.body]).animate({
scrollTop: $element.offset().top - ($('#website_header').height() + 30)
}, timeOut);
}
function parseWinHash(){
const hash = window.location.hash.substring(1);
const hashValues = hash.split('&');
var finalReturn = {};
if(hash && hashValues.length > 0){
hashValues.forEach(function(e){
hashValueSplit = e.split('=');
finalReturn[hashValueSplit[0]] = hashValueSplit[1];
});
}
return finalReturn;
}
window.parsedWinHash = parseWinHash();
function processWinHash(){
if(window.parsedWinHash){
if(window.parsedWinHash['type']){
$('.choose_type_btn[data-type="'+window.parsedWinHash['type']+'"]').trigger('click');
if(window.parsedWinHash['type'] != 'code') $('#has_code_wrp button[data-type="yes"]').trigger('click');
}
if(window.parsedWinHash['subType']){
$('.homeSubType_inner button[data-subtype="'+window.parsedWinHash['subType']+'"]').trigger('click');
}
if(window.parsedWinHash['boost']){
var boostIndex = boostVals.indexOf(window.parsedWinHash['boost']);
$('#home_boost_range').val(boostIndex + 1);
$('#home_boost_confirm').trigger('click');
}
}
}
processWinHash();
function updateWinHash(key, value) {
window.removeEventListener('popstate', processPopstate);
window.parsedWinHash[key] = value;
var finalHash = Object.keys(window.parsedWinHash).map(function(x){return x + '=' + window.parsedWinHash[x];}).join('&');
window.location.hash = '#' + finalHash;
window.addEventListener('popstate', processPopstate);
}
var currentState = history.state;
function processPopstate(){
window.parsedWinHash = parseWinHash();
parsedWinHashLength = Object.keys(window.parsedWinHash).length;
if(parsedWinHashLength == 0){
$('.homeChoosedType, .homeSubType').slideUp();
$('#home_slider').slideDown();
} else if(parsedWinHashLength == 1){
$('#home_boost_wrp').slideUp();
}
if(!window.parsedWinHash['boost']){
$('#home_examDates_wrp').slideUp();
}
processWinHash();
}
window.addEventListener('popstate', processPopstate);
});
var slideIndex = 1;
{# showSlides(slideIndex); #}
// Next/previous controls
function plusSlides(n) {
showSlides(slideIndex += n);
}
// Thumbnail image controls
function currentSlide(n) {
showSlides(slideIndex = n);
}
function showSlides(n) {
var i;
var slides = document.getElementsByClassName("mySlides");
var dots = document.getElementsByClassName("dot");
if (n > slides.length) {slideIndex = 1}
if (n < 1) {slideIndex = slides.length}
for (i = 0; i < slides.length; i++) {
slides[i].style.display = "none";
}
for (i = 0; i < dots.length; i++) {
dots[i].className = dots[i].className.replace(" active", "");
}
slides[slideIndex-1].style.display = "block";
dots[slideIndex-1].className += " active";
}
</script>
{% endblock %}