{"id":106,"date":"2023-12-21T10:26:41","date_gmt":"2023-12-21T10:26:41","guid":{"rendered":"https:\/\/evisa.xpressbuddy.com\/?page_id=106"},"modified":"2025-11-07T20:53:06","modified_gmt":"2025-11-07T19:53:06","slug":"visa_submittion","status":"publish","type":"page","link":"https:\/\/immigrationinluxembourg.com\/index.php\/visa_submittion\/","title":{"rendered":"forms"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"106\" class=\"elementor elementor-106\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3faf615 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3faf615\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-e266c84\" data-id=\"e266c84\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ed0cab2 elementor-widget elementor-widget-shortcode\" data-id=\"ed0cab2\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- \n    Fichier: template-form-v2.php\n    Description: Formulaire de candidature avec type de visa (Travail\/\u00c9tudes)\n-->\n\n<div class=\"candidature-container\">\n    <!-- Barre de progression -->\n    <div class=\"stepper-progress\">\n        <div class=\"step active\" data-step=\"1\">\n            <div class=\"step-circle\">1<\/div>\n            <div class=\"step-label\">Informations<\/div>\n        <\/div>\n        <div class=\"step-line\"><\/div>\n        <div class=\"step\" data-step=\"2\">\n            <div class=\"step-circle\">2<\/div>\n            <div class=\"step-label\">Choix<\/div>\n        <\/div>\n        <div class=\"step-line\"><\/div>\n        <div class=\"step\" data-step=\"3\">\n            <div class=\"step-circle\">3<\/div>\n            <div class=\"step-label\">Motivations<\/div>\n        <\/div>\n        <div class=\"step-line\"><\/div>\n        <div class=\"step\" data-step=\"4\">\n            <div class=\"step-circle\">4<\/div>\n            <div class=\"step-label\">Documents<\/div>\n        <\/div>\n        <div class=\"step-line\"><\/div>\n        <div class=\"step\" data-step=\"5\">\n            <div class=\"step-circle\">5<\/div>\n            <div class=\"step-label\">Paiement<\/div>\n        <\/div>\n    <\/div>\n\n    <form id=\"candidature-form\" enctype=\"multipart\/form-data\">\n        \n        <!-- \u00c9TAPE 1 : Informations + Type de Visa -->\n        <div class=\"form-step active\" data-step=\"1\">\n            <h2>\ud83d\udccb Informations Personnelles<\/h2>\n            <p class=\"step-description\">Compl\u00e9tez vos informations et choisissez votre type de visa<\/p>\n            \n            <div class=\"form-row\">\n                <div class=\"form-group\">\n                    <label for=\"prenom\">Pr\u00e9nom <span class=\"required\">*<\/span><\/label>\n                    <input type=\"text\" id=\"prenom\" name=\"prenom\" required>\n                <\/div>\n                <div class=\"form-group\">\n                    <label for=\"nom\">Nom <span class=\"required\">*<\/span><\/label>\n                    <input type=\"text\" id=\"nom\" name=\"nom\" required>\n                <\/div>\n            <\/div>\n            \n            <div class=\"form-row\">\n                <div class=\"form-group\">\n                    <label for=\"email\">Email <span class=\"required\">*<\/span><\/label>\n                    <input type=\"email\" id=\"email\" name=\"email\" required>\n                <\/div>\n                <div class=\"form-group\">\n                    <label for=\"telephone\">T\u00e9l\u00e9phone <span class=\"required\">*<\/span><\/label>\n                    <input type=\"tel\" id=\"telephone\" name=\"telephone\" required>\n                <\/div>\n            <\/div>\n            \n            <div class=\"form-group\">\n                <label for=\"niveau_etudes\">Niveau d'\u00e9tudes <span class=\"required\">*<\/span><\/label>\n                <select id=\"niveau_etudes\" name=\"niveau_etudes\" required>\n                    <option value=\"\">S\u00e9lectionner votre niveau<\/option>\n                    <option value=\"bac\">Baccalaur\u00e9at<\/option>\n                    <option value=\"bts\">BTS \/ DUT<\/option>\n                    <option value=\"licence\">Licence (Bac+3)<\/option>\n                    <option value=\"master\">Master (Bac+5)<\/option>\n                    <option value=\"doctorat\">Doctorat (Bac+8)<\/option>\n                    <option value=\"autre\">Autre<\/option>\n                <\/select>\n            <\/div>\n            \n            <div class=\"form-group\" style=\"margin-top: 30px;\">\n                <label>Type de visa souhait\u00e9 <span class=\"required\">*<\/span><\/label>\n                <div class=\"radio-group\" style=\"grid-template-columns: 1fr 1fr;\">\n                    <label class=\"radio-option visa-option\">\n                        <input type=\"radio\" name=\"type_visa\" value=\"travail\" required checked>\n                        <span class=\"visa-card\">\n                            <span class=\"visa-icon\">\ud83d\udcbc<\/span>\n                            <strong>Visa Travail<\/strong>\n                            <small>Emploi au Luxembourg<\/small>\n                        <\/span>\n                    <\/label>\n                    <label class=\"radio-option visa-option\">\n                        <input type=\"radio\" name=\"type_visa\" value=\"etudes\" required>\n                        <span class=\"visa-card\">\n                            <span class=\"visa-icon\">\ud83c\udf93<\/span>\n                            <strong>Visa \u00c9tudes<\/strong>\n                            <small>\u00c9tudes universitaires<\/small>\n                        <\/span>\n                    <\/label>\n                <\/div>\n            <\/div>\n        <\/div>\n        \n        <!-- \u00c9TAPE 2 : Choix Dynamique -->\n        <div class=\"form-step\" data-step=\"2\">\n            <h2 id=\"step2-title\">\ud83d\udcbc S\u00e9lection<\/h2>\n            <p class=\"step-description\" id=\"step2-description\">Choisissez parmi les options disponibles<\/p>\n            \n            <div id=\"choix-container\">\n                <div style=\"text-align: center; padding: 40px;\">\n                    <div class=\"spinner\" style=\"margin: 0 auto 20px;\"><\/div>\n                    <p style=\"color: #6b7280;\">Chargement...<\/p>\n                <\/div>\n            <\/div>\n            \n            <input type=\"hidden\" id=\"offre_ou_universite_id\" name=\"offre_ou_universite_id\" required>\n            \n            <div id=\"type-contrat-group\" class=\"form-group\" style=\"display: none; margin-top: 30px;\">\n                <label>Type de contrat souhait\u00e9<\/label>\n                <div class=\"radio-group\">\n                    <label class=\"radio-option\">\n                        <input type=\"radio\" name=\"type_contrat\" value=\"cdi\" checked>\n                        <span>CDI<\/span>\n                    <\/label>\n                    <label class=\"radio-option\">\n                        <input type=\"radio\" name=\"type_contrat\" value=\"cdd\">\n                        <span>CDD<\/span>\n                    <\/label>\n                    <label class=\"radio-option\">\n                        <input type=\"radio\" name=\"type_contrat\" value=\"stage\">\n                        <span>Stage<\/span>\n                    <\/label>\n                    <label class=\"radio-option\">\n                        <input type=\"radio\" name=\"type_contrat\" value=\"alternance\">\n                        <span>Alternance<\/span>\n                    <\/label>\n                <\/div>\n            <\/div>\n        <\/div>\n        \n        <!-- \u00c9TAPE 3 : Motivations -->\n        <div class=\"form-step\" data-step=\"3\">\n            <h2>\u270d\ufe0f Vos motivations<\/h2>\n            <p class=\"step-description\">Expliquez-nous pourquoi vous \u00eates le candidat id\u00e9al<\/p>\n            \n            <div class=\"form-group\">\n                <label for=\"lettre_motivation\">Lettre de motivation <span class=\"required\">*<\/span><\/label>\n                <textarea id=\"lettre_motivation\" name=\"lettre_motivation\" rows=\"10\" required \n                    placeholder=\"Parlez-nous de votre parcours, vos comp\u00e9tences et votre motivation...\"><\/textarea>\n                <div class=\"char-count\">\n                    <span id=\"char-counter\">0<\/span> \/ 2000 caract\u00e8res\n                <\/div>\n            <\/div>\n            \n            <div class=\"form-group\">\n                <label for=\"infos_complementaires\">Informations compl\u00e9mentaires<\/label>\n                <textarea id=\"infos_complementaires\" name=\"infos_complementaires\" rows=\"4\" \n                    placeholder=\"Disponibilit\u00e9, pr\u00e9tentions salariales, r\u00e9f\u00e9rences...\"><\/textarea>\n            <\/div>\n        <\/div>\n        \n        <!-- \u00c9TAPE 4 : Documents -->\n        <div class=\"form-step\" data-step=\"4\">\n            <h2>\ud83d\udcce Vos documents<\/h2>\n            <p class=\"step-description\">T\u00e9l\u00e9chargez les documents n\u00e9cessaires (PDF, JPG, PNG, DOCX)<\/p>\n            \n            <div class=\"form-group\">\n                <label for=\"piece_identite\">Pi\u00e8ce d'identit\u00e9 <span class=\"required\">*<\/span><\/label>\n                <div class=\"file-upload-wrapper\">\n                    <input type=\"file\" id=\"piece_identite\" name=\"piece_identite\" accept=\".pdf,.jpg,.jpeg,.png\" required>\n                    <label for=\"piece_identite\" class=\"file-upload-label\">\n                        <span class=\"file-icon\">\ud83d\udcc4<\/span>\n                        <span class=\"file-text\">Choisir un fichier<\/span>\n                    <\/label>\n                    <div class=\"file-name\"><\/div>\n                <\/div>\n                <small>Max 5 MB - PDF, JPG, PNG<\/small>\n            <\/div>\n            \n            <div class=\"form-group\">\n                <label for=\"cv\">CV <span class=\"required\">*<\/span><\/label>\n                <div class=\"file-upload-wrapper\">\n                    <input type=\"file\" id=\"cv\" name=\"cv\" accept=\".pdf,.doc,.docx\" required>\n                    <label for=\"cv\" class=\"file-upload-label\">\n                        <span class=\"file-icon\">\ud83d\udcc4<\/span>\n                        <span class=\"file-text\">Choisir un fichier<\/span>\n                    <\/label>\n                    <div class=\"file-name\"><\/div>\n                <\/div>\n                <small>Max 5 MB - PDF, DOC, DOCX<\/small>\n            <\/div>\n            \n            <div class=\"form-group\">\n                <label for=\"diplomes\">Dipl\u00f4mes<\/label>\n                <div class=\"file-upload-wrapper\">\n                    <input type=\"file\" id=\"diplomes\" name=\"diplomes\" accept=\".pdf,.jpg,.jpeg,.png\" multiple>\n                    <label for=\"diplomes\" class=\"file-upload-label\">\n                        <span class=\"file-icon\">\ud83d\udcc4<\/span>\n                        <span class=\"file-text\">Choisir des fichiers<\/span>\n                    <\/label>\n                    <div class=\"file-name\"><\/div>\n                <\/div>\n                <small>Max 10 MB - PDF, JPG, PNG<\/small>\n            <\/div>\n            \n            <div class=\"form-group checkbox-group\">\n                <label>\n                    <input type=\"checkbox\" id=\"accept_terms\" name=\"accept_terms\" required>\n                    <span>Je certifie que les informations sont exactes <span class=\"required\">*<\/span><\/span>\n                <\/label>\n            <\/div>\n        <\/div>\n        \n        <!-- \u00c9TAPE 5 : Paiement -->\n        <div class=\"form-step\" data-step=\"5\">\n            <h2>\ud83d\udcb3 Finaliser votre candidature<\/h2>\n            <p class=\"step-description\">Frais de traitement : <strong>40 \u20ac<\/strong><\/p>\n            \n            <div class=\"payment-summary\">\n                <div class=\"summary-item\">\n                    <span>Candidat :<\/span>\n                    <strong id=\"summary-name\">-<\/strong>\n                <\/div>\n                <div class=\"summary-item\">\n                    <span>Type de visa :<\/span>\n                    <strong id=\"summary-visa\">-<\/strong>\n                <\/div>\n                <div class=\"summary-item\">\n                    <span>Choix :<\/span>\n                    <strong id=\"summary-choix\">-<\/strong>\n                <\/div>\n                <div class=\"summary-item total\">\n                    <span>Montant :<\/span>\n                    <strong>40 \u20ac<\/strong>\n                <\/div>\n            <\/div>\n            \n            <div class=\"info-box\" style=\"background: #f0fdf4; border: 2px solid #86efac; padding: 25px; border-radius: 12px;\">\n                <h3 style=\"color: #065f46; margin-top: 0;\">\ud83d\udcb3 Paiement s\u00e9curis\u00e9 avec FedaPay<\/h3>\n                <p style=\"color: #065f46;\">En cliquant sur le bouton, vous serez redirig\u00e9 vers FedaPay pour choisir :<\/p>\n                <ul style=\"color: #065f46; padding-left: 25px;\">\n                    <li>\ud83d\udcf1 Mobile Money (MTN, Moov, Flooz)<\/li>\n                    <li>\ud83d\udcb3 Carte bancaire (Visa, Mastercard)<\/li>\n                <\/ul>\n            <\/div>\n        <\/div>\n        \n        <div id=\"form-message\" class=\"form-message\" style=\"display:none;\"><\/div>\n        \n        <div class=\"form-navigation\">\n            <button type=\"button\" class=\"btn btn-secondary btn-prev\" style=\"display:none;\">\u2190 Pr\u00e9c\u00e9dent<\/button>\n            <button type=\"button\" class=\"btn btn-primary btn-next\">Suivant \u2192<\/button>\n            <button type=\"button\" class=\"btn btn-success btn-submit\" style=\"display:none;\">\ud83d\udcb3 Payer<\/button>\n        <\/div>\n        \n        <div class=\"loading-overlay\" style=\"display:none;\">\n            <div class=\"spinner\"><\/div>\n            <p>Traitement...<\/p>\n        <\/div>\n    <\/form>\n<\/div>\n\n<style>\n* { margin: 0; padding: 0; box-sizing: border-box; }\n.candidature-container { max-width: 900px; margin: 40px auto; padding: 40px; background: #fff; border-radius: 16px; box-shadow: 0 4px 30px rgba(0,0,0,0.1); }\n.stepper-progress { display: flex; align-items: center; justify-content: space-between; margin-bottom: 50px; padding: 0 20px; }\n.step { display: flex; flex-direction: column; align-items: center; position: relative; z-index: 2; }\n.step-circle { width: 50px; height: 50px; border-radius: 50%; background: #e0e0e0; color: #999; display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 18px; transition: all 0.3s; margin-bottom: 10px; }\n.step.active .step-circle { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4); transform: scale(1.1); }\n.step.completed .step-circle { background: #10b981; color: white; }\n.step-label { font-size: 13px; color: #666; text-align: center; font-weight: 500; }\n.step.active .step-label { color: #667eea; font-weight: 600; }\n.step-line { height: 3px; background: #e0e0e0; flex: 1; margin: 0 5px 35px; transition: all 0.3s; }\n.step-line.completed { background: #10b981; }\n.form-step { display: none; animation: slideIn 0.4s ease; }\n.form-step.active { display: block; }\n@keyframes slideIn { from { opacity: 0; transform: translateX(30px); } to { opacity: 1; transform: translateX(0); } }\n.form-step h2 { color: #1f2937; font-size: 28px; margin-bottom: 10px; }\n.step-description { color: #6b7280; margin-bottom: 30px; font-size: 15px; }\n.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }\n.form-group { margin-bottom: 25px; }\n.form-group label { display: block; margin-bottom: 8px; color: #374151; font-weight: 600; font-size: 14px; }\n.required { color: #ef4444; }\n.form-group input, .form-group select, .form-group textarea { width: 100%; padding: 14px 16px; border: 2px solid #e5e7eb; border-radius: 10px; font-size: 15px; transition: all 0.3s; font-family: inherit; }\n.form-group input:focus, .form-group select:focus, .form-group textarea:focus { outline: none; border-color: #667eea; box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1); }\n.visa-option input { display: none; }\n.visa-card { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 25px; border: 2px solid #e5e7eb; border-radius: 12px; text-align: center; cursor: pointer; transition: all 0.3s; background: white; }\n.visa-option input:checked + .visa-card { border-color: #667eea; background: linear-gradient(135deg, #f3f4ff 0%, #e8ecff 100%); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(102, 126, 234, 0.2); }\n.visa-icon { font-size: 48px; margin-bottom: 8px; }\n.visa-card strong { font-size: 18px; color: #1f2937; }\n.visa-card small { color: #6b7280; font-size: 13px; }\n.choix-card { border: 2px solid #e5e7eb; border-radius: 12px; padding: 20px; margin-bottom: 15px; cursor: pointer; transition: all 0.3s; background: white; }\n.choix-card:hover { border-color: #667eea; box-shadow: 0 4px 12px rgba(102, 126, 234, 0.15); transform: translateY(-2px); }\n.choix-card.selected { border-color: #667eea; background: linear-gradient(135deg, #f3f4ff 0%, #e8ecff 100%); box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); }\n.choix-card-header { display: flex; justify-content: space-between; align-items: start; margin-bottom: 12px; }\n.choix-card-title { font-size: 18px; font-weight: 600; color: #1f2937; margin: 0; }\n.choix-card-badge { padding: 4px 12px; border-radius: 20px; font-size: 13px; font-weight: 600; }\n.badge-salaire { background: #d1fae5; color: #065f46; }\n.badge-ville { background: #dbeafe; color: #1e40af; }\n.choix-card-meta { display: flex; gap: 15px; margin-top: 8px; font-size: 14px; color: #6b7280; }\n.spinner { width: 40px; height: 40px; border: 4px solid #e5e7eb; border-top-color: #667eea; border-radius: 50%; animation: spin 1s linear infinite; }\n@keyframes spin { to { transform: rotate(360deg); } }\n.radio-group { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 10px; margin-top: 10px; }\n.radio-option { cursor: pointer; }\n.radio-option input { display: none; }\n.radio-option span { display: block; padding: 12px 20px; border: 2px solid #e5e7eb; border-radius: 8px; text-align: center; transition: all 0.3s; font-weight: 500; }\n.radio-option input:checked + span { border-color: #667eea; background: #f3f4ff; color: #667eea; }\n.file-upload-wrapper { position: relative; margin-bottom: 8px; }\n.file-upload-wrapper input[type=\"file\"] { display: none; }\n.file-upload-label { display: flex; align-items: center; gap: 12px; padding: 20px; border: 2px dashed #d1d5db; border-radius: 10px; cursor: pointer; transition: all 0.3s; background: #f9fafb; }\n.file-upload-label:hover { border-color: #667eea; background: #f3f4ff; }\n.file-icon { font-size: 24px; }\n.file-name { margin-top: 8px; color: #10b981; font-size: 14px; font-weight: 500; }\n.checkbox-group label { display: flex; align-items: start; gap: 12px; cursor: pointer; }\n.checkbox-group input[type=\"checkbox\"] { width: 20px; height: 20px; cursor: pointer; flex-shrink: 0; margin-top: 2px; }\n.char-count { text-align: right; color: #6b7280; font-size: 13px; margin-top: 5px; }\n.payment-summary { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 12px; color: white; margin-bottom: 30px; }\n.summary-item { display: flex; justify-content: space-between; margin-bottom: 12px; padding-bottom: 12px; border-bottom: 1px solid rgba(255,255,255,0.2); }\n.summary-item.total { border-bottom: none; font-size: 20px; margin-top: 10px; }\n.form-navigation { display: flex; gap: 15px; margin-top: 40px; justify-content: space-between; }\n.btn { padding: 14px 32px; border: none; border-radius: 10px; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.3s; }\n.btn-primary { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; margin-left: auto; }\n.btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 20px rgba(102, 126, 234, 0.4); }\n.btn-secondary { background: #f3f4f6; color: #374151; }\n.btn-secondary:hover { background: #e5e7eb; }\n.btn-success { background: linear-gradient(135deg, #10b981 0%, #059669 100%); color: white; margin-left: auto; }\n.btn-success:hover { transform: translateY(-2px); box-shadow: 0 8px 20px rgba(16, 185, 129, 0.4); }\n.form-message { padding: 16px 20px; border-radius: 10px; margin-bottom: 20px; font-weight: 500; }\n.form-message.success { background: #d1fae5; color: #065f46; border: 1px solid #6ee7b7; }\n.form-message.error { background: #fee2e2; color: #991b1b; border: 1px solid #fca5a5; }\n.loading-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.7); display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 9999; color: white; }\n@media (max-width: 768px) { .candidature-container { padding: 20px; } .form-row { grid-template-columns: 1fr; } }\n<\/style>\n<!-- \n    \u00c0 placer APR\u00c8S la fermeture de <\/style> dans template-form-v2.php\n    Remplacez TOUTE la balise <script> par celle-ci\n-->\n\n<script>\njQuery(document).ready(function($) {\n    let currentStep = 1;\n    const totalSteps = 5;\n    let candidatureId = null;\n    let selectedTypeVisa = 'travail';\n    let selectedChoixId = null;\n    let selectedChoixTitle = '';\n    \n    const form = $('#candidature-form');\n    const btnPrev = $('.btn-prev');\n    const btnNext = $('.btn-next');\n    const btnSubmit = $('.btn-submit');\n    \n    function updateStep(step) {\n        $('.form-step').removeClass('active');\n        $('.form-step[data-step=\"' + step + '\"]').addClass('active');\n        \n        $('.step').removeClass('active completed');\n        $('.step-line').removeClass('completed');\n        \n        for(let i = 1; i <= totalSteps; i++) {\n            if(i < step) {\n                $('.step[data-step=\"' + i + '\"]').addClass('completed');\n                $('.step-line:nth-of-type(' + (i*2-1) + ')').addClass('completed');\n            } else if(i === step) {\n                $('.step[data-step=\"' + i + '\"]').addClass('active');\n            }\n        }\n        \n        btnPrev.toggle(step > 1);\n        btnNext.toggle(step < totalSteps);\n        btnSubmit.toggle(step === totalSteps);\n        \n        if(step === 5) updatePaymentSummary();\n        window.scrollTo({top: 0, behavior: 'smooth'});\n    }\n    \n    function validateStep(step) {\n        const currentStepEl = $('.form-step[data-step=\"' + step + '\"]');\n        const inputs = currentStepEl.find('input[required], select[required], textarea[required]');\n        let isValid = true;\n        \n        inputs.each(function() {\n            const $input = $(this);\n            if($input.attr('type') === 'checkbox') {\n                if(!$input.is(':checked')) {\n                    isValid = false;\n                    $input.parent().css('color', '#ef4444');\n                }\n            } else if($input.attr('type') === 'file') {\n                if(!this.files || this.files.length === 0) {\n                    isValid = false;\n                    $input.siblings('.file-upload-label').css('border-color', '#ef4444');\n                }\n            } else if($input.attr('type') === 'hidden') {\n                if(!$input.val()) isValid = false;\n            } else if(!$input.val() || $input.val().trim() === '') {\n                isValid = false;\n                $input.css('border-color', '#ef4444');\n            }\n        });\n        return isValid;\n    }\n    \n    function loadOffresOrUniversites() {\n        selectedTypeVisa = $('input[name=\"type_visa\"]:checked').val();\n        $('#choix-container').html('<div style=\"text-align: center; padding: 40px;\"><div class=\"spinner\" style=\"margin: 0 auto 20px;\"><\/div><p>Chargement...<\/p><\/div>');\n        \n        $.ajax({\n            url: candidatureAjax.ajax_url,\n            type: 'POST',\n            data: {\n                action: 'get_offres_or_universites',\n                nonce: candidatureAjax.nonce,\n                type_visa: selectedTypeVisa\n            },\n            success: function(response) {\n                if(response.success) {\n                    displayChoix(response.data);\n                } else {\n                    showMessage('Erreur de chargement', 'error');\n                }\n            },\n            error: function() {\n                showMessage('Erreur de connexion', 'error');\n                $('#choix-container').html('<p style=\"text-align: center; color: #ef4444; padding: 40px;\">Erreur. Veuillez r\u00e9essayer.<\/p>');\n            }\n        });\n    }\n    \n    function displayChoix(data) {\n        const isEmploi = data.type === 'emploi';\n        $('#step2-title').html(isEmploi ? '\ud83d\udcbc S\u00e9lection de l\\'offre d\\'emploi' : '\ud83c\udf93 Choix de l\\'universit\u00e9');\n        $('#step2-description').text(isEmploi ? 'S\u00e9lectionnez l\\'offre qui vous int\u00e9resse' : 'Choisissez votre universit\u00e9');\n        $('#type-contrat-group').toggle(isEmploi);\n        \n        let html = '';\n        if(!data.data || data.data.length === 0) {\n            html = '<p style=\"text-align: center; color: #6b7280; padding: 40px;\">Aucune option disponible<\/p>';\n        } else {\n            data.data.forEach(function(item) {\n                html += '<div class=\"choix-card\" data-id=\"' + item.id + '\" data-title=\"' + escapeHtml(item.title) + '\">';\n                html += '<div class=\"choix-card-header\">';\n                html += '<h3 class=\"choix-card-title\">' + escapeHtml(item.title) + '<\/h3>';\n                html += '<span class=\"choix-card-badge ' + (isEmploi ? 'badge-salaire' : 'badge-ville') + '\">';\n                html += escapeHtml(isEmploi ? item.salaire : item.ville);\n                html += '<\/span><\/div>';\n                \n                if(!isEmploi) {\n                    html += '<div class=\"choix-card-meta\">';\n                    html += '<span>\ud83d\udccd ' + escapeHtml(item.ville) + '<\/span>';\n                    html += '<span>\ud83c\udfdb\ufe0f ' + escapeHtml(item.type) + '<\/span>';\n                    html += '<span>\ud83d\udcb0 ' + escapeHtml(item.frais) + '<\/span>';\n                    html += '<\/div>';\n                }\n                \n                if(item.excerpt) html += '<p class=\"choix-card-excerpt\">' + item.excerpt + '<\/p>';\n                html += '<\/div>';\n            });\n        }\n        \n        $('#choix-container').html(html);\n        \n        $('.choix-card').click(function() {\n            $('.choix-card').removeClass('selected');\n            $(this).addClass('selected');\n            selectedChoixId = $(this).data('id');\n            selectedChoixTitle = $(this).data('title');\n            $('#offre_ou_universite_id').val(selectedChoixId);\n        });\n    }\n    \n    function escapeHtml(text) {\n        const map = {'&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#039;'};\n        return String(text).replace(\/[&<>\"']\/g, function(m) { return map[m]; });\n    }\n    \n    function updatePaymentSummary() {\n        const prenom = $('#prenom').val();\n        const nom = $('#nom').val();\n        const visaLabel = selectedTypeVisa === 'travail' ? '\ud83d\udcbc Visa Travail' : '\ud83c\udf93 Visa \u00c9tudes';\n        $('#summary-name').text(prenom + ' ' + nom);\n        $('#summary-visa').text(visaLabel);\n        $('#summary-choix').text(selectedChoixTitle || '-');\n    }\n    \n    function showMessage(message, type) {\n        const messageEl = $('#form-message');\n        messageEl.removeClass('success error').addClass(type).html(message).show();\n        setTimeout(function() { messageEl.fadeOut(); }, 5000);\n        window.scrollTo({top: messageEl.offset().top - 100, behavior: 'smooth'});\n    }\n    \n    function submitCandidature() {\n        $('.loading-overlay').show();\n        const formData = new FormData(form[0]);\n        formData.append('action', 'submit_candidature');\n        formData.append('nonce', candidatureAjax.nonce);\n        \n        $.ajax({\n            url: candidatureAjax.ajax_url,\n            type: 'POST',\n            data: formData,\n            processData: false,\n            contentType: false,\n            success: function(response) {\n                $('.loading-overlay').hide();\n                if(response.success) {\n                    candidatureId = response.data.candidature_id;\n                    currentStep++;\n                    updateStep(currentStep);\n                    showMessage('Candidature enregistr\u00e9e !', 'success');\n                } else {\n                    showMessage(response.data.message, 'error');\n                }\n            },\n            error: function() {\n                $('.loading-overlay').hide();\n                showMessage('Erreur de connexion', 'error');\n            }\n        });\n    }\n    \n    btnNext.click(function() {\n        if(!validateStep(currentStep)) {\n            showMessage('Veuillez remplir tous les champs obligatoires', 'error');\n            return;\n        }\n        \n        if(currentStep === 2 && !selectedChoixId) {\n            showMessage('Veuillez s\u00e9lectionner une option', 'error');\n            return;\n        }\n        \n        if(currentStep === 4) {\n            submitCandidature();\n        } else {\n            if(currentStep === 1) loadOffresOrUniversites();\n            currentStep++;\n            updateStep(currentStep);\n        }\n    });\n    \n    btnPrev.click(function() {\n        currentStep--;\n        updateStep(currentStep);\n    });\n    \n    btnSubmit.click(function() {\n        if(!candidatureId) {\n            showMessage('Erreur : candidature non enregistr\u00e9e', 'error');\n            return;\n        }\n        \n        $('.loading-overlay').show();\n        $('.loading-overlay p').text('Redirection vers le paiement...');\n        \n        $.ajax({\n            url: candidatureAjax.ajax_url,\n            type: 'POST',\n            data: {\n                action: 'process_payment_fedapay',\n                nonce: candidatureAjax.nonce,\n                candidature_id: candidatureId\n            },\n            success: function(response) {\n                if(response.success) {\n                    window.location.href = response.data.redirect_url;\n                } else {\n                    $('.loading-overlay').hide();\n                    showMessage(response.data.message, 'error');\n                }\n            },\n            error: function() {\n                $('.loading-overlay').hide();\n                showMessage('Erreur de connexion', 'error');\n            }\n        });\n    });\n    \n    $('#lettre_motivation').on('input', function() {\n        const count = $(this).val().length;\n        $('#char-counter').text(count);\n        if(count > 2000) {\n            $(this).val($(this).val().substring(0, 2000));\n            $('#char-counter').text(2000);\n        }\n    });\n    \n    $('input[type=\"file\"]').change(function() {\n        const files = this.files;\n        const fileNameEl = $(this).siblings('.file-name');\n        if(files.length > 0) {\n            let names = [];\n            for(let i = 0; i < files.length; i++) names.push(files[i].name);\n            fileNameEl.text('\u2713 ' + names.join(', ')).show();\n            $(this).siblings('.file-upload-label').css('border-color', '#10b981');\n        } else {\n            fileNameEl.hide();\n        }\n    });\n    \n    $('input, select, textarea').on('input change', function() {\n        $(this).css('border-color', '#e5e7eb');\n        $(this).parent().css('color', '');\n        $(this).siblings('.file-upload-label').css('border-color', '');\n    });\n    \n    $('input[name=\"type_visa\"]').change(function() {\n        selectedChoixId = null;\n        selectedChoixTitle = '';\n        $('#offre_ou_universite_id').val('');\n    });\n    \n    loadOffresOrUniversites();\n    updateStep(1);\n    \n    console.log('Formulaire de candidature initialis\u00e9');\n});\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-0472911\" data-id=\"0472911\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-11dafad elementor-widget elementor-widget-int-sec-title\" data-id=\"11dafad\" data-element_type=\"widget\" data-widget_type=\"int-sec-title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t                <div class=\"sec-title\">\r\n                            <h2 class=\"title wow skewIn\">Common questions <br>\n<span> answered<\/span><\/h2>\r\n                            <p>At the heart of our commitment to providing <br>\nexceptional immigration solutions stands our trusted<\/p>\r\n                    <\/div>\r\n    \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9ee28b0 elementor-widget elementor-widget-image\" data-id=\"9ee28b0\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"642\" height=\"455\" src=\"https:\/\/immigrationinluxembourg.com\/wp-content\/uploads\/2023\/12\/faq_img.png\" class=\"attachment-large size-large wp-image-590\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Common questions answered At the heart of our commitment to providing exceptional immigration solutions stands our trusted<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"evisa-template.php","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"class_list":["post-106","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/immigrationinluxembourg.com\/index.php\/wp-json\/wp\/v2\/pages\/106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/immigrationinluxembourg.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/immigrationinluxembourg.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/immigrationinluxembourg.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/immigrationinluxembourg.com\/index.php\/wp-json\/wp\/v2\/comments?post=106"}],"version-history":[{"count":17,"href":"https:\/\/immigrationinluxembourg.com\/index.php\/wp-json\/wp\/v2\/pages\/106\/revisions"}],"predecessor-version":[{"id":2359,"href":"https:\/\/immigrationinluxembourg.com\/index.php\/wp-json\/wp\/v2\/pages\/106\/revisions\/2359"}],"wp:attachment":[{"href":"https:\/\/immigrationinluxembourg.com\/index.php\/wp-json\/wp\/v2\/media?parent=106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}