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 165 166

Visa-Specific Documents

167 168
169

Visitor/Retiree Visa:

170 175
176 177
178

Talent Passport (Remote Worker):

179 186
187 188
189

Student Visa:

190 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 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 318
319
320 321

Differences from Paris Prefecture

322
323
324

Béziers/Montpellier

325 331
332
333

Paris Prefecture

334 340
341
342 343
344

The ConciergeVisa.ai Advantage

345

Our Béziers office has established relationships with the Montpellier prefecture. We know:

346 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 668 669 670 671 672 673 674 675