templates/front/index.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {# {% block title %}{% endblock %} #}
  3. {% block stylesheets %}
  4. <link rel="stylesheet" href="{{ asset('assets/css/slider.css') }}?v=1.0.0"/>
  5. <!-- Link Swiper's CSS -->
  6. <link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.min.css" />
  7. <style>
  8. .aniBG {
  9.     position: fixed;
  10.     top:0;
  11.     left:0;
  12.     width:100%;
  13.     height:100%;
  14.     /*background-size: contain;*/
  15.     background-size: 50%;
  16.     background-position: center;
  17.     opacity: 0.3;
  18.     z-index: 1;
  19. }
  20. .aniBG.type_signs {
  21.     background-image:url('{{ asset('assets/img/bg/signs.png') }}');
  22. }
  23. .aniBG.type_auto {
  24.     background-image:url('{{ asset('assets/img/bg/car.png') }}');
  25.     animation: aniBGAnimAuto 6s infinite;
  26. }
  27. .aniBG.type_code {
  28.     background-image:url('{{ asset('assets/img/bg/licence.png') }}');
  29.     animation: aniBGAnimCode 6s infinite;
  30. }
  31. .aniBG.type_moto {
  32.     background-image:url('{{ asset('assets/img/bg/moto.png') }}');
  33.     animation: aniBGAnimMoto 6s infinite;
  34. }
  35. body.type_moto .aniBG.type_code, body.type_moto .aniBG.type_auto,
  36. body.type_code .aniBG.type_auto, body.type_code .aniBG.type_moto,
  37. body.type_auto .aniBG.type_code, body.type_auto .aniBG.type_moto {
  38.     display: none;
  39. }
  40. .homeSubType {
  41.     display: none;
  42. }
  43. .remainingPlaces {
  44.     position: absolute;
  45.     right: -1px;
  46.     bottom: 0px;
  47.     line-height: initial;
  48.     background: white;
  49.     text-align: center;
  50.     padding: 3px 9px;
  51.     font-size: 11px;
  52.     border-radius: 3px 0 0 3px;
  53.     color: #c61c61;
  54. }
  55. @keyframes aniBGAnimAuto {
  56.     0% {
  57.         opacity:0;
  58.     }
  59.     25% {
  60.         opacity:1;
  61.     }
  62.     50% {
  63.         opacity:0;
  64.     }
  65. }
  66. @keyframes aniBGAnimCode {
  67.     0% {
  68.         opacity:0;
  69.     }
  70.     25% {
  71.         opacity:0;
  72.     }
  73.     50% {
  74.         opacity:1;
  75.     }
  76.     75% {
  77.         opacity:0;
  78.     }
  79. }
  80. @keyframes aniBGAnimMoto {
  81.     0% {
  82.         opacity:0;
  83.     }
  84.     50% {
  85.         opacity:0;
  86.     }
  87.     75% {
  88.         opacity:1;
  89.     }
  90.     100% {
  91.         opacity:0;
  92.     }
  93. }
  94. .homeSubType img {
  95.     width: 80%;
  96.     background: #0a58ca;
  97.     border-radius: 10px;
  98.     padding: 15%;
  99.     transform: translate(0, 250%);
  100.     transition-duration:2s;
  101. }
  102. .homeSubType button {
  103.     width: 27%;
  104.     text-align: center;
  105. }
  106. .homeSubType button span {
  107.     margin-top: 20px;
  108.     display: block;
  109.     font-weight: bold;
  110.     font-size: 23px;
  111. }
  112. .homeSubType_inner {
  113.     display: flex;
  114.     align-items: center;
  115.     justify-content: center;
  116.     padding: 40px 0px;
  117.     overflow: hidden;
  118. }
  119. body[class*="type_"] .homeSubType img {
  120.     transform: translate(0, 0);
  121. }
  122. body.type_auto .homeSubType button:last-child img {
  123.     transition-delay: 0.5s;
  124. }
  125. body.type_code .homeSubType button:first-child img {
  126.     transition-delay: 1s;
  127. }
  128. body.type_code .homeSubType button:last-child img {
  129.     transition-delay: 1.5s;
  130. }
  131. #homeChoosedType_auto .auto,
  132. #homeChoosedType_auto .manuelle,
  133. #homeChoosedType_code .stage,
  134. #homeChoosedType_code .online {
  135.     opacity:0;
  136.     position: absolute;
  137.     width: 18%;
  138.     background: #c61e61;
  139.     border-radius: 7px;
  140.     padding: 2%;
  141.     z-index: 1;
  142.     top: 1%;
  143.     margin-left: -2%;
  144. }
  145. .homeChoosedType {
  146.     background: #36165a;
  147.     width: 50%;
  148.     margin: auto;
  149.     padding: 0 15%;
  150.     border-radius: 0 0px 10px 10px;
  151.     position: relative;
  152.     display: none;
  153. }
  154. div#homeChoosedType_auto img.car,
  155. div#homeChoosedType_code img.code,
  156. div#homeChoosedType_moto img.moto {
  157.     width: 100%;
  158. }
  159. #homeChoosedType_auto .auto,
  160. #homeChoosedType_auto .manuelle,
  161. #homeChoosedType_code .stage,
  162. #homeChoosedType_moto .moto_a2,
  163. #homeChoosedType_code .online {
  164.     animation: animHomeChoosedTypeIcon 10s infinite;
  165. }
  166. #homeChoosedType_moto .moto_a2 {
  167.     position: absolute;
  168.     z-index: 2;
  169.     background: #c61e61;
  170.     color: #fff;
  171.     border-radius: 7px;
  172.     padding: 1%;
  173.     text-align: center;
  174.     font-weight: bold;
  175.     font-size: 2.2em;
  176. }
  177. @keyframes animHomeChoosedTypeIcon {
  178.     0% {
  179.         transform: translate(0, 0);
  180.     }
  181.     20% {
  182.         transform: translate(10px, 7px);
  183.     }
  184.     80% {
  185.         transform: translate(-10px, 3px);
  186.     }
  187.     100% {
  188.         transform: translate(0px, 0px);
  189.     }
  190. }
  191. .homeChoosedType i.close {
  192.     position: absolute;
  193.     z-index: 2;
  194.     background: #fff;
  195.     right: -3px;
  196.     font-size: 2em;
  197.     padding: 0 19px;
  198.     border-radius: 3px;
  199.     color: #36165a;
  200.     font-weight: bold;
  201.     cursor: pointer;
  202. }
  203. .subType_cta {
  204.     text-align: center;
  205.     padding-top: 30px;
  206.     font-weight: bold;
  207.     font-size: 23px;
  208.     animation: focus-in-expand 2s;
  209. }
  210. @media all and (max-width:640px){
  211.     .homeChoosedType i.close {
  212.         font-size: 1em;
  213.         padding: 0 9px;
  214.     }
  215.     #homeChoosedType_moto .moto_a2 {
  216.         font-size: 1.2em;
  217.     }
  218.     .homeChoosedType {
  219.         width: 60%;
  220.     }
  221.     .subType_cta {
  222.         padding-top: 20px;
  223.         font-size: 19px;
  224.     }
  225.     .homeSubType_inner {
  226.         padding: 20px 0px;
  227.     }
  228.     .homeSubType button {
  229.     }
  230.     .homeSubType button span {
  231.         font-size: 17px;
  232.     }
  233.     .between {
  234.         text-align: center;
  235.         font-size: 13px;
  236.     }
  237.     #homeSubType_code button {
  238.         width: 50%;
  239.     }
  240.     #home_examDates .infWrp {
  241.         flex-direction: column;
  242.         width: 100%;
  243.         padding: 10px;
  244.     }
  245.     #home_examDates .swiper-slide .btn {
  246.         width: 100%;
  247.         border: none !important;
  248.     }
  249.     #home_examDates .centerName, #home_examDates .date {
  250.         line-height: normal;
  251.     }
  252. }
  253. @-webkit-keyframes focus-in-expand {
  254.   0% {
  255.     letter-spacing: -0.5em;
  256.     -webkit-filter: blur(12px);
  257.             filter: blur(12px);
  258.     opacity: 0;
  259.   }
  260.   100% {
  261.     -webkit-filter: blur(0px);
  262.             filter: blur(0px);
  263.     opacity: 1;
  264.   }
  265. }
  266. @keyframes focus-in-expand {
  267.   0% {
  268.     letter-spacing: -0.5em;
  269.     -webkit-filter: blur(12px);
  270.             filter: blur(12px);
  271.     opacity: 0;
  272.   }
  273.   100% {
  274.     -webkit-filter: blur(0px);
  275.             filter: blur(0px);
  276.     opacity: 1;
  277.   }
  278. }
  279. .no_pack_img_wrp {
  280.     padding: 12%;
  281.     background: #e2e2e2;
  282. }
  283. .no_pack_img_wrp img {
  284.     width: 50% !important;
  285.     margin: auto;
  286.     display: block;
  287. }
  288. #home_boost_wrp .slidecontainer {
  289.   width: 100%; /* Width of the outside container */
  290.   height: 25px;
  291. }
  292. /* The slider itself */
  293. #home_boost_wrp .slider {
  294.     appearance: none;
  295.     width: 100%;
  296.     height: 15px;
  297.     outline: none;
  298.     opacity: 0.7;
  299.     -webkit-appearance: none;
  300.     -webkit-transition: .2s;
  301.     transition: opacity .2s;
  302.     border-radius: 10px;
  303.     background: repeating-linear-gradient(to right, red 0%, blue 50%, red 100%);
  304.     width: 100%;
  305.     background-size: 200% auto;
  306.     background-position: 0 100%;
  307.     animation: gradientAnimation 2s infinite;
  308.     animation-fill-mode: forwards;
  309.     animation-timing-function: linear;
  310.     cursor: grab;
  311.     /*
  312.     background: #d3d3d3;
  313.     -webkit-transition: .2s;
  314.     transition: opacity .2s;
  315.     border-radius: 10px;*/
  316. }
  317. /* Mouse-over effects */
  318. #home_boost_wrp .slider:hover {
  319.   opacity: 1; /* Fully shown on mouse-over */
  320. }
  321. #home_boost_wrp .slider::-webkit-slider-thumb {
  322.   -webkit-appearance: none;
  323.   appearance: none;
  324.   width: 32px;
  325.   height: 32px;
  326.   background: #36165a;
  327.   cursor: pointer;
  328.   border-radius: 50%;
  329.   border: 3px solid #fff;
  330. }
  331. #home_boost_wrp .slider::-moz-range-thumb {
  332.   width: 32px;
  333.   height: 32px;
  334.   background: #36165a;
  335.   cursor: pointer;
  336.   border-radius: 50%;
  337.   border: 3px solid #fff;
  338. }
  339. #home_boost_wrp {
  340.     padding-bottom: 30px;
  341. }
  342. #home_examDates .infWrp {
  343.     width: calc(100% - 78px);
  344.     display: flex;
  345.     float: left;
  346.     justify-content: center;
  347.     position: relative;
  348. }
  349. #home_examDates .date {
  350.     margin-left: 20px;
  351. }
  352. #home_examDates .centerName {
  353.     margin-left: 10px;
  354. }
  355. @keyframes home_boost_wrpSliderAnim {
  356.     0%{
  357.         transform: scale(1);
  358.     }
  359.     70%{
  360.         transform: scale(1);
  361.     }
  362.     75%{
  363.         transform: scale(0.5);
  364.     }
  365.     80%{
  366.         transform: scale(1);
  367.     }
  368.     85%{
  369.         transform: scale(0.5);
  370.     }
  371.     90%{
  372.         transform: scale(1);
  373.     }
  374.     100%{
  375.         transform: scale(1);
  376.     }
  377. }
  378. #home_boost_wrp h2 {
  379.     text-align: center;
  380.     margin: 40px auto 20px;
  381. }
  382. #home_boost_wrp, #home_boost_choices > li {
  383.     display: none;
  384. }
  385. #home_examDates .swiper-slide.full {
  386.     background: gray;
  387. }
  388. #home_examDates .swiper-slide.full .btn {
  389.     background: #3d3d3d;
  390. }
  391. ul#home_boost_choices {
  392.     text-align: center;
  393.     list-style: none;
  394.     padding: 0;
  395. }
  396. ul#home_boost_choices ul {
  397.     padding: 0;
  398.     list-style: none;
  399. }
  400. img.boost_icn {
  401.     background: #2196f3;
  402.     border-radius: 7px;
  403.     margin-bottom: 10px;
  404.     margin-top: 20px;
  405.     width: 90px;
  406.     padding: 17px;
  407.     animation: home_boost_wrpSliderAnim 3s infinite;
  408.     -moz-animation: home_boost_wrpSliderAnim 3s infinite;
  409. }
  410. ul#home_boost_choices .infos {
  411.     font-size: 13px;
  412. }
  413. button#home_boost_confirm {
  414.     margin: auto;
  415.     display: block;
  416.     font-weight: bold;
  417.     text-transform: uppercase;
  418.     font-size: 23px;
  419.     color: #989898;
  420. }
  421. .aniBG,
  422. #page_top_wrp,
  423. #page_bottom_wrp {
  424.     /*display: none;*/
  425. }
  426. div#updatingQuestionsModal .modal-body {background: red;color: #fff;}
  427. h5#updatingQuestionsModalLabel {
  428.     color: red;
  429. }
  430. </style>
  431. {% endblock %}
  432. {% block pageTop %}
  433.     <p>{{"Passez votre examen en 1 jour avec ESR Auto Moto"|trans}}</p>
  434. {% endblock %}
  435. {% block body %}
  436. <!-- Swiper -->
  437. <div id="home_slider" class="swiper mySwiper">
  438.     <div class="swiper-wrapper">
  439.         <div class="swiper-slide">
  440.             <div class="block block_voiture">
  441.                 {{"Voiture"|trans}}
  442.                 <button data-type="auto" type="button" class="btn choose_type_btn">{{"Choisir"|trans}}</button>
  443.             </div>
  444.         </div>
  445.         <div class="swiper-slide codeSlide">
  446.             <div class="block block_code">
  447.                 {{"Code de la route"|trans}}
  448.                 <button data-type="code" type="button" class="btn choose_type_btn">{{"Choisir"|trans}}</button>
  449.             </div>
  450.         </div>
  451.         <div class="swiper-slide">
  452.             <div class="block block_moto">
  453.                 {{"Moto"|trans}}
  454.                 <button data-type="moto" type="button" class="btn choose_type_btn">{{"Choisir"|trans}}</button>
  455.             </div>
  456.         </div>
  457.     </div>
  458.     <div class="swiper-button-next"></div>
  459.     <div class="swiper-button-prev"></div>
  460. </div>
  461. <div class="container">
  462.     <div id="has_code_wrp">
  463.         <h2 id="has_code_wrp_title">{{"Avez-vous déjà votre code ?"|trans}}</h2>
  464.         <div class="inner">
  465.             <button type="button" data-type="yes" class="btn">{{"Oui"|trans}}</button>
  466.             <button type="button" data-type="no" class="btn">{{"Non"|trans}}</button>
  467.         </div>
  468.     </div>
  469.     <div id="needCodeFirstWarning">{{"Vous devez passer votre code en premier"|trans}}</div>
  470.     <div id="homeChoosedType_auto" class="homeChoosedType">
  471.         <i class="close">x</i>
  472.         <img class="auto" src="{{ asset('assets/img/icons/automatic-transmission.png') }}" />
  473.         <img class="manuelle" src="{{ asset('assets/img/icons/manual-transmission.png') }}" />
  474.         <img class="car" src="{{ asset('assets/img/icons/eco-car.png') }}" />
  475.     </div>
  476.     <div id="homeChoosedType_code" class="homeChoosedType">
  477.         <i class="close">x</i>
  478.         <img class="stage" src="{{ asset('assets/img/icons/fast.png') }}" />
  479.         <img class="online" src="{{ asset('assets/img/icons/laptop.png') }}" />
  480.         <img class="code" src="{{ asset('assets/img/icons/driving-license.png') }}" />
  481.     </div>
  482.     <div id="homeChoosedType_moto" class="homeChoosedType">
  483.         <i class="close">x</i>
  484.         <div class="moto_a2">A2</div>
  485.         <img class="moto" src="{{ asset('assets/img/icons/motorbike.png') }}" />
  486.     </div>
  487.     <div id="homeSubType_auto" class="homeSubType">
  488.         <div class="subType_cta">{{"Que la force soit avec vous !"|trans}}</div>
  489.         <div class="homeSubType_inner">
  490.             <button type="button" data-subType="auto" class="btn">
  491.                 <img src="{{ asset('assets/img/icons/automatic-transmission.png') }}" />
  492.                 <span>{{"Automatique"|trans}}</span>
  493.             </button>
  494.             <div class="between">{{"Ou bien"|trans}}</div>
  495.             <button type="button" data-subType="manuelle" class="btn">
  496.                 <img src="{{ asset('assets/img/icons/manual-transmission.png') }}" />
  497.                 <span>{{"Manuel"|trans}}</span>
  498.             </button>
  499.         </div>
  500.     </div>
  501.     <div id="homeSubType_code" class="homeSubType">
  502.         <div class="subType_cta">{{"Passez votre examen en 1 jour !"|trans}}</div>
  503.         <div class="homeSubType_inner">
  504.             <button type="button" data-subType="stage" class="btn">
  505.                 <img src="{{ asset('assets/img/icons/fast.png') }}" />
  506.                 <span>{{"Stage code 1 jour"|trans}}</span>
  507.             </button>
  508.             <div class="between">{{"Ou bien"|trans}}</div>
  509.             <button type="button" data-subType="online" class="btn">
  510.                 <img src="{{ asset('assets/img/icons/laptop.png') }}" />
  511.                 <span>{{"Code en ligne"|trans}}</span>
  512.             </button>
  513.         </div>
  514.     </div>
  515.     <div id="home_boost_wrp">
  516.         <h2 id="home_boost_title">{{"Choisissez votre Boost"|trans}}</h2>
  517.         <div class="slidecontainer">
  518.             <input type="range" min="1" max="3" value="3" step="1" class="slider" id="home_boost_range">
  519.         </div>
  520.         <ul id="home_boost_choices">
  521.             <li data-level="1">
  522.                 <img src="{{ asset('assets/img/icons/forward.png')}}" class="boost_icn" />
  523.                 <h4>{{"C. Libre"|trans}}</h4>
  524.                 <ul class="infos">
  525.                     {# <li>Examen après 6 mois</li> #}
  526.                     <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>
  527.                 </ul>
  528.             </li>
  529.             <li data-level="2">
  530.                 <img src="{{ asset('assets/img/icons/fast-forward.png')}}" class="boost_icn" />
  531.                 <h4>{{"Accéléré"|trans}}</h4>
  532.                 <ul class="infos">
  533.                     {# <li>Examen après 2 mois</li> #}
  534.                     <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>
  535.                 </ul>
  536.             </li>
  537.             <li data-level="3">
  538.                 <img src="{{ asset('assets/img/icons/boost.png')}}" class="boost_icn" />
  539.                 <h4>{{"Super accéléré"|trans}}</h4>
  540.                 <ul class="infos">
  541.                     {# <li>Examen avant 2 mois</li> #}
  542.                     <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>
  543.                 </ul>
  544.             </li>
  545.         </ul>
  546.         <button type="button" id="home_boost_confirm" class="btn">{{"Valider"|trans}}</button>
  547.     </div>
  548.     <div id="home_examDates_wrp">
  549.         <h2 id="home_examDates_title">{{"Dates d'examen"|trans}}</h2>
  550.         <div class="nav_wrp">
  551.             <div class="swiper-button-next"></div>
  552.             <div class="swiper-button-prev"></div>
  553.         </div>
  554.         <div class="monthChooser">{{"Mois"|trans}}</div>
  555.         <div id="home_examDates">
  556.             <div class="swiper-wrapper">
  557.                 {# {% for examDate in examDates %}
  558.                     <div class="swiper-slide" data-date="{{examDate.date|date('Y-m-d')}}">
  559.                         {{examDate.date|date('d-m-Y')}}
  560.                         <div class="btn choose_ExamDate_btn">Choisir</div>
  561.                     </div>
  562.                 {% endfor %} #}
  563.             </div>
  564.         </div>
  565.         <div id="examDates_statuts">
  566.             <div class="free">{{"Libre"|trans}}</div>
  567.             <div class="temporary">{{"Temporaire"|trans}}</div>
  568.             <div class="full">{{"Saturée"|trans}}</div>
  569.         </div>
  570.     </div>
  571.     <div id="home_packs_wrp">
  572.         <h2 id="home_packs_title">{{"Packs"|trans}}</h2>
  573.         <ul id="home_packs_list">
  574.             {% for pack in packs %}
  575.                 <li data-id="{{pack.id}}" class="pack pack_id_{{pack.id}} pack_{{pack.category}} subtype_{{pack.type}} boost_{{pack.boost}}">
  576.                     <div class="left_wrp">
  577.                         {% if pack.image %}
  578.                             <img src="{{ asset('assets/img/packs/')  ~  pack.image }}" class="pack_img" />
  579.                         {% else %}
  580.                             <div class="no_pack_img_wrp"><img src="{{ asset('assets/img/icons/no-image.png') }}" /></div>
  581.                         {% endif %}
  582.                     </div>
  583.                     <div class="center_wrp">
  584.                         <h5>{{pack.name}} {% if pack.duration > 0 %}{{pack.duration}}H{% endif %}<i class="pack_infos">?</i></h5>
  585.                         <div class="description">{{pack.description|raw}}</div>
  586.                         <div class="long_description">{{pack.LongDescription|raw}}</div>
  587.                         {# <div class="description">{{pack.description|striptags|slice(0, 80)|raw}}</div> #}
  588.                     </div>
  589.                     <div class="right_wrp">
  590.                         <span class="pack_price">{{pack.price}} €</span>
  591.                         <button data-id="{{pack.id}}" type="button" class="btn choose_pack_btn">{{"Choisir"|trans}}</button>
  592.                     </div>
  593.                     <ul class="pack_availabilities"></ul>
  594.                     <div class="pack_warning"></div>
  595.                 </li>
  596.             {% endfor %}
  597.         </ul>
  598.     </div>
  599. </div>
  600. {% endblock %}
  601. {% block pageBottom %}
  602.     <div class="swiper-wrapper">
  603.         <div class="swiper-slide blue">
  604.             <a href="https://moncompteformation.gouv.fr" target="_Blank">
  605.                 <img src="{{ asset('assets/img/cpf.png') }}" />
  606.                 <p>{{"Votre permis de conduite <span class=\"highlighted\">gratuit</span> ?<br />C’est possible grâce au CPF !"|trans|raw}}</p>
  607.             </a>
  608.         </div>
  609.         <div class="swiper-slide yellow">
  610.             <a href="https://moncompteformation.gouv.fr" target="_Blank">
  611.                 <img src="{{ asset('assets/img/logo_ecole_de_conduite.png') }}" />
  612.                 <p>{{"Un enseignement de <span class=\"highlighted\">qualité</span> et une information claire et transparente"|trans|raw}}</p>
  613.             </a>
  614.         </div>
  615.         <div class="swiper-slide red">
  616.             <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">
  617.                 <img src="{{ asset('assets/img/LogoQualiopi.png') }}" />
  618.                 <p>{{"Marque de certification <span class=\"highlighted\">qualité</span> des prestataires de formation"|trans|raw}}</p>
  619.             </a>
  620.         </div>
  621.         <div class="swiper-slide red2">
  622.             <a href="https://getalma.eu/" target="_Blank">
  623.                 <img src="{{ asset('assets/img/logo-alma.png') }}" />
  624.                 <p>{{"Payez votre formation <span class=\"highlighted\">en 3 fois</span> grâce à Alma"|trans|raw}}</p>
  625.             </a>
  626.         </div>
  627.     </div>
  628. {% endblock %}
  629. {% block footerJavascripts %}
  630. <!-- Updating Questions Modal -->
  631. <div class="modal fade" id="updatingQuestionsModal" tabindex="-1" role="dialog" aria-labelledby="updatingQuestionsModalLabel" aria-hidden="true">
  632.     <div class="modal-dialog" role="document">
  633.         <div class="modal-content">
  634.             <div class="modal-header">
  635.                 <h5 class="modal-title" id="updatingQuestionsModalLabel">Attention !</h5>
  636.                 <button type="button" class="btn close" data-dismiss="modal" aria-label="Close">
  637.                     <span aria-hidden="true">&times;</span>
  638.                 </button>
  639.             </div>
  640.             <div class="modal-body">
  641.                 Les questions de l'examen sont actuellement en cours de mise à jour...
  642.             </div>
  643.             <div class="modal-footer">
  644.                 <button type="button" class="btn btn-secondary" data-dismiss="modal">Fermer</button>
  645.             </div>
  646.         </div>
  647.     </div>
  648. </div>
  649. <!-- ! Updating Questions Modal -->
  650. <!-- Login Modal -->
  651. <div class="modal fade" id="loginModal" tabindex="-1" role="dialog" aria-labelledby="loginModalLabel" aria-hidden="true">
  652.     <div class="modal-dialog" role="document">
  653.         <div class="modal-content">
  654.             <div class="modal-header">
  655.                 <h5 class="modal-title" id="loginModalLabel">{{"Identification"|trans}}</h5>
  656.                 <button type="button" class="btn close" data-dismiss="modal" aria-label="Close">
  657.                     <span aria-hidden="true">&times;</span>
  658.                 </button>
  659.             </div>
  660.             <div class="modal-body">
  661.                 <h3 class="insent_sentence">{{"Vous y êtes presque !<br />Identifiez-vous pour passer au paiement."|trans|raw}}</h3>
  662.                 <form id="popup_login_form">
  663.                     <div class="form-group">
  664.                         <label for="login_username">{{"Login"|trans}}</label>
  665.                         <input type="email" id="login_username" class="form-control" />
  666.                     </div>
  667.                     <div class="form-group">
  668.                         <label for="login_password">{{"Mot de passe"|trans}}</label>
  669.                         <input type="password" id="login_password" class="form-control" />
  670.                     </div>
  671.                 </form>
  672.                 <div class="other">
  673.                     {{"Vous n'avez pas encore de compte ?<br /><a href=\"#\" class=\"open_registrationPopup\">Cliquez ici</a> pour vous inscrire"|trans|raw}}
  674.                 </div>
  675.             </div>
  676.             <div class="modal-footer">
  677.                 <button type="button" class="btn btn-secondary" data-dismiss="modal">{{"Annuler"|trans}}</button>
  678.                 <button id="popup_login_btn" type="button" class="btn btn-primary">{{"Connexion"|trans}}</button>
  679.             </div>
  680.         </div>
  681.     </div>
  682. </div>
  683. <!-- ! Login Modal -->
  684. <!-- Registration Modal -->
  685. <div class="modal fade" id="registrationModal" tabindex="-1" role="dialog" aria-labelledby="registrationModalLabel" aria-hidden="true">
  686.     <div class="modal-dialog" role="document">
  687.         <div class="modal-content">
  688.             <div class="modal-header">
  689.                 <h5 class="modal-title" id="registrationModalLabel">{{"Inscription"|trans}}</h5>
  690.                 <button type="button" class="btn close" data-dismiss="modal" aria-label="Close">
  691.                     <span aria-hidden="true">&times;</span>
  692.                 </button>
  693.             </div>
  694.             <div class="modal-body">
  695.                 <h3 class="insent_sentence">{{"Plus qu'une seule étape !<br />Inscrivez-vous pour passer au paiement."|trans|raw}}</h3>
  696.                 <form id="popup_register_form">
  697.                     <div class="form-group">
  698.                         <label for="registration_username">{{"Email"|trans}}</label>
  699.                         <input type="email" id="registration_username" class="form-control" />
  700.                     </div>
  701.                     <div class="form-group">
  702.                         <label for="registration_password">{{"Mot de passe"|trans}}</label>
  703.                         <input type="password" id="registration_password" class="form-control" />
  704.                     </div>
  705.                     <div class="form-group">
  706.                         <label for="registration_phone">Téléphone</label>
  707.                         <input type="text" id="registration_phone" class="form-control" name="registration_phone" />
  708.                     </div>
  709.                     <div class="form-group">
  710.                         <label for="registration_partner">{{"Code parrainage"|trans}}</label>
  711.                         <input type="text" id="registration_partner" class="form-control" />
  712.                     </div>
  713.                 </form>
  714.                 <div class="other">
  715.                     {{"Vous avez déjà un compte ?<br /><a href=\"#\" class=\"open_loginPopup\">Cliquez ici</a> pour vous connecter"|trans|raw}}
  716.                 </div>
  717.             </div>
  718.             <div class="modal-footer">
  719.                 <button type="button" class="btn btn-secondary" data-dismiss="modal">{{"Annuler"|trans}}</button>
  720.                 <button id="popup_register_btn" type="button" class="btn btn-primary">{{"Valider"|trans}}</button>
  721.             </div>
  722.         </div>
  723.     </div>
  724. </div>
  725. <!-- ! Registration Modal -->
  726. <!-- Months Modal -->
  727. <div class="modal fade" id="monthsModal" tabindex="-1" role="dialog" aria-labelledby="monthsModalLabel" aria-hidden="true">
  728.     <div class="modal-dialog" role="document">
  729.         <div class="modal-content">
  730.             <div class="modal-header">
  731.                 <h5 class="modal-title" id="monthsModalLabel">{{"Choisissez un mois"|trans}}</h5>
  732.                 <button type="button" class="close btn" data-dismiss="modal" aria-label="Close">
  733.                     <span aria-hidden="true">&times;</span>
  734.                 </button>
  735.             </div>
  736.             <div class="modal-body">
  737.                 <ul id="monthsModal_list">
  738.                     {% for examMonth in examMonths %}
  739.                         <li>
  740.                             <button type="button" class="btn btn-info" data-date="{{examMonth.date}}">{{examMonth.readable}}</button>
  741.                         </li>
  742.                     {% endfor %}
  743.                 </ul>
  744.             </div>
  745.             <div class="modal-footer">
  746.                 <button type="button" class="btn btn-secondary" data-dismiss="modal">{{"Annuler"|trans}}</button>
  747.             </div>
  748.         </div>
  749.     </div>
  750. </div>
  751. <!-- ! Months Modal -->
  752. <!-- Availability Details Modal -->
  753. <div class="modal fade" id="availabilityDetailsModal" tabindex="-1" role="dialog" aria-labelledby="availabilityDetailsModalLabel" aria-hidden="true">
  754.     <div class="modal-dialog" role="document">
  755.         <div class="modal-content">
  756.             <div class="modal-header">
  757.                 <h5 class="modal-title" id="availabilityDetailsModalLabel">{{"Détails de la disponibilité"|trans}}</h5>
  758.                 <button type="button" class="close btn" data-dismiss="modal" aria-label="Close">
  759.                     <span aria-hidden="true">&times;</span>
  760.                 </button>
  761.             </div>
  762.             <div class="modal-body">
  763.                 <table id="availabilityDetailsModal_list">
  764.                     <thead>
  765.                         <tr>
  766.                             <td>{{"Date"|trans}}</td>
  767.                             <td>{{"Heure de début"|trans}}</td>
  768.                             <td>{{"Heure de fin"|trans}}</td>
  769.                         </tr>
  770.                     </thead>
  771.                     <tbody></tbody>
  772.                 </table>
  773.             </div>
  774.             <div class="modal-footer">
  775.                 <button type="button" class="btn btn-secondary" data-dismiss="modal">{{"Fermer"|trans}}</button>
  776.             </div>
  777.         </div>
  778.     </div>
  779. </div>
  780. <!-- ! Availability Details Modal -->
  781. <!-- Pack Details Modal -->
  782. <div class="modal fade" id="packDetailsModal" tabindex="-1" role="dialog" aria-labelledby="packDetailsModalLabel" aria-hidden="true">
  783.     <div class="modal-dialog" role="document">
  784.         <div class="modal-content">
  785.             <div class="modal-header">
  786.                 <h5 class="modal-title" id="packDetailsModalLabel">{{"Détails du pack"|trans}}</h5>
  787.                 <button type="button" class="close btn" data-dismiss="modal" aria-label="Close">
  788.                     <span aria-hidden="true">&times;</span>
  789.                 </button>
  790.             </div>
  791.             <div class="modal-body">
  792.                 <h6 class="choosedDate_dyn"></h6>
  793.                 <div class="pack_long_description">
  794.                 </div>
  795.             </div>
  796.             <div class="modal-footer">
  797.                 <button type="button" class="btn btn-secondary" data-dismiss="modal">{{"Fermer"|trans}}</button>
  798.             </div>
  799.         </div>
  800.     </div>
  801. </div>
  802. <!-- ! Pack Details Modal -->
  803. <!-- Swiper JS -->
  804. <script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
  805. <!-- Initialize Swiper -->
  806. <script>
  807.     var swiper = new Swiper("#home_slider", {
  808.         loop: true,
  809.         navigation: {
  810.             nextEl: ".swiper-button-next",
  811.             prevEl: ".swiper-button-prev",
  812.         },
  813.         breakpoints: {
  814.             1024: {
  815.                 slidesPerView: 3,
  816.                 loop: false,
  817.             },
  818.         }
  819.     });
  820.     swiper.on('transitionEnd', function () {
  821.         $('#has_code_wrp').slideUp();
  822.     });
  823.     var bottomPageSwiper = new Swiper("#page_bottom_wrp", {
  824.         loop: true,
  825.         autoplay: {
  826.             delay: 1500,
  827.             disableOnInteraction: true,
  828.         },
  829.         speed: 1000, 
  830.         //effect: 'fade',
  831.         //fadeEffect: {
  832.         //    crossFade: true
  833.         //},
  834.         slidesPerView: 1
  835.     });
  836. </script>
  837. <script>
  838. $(document).ready(function($){
  839.     function localStorageAvailable() {
  840.         if (typeof(Storage) !== "undefined") {
  841.             return true;
  842.         } else {
  843.             return false;
  844.         }
  845.     }
  846.     if (localStorageAvailable()) {
  847.         var dontShowUpdatingQuestionsModal = localStorage.dontShowUpdatingQuestionsModal;
  848.         if(!dontShowUpdatingQuestionsModal){
  849.             //$('#updatingQuestionsModal').modal('show');
  850.         }
  851.         $('#updatingQuestionsModal').on('hidden.bs.modal', function() {
  852.             localStorage.dontShowUpdatingQuestionsModal = true;
  853.         });
  854.     }
  855.     {% if app.user %}
  856.         window.loggedIn = true;
  857.     {% endif %}
  858.     var datesSwiper;
  859.     var availabilitiesSwiper = null;
  860.     function animateBlocks(){
  861.         $('#choiceBlocks_wrp').slideDown();
  862.         $('#choiceBlocks_wrp block_1, #choiceBlocks_wrp block_2').addClass('animate');
  863.         setTimeout(function(){
  864.             $('#choiceBlocks_wrp block_1, #choiceBlocks_wrp block_2').removeClass('animate');
  865.         }, 10000);
  866.     }
  867.     $('i.pack_infos').on('click', function(e){
  868.         var packID = $(this).closest('li').attr('data-id');
  869.         $('#packDetailsModal .modal-body .pack_long_description').html($('#home_packs_list li.pack_id_'+packID+' .long_description').html());
  870.         $('#packDetailsModal').modal('show');
  871.     });
  872.     $('.homeSubType button').on('click', function(e){
  873.         window.subType = $(this).attr('data-subType');
  874.         $('.homeSubType').slideUp();
  875.         $('#homeChoosedType_'+window.choosedType+' img.'+window.subType).css({'opacity':1});
  876.         $('#home_packs_wrp li').each(function(i, e){
  877.             if(!$(e).hasClass('subtype_'+window.subType)){
  878.                 $(e).slideUp();
  879.             }
  880.         });
  881.         updateWinHash('subType', window.subType);
  882.         if(window.subType == 'online'){
  883.             window.choosedDate = null;
  884.             window.choosedDateID = null;
  885.             $('#home_packs_list .pack_availabilities').slideUp().html('');
  886.             $('#home_packs_wrp').slideDown();
  887.             customScrollTo($('#home_packs_wrp'));
  888.         } else if(window.choosedType == 'auto'){
  889.             /*$('#home_examDates_wrp, .choose_ExamDate_btn').slideDown();*/
  890.             $('#home_boost_wrp').slideDown();
  891.             customScrollTo($('#home_examDates_wrp'));
  892.         } else {
  893.             getExamDates('code');
  894.             customScrollTo($('#home_examDates_wrp'));
  895.         }
  896.     });
  897.     $('.open_registrationPopup').on('click', function(e){
  898.         e.preventDefault();
  899.         $('#loginModal').modal('hide');
  900.         $('#registrationModal').modal('show');
  901.     });
  902.     $('.monthChooser').on('click', function(e){
  903.         $('#monthsModal').modal('show');
  904.     });
  905.     $('body').on('click', '.pack_availabilities i.infos', function(e){
  906.         availabilitiesSwiper.autoplay.stop();
  907.         var rawData = $(this).closest('.swiper-slide').attr('data-raw');
  908.         rawData = JSON.parse(rawData);
  909.         $('#availabilityDetailsModal_list tbody').html('');
  910.         $.each(rawData, function(k, d){
  911.             $('#availabilityDetailsModal_list tbody').append('<tr><td>'+d[2]+'</td><td>'+d[0]+'H</td><td>'+d[1]+'H</td></tr>');
  912.         });
  913.         $('#availabilityDetailsModal').modal('show');
  914.     });
  915.     $('#monthsModal_list button').on('click', function(e){
  916.         if($(this).closest('li').hasClass('disabled')) return false;
  917.         $('#home_packs_list .pack_availabilities, #home_packs_list .pack_warning').slideUp().html('');
  918.         $('#home_packs_wrp').slideUp();
  919.         getExamDates(window.choosedType, $('#home_boost_range').val(), $(this).attr('data-date'));
  920.     });
  921.     $('.open_loginPopup').on('click', function(e){
  922.         e.preventDefault();
  923.         $('#registrationModal').modal('hide');
  924.         $('#loginModal').modal('show');
  925.     });
  926.     $(document).on('click', '.choose_ExamDate_btn' , function(e){
  927.         e.preventDefault();
  928.         if($(this).closest('.swiper-slide').hasClass('full')) return false;
  929.         //datesSwiper.autoplay = false;
  930.         datesSwiper.autoplay.stop();
  931.         $('#home_examDates_wrp .swiper-slide.selected').removeClass('selected');
  932.         $(this).closest('.swiper-slide').addClass('selected');
  933.         /*$('#home_examDates_wrp li:not(.selected)').slideUp();*/
  934.         window.choosedDate = $(this).closest('.swiper-slide').attr('data-date');
  935.         window.choosedDateID = $(this).closest('.swiper-slide').attr('data-dateID');
  936.         $('.choosedDate_dyn').html($(this).closest('.swiper-slide').attr('data-dateFr'));
  937.         $('#home_packs_list .pack_availabilities, #home_packs_list .pack_warning').slideUp().html('');
  938.         $('#home_packs_wrp').slideDown();
  939.         customScrollTo($(".homeChoosedType"));
  940.     });
  941.     $('#has_code_wrp button').on('click', function(){
  942.         $('#has_code_wrp button.selected').removeClass('selected');
  943.         $(this).addClass('selected');
  944.         window.hasCode = $(this).attr('data-type');
  945.         if(window.hasCode == 'yes'){
  946.             $('#home_slider, #has_code_wrp, #needCodeFirstWarning').slideUp();
  947.             $('#homeChoosedType_'+window.choosedType).slideDown();
  948.             if(window.choosedType != 'moto'){
  949.                 updateWinHash('type', 'auto');
  950.                 $('#homeSubType_'+window.choosedType).slideDown();
  951.                 //customScrollTo($('#homeChoosedType_'+window.choosedType));
  952.             } else {
  953.                 updateWinHash('type', 'moto');
  954.                 getExamDates('moto');
  955.                 //customScrollTo($('#home_examDates_wrp'));
  956.             }
  957.             $([document.documentElement, document.body]).animate({
  958.                 scrollTop: 0
  959.             }, 1000);
  960.             $('body').addClass('type_'+window.choosedType);
  961.         } else {
  962.             $('#needCodeFirstWarning').slideDown();
  963.             //window.talbiJSAlert.show('warning', "Vous devez passer votre code en premier");
  964.             swiper.slideTo( 2,1000,false );
  965.             //swiper.slideTo( $('.codeSlide').index(),1000,false );
  966.             customScrollTo($("#home_slider"));
  967.         }
  968.     });
  969.     var boostVals = ['none', 'fast', 'superFast'];
  970.     $('#home_boost_confirm').on('click', function(){
  971.         $('#homeChoosedType_auto').append($('#home_boost_choices li[data-level="'+$('#home_boost_range').val()+'"]').find('img.boost_icn'));
  972.         var boostVal = boostVals[$('#home_boost_range').val() - 1];
  973.         updateWinHash('boost', boostVal);
  974.         var today = new Date();
  975.         var year = today.getFullYear();
  976.         var month = today.getMonth();
  977.         var day = '01';//today.getDate();
  978.         if(boostVal == 'none'){
  979.             var dateFrom = new Date(year + 1, month, day);
  980.         } else if(boostVal == 'fast'){
  981.             var dateFrom = new Date(year, month + 2, day);
  982.         }
  983.         if(boostVal != 'superFast'){
  984.             $('#monthsModal_list li').each(function(i, e){
  985.                 var tDate = new Date($(e).find('button').attr('data-date')+'-01');
  986.                 if(tDate < dateFrom) $(e).addClass('disabled');
  987.             });
  988.         }
  989.         getExamDates('auto', $('#home_boost_range').val());
  990.         $('#home_packs_wrp li').each(function(i, e){
  991.             if(!$(e).hasClass('boost_'+boostVal)){
  992.                 $(e).slideUp();
  993.             }
  994.         });
  995.         $('#home_boost_wrp').slideUp();
  996.     });
  997.     $('#home_boost_range').on('change', function(){
  998.         updateHomeBoost();
  999.     });
  1000.     updateHomeBoost();
  1001.     function updateHomeBoost(){
  1002.         var level = $('#home_boost_range').val();
  1003.         $('#home_boost_choices > li').slideUp();
  1004.         $('#home_boost_choices li[data-level="'+level+'"]').slideDown();
  1005.     }
  1006.     function getExamDates(type, boost=null, month=null){
  1007.         window.talbiJSLoading.show();
  1008.         $.ajax({
  1009.             url: '/api/getExamDates',
  1010.             type: 'POST',
  1011.             dataType: 'json',
  1012.             data: { type:type, boost:boost, month:month},
  1013.             success: function(r){
  1014.                 window.talbiJSLoading.hide();
  1015.                 if(r.examDates){
  1016.                     var examDatesKeys = Object.keys(r.examDates);
  1017.                     $('#home_examDates_wrp .swiper-wrapper').html('');
  1018.                     $('#home_examDates_wrp').slideUp();
  1019.                     if(examDatesKeys.length > 0){
  1020.                         for (var ix in r.examDates) {
  1021.                             var e = r.examDates[ix];
  1022.                             if(e.status == -1){
  1023.                                 var dateFinal = e.dateStrn;
  1024.                                 var dateFr = e.dateStrn;
  1025.                                 var dataDate = e.date;
  1026.                                 var dExamCenter = '';
  1027.                             } else {
  1028.                                 var ev = new Date(e.date.split('T')[0]);
  1029.                                 var dateFinal = ev.toLocaleDateString();
  1030.                                 var dateFr = ev.toLocaleDateString();
  1031.                                 var dataDate = e.date.split('T')[0];
  1032.                                 var dExamCenter = '<div class="centerName">'+e.centerName+' à '+e.time+'</div>';
  1033.                             }
  1034.                             var remainingPlaces = e.places - e.booked;
  1035.                             var full = remainingPlaces > 0 ? '' : 'full';
  1036.                             var waiting = (e.status == 2 || e.status == -1) ? 'waiting' : '';
  1037.                             $('#home_examDates_wrp .swiper-wrapper').append(
  1038.                                 '<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>'
  1039.                             );
  1040.                         }
  1041.                         if(datesSwiper) datesSwiper.destroy();
  1042.                         datesSwiper = new Swiper("#home_examDates", {
  1043.                             loop: false,
  1044.                             navigation: {
  1045.                                 nextEl: ".swiper-button-next",
  1046.                                 prevEl: ".swiper-button-prev",
  1047.                             },
  1048.                             //longSwipes: true,
  1049.                             autoplay: {
  1050.                                 delay: 1000,
  1051.                                 disableOnInteraction: true,
  1052.                             },
  1053.                             breakpoints: {
  1054.                                 1420: {
  1055.                                     slidesPerView: 3,
  1056.                                     loop: false,
  1057.                                 },
  1058.                                 1024: {
  1059.                                     slidesPerView: 2,
  1060.                                     loop: false,
  1061.                                 },
  1062.                                 720: {
  1063.                                     slidesPerView: 1,
  1064.                                     loop: false,
  1065.                                 },
  1066.                             }
  1067.                         });
  1068.                         //datesSwiper.slideTo( 1,1000,false );
  1069.                         datesSwiper.autoplay.start();
  1070.                     } else {
  1071.                         $('#home_packs_wrp').slideUp();
  1072.                         $('#home_examDates_wrp .swiper-wrapper').append(
  1073.                             '<div class="alert alert-warning">Aucune date trouvée</div>'
  1074.                         );
  1075.                     }
  1076.                     if(month){
  1077.                         $('#monthsModal').modal('hide');
  1078.                     }
  1079.                     $('#home_examDates_wrp, .choose_ExamDate_btn').slideDown();
  1080.                 } else if(r.error) {
  1081.                     window.talbiJSAlert.show('danger', r.error);
  1082.                 } else {
  1083.                     window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
  1084.                 }
  1085.             },
  1086.             error: function(r){
  1087.                 window.talbiJSLoading.hide();
  1088.                 window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
  1089.             }
  1090.         });
  1091.     }
  1092.     $('.choose_type_btn').on('click', function(){
  1093.         window.choosedType = $(this).attr('data-type');
  1094.         if(window.choosedType != 'code'){
  1095.             $('#has_code_wrp').slideDown();
  1096.             $('.choose_ExamDate_btn').slideUp();
  1097.             customScrollTo($("#home_slider"));
  1098.         } else {
  1099.             $('#needCodeFirstWarning').slideUp();
  1100.             $('#home_slider, #has_code_wrp').slideUp();
  1101.             $('#homeChoosedType_'+window.choosedType).slideDown();
  1102.             $('#homeSubType_'+window.choosedType).slideDown();
  1103.             $('body').addClass('type_'+window.choosedType);
  1104.             updateWinHash('type', 'code');
  1105.             $([document.documentElement, document.body]).animate({
  1106.                 scrollTop: 0
  1107.             }, 1000);
  1108.         }
  1109.         $('#home_slider > .selected').removeClass('selected');
  1110.         $(this).closest('div').addClass('selected');
  1111.         $('#home_packs_wrp').slideUp();
  1112.         $('#home_packs_wrp li').each(function(i, e){
  1113.             if($(e).hasClass('pack_'+window.choosedType)){
  1114.                 $(e).slideDown();
  1115.             } else {
  1116.                 $(e).slideUp();
  1117.             }
  1118.         });
  1119.     });
  1120.     $('.homeChoosedType i.close').on('click', function(){
  1121.         window.location.href = '/';
  1122.     });
  1123.     $('#popup_register_btn').on('click', function(){
  1124.         var username = $('#registration_username').val();
  1125.         var password = $('#registration_password').val();
  1126.         var phone = $('#registration_phone').val();
  1127.         var partnerCode = $('#registration_partner').val();
  1128.         if(username == ''){
  1129.             window.talbiJSAlert.show('warning', "Vous devez saisir votre adresse email.");
  1130.             return false;
  1131.         } else if(password == ''){
  1132.             window.talbiJSAlert.show('warning', "Vous devez saisir votre mot de passe.");
  1133.             return false;
  1134.         }
  1135.         window.talbiJSLoading.show('Inscription');
  1136.         $.ajax({
  1137.             url: '/api/registration',
  1138.             type: 'POST',
  1139.             dataType: 'json',
  1140.             data: { username:username, password:password, partnerCode:partnerCode, phone:phone},
  1141.             success: function(r){
  1142.                 window.talbiJSLoading.hide();
  1143.                 if(r.user){
  1144.                     window.talbiJSAlert.show('success', "Bienvenue", 2000);
  1145.                     window.loggedIn = true;
  1146.                     $('#registrationModal').modal('toggle');
  1147.                     if(r.isPartner) {
  1148.                         window.isPartner = true;
  1149.                         window.affiliate = r.user;
  1150.                         chooseAvailability();
  1151.                     } else {
  1152.                         ajaxLogin(username, password);
  1153.                     }
  1154.                 } else if(r.error) {
  1155.                     window.talbiJSAlert.show('danger', r.error);
  1156.                 } else {
  1157.                     window.talbiJSAlert.show('danger', "Une erreur s'est produite, veuillez vérifier vos données.", 4000);
  1158.                 }
  1159.             },
  1160.             error: function(r){
  1161.                 window.talbiJSLoading.hide();
  1162.                 window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
  1163.             }
  1164.         });
  1165.     });
  1166.     $('#popup_login_btn').on('click', function(){
  1167.         var login_username = $('#login_username').val();
  1168.         var login_password = $('#login_password').val();
  1169.         ajaxLogin(login_username, login_password);
  1170.     });
  1171.     function ajaxLogin(login_username, login_password){
  1172.         window.talbiJSLoading.show('Identification');
  1173.         $.ajax({
  1174.             url: '/api/login',
  1175.             type: 'POST',
  1176.             dataType: 'json',
  1177.             contentType: "application/json",
  1178.             data: JSON.stringify({email:login_username, password:login_password}),
  1179.             success: function(r){
  1180.                 window.talbiJSLoading.hide();
  1181.                 if(r.user){
  1182.                     window.talbiJSAlert.show('success', "Bienvenue", 2000);
  1183.                     window.loggedIn = true;
  1184.                     $('#loginModal').modal('toggle');
  1185.                     if(r.isPartner){
  1186.                         window.isPartner = true;
  1187.                         $('#registrationModalLabel').text('Inscription filleul');
  1188.                         $('#registration_partner').slideUp().remove();
  1189.                         $('#registrationModal').modal('show');
  1190.                     } else {
  1191.                         chooseAvailability();
  1192.                     }
  1193.                 } else {
  1194.                     window.talbiJSAlert.show('danger', 'Identifiants incorrects');
  1195.                 }
  1196.             },
  1197.             error: function(r){
  1198.                 window.talbiJSLoading.hide();
  1199.                 window.talbiJSAlert.show('danger', 'Identifiants incorrects');
  1200.             }
  1201.         });
  1202.     }
  1203.     $('.choose_pack_btn').on('click', function(){
  1204.         $this = $(this);
  1205.         if(window.choosedType == 'code'){
  1206.             $('#home_packs_list li.selected').removeClass('selected');
  1207.             $this.closest('li').addClass('selected');
  1208.             if(window.loggedIn){
  1209.                 if(window.isPartner){
  1210.                     $('#registrationModal').modal('show');
  1211.                 } else {
  1212.                     chooseAvailability();
  1213.                 }
  1214.             } else {
  1215.                 $('#loginModal').modal('toggle');
  1216.             }
  1217.             return;
  1218.         }
  1219.         var $availabilitiesTarget = $this.closest('li').find('.pack_availabilities');
  1220.         $availabilitiesTarget.html('<div class="swiper-wrapper"></div>');
  1221.         //$('#home_packs_list li.selected .pack_availabilities').slideUp().html('');
  1222.         $('#home_packs_list li.selected .pack_availabilities').slideUp();
  1223.         $('#home_packs_list li.selected .pack_warning').slideUp();
  1224.         var choosedPack = $this.attr('data-id');
  1225.         window.talbiJSLoading.show('Recherche des disponibilités');
  1226.         $.ajax({
  1227.             url: '/api/getAvailabilities',
  1228.             type: 'POST',
  1229.             dataType: 'json',
  1230.             data: {pack:choosedPack, date:window.choosedDate, dateID:window.choosedDateID},
  1231.             success: function(r){
  1232.                 window.talbiJSLoading.hide();
  1233.                 $this.closest('li').addClass('selected');
  1234.                 if(r.availabilities.length > 0){
  1235.                     if(document.querySelector("#home_packs_list li.pack_id_"+choosedPack+" .pack_availabilities").swiper) {
  1236.                         availabilitiesSwiper.removeAllSlides();
  1237.                     }
  1238.                     availabilitiesSwiper = new Swiper("#home_packs_list li.pack_id_"+choosedPack+" .pack_availabilities", {
  1239.                         //slidesPerView: 3,
  1240.                         spaceBetween: 20,
  1241.                         autoplay: {
  1242.                             delay: 1000,
  1243.                             disableOnInteraction: true,
  1244.                         },
  1245.                         breakpoints: {
  1246.                             640: {
  1247.                                 slidesPerView: 1,
  1248.                                 loop: false,
  1249.                             },
  1250.                             1024: {
  1251.                                 slidesPerView: 3,
  1252.                                 loop: false,
  1253.                             },
  1254.                         }
  1255.                     });
  1256.                     var availabilitiesSwiperContent = '';
  1257.                     r.availabilities.forEach(function(e){
  1258.                         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>';
  1259.                     });
  1260.                     availabilitiesSwiper.appendSlide(availabilitiesSwiperContent);
  1261.                     availabilitiesSwiper.update(true);
  1262.                     $availabilitiesTarget.slideDown();
  1263.                 } else {
  1264.                     $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();
  1265.                     //window.talbiJSAlert.show('warning', "Aucune disponibilité trouvée, merci de choisir une autre date d'examen ou bien un autre pack", 3000);
  1266.                 }
  1267.             },
  1268.             error: function(r){
  1269.                 window.talbiJSLoading.hide();
  1270.                 window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
  1271.             }
  1272.         })
  1273.     });
  1274.     $(document).on('click', '.choose_availability_btn', function(){
  1275.         window.selectedAvailability = $(this).closest('div');
  1276.         if(window.loggedIn){
  1277.             if(window.isPartner){
  1278.                 $('#registrationModal').modal('show');
  1279.             } else {
  1280.                 chooseAvailability();
  1281.             }
  1282.         } else {
  1283.             $('#loginModal').modal('toggle');
  1284.         }
  1285.     });
  1286.     function chooseAvailability(){
  1287.         var rawData, ajTarget;
  1288.         if(window.choosedType == 'code'){
  1289.             rawData = {};
  1290.             ajTarget = 'bookCodeAvailability';
  1291.         } else {
  1292.             rawData = window.selectedAvailability.attr('data-raw');
  1293.             ajTarget = 'bookAvailability';
  1294.         }
  1295.         var examDate = window.choosedDate;
  1296.         var examDateID = window.choosedDateID;
  1297.         var pack = $('#home_packs_list li.selected .choose_pack_btn').attr('data-id');
  1298.         var affiliate = window.affiliate;
  1299.         window.talbiJSLoading.show();
  1300.         $.ajax({
  1301.             url: '/api/'+ajTarget,
  1302.             type: 'POST',
  1303.             dataType: 'json',
  1304.             data: {examDate:examDate, examDateID:examDateID, rawData:rawData, pack:pack, affiliate:affiliate},
  1305.             success: function(r){
  1306.                 window.talbiJSLoading.hide();
  1307.                 if(r.success){
  1308.                     if(window.isPartner){
  1309.                         window.talbiJSAlert.show('success', "Lien de paiement envoyé par mail", 5000);
  1310.                     } else {
  1311.                         document.location.href = '/checkout/' + r.success;
  1312.                     }
  1313.                 } else if(r.errors){
  1314.                     window.talbiJSAlert.show('danger', r.errors.join('\n'));
  1315.                 } else {
  1316.                     window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
  1317.                 }
  1318.             },
  1319.             error: function(r){
  1320.                 window.talbiJSLoading.hide();
  1321.                 window.talbiJSAlert.show('danger', "Une erreur s'est produite !");
  1322.             }
  1323.         });
  1324.     }
  1325.     function customScrollTo($element, timeOut=1000){
  1326.         $([document.documentElement, document.body]).animate({
  1327.             scrollTop: $element.offset().top - ($('#website_header').height() + 30)
  1328.         }, timeOut);
  1329.     }
  1330.     function parseWinHash(){
  1331.         const hash = window.location.hash.substring(1);
  1332.         const hashValues = hash.split('&');
  1333.         var finalReturn = {};
  1334.         if(hash && hashValues.length > 0){
  1335.             hashValues.forEach(function(e){
  1336.                 hashValueSplit = e.split('=');
  1337.                 finalReturn[hashValueSplit[0]] = hashValueSplit[1];
  1338.             });
  1339.         }
  1340.         return finalReturn;
  1341.     }
  1342.     window.parsedWinHash = parseWinHash();
  1343.     function processWinHash(){
  1344.         if(window.parsedWinHash){
  1345.             if(window.parsedWinHash['type']){
  1346.                 $('.choose_type_btn[data-type="'+window.parsedWinHash['type']+'"]').trigger('click');
  1347.                 if(window.parsedWinHash['type'] != 'code') $('#has_code_wrp button[data-type="yes"]').trigger('click');
  1348.             }
  1349.             if(window.parsedWinHash['subType']){
  1350.                 $('.homeSubType_inner button[data-subtype="'+window.parsedWinHash['subType']+'"]').trigger('click');
  1351.             }
  1352.             if(window.parsedWinHash['boost']){
  1353.                 var boostIndex = boostVals.indexOf(window.parsedWinHash['boost']);
  1354.                 $('#home_boost_range').val(boostIndex + 1);
  1355.                 $('#home_boost_confirm').trigger('click');
  1356.             }
  1357.         }
  1358.     }
  1359.     processWinHash();
  1360.     function updateWinHash(key, value) {
  1361.         window.removeEventListener('popstate', processPopstate);
  1362.         window.parsedWinHash[key] = value;
  1363.         var finalHash = Object.keys(window.parsedWinHash).map(function(x){return x + '=' + window.parsedWinHash[x];}).join('&');
  1364.         window.location.hash = '#' + finalHash;
  1365.         window.addEventListener('popstate', processPopstate);
  1366.     }
  1367.     var currentState = history.state;
  1368.     function processPopstate(){
  1369.         window.parsedWinHash = parseWinHash();
  1370.         parsedWinHashLength = Object.keys(window.parsedWinHash).length;
  1371.         if(parsedWinHashLength == 0){
  1372.             $('.homeChoosedType, .homeSubType').slideUp();
  1373.             $('#home_slider').slideDown();
  1374.         } else if(parsedWinHashLength == 1){
  1375.             $('#home_boost_wrp').slideUp();
  1376.         }
  1377.         if(!window.parsedWinHash['boost']){
  1378.             $('#home_examDates_wrp').slideUp();
  1379.         }
  1380.         processWinHash();
  1381.     }
  1382.     window.addEventListener('popstate', processPopstate);
  1383. });
  1384. var slideIndex = 1;
  1385. {# showSlides(slideIndex); #}
  1386. // Next/previous controls
  1387. function plusSlides(n) {
  1388.   showSlides(slideIndex += n);
  1389. }
  1390. // Thumbnail image controls
  1391. function currentSlide(n) {
  1392.   showSlides(slideIndex = n);
  1393. }
  1394. function showSlides(n) {
  1395.   var i;
  1396.   var slides = document.getElementsByClassName("mySlides");
  1397.   var dots = document.getElementsByClassName("dot");
  1398.   if (n > slides.length) {slideIndex = 1}
  1399.   if (n < 1) {slideIndex = slides.length}
  1400.   for (i = 0; i < slides.length; i++) {
  1401.       slides[i].style.display = "none";
  1402.   }
  1403.   for (i = 0; i < dots.length; i++) {
  1404.       dots[i].className = dots[i].className.replace(" active", "");
  1405.   }
  1406.   slides[slideIndex-1].style.display = "block";
  1407.   dots[slideIndex-1].className += " active";
  1408. }
  1409. </script>
  1410. {% endblock %}