1 // ConciergeVisa.ai - Main JavaScript
2
3 // Smooth scroll to sections
4 function scrollToQuiz() {
5 document.getElementById('quiz').scrollIntoView({ behavior: 'smooth' });
6 }
7
8 function scrollToSection(sectionId) {
9 document.getElementById(sectionId).scrollIntoView({ behavior: 'smooth' });
10 }
11
12 // Mobile menu toggle
13 function toggleMobileMenu() {
14 const mobileMenu = document.getElementById('mobileMenu');
15 mobileMenu.classList.toggle('active');
16 }
17
18 // Modal functions
19 function openModal(modalId) {
20 const modal = document.getElementById(modalId);
21 modal.classList.add('active');
22 document.body.style.overflow = 'hidden';
23 }
24
25 function closeModal(modalId) {
26 const modal = document.getElementById(modalId);
27 modal.classList.remove('active');
28 document.body.style.overflow = 'auto';
29 }
30
31 function openBookingModal() {
32 openModal('bookingModal');
33 }
34
35 function openContactModal() {
36 openModal('contactModal');
37 }
38
39 function openAuditorDemo() {
40 openModal('auditorModal');
41 }
42
43 // Close modal when clicking outside
44 document.addEventListener('click', (e) => {
45 if (e.target.classList.contains('modal')) {
46 e.target.classList.remove('active');
47 document.body.style.overflow = 'auto';
48 }
49 });
50
51 // Form submission handlers
52 function handleBookingSubmit(event) {
53 event.preventDefault();
54
55 // Get form data
56 const formData = new FormData(event.target);
57 const data = Object.fromEntries(formData.entries());
58
59 console.log('Booking form submitted:', data);
60
61 // In production, this would send data to your email or CRM
62 alert(`✅ Thank you for your booking request!\n\nWe'll contact you within 48 hours at the email address you provided.\n\n💡 In the meantime, start gathering your documents using the checklist from the quiz!`);
63
64 closeModal('bookingModal');
65 event.target.reset();
66
67 // Simulate sending email (in production, integrate with backend)
68 // sendBookingEmail(data);
69 }
70
71 function handleContactSubmit(event) {
72 event.preventDefault();
73
74 const formData = new FormData(event.target);
75 const data = Object.fromEntries(formData.entries());
76
77 console.log('Contact form submitted:', data);
78
79 alert(`✅ Message sent successfully!\n\nWe'll respond to your inquiry within 48 hours.\n\nThank you for contacting ConciergeVisa.ai!`);
80
81 closeModal('contactModal');
82 event.target.reset();
83 }
84
85 // Document auditor demo simulation
86 function simulateUpload() {
87 const uploadArea = document.querySelector('.demo-upload');
88 const resultsArea = document.getElementById('demoResults');
89
90 // Show loading state
91 uploadArea.innerHTML = `
92
93
94
Analyzing document...
95
Our AI is checking your bank statement
96
97 `;
98
99 // Simulate processing time
100 setTimeout(() => {
101 uploadArea.style.display = 'none';
102 resultsArea.style.display = 'block';
103 }, 2500);
104 }
105
106 // Resource modal system
107 const resourceContent = {
108 'visa-types': {
109 title: 'French Visa Types Guide',
110 content: `
111 Long-Stay Visa Categories
112
113
114
🏖️ Visitor Visa (VLS-T Visiteur)
115
Who it's for: Retirees, people with independent income
116
Duration: Up to 1 year, renewable
117
Can you work: No
118
Requirements: €1,700/month income, health insurance, proof of accommodation
119
120
121
122
💼 Talent Passport
123
Who it's for: Skilled workers, entrepreneurs, investors, researchers, artists
124
Duration: Up to 4 years
125
Can you work: Yes
126
Requirements: Professional qualifications, business plan (for entrepreneurs), proof of income
127
Categories: Highly skilled worker, entrepreneur/innovative business, investor, artist, researcher
128
129
130
131
🎓 Student Visa (VLS-TS Étudiant)
132
Who it's for: Students enrolled in French institutions
133
Duration: Duration of studies
134
Can you work: Yes, part-time (up to 964 hours/year)
135
Requirements: Acceptance letter, €615/month proof of resources, Campus France registration
136
137
138
139
👨👩👧 Family Reunification
140
Who it's for: Joining family members in France
141
Duration: Varies
142
Can you work: Usually yes (after approval)
143
Requirements: Proof of relationship, sponsor's income and accommodation
144
145
146
147
Not sure which visa is right for you?
148
149
150 `
151 },
152 'checklist': {
153 title: 'Document Checklist',
154 content: `
155 Universal Documents (All Visa Types)
156
157 - Valid passport (3+ months validity after visa expiry)
158 - Birth certificate (apostilled & translated)
159 - Recent passport photos (3.5cm x 4.5cm)
160 - Visa application form (completed)
161 - Proof of accommodation in France
162 - Health insurance certificate
163 - Clean criminal record (apostilled & translated)
164
165
166 Visa-Specific Documents
167
168
169
Visitor/Retiree Visa:
170
171 - Pension statements or proof of income
172 - Bank statements (last 3-6 months)
173 - Tax returns (last 2 years)
174
175
176
177
178
Talent Passport (Remote Worker):
179
180 - Remote work contract
181 - Letter from employer confirming remote work
182 - University diploma
183 - CV/Resume
184 - Tax returns (last 2 years)
185
186
187
188
189
Student Visa:
190
191 - Acceptance letter from French institution
192 - Proof of financial resources (€615/month)
193 - Academic transcripts
194 - Campus France registration confirmation
195
196
197
198
199
Critical Reminders
200
✅ All documents in foreign languages must be translated by a certified translator
201
✅ Birth certificates and criminal records need apostille certification
202
✅ Bank statements must be dated within the last 30 days
203
✅ Make copies of everything before sending!
204
205
206
207
Want us to check your documents?
208
209
Or start with a €125/hour consultation to discuss your specific needs
210
211 `
212 },
213 'timeline': {
214 title: 'Visa Timeline Calculator',
215 content: `
216 Typical Processing Times
217
218
219
220
🎓 Student Visa
221
1-3 months
222
Fastest category if you have acceptance letter
223
224
225
226
🏖️ Visitor/Retiree Visa
227
2-4 months
228
Moderate speed with complete documentation
229
230
231
232
💼 Talent Passport
233
3-6 months
234
Requires more documentation review
235
236
237
238
👨👩👧 Family Reunification
239
6-12 months
240
Longest wait time, multiple verification steps
241
242
243
244 Timeline Breakdown
245
246
247
1
248
249
Document Preparation
250
2-4 weeks (gathering, apostilles, translations)
251
252
253
254
255
2
256
257
Consulate Appointment
258
1-4 weeks wait time for appointment
259
260
261
262
263
3
264
265
Application Processing
266
4-12 weeks (varies by visa type)
267
268
269
270
271
✓
272
273
Visa Issued
274
Passport returned with visa sticker
275
276
277
278
279
280
Pro Tips to Speed Up Your Application
281
282 - Apply during off-peak months (avoid June-August)
283 - Submit 100% complete documentation the first time
284 - Book consulate appointments early (they fill up fast)
285 - Get apostilles and translations done in parallel
286 - Use our audit service to avoid rejection delays!
287
288
289
290
291
Want to start your timeline today?
292
293
294 `
295 },
296 'prefecture': {
297 title: 'Prefecture Guide - Béziers & Hérault',
298 content: `
299 Understanding French Prefectures
300 Each French département has a prefecture (administrative office) that handles visa validation and carte de séjour applications. Requirements can vary!
301
302 Béziers & Hérault (34) Specifics
303
304
305
Montpellier Prefecture
306
Serves: Hérault département (including Béziers)
307
Location: 34 Place des Martyrs de la Résistance, 34000 Montpellier
308
Known for: Efficient processing, but strict about document formatting
309
310
311
Specific Requirements:
312
313 - Bank statements must show BOTH name and IBAN clearly visible
314 - Accommodation proof requires specific lease format
315 - Prefers documents in chronological order
316 - Very strict about 30-day dating rule for bank statements
317
318
319
320
321 Differences from Paris Prefecture
322
323
324
Béziers/Montpellier
325
326 - Faster appointments
327 - More flexible with minor errors
328 - English spoken by some staff
329 - Smaller applicant volume
330
331
332
333
Paris Prefecture
334
335 - Months-long wait times
336 - Very strict documentation rules
337 - French language often required
338 - Huge applicant backlog
339
340
341
342
343
344
The ConciergeVisa.ai Advantage
345
Our Béziers office has established relationships with the Montpellier prefecture. We know:
346
347 - ✅ Exactly how they want documents formatted
348 - ✅ Current processing times and backlogs
349 - ✅ Which staff members handle different visa types
350 - ✅ Common rejection reasons specific to this prefecture
351 - ✅ How to expedite urgent cases
352
353
354
355 Other Occitanie Prefectures
356
357
Toulouse (31): Second largest in region, moderate wait times
358
Nîmes (30): Similar to Montpellier, slightly slower
359
Perpignan (66): Smallest office, fastest but limited English support
360
361
362
363
Need help navigating your local prefecture?
364
365
366 `
367 }
368 };
369
370 function showResource(resourceKey) {
371 const resource = resourceContent[resourceKey];
372 if (!resource) return;
373
374 // Create modal if it doesn't exist
375 let resourceModal = document.getElementById('resourceModal');
376 if (!resourceModal) {
377 resourceModal = document.createElement('div');
378 resourceModal.id = 'resourceModal';
379 resourceModal.className = 'modal';
380 resourceModal.innerHTML = `
381
387 `;
388 document.body.appendChild(resourceModal);
389 }
390
391 const content = document.getElementById('resourceModalContent');
392 content.innerHTML = `
393 ${resource.title}
394 ${resource.content}
395 `;
396
397 openModal('resourceModal');
398 }
399
400 function closeResourceModal() {
401 closeModal('resourceModal');
402 }
403
404 // Scroll animations
405 const observerOptions = {
406 threshold: 0.1,
407 rootMargin: '0px 0px -100px 0px'
408 };
409
410 const observer = new IntersectionObserver((entries) => {
411 entries.forEach(entry => {
412 if (entry.isIntersecting) {
413 entry.target.style.opacity = '1';
414 entry.target.style.transform = 'translateY(0)';
415 }
416 });
417 }, observerOptions);
418
419 // Initialize on page load
420 document.addEventListener('DOMContentLoaded', () => {
421 // Animate elements on scroll
422 const animateElements = document.querySelectorAll('.feature-card, .resource-card, .step');
423 animateElements.forEach(el => {
424 el.style.opacity = '0';
425 el.style.transform = 'translateY(30px)';
426 el.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
427 observer.observe(el);
428 });
429
430 // Close mobile menu when clicking links
431 const mobileLinks = document.querySelectorAll('.mobile-menu a');
432 mobileLinks.forEach(link => {
433 link.addEventListener('click', () => {
434 toggleMobileMenu();
435 });
436 });
437 });
438
439 // Prevent body scroll when modal is open
440 document.querySelectorAll('.modal').forEach(modal => {
441 modal.addEventListener('click', (e) => {
442 if (e.target === modal) {
443 closeModal(modal.id);
444 }
445 });
446 });
447
547
548
549
550
551
552
553
554
555
556
557
561
562 You won't be charged yet. We'll send an invoice after our initial consultation.
563
564
565
566
567
603
604
605
606
609
AI Document Auditor Demo
610
This is how our system will check your documents automatically
611
612
613
614
615
616
Upload Your Document
617
Drag and drop or click to select
618
619
620
621
622
623
Audit Results
624
625
626
627
628
Name Match
629
Document name matches your profile: John Doe
630
631
632
633
634
635
636
Date Out of Range
637
Bank statement dated 45 days ago. Must be within 30 days.
638
639
640
641
642
643
644
Balance Verification
645
Balance of €2,450 exceeds SMIC threshold of €1,700
646
647
648
649
650
651
652
Translation Needed
653
Document is in English. French translation required for submission.
654
655
656
657
658
659
Ready to audit your real documents?
660
663
664
665
666
667
668
669
670
671
672
673