From 6c8960d09d205afcea577bd3f1a8e828f214b77a Mon Sep 17 00:00:00 2001 From: Ravi Gulhane <> Date: Mon, 18 May 2026 10:13:20 +0530 Subject: [PATCH] Recover project structure --- laravel | 1 + website/achievements.php | 44 +++ website/admin/admins.php | 112 +++++++ website/admin/contacts.php | 91 ++++++ website/admin/login.php | 47 +++ website/admin/logout.php | 5 + website/admin/newsletter.php | 85 ++++++ website/admin/resources.php | 191 ++++++++++++ website/admin/sessions.php | 163 ++++++++++ website/admin/tutorials.php | 222 ++++++++++++++ website/assets/css/admin.css | 113 +++++++ website/assets/css/style.css | 73 +++++ website/assets/js/main.js | 8 + website/contact.php | 72 +++++ website/data/resources.json | 22 ++ website/expertise.php | 48 +++ website/experts.php | 28 ++ website/includes/admin-footer.php | 9 + website/includes/admin-header.php | 33 ++ website/includes/auth.php | 50 ++++ website/includes/data.php | 229 ++++++++++++++ website/includes/db.php | 223 ++++++++++++++ website/includes/footer.php | 12 + website/includes/header.php | 46 +++ website/includes/mysqli-class.php | 138 +++++++++ website/includes/site-footer.php | 14 + website/includes/site-header.php | 50 ++++ website/index.php | 282 ++++++++++++++++++ website/news-events.php | 41 +++ website/resources.php | 56 ++++ website/services.php | 35 +++ website/sessions-list.php | 50 ++++ website/training.php | 33 ++ website/uploads/tutorial_1764217762_7756.docx | Bin 0 -> 44617 bytes website/who-we-are.php | 30 ++ website/work-with-us.php | 43 +++ 36 files changed, 2699 insertions(+) create mode 160000 laravel create mode 100644 website/achievements.php create mode 100644 website/admin/admins.php create mode 100644 website/admin/contacts.php create mode 100644 website/admin/login.php create mode 100644 website/admin/logout.php create mode 100644 website/admin/newsletter.php create mode 100644 website/admin/resources.php create mode 100644 website/admin/sessions.php create mode 100644 website/admin/tutorials.php create mode 100644 website/assets/css/admin.css create mode 100644 website/assets/css/style.css create mode 100644 website/assets/js/main.js create mode 100644 website/contact.php create mode 100644 website/data/resources.json create mode 100644 website/expertise.php create mode 100644 website/experts.php create mode 100644 website/includes/admin-footer.php create mode 100644 website/includes/admin-header.php create mode 100644 website/includes/auth.php create mode 100644 website/includes/data.php create mode 100644 website/includes/db.php create mode 100644 website/includes/footer.php create mode 100644 website/includes/header.php create mode 100644 website/includes/mysqli-class.php create mode 100644 website/includes/site-footer.php create mode 100644 website/includes/site-header.php create mode 100644 website/index.php create mode 100644 website/news-events.php create mode 100644 website/resources.php create mode 100644 website/services.php create mode 100644 website/sessions-list.php create mode 100644 website/training.php create mode 100644 website/uploads/tutorial_1764217762_7756.docx create mode 100644 website/who-we-are.php create mode 100644 website/work-with-us.php diff --git a/laravel b/laravel new file mode 160000 index 0000000..71f2f59 --- /dev/null +++ b/laravel @@ -0,0 +1 @@ +Subproject commit 71f2f59185314709834fd132e91636eca4d1d0fb diff --git a/website/achievements.php b/website/achievements.php new file mode 100644 index 0000000..6f58b77 --- /dev/null +++ b/website/achievements.php @@ -0,0 +1,44 @@ + + +
+
+
+

Achievements

+

Milestones powered by data and collaboration

+
+
+
+
1Mn+
+
Lives touched
+
+
+
+
+
5k+
+
Doctors trained
+
+
+
+
+
500+
+
Medical schools
+
+
+
+
+
300+
+
Research studies
+
+
+
+

These numbers reflect multi-year partnerships, field programs, and training cohorts across India.

+
+
+
+ + diff --git a/website/admin/admins.php b/website/admin/admins.php new file mode 100644 index 0000000..5c5b45f --- /dev/null +++ b/website/admin/admins.php @@ -0,0 +1,112 @@ +query("SELECT email, created_at FROM admins ORDER BY created_at DESC"); +$admins = is_array($admins) ? $admins : []; +$assetPathPrefix = '../'; +$pageTitle = 'Admins'; +$currentPage = ''; +$extraStyles = << + body { background: #f6faf7; } + .admin-shell { padding: 40px 0; } + .table { width: 100%; border-collapse: collapse; margin-top: 20px; } + .table th, .table td { text-align: left; padding: 12px 10px; border-bottom: 1px solid #e1ede7; } + .table th { color: #0f4333; } + form input { width: 100%; padding: 12px 14px; border-radius: 10px; border: 1px solid #d8e7e0; font-size: 15px; margin-top: 8px; } + form label { font-weight: 700; color: #0f4333; display: block; margin-top: 12px; } + +CSS; + +require __DIR__ . '/../includes/admin-header.php'; +?> + +
+
+
+
+

Admins

+

Manage administrator accounts

+
+
+ + + +
+ + +
+ + +
+

Add Admin

+
+ + + + + + +
+ +
+
+
+ +
+

Existing Admins

+ +

No admins found.

+ + + + + + + + + + + + + + + + +
EmailCreated
+ +
+
+
+ + diff --git a/website/admin/contacts.php b/website/admin/contacts.php new file mode 100644 index 0000000..b4481b9 --- /dev/null +++ b/website/admin/contacts.php @@ -0,0 +1,91 @@ + + body { background: #f6faf7; } + .admin-shell { padding: 40px 0; } + .table { width: 100%; border-collapse: collapse; margin-top: 20px; } + .table th, .table td { text-align: left; padding: 12px 10px; border-bottom: 1px solid #e1ede7; vertical-align: top; } + .table th { color: #0f4333; } + +CSS; + +require __DIR__ . '/../includes/admin-header.php'; +?> + +
+
+
+
+

Contact Entries

+

Messages from the contact form

+
+
Read-only
+
+ + +
+ Export CSV +
+ + +

No messages yet.

+ + + + + + + + + + + + + + + + + + + + + + +
NameEmailOrganizationMessageReceived
+ +
+
+ + diff --git a/website/admin/login.php b/website/admin/login.php new file mode 100644 index 0000000..19a416a --- /dev/null +++ b/website/admin/login.php @@ -0,0 +1,47 @@ + + +
+
+
+

Admin Login

+ +
+ +
+
+ + +
+
+ + +
+ +

Default admin: ravi@stratawiz.com / qwerty

+
+
+
+
+ + diff --git a/website/admin/logout.php b/website/admin/logout.php new file mode 100644 index 0000000..3f36376 --- /dev/null +++ b/website/admin/logout.php @@ -0,0 +1,5 @@ + + body { background: #f6faf7; } + .admin-shell { padding: 40px 0; } + .table { width: 100%; border-collapse: collapse; margin-top: 20px; } + .table th, .table td { text-align: left; padding: 12px 10px; border-bottom: 1px solid #e1ede7; } + .table th { color: #0f4333; } + +CSS; + +require __DIR__ . '/../includes/admin-header.php'; +?> + +
+
+
+
+

Newsletter

+

Subscription list

+
+
Read-only
+
+ + +
+ Export CSV +
+ + +

No subscribers yet.

+ + + + + + + + + + + + + + + + + + +
First NameEmailSubscribed
+ +
+
+ + diff --git a/website/admin/resources.php b/website/admin/resources.php new file mode 100644 index 0000000..d714e9e --- /dev/null +++ b/website/admin/resources.php @@ -0,0 +1,191 @@ +'; print_r($resources); exit; +$assetPathPrefix = '../'; +$pageTitle = 'Manage Resources'; +$currentPage = 'resources'; +$extraStyles = << + body { background: #f6faf7; } + .admin-shell { padding: 40px 0; } + .table { width: 100%; border-collapse: collapse; margin-top: 20px; } + .table th, .table td { text-align: left; padding: 12px 10px; border-bottom: 1px solid #e1ede7; } + .table th { color: #0f4333; } + .badge { display: inline-block; padding: 6px 10px; border-radius: 10px; background: #e8f5ef; color: #0f4333; font-weight: 700; font-size: 13px; } + .inline-btn { color: #b9342f; font-weight: 700; } + form textarea { min-height: 120px; resize: vertical; } + form input, form textarea { width: 100%; padding: 12px 14px; border-radius: 10px; border: 1px solid #d8e7e0; font-size: 15px; margin-top: 8px; } + form input[type=file] { padding: 8px; } + form label { font-weight: 700; color: #0f4333; display: block; margin-top: 12px; } + .topbar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; } + +CSS; + +require __DIR__ . '/../includes/admin-header.php'; +?> + +
+
+
+
+

Resources

+

Resources for Learning and Research

+

Add short descriptions and labels; they will appear instantly on the public site.

+
+ +
+ + + +
Resource added successfully.
+ + +
Resource deleted.
+ + +
+ + + +

No resources yet. Add your first entry below.

+ + + + + + + + + + + + + $resource): ?> + + + + + + + + + + +
TitleSummaryLabelAsset
+ + Download + + Watch + + None + + Delete
+ + +
+
+

Add Resource

+
+ + + + + + + + + + + + + + +

Upload a file or provide a video URL (or both).

+ +
+ + View live site +
+
+
+
+
+
+ + diff --git a/website/admin/sessions.php b/website/admin/sessions.php new file mode 100644 index 0000000..3fcda81 --- /dev/null +++ b/website/admin/sessions.php @@ -0,0 +1,163 @@ + + body { background: #f6faf7; } + .admin-shell { padding: 40px 0; } + .table { width: 100%; border-collapse: collapse; margin-top: 20px; } + .table th, .table td { text-align: left; padding: 12px 10px; border-bottom: 1px solid #e1ede7; } + .table th { color: #0f4333; } + .badge { display: inline-block; padding: 6px 10px; border-radius: 10px; background: #e8f5ef; color: #0f4333; font-weight: 700; font-size: 13px; } + .inline-btn { color: #b9342f; font-weight: 700; } + form textarea { min-height: 120px; resize: vertical; } + form input, form textarea { width: 100%; padding: 12px 14px; border-radius: 10px; border: 1px solid #d8e7e0; font-size: 15px; margin-top: 8px; } + form label { font-weight: 700; color: #0f4333; display: block; margin-top: 12px; } + .topbar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; } + +CSS; + +require __DIR__ . '/../includes/admin-header.php'; +?> + +
+
+
+
+

Upcoming Sessions

+

Manage events and workshops

+

Add session details to show on the public site.

+
+ +
+ + + +
Session added successfully.
+ + +
Session deleted.
+ + +
Session updated.
+ + +
+ + + +

No sessions yet. Add your first event below.

+ + + + + + + + + + + + + + + + + + + + + + +
TitleDescriptionTagStart Date
+ Edit | + Delete +
+ + +
+
+

+
+ + + + + + + + + + + + + + + + + + +
+ + View live +
+
+
+
+
+
+ + diff --git a/website/admin/tutorials.php b/website/admin/tutorials.php new file mode 100644 index 0000000..182ea62 --- /dev/null +++ b/website/admin/tutorials.php @@ -0,0 +1,222 @@ + + body { background: #f6faf7; } + .admin-shell { padding: 40px 0; } + .table { width: 100%; border-collapse: collapse; margin-top: 20px; } + .table th, .table td { text-align: left; padding: 12px 10px; border-bottom: 1px solid #e1ede7; } + .table th { color: #0f4333; } + .badge { display: inline-block; padding: 6px 10px; border-radius: 10px; background: #e8f5ef; color: #0f4333; font-weight: 700; font-size: 13px; } + .inline-btn { color: #b9342f; font-weight: 700; } + form textarea { min-height: 120px; resize: vertical; } + form input, form textarea, form select { width: 100%; padding: 12px 14px; border-radius: 10px; border: 1px solid #d8e7e0; font-size: 15px; margin-top: 8px; } + form input[type=file] { padding: 8px; } + form label { font-weight: 700; color: #0f4333; display: block; margin-top: 12px; } + .topbar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; } + +CSS; + +require __DIR__ . '/../includes/admin-header.php'; +?> + +
+
+
+
+

Tutorials

+

Manage tutorials

+

Add training tutorials with downloads or video links.

+
+ +
+ + + +
Tutorial added successfully.
+ + +
Tutorial deleted.
+ + +
Tutorial updated successfully.
+ + +
+ + + +

No tutorials yet. Add your first entry below.

+ + + + + + + + + + + + + + + + + + + + + + + +
TitleDescriptionStatusAsset
+ + Download + + Watch + + None + + + Edit | + Delete +
+ + +
+
+

+
+ + + + + + + + + + + + + + + + + + +

Current file: Download

+ +

Upload a file or provide a video URL (or both).

+ + +
+
+
+
+
+ + diff --git a/website/assets/css/admin.css b/website/assets/css/admin.css new file mode 100644 index 0000000..5ac74bb --- /dev/null +++ b/website/assets/css/admin.css @@ -0,0 +1,113 @@ +body.admin-body { + background: #f6faf7; + font-family: 'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif; + color: #0e1e18; +} + +.site-header { + background: #ffffff; +} + +.brand-mark { + width: 42px; + height: 42px; + border-radius: 12px; + background: linear-gradient(135deg, #2bc08a, #11704f); +} + +.brand-name { + font-size: 18px; +} + +.brand-tagline { + font-size: 12px; +} + +.admin-shell { + padding: 40px 0; +} + +.admin-nav { + display: flex; + gap: 10px; + flex-wrap: wrap; + margin: 10px 0 20px; +} + +.admin-nav a { + background: #e6f3ed; + color: #0f4333; + padding: 8px 12px; + border-radius: 10px; + font-weight: 700; + text-decoration: none; +} + +.card { + border-radius: 16px; + border: 1px solid #e5efe9; + box-shadow: 0 10px 24px rgba(20, 72, 55, 0.08); + padding: 16px; +} + +.btn.primary, +.btn.btn-primary { + background: #1d9c6d; + color: #fff; + border: none; +} + +.btn.outline, +.btn.btn-outline { + background: #fff; + border: 1px solid #d3e8e0; + color: #0f4333; +} + +.btn.small { + padding: 8px 12px; + border-radius: 10px; +} + +form input, +form textarea, +form select { + width: 100%; + padding: 12px 14px; + border-radius: 10px; + border: 1px solid #d8e7e0; + font-size: 15px; + margin-top: 8px; +} + +form textarea { + min-height: 120px; + resize: vertical; +} + +form label { + font-weight: 700; + color: #0f4333; + display: block; + margin-top: 12px; +} + +.alert.good { + background: #def3eb; + color: #0f4333; +} + +.alert.bad { + background: #ffebe8; + color: #9a2f23; +} + +.table th, +.table td { + vertical-align: top; +} + +.admin-footer { + background: #f0f5f3; + border-top: 1px solid #e0ebe5; +} diff --git a/website/assets/css/style.css b/website/assets/css/style.css new file mode 100644 index 0000000..5fcd576 --- /dev/null +++ b/website/assets/css/style.css @@ -0,0 +1,73 @@ +.brand-mark { + width: 42px; + height: 42px; + background: linear-gradient(135deg, #2bc08a, #11704f); + border-radius: 12px; +} + +.hero-section { + background: radial-gradient(140% 120% at 25% 20%, #e9f7f0 0%, #ffffff 60%); +} + +.stat-tile { + background: #eef8f5; + border: 1px solid #def3eb; +} + +.hero-orb { + width: 220px; + height: 220px; + border-radius: 50%; + background: radial-gradient(circle at 30% 30%, #ffb7a6, #e06a6a 60%); + display: grid; + place-items: center; + box-shadow: 0 18px 40px rgba(223, 121, 121, 0.35); +} + +.hero-orb-inner { + width: 120px; + height: 120px; + background: linear-gradient(180deg, #ffede7, #ffb9a6); + border-radius: 12px; +} + +.icon-pill { + width: 42px; + height: 42px; + border-radius: 12px; + background: #e8f5ef; + color: #0f6f52; + display: grid; + place-items: center; + font-weight: 700; +} + +.placeholder-img { + min-height: 200px; + background: linear-gradient(135deg, #c2e7d9, #9cd3c3); +} +.placeholder-img.tall { min-height: 260px; } +.placeholder-img.small { min-height: 140px; } +.placeholder-img.mailer { + min-height: 220px; + background: linear-gradient(135deg, #f6f6f6, #ffffff); + box-shadow: 0 12px 30px rgba(0,0,0,0.08); +} + +.dot { + width: 10px; + height: 10px; + border-radius: 50%; + display: inline-block; +} + +.badge.bg-success-subtle { + background: #e8f5ef !important; + color: #0f6f52 !important; +} + +.card { + border-radius: 16px; +} + +.footer a { color: #fff; } diff --git a/website/assets/js/main.js b/website/assets/js/main.js new file mode 100644 index 0000000..5da48f9 --- /dev/null +++ b/website/assets/js/main.js @@ -0,0 +1,8 @@ +document.addEventListener('DOMContentLoaded', () => { + const form = document.querySelector('.newsletter-form'); + if (form) { + form.addEventListener('submit', () => { + // Let the form submit normally; no client-side prevention so server can record subscriptions. + }); + } +}); diff --git a/website/contact.php b/website/contact.php new file mode 100644 index 0000000..a2bb8d1 --- /dev/null +++ b/website/contact.php @@ -0,0 +1,72 @@ + + +
+
+
+
+
+

Contact

+

We would love to hear from you

+

Tell us about your research needs, training goals, or partnership ideas.

+
    +
  • • Program design consultations
  • +
  • • Training calendar requests
  • +
  • • Media and speaking inquiries
  • +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+ + diff --git a/website/data/resources.json b/website/data/resources.json new file mode 100644 index 0000000..166e9a9 --- /dev/null +++ b/website/data/resources.json @@ -0,0 +1,22 @@ +[ + { + "title": "Understanding Lung Function in Adult Populations", + "summary": "A concise explainer on spirometry metrics and how to interpret lung function assessments in community settings.", + "label": "Publication" + }, + { + "title": "Lung Function in India: Overview", + "summary": "Key findings from multi-city research that maps prevalence of respiratory conditions across demographic groups.", + "label": "Research Brief" + }, + { + "title": "Childhood Lung Function in India", + "summary": "Practical guidance for pediatric screening teams and frontline clinicians working with young patients.", + "label": "Toolkit" + }, + { + "title": "Understanding Lung Function in Rural Populations", + "summary": "Field notes and methodologies for conducting door-to-door lung health studies with limited resources.", + "label": "Field Guide" + } +] diff --git a/website/expertise.php b/website/expertise.php new file mode 100644 index 0000000..0418a34 --- /dev/null +++ b/website/expertise.php @@ -0,0 +1,48 @@ + + +
+
+
+
+

Our Expertise

+

Our Services & Expertise

+
+
+
+
+
+
★
+
Research
+

Rigorous studies to map lung health trends and inform community programs.

+
+
+
+
+
+
+
★
+
Training
+

Workshops and mentoring that upskill clinicians and field teams.

+
+
+
+
+
+
+
★
+
Consulting
+

Advisory for programs to scale respiratory care safely and effectively.

+
+
+
+
+
+
+
+ + diff --git a/website/experts.php b/website/experts.php new file mode 100644 index 0000000..9ca8488 --- /dev/null +++ b/website/experts.php @@ -0,0 +1,28 @@ + + +
+
+
+
+

Our Experts

+

Meet the team driving respiratory innovation

+

Clinical specialists, researchers, and educators collaborate to design programs that translate science into care. Each team member brings domain expertise across pulmonology, epidemiology, community health, and implementation.

+
    +
  • 300+ specialists and faculty contributors
  • +
  • Cross-functional teams for research and training
  • +
  • Field experience across diverse geographies
  • +
+
+
+
+
Trusted by leading institutes
+
+
+
+
+ + diff --git a/website/includes/admin-footer.php b/website/includes/admin-footer.php new file mode 100644 index 0000000..162f444 --- /dev/null +++ b/website/includes/admin-footer.php @@ -0,0 +1,9 @@ +
+
+ ©2025 Stratawiz.com +
+
+ + + + diff --git a/website/includes/admin-header.php b/website/includes/admin-header.php new file mode 100644 index 0000000..aea96cf --- /dev/null +++ b/website/includes/admin-header.php @@ -0,0 +1,33 @@ + + + + + + + <?php echo htmlspecialchars($pageTitle); ?> + + + + + + diff --git a/website/includes/auth.php b/website/includes/auth.php new file mode 100644 index 0000000..8d9c605 --- /dev/null +++ b/website/includes/auth.php @@ -0,0 +1,50 @@ +query("SELECT * FROM resources_table ORDER BY id DESC"); + return is_array($rows) ? $rows : []; + } catch (Throwable $e) { + error_log('get_resources attempt failed: ' . $e->getMessage()); + return []; + } + } +} + +if (!function_exists('add_resource')) { + function add_resource(array $payload): void + { + $pdo = db(); + $table = resource_table_name($pdo); + $pdo->insert($table, [ + 'title' => trim($payload['title'] ?? ''), + 'summary' => trim($payload['summary'] ?? ''), + 'label' => trim($payload['label'] ?? ''), + 'file_path' => $payload['file_path'] ?? null, + 'video_url' => trim($payload['video_url'] ?? ''), + ]); + } +} + +if (!function_exists('delete_resource')) { + function delete_resource(int $id): void + { + $pdo = db(); + $table = resource_table_name($pdo); + $filePath = null; + $row = $pdo->getOne("SELECT file_path FROM `$table` WHERE id = ?", [$id]); + if ($row && isset($row['file_path'])) { + $filePath = $row['file_path']; + } + $pdo->deleteById($table, $id); + if ($filePath && is_string($filePath)) { + $full = __DIR__ . '/../' . ltrim($filePath, '/'); + if (is_file($full)) { + @unlink($full); + } + } + } +} + +if (!function_exists('get_sessions')) { + function get_sessions(): array + { + $pdo = db(); + $rows = $pdo->query(" + SELECT id, number, start_date, status, join_link, code, venue + FROM sessions + WHERE (status IN ('current','upcoming') OR start_date >= NOW()) + AND (deleted_at IS NULL OR deleted_at = '0000-00-00 00:00:00') + ORDER BY start_date ASC + "); + return is_array($rows) ? $rows : []; + } +} + +if (!function_exists('add_session')) { + function add_session(array $payload): void + { + $pdo = db(); + $pdo->insert('sessions', [ + 'title' => trim($payload['title'] ?? ''), + 'description' => trim($payload['description'] ?? ''), + 'tag' => trim($payload['tag'] ?? ''), + 'cta_label' => trim($payload['cta_label'] ?? 'Register'), + 'start_date' => $payload['start_date'] ?? null, + ]); + } +} + +if (!function_exists('update_session')) { + function update_session(int $id, array $payload): void + { + $pdo = db(); + $pdo->update('sessions', [ + 'title' => trim($payload['title'] ?? ''), + 'description' => trim($payload['description'] ?? ''), + 'tag' => trim($payload['tag'] ?? ''), + 'cta_label' => trim($payload['cta_label'] ?? 'Register'), + 'start_date' => $payload['start_date'] ?? null, + ], "id = ?", [$id]); + } +} + +if (!function_exists('delete_session')) { + function delete_session(int $id): void + { + $pdo = db(); + $pdo->deleteById('sessions', $id); + } +} + +if (!function_exists('save_contact')) { + function save_contact(array $payload): void + { + $pdo = db(); + $pdo->insert('contacts', [ + 'name' => trim($payload['name'] ?? ''), + 'email' => trim($payload['email'] ?? ''), + 'organization' => trim($payload['organization'] ?? ''), + 'message' => trim($payload['message'] ?? ''), + ]); + } +} + +if (!function_exists('get_contacts')) { + function get_contacts(): array + { + $pdo = db(); + return $pdo->query("SELECT id, name, email, organization, message, created_at FROM contacts ORDER BY id DESC"); + } +} + +if (!function_exists('get_tutorials')) { + function get_tutorials(bool $onlyActive = true): array + { + $pdo = db(); + $sql = "SELECT id, title, description, status, file_path, video_url, created_at FROM tutorials"; + $params = []; + if ($onlyActive) { + $sql .= " WHERE status = ?"; + $params[] = 'active'; + } + $sql .= " ORDER BY id DESC"; + $rows = $pdo->query($sql, $params); + return is_array($rows) ? $rows : []; + } +} + +if (!function_exists('add_tutorial')) { + function add_tutorial(array $payload): void + { + $pdo = db(); + $pdo->insert('tutorials', [ + 'title' => trim($payload['title'] ?? ''), + 'description' => trim($payload['description'] ?? ''), + 'status' => trim($payload['status'] ?? 'active'), + 'file_path' => $payload['file_path'] ?? null, + 'video_url' => trim($payload['video_url'] ?? ''), + ]); + } +} + +if (!function_exists('update_tutorial')) { + function update_tutorial(int $id, array $payload): void + { + $pdo = db(); + $data = [ + 'title' => trim($payload['title'] ?? ''), + 'description' => trim($payload['description'] ?? ''), + 'status' => trim($payload['status'] ?? 'active'), + 'video_url' => trim($payload['video_url'] ?? ''), + ]; + if (!empty($payload['file_path'])) { + $data['file_path'] = $payload['file_path']; + } + $pdo->update('tutorials', $data, "id = ?", [$id]); + } +} + +if (!function_exists('delete_tutorial')) { + function delete_tutorial(int $id): void + { + $pdo = db(); + $row = $pdo->getOne("SELECT file_path FROM tutorials WHERE id = ?", [$id]); + $filePath = $row['file_path'] ?? null; + $pdo->deleteById('tutorials', $id); + if ($filePath && is_string($filePath)) { + $full = __DIR__ . '/../' . ltrim($filePath, '/'); + if (is_file($full)) { + @unlink($full); + } + } + } +} + +if (!function_exists('save_subscription')) { + function save_subscription(array $payload): void + { + $pdo = db(); + $pdo->rawQuery( + "INSERT INTO newsletter_subscriptions (first_name, email) VALUES (?, ?) ON DUPLICATE KEY UPDATE first_name = VALUES(first_name)", + [ + trim($payload['first_name'] ?? ''), + trim($payload['email'] ?? ''), + ] + ); + } +} + +if (!function_exists('get_subscriptions')) { + function get_subscriptions(): array + { + $pdo = db(); + return $pdo->query("SELECT id, first_name, email, created_at FROM newsletter_subscriptions ORDER BY id DESC"); + } +} + +if (!function_exists('get_admin_by_email')) { + function get_admin_by_email(string $email): ?array + { + $pdo = db(); + $row = $pdo->getOne("SELECT * FROM admins WHERE email = ?", [$email]); + return $row ?: null; + } +} + +if (!function_exists('create_admin')) { + function create_admin(string $email, string $password): void + { + $pdo = db(); + $hash = password_hash($password, PASSWORD_DEFAULT); + $pdo->insert('admins', ['email' => $email, 'password_hash' => $hash]); + } +} diff --git a/website/includes/db.php b/website/includes/db.php new file mode 100644 index 0000000..686efa1 --- /dev/null +++ b/website/includes/db.php @@ -0,0 +1,223 @@ + null, 'host' => $host, 'port' => $port], + ]; + + $lastError = ''; + foreach ($attempts as $attempt) { + try { + $db = new MysqliDb([ + 'host' => $attempt['host'], + 'username' => $user, + 'password' => $pass, + 'db' => $dbName, + 'port' => $attempt['port'], + 'socket' => $attempt['socket'], + 'charset' => 'utf8mb4', + ]); + bootstrap_schema($db); + return $db; + } catch (Exception $e) { + $lastError = $e->getMessage(); + } + } + + throw new Exception('Database connection failed: ' . $lastError); +} + +function bootstrap_schema(MysqliDb $db): void +{ + $db->rawQuery("CREATE TABLE IF NOT EXISTS admins ( + id INT AUTO_INCREMENT PRIMARY KEY, + email VARCHAR(255) NOT NULL UNIQUE, + password_hash VARCHAR(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + )"); + + $resourceTable = ensure_resources_table($db); + + $db->rawQuery("CREATE TABLE IF NOT EXISTS sessions ( + id INT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(255) NOT NULL, + description TEXT NOT NULL, + tag VARCHAR(50) DEFAULT NULL, + cta_label VARCHAR(100) DEFAULT 'Register', + start_date DATE DEFAULT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + )"); + + $db->rawQuery("CREATE TABLE IF NOT EXISTS contacts ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, + organization VARCHAR(255) DEFAULT NULL, + message TEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + )"); + + $db->rawQuery("CREATE TABLE IF NOT EXISTS newsletter_subscriptions ( + id INT AUTO_INCREMENT PRIMARY KEY, + first_name VARCHAR(255) DEFAULT NULL, + email VARCHAR(255) NOT NULL UNIQUE, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + )"); + + $db->rawQuery("CREATE TABLE IF NOT EXISTS tutorials ( + id INT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(255) NOT NULL, + description TEXT NOT NULL, + status VARCHAR(50) NOT NULL DEFAULT 'active', + file_path VARCHAR(255) DEFAULT NULL, + video_url VARCHAR(255) DEFAULT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + )"); + + seed_default_admin($db); + seed_sample_resources($db, $resourceTable); + seed_sample_sessions($db); + seed_sample_tutorials($db); +} + +function seed_default_admin(MysqliDb $db): void +{ + $row = $db->getOne("SELECT 1 FROM admins WHERE email = ?", ['ravi@stratawiz.com']); + if ($row) { + return; + } + $hash = password_hash('qwerty', PASSWORD_DEFAULT); + $db->insert('admins', ['email' => 'ravi@stratawiz.com', 'password_hash' => $hash]); +} + +function seed_sample_resources(MysqliDb $db, string $table): void +{ + $count = (int) $db->getValue("SELECT COUNT(*) as c FROM `$table`"); + if ($count > 0) { + return; + } + + $samples = [ + ['title' => 'Understanding Lung Function in Adult Populations', 'summary' => 'A concise explainer on spirometry metrics and how to interpret lung function assessments in community settings.', 'label' => 'Publication'], + ['title' => 'Lung Function in India: Overview', 'summary' => 'Key findings from multi-city research that maps prevalence of respiratory conditions across demographic groups.', 'label' => 'Research Brief'], + ['title' => 'Childhood Lung Function in India', 'summary' => 'Practical guidance for pediatric screening teams and frontline clinicians working with young patients.', 'label' => 'Toolkit'], + ['title' => 'Understanding Lung Function in Rural Populations', 'summary' => 'Field notes and methodologies for conducting door-to-door lung health studies with limited resources.', 'label' => 'Field Guide'], + ]; + + foreach ($samples as $sample) { + $db->insert($table, $sample); + } +} + +function seed_sample_sessions(MysqliDb $db): void +{ + $count = (int) $db->getValue("SELECT COUNT(*) as c FROM sessions"); + if ($count > 0) { + return; + } + + $samples = [ + ['title' => 'Nutrition guidance for advanced lung conditions', 'description' => 'Upcoming webinar on dietary support for patients with complex respiratory conditions.', 'tag' => 'New'], + ['title' => 'Workshop: Field data quality for respiratory studies', 'description' => 'Hands-on clinic for research leads to strengthen field protocols and audits.', 'tag' => 'Update'], + ['title' => 'Training cohort launch: Spirometry essentials', 'description' => 'New batch begins soon with live mentoring and case reviews.', 'tag' => 'Upcoming'], + ]; + + foreach ($samples as $sample) { + $db->insert('sessions', $sample); + } +} + +function seed_sample_tutorials(MysqliDb $db): void +{ + $count = (int) $db->getValue("SELECT COUNT(*) as c FROM tutorials"); + if ($count > 0) { + return; + } + + $samples = [ + ['title' => 'Spirometry Basics', 'description' => 'Step-by-step guide for accurate spirometry setup and testing.', 'status' => 'active'], + ['title' => 'Inhaler Technique', 'description' => 'Visual walkthrough on patient education for inhaler use.', 'status' => 'active'], + ]; + + foreach ($samples as $sample) { + $db->insert('tutorials', $sample); + } +} + +function ensure_resources_table(MysqliDb $db): string +{ + $candidates = ['resources_table', 'resources']; + + // Prefer any existing table that already has rows. + foreach ($candidates as $name) { + $exists = $db->getValue("SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?", [$name]); + if ($exists) { + $count = (int) $db->getValue("SELECT COUNT(*) FROM `$name`"); + if ($count > 0) { + add_resource_columns_if_missing($db, $name); + return $name; + } + } + } + + // Fallback to first existing, even if empty. + foreach ($candidates as $name) { + $exists = $db->getValue("SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?", [$name]); + if ($exists) { + add_resource_columns_if_missing($db, $name); + return $name; + } + } + + $name = 'resources'; + $db->rawQuery("CREATE TABLE IF NOT EXISTS `$name` ( + id INT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(255) NOT NULL, + summary TEXT NOT NULL, + label VARCHAR(100) NOT NULL, + file_path VARCHAR(255) DEFAULT NULL, + video_url VARCHAR(255) DEFAULT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + )"); + add_resource_columns_if_missing($db, $name); + return $name; +} + +function add_resource_columns_if_missing(MysqliDb $db, string $table): void +{ + $columns = [ + 'file_path' => 'ALTER TABLE `%s` ADD COLUMN file_path VARCHAR(255) DEFAULT NULL', + 'video_url' => 'ALTER TABLE `%s` ADD COLUMN video_url VARCHAR(255) DEFAULT NULL', + ]; + + foreach ($columns as $column => $alter) { + $exists = $db->getValue("SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = ? AND column_name = ?", [$table, $column]); + if (!$exists) { + $db->rawQuery(sprintf($alter, $table)); + } + } +} + +function resource_table_name(MysqliDb $db): string +{ + static $resolved; + if ($resolved) { + return $resolved; + } + $resolved = ensure_resources_table($db); + return $resolved; +} diff --git a/website/includes/footer.php b/website/includes/footer.php new file mode 100644 index 0000000..d2bb41b --- /dev/null +++ b/website/includes/footer.php @@ -0,0 +1,12 @@ + + + + + diff --git a/website/includes/header.php b/website/includes/header.php new file mode 100644 index 0000000..2532b5a --- /dev/null +++ b/website/includes/header.php @@ -0,0 +1,46 @@ + 'home', 'label' => 'Home', 'href' => $assetPathPrefix . 'index.php'], + ['key' => 'experts', 'label' => 'Our Experts', 'href' => $assetPathPrefix . 'experts.php'], + ['key' => 'services', 'label' => 'Our Services', 'href' => $assetPathPrefix . 'services.php'], + ['key' => 'training', 'label' => 'Training', 'href' => $assetPathPrefix . 'training.php'], + ['key' => 'achievements', 'label' => 'Achievements', 'href' => $assetPathPrefix . 'achievements.php'], + ['key' => 'resources', 'label' => 'Resources', 'href' => $assetPathPrefix . 'resources.php'], + ['key' => 'news', 'label' => 'News & Events', 'href' => $assetPathPrefix . 'news-events.php'], + ['key' => 'contact', 'label' => 'Contact', 'href' => $assetPathPrefix . 'contact.php'], +]; +?> + + + + + + <?php echo htmlspecialchars($pageTitle); ?> + + + + + + diff --git a/website/includes/mysqli-class.php b/website/includes/mysqli-class.php new file mode 100644 index 0000000..2ce488a --- /dev/null +++ b/website/includes/mysqli-class.php @@ -0,0 +1,138 @@ +conn = @new mysqli($host, $user, $pass, $db, $port ?? ini_get("mysqli.default_port"), $socket); + if ($this->conn->connect_errno) { + throw new Exception('MySQL connection error: ' . $this->conn->connect_error); + } + $this->conn->set_charset($charset); + } + + /** + * @return array|bool + */ + public function rawQuery(string $sql, array $params = []) + { + if (empty($params)) { + $result = $this->conn->query($sql); + if ($result === false) { + throw new Exception('Query error: ' . $this->conn->error); + } + if ($result === true) { + return true; + } + $data = $result->fetch_all(MYSQLI_ASSOC); + $result->free(); + return $data; + } + + $stmt = $this->prepareAndBind($sql, $params); + if (!$stmt->execute()) { + throw new Exception('Query error: ' . $stmt->error); + } + $res = $stmt->get_result(); + $rows = $res ? $res->fetch_all(MYSQLI_ASSOC) : []; + $stmt->close(); + return $rows; + } + + /** + * @return array|bool + */ + public function query(string $sql, array $params = []) + { + return $this->rawQuery($sql, $params); + } + + /** + * @return array|null + */ + public function getOne(string $sql, array $params = []) + { + $rows = $this->rawQuery($sql, $params); + return $rows[0] ?? null; + } + + public function getValue(string $sql, array $params = []) + { + $row = $this->getOne($sql, $params); + if (!$row) { + return null; + } + return array_shift($row); + } + + public function insert(string $table, array $data): int + { + $cols = array_keys($data); + $placeholders = implode(',', array_fill(0, count($cols), '?')); + $colList = '`' . implode('`,`', $cols) . '`'; + $sql = "INSERT INTO `$table` ($colList) VALUES ($placeholders)"; + $stmt = $this->prepareAndBind($sql, array_values($data)); + if (!$stmt->execute()) { + throw new Exception('Insert error: ' . $stmt->error); + } + $id = $stmt->insert_id ?: $this->conn->insert_id; + $stmt->close(); + return (int) $id; + } + + public function deleteById(string $table, int $id): bool + { + $stmt = $this->prepareAndBind("DELETE FROM `$table` WHERE id = ?", [$id]); + $ok = $stmt->execute(); + $stmt->close(); + return $ok; + } + + public function update(string $table, array $data, string $where, array $params = []): bool + { + $sets = []; + $values = []; + foreach ($data as $col => $val) { + $sets[] = "`$col` = ?"; + $values[] = $val; + } + $sql = "UPDATE `$table` SET " . implode(',', $sets) . " WHERE $where"; + $bind = array_merge($values, $params); + $stmt = $this->prepareAndBind($sql, $bind); + $ok = $stmt->execute(); + $stmt->close(); + return $ok; + } + + private function prepareAndBind(string $sql, array $params): mysqli_stmt + { + $stmt = $this->conn->prepare($sql); + if (!$stmt) { + throw new Exception('Prepare failed: ' . $this->conn->error); + } + if (!empty($params)) { + $types = ''; + $refs = []; + foreach ($params as $param) { + $types .= is_int($param) ? 'i' : (is_float($param) ? 'd' : 's'); + } + $refs[] = &$types; + foreach ($params as $k => $v) { + $refs[] = &$params[$k]; + } + $stmt->bind_param(...$refs); + } + return $stmt; + } +} diff --git a/website/includes/site-footer.php b/website/includes/site-footer.php new file mode 100644 index 0000000..6678ef5 --- /dev/null +++ b/website/includes/site-footer.php @@ -0,0 +1,14 @@ + + + + + diff --git a/website/includes/site-header.php b/website/includes/site-header.php new file mode 100644 index 0000000..8437d09 --- /dev/null +++ b/website/includes/site-header.php @@ -0,0 +1,50 @@ + + + + + + + + + + + + <?php echo htmlspecialchars($pageTitle); ?> + + + + + diff --git a/website/index.php b/website/index.php new file mode 100644 index 0000000..4f7635a --- /dev/null +++ b/website/index.php @@ -0,0 +1,282 @@ + + +
+
+
+
+
+

Transforming Respiratory Health Through

+

Research, Training & Innovation

+

Advancing the science of lung health to create a healthier India.

+ +
+
+
+
1Mn+
+
Lives touched
+
+
+
+
+
5k+
+
Doctors trained
+
+
+
+
+
500+
+
Medical schools
+
+
+
+
+
300+
+
Research studies
+
+
+
+
+
50+
+
New research
+
+
+
+
+
+
+
+
+ Lab ready +
+
+
+
+ +
+
+
+
+
+
+
+ 300+ + consultants & specialists +
+
+
+
+

Who we are

+

Grounded in data, inspired by care

+

We are a multidisciplinary team working at the intersection of research, training, and respiratory medicine. From field studies to clinical education, we help organizations make lung health programs measurable, effective, and equitable.

+
    +
  • + + Modern Research Device +
  • +
  • + + World Class laboratory +
  • +
+ Learn more +
+
+
+
+ +
+
+
+
+

Our Expertise

+

Our Services & Expertise

+
+
+
+
+
+
+
★
+
Research
+

Rigorous studies to map lung health trends and inform community programs.

+ Learn more +
+
+
+
+
+
+
★
+
Training
+

Workshops and mentoring that upskill clinicians and field teams.

+ Learn more +
+
+
+
+
+
+
★
+
Consulting
+

Advisory for programs to scale respiratory care safely and effectively.

+ Learn more +
+
+
+
+
+
+ +
+
+
+
+

Training Program

+

Our modular training brings together research-backed content, case-based discussions, and practical skill-building so teams can lead respiratory health initiatives confidently.

+
    +
  • • Research Training
  • +
  • • Spirometry & Lung Function Testing
  • +
  • • Critical Situations
  • +
  • • Audit Program
  • +
  • • Quality Assurance
  • +
+ Join the training +
+
+
+
+ 100+ batch completions +
+
+
+
+
+ +
+
+
+
+

Latest Events

+

Latest Events

+
+ View all events +
+ +

No upcoming sessions yet. Check back soon.

+ +
+ + +
+
+
+
+ Upcoming +
Session
+

Starts:

+

Venue:

+ Register +
+
+
+ +
+ +
+
+ +
+
+
+

Resources for Learning and Research

+

Resources for Learning and Research

+

Well-curated resources to explore our work and keep you up to date on our research.

+
+ +

No resources yet.

+ +
+ + +
+
+ +
+

+
+ + Download + + + Watch + + + No download yet + +
+
+
+ +
+ +
+
+ + +
+
+
+
+

Subscribe

+

Subscribe to Regular Newsletters.

+

Get curated research insights and training updates straight to your inbox.

+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ + diff --git a/website/news-events.php b/website/news-events.php new file mode 100644 index 0000000..2de956e --- /dev/null +++ b/website/news-events.php @@ -0,0 +1,41 @@ + + +
+
+
+

News & Events

+

Latest updates, workshops, and announcements

+ +

No sessions announced yet. Check back soon.

+ +
+ + +
+
+
Upcoming
+

+

Starts:

+

Venue:

+ Register +
+ +
+ +
+
+
+ + diff --git a/website/resources.php b/website/resources.php new file mode 100644 index 0000000..01878c2 --- /dev/null +++ b/website/resources.php @@ -0,0 +1,56 @@ + + +
+
+
+

Resources

+

Resources for Learning and Research

+

Downloadable guides, publications, and toolkits created by our faculty to support your teams.

+ + +

No resources yet. Check back soon.

+ +
+ + +
+ +
+ +
+ +
+
+
+ + diff --git a/website/services.php b/website/services.php new file mode 100644 index 0000000..15ba369 --- /dev/null +++ b/website/services.php @@ -0,0 +1,35 @@ + + +
+
+
+

Our Services

+

Integrated solutions for lung health programs

+

From research design to clinical training and program evaluation, our services are built to deliver measurable outcomes.

+ +
+
+
R
+

Research Design

+

Protocol development, ethics submissions, and analytics frameworks tailored to your population.

+
+
+
T
+

Training & Upskilling

+

Workshops, certifications, and blended learning pathways for clinicians and field teams.

+
+
+
Q
+

Quality & Audits

+

End-to-end audits, standard operating procedures, and continuous improvement playbooks.

+
+
+
+
+
+ + diff --git a/website/sessions-list.php b/website/sessions-list.php new file mode 100644 index 0000000..be7e345 --- /dev/null +++ b/website/sessions-list.php @@ -0,0 +1,50 @@ + + +
+
+
+
+
+

Events

+

Current & Upcoming Sessions

+
+
+ +

No sessions announced yet. Check back soon.

+ +
+ + +
+
+
+
Upcoming
+
+
+

Starts:

+

Venue:

+ Register +
+
+
+ +
+ +
+
+
+ + diff --git a/website/training.php b/website/training.php new file mode 100644 index 0000000..5798834 --- /dev/null +++ b/website/training.php @@ -0,0 +1,33 @@ + + +
+
+
+
+
+

Training Program

+

Our modular training brings together research-backed content, case-based discussions, and practical skill-building so teams can lead respiratory health initiatives confidently.

+
    +
  • • Research Training
  • +
  • • Spirometry & Lung Function Testing
  • +
  • • Critical Situations
  • +
  • • Audit Program
  • +
  • • Quality Assurance
  • +
+ Join the training +
+
+
+ 100+ batch completions +
+
+
+
+
+ + diff --git a/website/uploads/tutorial_1764217762_7756.docx b/website/uploads/tutorial_1764217762_7756.docx new file mode 100644 index 0000000000000000000000000000000000000000..b5b5bc219cbd9fb66e28a65128c8199a18134d6d GIT binary patch literal 44617 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 literal 0 HcmV?d00001 diff --git a/website/who-we-are.php b/website/who-we-are.php new file mode 100644 index 0000000..6143517 --- /dev/null +++ b/website/who-we-are.php @@ -0,0 +1,30 @@ + + +
+
+
+
+
+
+
+
+

Who we are

+

Grounded in data, inspired by care

+

We are a multidisciplinary team working at the intersection of research, training, and respiratory medicine. From field studies to clinical education, we help organizations make lung health programs measurable, effective, and equitable.

+
    +
  • • Modern research device set-up
  • +
  • • World-class laboratory standards
  • +
+ Explore expertise +
+
+
+
+
+ + diff --git a/website/work-with-us.php b/website/work-with-us.php new file mode 100644 index 0000000..e92928b --- /dev/null +++ b/website/work-with-us.php @@ -0,0 +1,43 @@ + + +
+
+
+

Work with us

+

Partner with us on research, training programs, or pilot initiatives to strengthen respiratory health outcomes.

+
+
+
+
+
Research collaborations
+

Co-design studies, data collection, and analysis with our research team.

+
+
+
+
+
+
+
Training partnerships
+

Upskill your teams with modular curricula and faculty-led workshops.

+
+
+
+
+
+
+
Program consulting
+

Set up or scale clinics, QA processes, and field operations with our experts.

+
+
+
+
+
+
+
+ +