.im-tr-wrap{max-width:860px;margin:0 auto;padding:24px 0 60px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC",sans-serif;color:#1f2937;font-size:16px;line-height:1.7} .im-tr-wrap *,.im-tr-wrap *::before,.im-tr-wrap *::after{box-sizing:border-box} .im-tr-page{background:#fff;border-radius:12px;box-shadow:0 2px 16px rgba(0,0,0,.07);overflow:hidden} .im-tr-header{background:linear-gradient(135deg,#009dff,#3de1fe,#53eee0);padding:36px 40px 28px;color:#fff} .im-tr-header h1{margin:0 0 8px;font-size:26px;font-weight:700} .im-tr-header p{margin:0 0 8px;opacity:.9;font-size:15px} .im-tr-progress-bar{background:rgba(255,255,255,.3);border-radius:20px;height:10px;margin-top:16px;overflow:hidden} .im-tr-progress-fill{background:#fff;height:100%;border-radius:20px;transition:width .5s ease;width:0} .im-tr-progress-text{font-size:14px;font-weight:600;margin-top:8px;opacity:.9} .im-tr-section{padding:32px 40px;border-bottom:1px solid #f3f4f6} .im-tr-section:last-child{border-bottom:none} .im-tr-section h2{margin:0 0 20px;font-size:20px;font-weight:700;color:#111827;display:flex;align-items:center;gap:10px} .im-tr-section h2 .im-tr-step{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;background:linear-gradient(135deg,#009dff,#3de1fe);color:#fff;border-radius:50%;font-size:14px;font-weight:700;flex-shrink:0} .im-tr-video-wrap{position:relative;width:100%;padding-bottom:56.25%;border-radius:10px;overflow:hidden;background:#0f172a;margin-bottom:20px} .im-tr-video-wrap iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none} .im-tr-dl-section{display:block} .im-tr-dl-btn{display:inline-flex;align-items:center;justify-content:center;gap:12px;background:linear-gradient(135deg,#009dff,#3de1fe,#53eee0);color:#fff;padding:18px 36px;border-radius:12px;text-decoration:none;font-size:18px;font-weight:700;min-height:56px;box-shadow:0 4px 14px rgba(0,157,255,.35);transition:all .3s;border:none;cursor:pointer;font-family:inherit;max-width:100%;box-sizing:border-box;word-break:break-word;text-align:center} .im-tr-dl-btn:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,157,255,.45);color:#fff} .im-tr-dl-btn svg{flex-shrink:0} .im-tr-quiz{margin-top:28px;border-top:2px solid #e5e7eb;padding-top:24px} .im-tr-quiz-title{font-size:16px;font-weight:700;color:#009dff;margin:0 0 20px;display:flex;align-items:center;gap:8px} .im-tr-q{background:#f9fafb;border:1px solid #e5e7eb;border-radius:10px;padding:20px 24px;margin-bottom:16px;transition:border-color .3s} .im-tr-q.correct{border-color:#10b981;background:#ecfdf5} .im-tr-q.wrong{border-color:#ef4444;background:#fef2f2} .im-tr-q-text{font-size:15px;font-weight:600;color:#111827;margin:0 0 14px} .im-tr-opt{display:flex;align-items:center;gap:10px;padding:10px 14px;border:1.5px solid #d1d5db;border-radius:8px;margin-bottom:8px;cursor:pointer;transition:all .15s;position:relative;font-size:15px;color:#374151} .im-tr-opt:hover{border-color:#009dff;background:#e6f9ff} .im-tr-opt.selected{border-color:#009dff;background:#e6f9ff;color:#009dff;font-weight:600} .im-tr-opt.locked{cursor:default;pointer-events:none;opacity:.85} .im-tr-opt.locked.selected.correct-opt{border-color:#10b981;background:#d1fae5;color:#065f46} .im-tr-opt.locked.selected.wrong-opt{border-color:#ef4444;background:#fee2e2;color:#991b1b} .im-tr-opt input[type=radio]{position:absolute;opacity:0;width:0;height:0;pointer-events:none} .im-tr-opt .im-tr-ck{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border:2px solid #d1d5db;border-radius:50%;flex-shrink:0;transition:all .2s;background:#fff;position:relative} .im-tr-opt .im-tr-ck::after{content:"";width:10px;height:10px;border-radius:50%;background:#fff;opacity:0;transition:opacity .15s} .im-tr-opt.selected .im-tr-ck{background:linear-gradient(135deg,#009dff,#3de1fe,#53eee0);border-color:transparent} .im-tr-opt.selected .im-tr-ck::after{opacity:1} .im-tr-opt .im-tr-letter{font-weight:700;min-width:16px} .im-tr-q-feedback{margin-top:8px;font-size:14px;font-weight:600;display:none} .im-tr-q-feedback.show{display:block} .im-tr-q-feedback.err{color:#ef4444} .im-tr-q-feedback.ok{color:#10b981} .im-tr-btn-row{display:flex;gap:12px;margin-top:20px;flex-wrap:wrap} .im-tr-submit{display:inline-flex;align-items:center;gap:8px;background:linear-gradient(135deg,#009dff,#3de1fe,#53eee0);color:#fff;border:none;padding:13px 32px;border-radius:8px;font-size:16px;font-weight:700;cursor:pointer;transition:all .3s;font-family:inherit} .im-tr-submit:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(0,157,255,.3)} .im-tr-submit:disabled{background:#94a3b8;cursor:not-allowed;transform:none;box-shadow:none} .im-tr-retry{display:none;align-items:center;gap:8px;background:#f59e0b;color:#fff;border:none;padding:13px 32px;border-radius:8px;font-size:16px;font-weight:700;cursor:pointer;transition:all .3s;font-family:inherit} .im-tr-retry:hover{background:#d97706;transform:translateY(-1px)} .im-tr-locked-overlay{position:relative} .im-tr-locked-overlay::after{content:"✓ Completed";position:absolute;top:12px;right:16px;background:#10b981;color:#fff;padding:4px 12px;border-radius:6px;font-size:12px;font-weight:700} .im-tr-hidden{display:none} .im-tr-center{text-align:center;padding:60px 40px} .im-tr-icon{width:72px;height:72px;border-radius:50%;font-size:36px;line-height:72px;margin:0 auto 24px;font-weight:700} .im-tr-icon.ok{background:#d1fae5;color:#065f46} .im-tr-icon.err{background:#fee2e2;color:#991b1b} .im-tr-center h1{font-size:24px;margin:0 0 12px} .im-tr-center p{color:#6b7280;font-size:15px;margin-bottom:5px;} .im-tr-notice{background:#e6f9ff;border-left:4px solid #009dff;padding:12px 16px;border-radius:0 8px 8px 0;color:#007acc;font-size:14px;margin-bottom:20px} @media(max-width:600px){.im-tr-header,.im-tr-section{padding:24px 20px}.im-tr-q{padding:16px 18px}.im-tr-dl-section{width:100%}.im-tr-dl-btn{width:100%;padding:15px 18px;font-size:16px;min-height:52px;gap:10px;line-height:1.35}.im-tr-dl-btn svg{width:22px;height:22px}} @keyframes imTrFadeIn{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}} .im-tr-fade-in{animation:imTrFadeIn .5s ease} @keyframes imTrSpin{to{transform:rotate(360deg)}} .im-tr-btn-loading{position:relative;color:transparent!important} .im-tr-btn-loading::after{content:"";position:absolute;width:20px;height:20px;top:50%;left:50%;margin:-10px 0 0 -10px;border:3px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:imTrSpin .6s linear infinite} '; echo ''; } /* ============================================================ AJAX: Training Complete Handler ============================================================ */ add_action('wp_ajax_im_training_complete', 'im_ajax_training_complete'); add_action('wp_ajax_nopriv_im_training_complete', 'im_ajax_training_complete'); function im_ajax_training_complete() { $token = sanitize_text_field($_POST['im_training_token'] ?? ''); $candidate = $token ? IM_Candidate::get_by_training_token($token) : null; if (!$candidate) { wp_send_json_error(['message' => 'Invalid or expired training link.']); } if (!wp_verify_nonce($_POST['im_nonce'] ?? '', 'im_training_' . $token)) { wp_send_json_error(['message' => 'Security verification failed. Please refresh and try again.']); } IM_Candidate::mark_training_completed($candidate->id); IM_Mailer::send_training_complete($candidate->id); $name = esc_html($candidate->preferred_name ?: $candidate->first_name); wp_send_json_success(['message' => 'ok', 'name' => $name]); } /* ============================================================ Shortcode: [im_training] ============================================================ */ add_shortcode('im_training', function () { im_enqueue_training_styles(); ob_start(); $token_str = sanitize_text_field($_GET['im_training_token'] ?? ''); // No token if (!$token_str): ?>
!

Invalid Link

This training link is invalid. Please check your email for the correct link.

status === 'trained'): ?>

Training Already Completed

You have already completed all training modules.

Your trial account information has been sent to your email. Thank you!

!

Invalid Link

This training link is invalid or no longer active. Please contact us if you need assistance.

training_opened_at)) { IM_Candidate::mark_training_opened($candidate->id); } // Fetch all training questions ordered by menu_order $training_posts = get_posts([ 'post_type' => 'training_questions', 'posts_per_page' => -1, 'orderby' => 'menu_order', 'order' => 'ASC', 'post_status' => 'publish', ]); if (empty($training_posts)): ?>
!

No Training Available

There are currently no training modules available. Please contact the recruitment team.

preferred_name ?: $candidate->first_name); $nonce = wp_create_nonce('im_training_' . $token_str); $total = count($training_posts); // Build training data for JS $training_data = []; foreach ($training_posts as $idx => $post) { $youtube_url = get_field('youtube_url', $post->ID) ?: ''; $download_url = get_field('download_url', $post->ID) ?: ''; $download_btn_text = get_field('download_btn_text', $post->ID) ?: 'Download Materials'; $test_questions = get_field('test_questions', $post->ID) ?: []; $qs = []; if (is_array($test_questions)) { foreach ($test_questions as $qi => $q) { $correct_raw = $q['correct_answer'] ?? ''; $correct_val = is_array($correct_raw) ? ($correct_raw['value'] ?? '') : $correct_raw; $qs[] = [ 'question' => $q['question'] ?? '', 'option_a' => $q['option_a'] ?? '', 'option_b' => $q['option_b'] ?? '', 'option_c' => $q['option_c'] ?? '', 'option_d' => $q['option_d'] ?? '', 'correct' => $correct_val, ]; } } $training_data[] = [ 'id' => $post->ID, 'title' => $post->post_title, 'youtube_url' => $youtube_url, 'download_url' => $download_url, 'download_btn_text' => $download_btn_text, 'questions' => $qs, ]; } ?>

Onboarding Training

Welcome, ! Please complete the training modules below to get started.

0 / completed
$td): $youtube_id = ''; if ($td['youtube_url']) { if (preg_match('/[?&]v=([^&]+)/', $td['youtube_url'], $m)) $youtube_id = $m[1]; elseif (preg_match('/youtu\.be\/([^?&]+)/', $td['youtube_url'], $m)) $youtube_id = $m[1]; elseif (preg_match('/embed\/([^?&]+)/', $td['youtube_url'], $m)) $youtube_id = $m[1]; } ?>

Test Questions — Answer all correctly to proceed
$q): ?>
Q.
'A', 'option_b' => 'B', 'option_c' => 'C', 'option_d' => 'D'] as $key => $letter): ?>