rrrrr
This commit is contained in:
parent
f8e0cdfba4
commit
a2b2e8ae3b
@ -1,4 +1 @@
|
|||||||
ALTER TABLE `attendees`
|
ALTER TABLE `attendees` ADD `consented` TINYINT(1) NOT NULL DEFAULT 0;
|
||||||
CHANGE `name` `first_name` VARCHAR(255),
|
|
||||||
ADD `last_name` VARCHAR(255) NULL AFTER `first_name`,
|
|
||||||
ADD `how_did_you_hear` VARCHAR(255) NULL;
|
|
||||||
1
db/migrations/007_add_consented_column.sql
Normal file
1
db/migrations/007_add_consented_column.sql
Normal file
@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE `attendees` ADD `consented` TINYINT(1) NOT NULL DEFAULT 0;
|
||||||
1
db/migrations/008_rename_column.sql
Normal file
1
db/migrations/008_rename_column.sql
Normal file
@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE attendees CHANGE COLUMN registered_at created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP;
|
||||||
@ -11,7 +11,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['email'])) {
|
|||||||
$password = isset($_POST['password']) ? $_POST['password'] : '';
|
$password = isset($_POST['password']) ? $_POST['password'] : '';
|
||||||
|
|
||||||
// Admin Login
|
// Admin Login
|
||||||
if ($email === 'admin' && $password === 'password') {
|
if ($email === 'admin@gmail.com' && $password === 'admin') {
|
||||||
$_SESSION['user'] = 'admin';
|
$_SESSION['user'] = 'admin';
|
||||||
header('Location: admin.php');
|
header('Location: admin.php');
|
||||||
exit;
|
exit;
|
||||||
|
|||||||
260
register.php
260
register.php
@ -2,38 +2,29 @@
|
|||||||
require_once 'db/config.php';
|
require_once 'db/config.php';
|
||||||
require_once 'mail/MailService.php';
|
require_once 'mail/MailService.php';
|
||||||
|
|
||||||
// --- CONFIGURATION ---
|
// Helper function to fetch webinar details
|
||||||
$webinar_id = filter_input(INPUT_GET, 'webinar_id', FILTER_VALIDATE_INT);
|
function get_webinar_details($id) {
|
||||||
$response = [];
|
if (empty($id)) {
|
||||||
|
return null;
|
||||||
// --- WEBINAR DETAILS ---
|
}
|
||||||
$webinar = null;
|
|
||||||
if ($webinar_id) {
|
|
||||||
try {
|
try {
|
||||||
$stmt = $pdo->prepare("SELECT title, description, starts_at, ends_at FROM webinars WHERE id = ?");
|
$stmt = db()->prepare("SELECT id, title, description, scheduled_at, presenter FROM webinars WHERE id = ?");
|
||||||
$stmt->execute([$webinar_id]);
|
$stmt->execute([$id]);
|
||||||
$webinar = $stmt->fetch(PDO::FETCH_ASSOC);
|
return $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
} catch (PDOException $e) {
|
} catch (PDOException $e) {
|
||||||
// Log error, but don't show to user
|
error_log("Database error fetching webinar ID $id: " . $e->getMessage());
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- FORM SUBMISSION (POST REQUEST) ---
|
// --- AJAX FORM SUBMISSION (POST REQUEST) ---
|
||||||
if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
||||||
header('Content-Type: application/json');
|
header('Content-Type: application/json');
|
||||||
|
$response = [];
|
||||||
|
|
||||||
// --- DATA CAPTURE ---
|
// --- DATA CAPTURE ---
|
||||||
$webinar_id = filter_input(INPUT_POST, 'webinar_id', FILTER_VALIDATE_INT);
|
$webinar_id = filter_input(INPUT_POST, 'webinar_id', FILTER_VALIDATE_INT) ?: filter_input(INPUT_GET, 'webinar_id', FILTER_VALIDATE_INT) ?: 1;
|
||||||
$webinar = null;
|
$webinar = get_webinar_details($webinar_id);
|
||||||
if ($webinar_id) {
|
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("SELECT title, description, starts_at, ends_at FROM webinars WHERE id = ?");
|
|
||||||
$stmt->execute([$webinar_id]);
|
|
||||||
$webinar = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
// Log error, but don't show to user
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
|
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
|
||||||
$first_name = filter_input(INPUT_POST, 'first_name', FILTER_SANITIZE_STRING);
|
$first_name = filter_input(INPUT_POST, 'first_name', FILTER_SANITIZE_STRING);
|
||||||
@ -54,73 +45,67 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
|||||||
$gclid = filter_input(INPUT_POST, 'gclid', FILTER_SANITIZE_STRING);
|
$gclid = filter_input(INPUT_POST, 'gclid', FILTER_SANITIZE_STRING);
|
||||||
$fbclid = filter_input(INPUT_POST, 'fbclid', FILTER_SANITIZE_STRING);
|
$fbclid = filter_input(INPUT_POST, 'fbclid', FILTER_SANITIZE_STRING);
|
||||||
|
|
||||||
|
|
||||||
if (!$first_name || !$last_name || !$email) {
|
|
||||||
$response['error'] = 'Please fill out all required fields.';
|
|
||||||
echo json_encode($response);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$webinar) {
|
if (!$webinar) {
|
||||||
$response['error'] = 'Webinar not found.';
|
$response = ['success' => false, 'error' => 'Webinar not found. Tried to find webinar with ID: ' . $webinar_id];
|
||||||
echo json_encode($response);
|
} elseif (!$first_name || !$last_name || !$email) {
|
||||||
exit;
|
$response = ['success' => false, 'error' => 'Please fill out all required fields.'];
|
||||||
}
|
} elseif ($password !== $confirm_password) {
|
||||||
|
$response = ['success' => false, 'error' => 'Passwords do not match.'];
|
||||||
if ($password !== $confirm_password) {
|
} else {
|
||||||
$response['error'] = 'Passwords do not match.';
|
|
||||||
echo json_encode($response);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$password_hash = password_hash($password, PASSWORD_DEFAULT);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Check for duplicates
|
|
||||||
$stmt = db()->prepare("SELECT id FROM attendees WHERE webinar_id = ? AND email = ?");
|
$stmt = db()->prepare("SELECT id FROM attendees WHERE webinar_id = ? AND email = ?");
|
||||||
$stmt->execute([$webinar_id, $email]);
|
$stmt->execute([$webinar_id, $email]);
|
||||||
if ($stmt->fetch()) {
|
if ($stmt->fetch()) {
|
||||||
$response['error'] = 'You are already registered for this webinar.';
|
$response = ['success' => false, 'error' => 'You are already registered for this webinar.'];
|
||||||
echo json_encode($response);
|
} else {
|
||||||
exit;
|
$password_hash = password_hash($password, PASSWORD_DEFAULT);
|
||||||
}
|
|
||||||
|
|
||||||
// Insert attendee
|
|
||||||
$sql = "INSERT INTO attendees (webinar_id, first_name, last_name, email, company, how_did_you_hear, password, timezone, utm_source, utm_medium, utm_campaign, utm_term, utm_content, referrer, gclid, fbclid)
|
$sql = "INSERT INTO attendees (webinar_id, first_name, last_name, email, company, how_did_you_hear, password, timezone, utm_source, utm_medium, utm_campaign, utm_term, utm_content, referrer, gclid, fbclid)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||||
$stmt = db()->prepare($sql);
|
$stmt = db()->prepare($sql);
|
||||||
$stmt->execute([$webinar_id, $first_name, $last_name, $email, $company, $how_did_you_hear, $password_hash, $timezone, $utm_source, $utm_medium, $utm_campaign, $utm_term, $utm_content, $referrer, $gclid, $fbclid]);
|
$stmt->execute([$webinar_id, $first_name, $last_name, $email, $company, $how_did_you_hear, $password_hash, $timezone, $utm_source, $utm_medium, $utm_campaign, $utm_term, $utm_content, $referrer, $gclid, $fbclid]);
|
||||||
$attendee_id = db()->lastInsertId();
|
|
||||||
|
|
||||||
// --- SEND CONFIRMATION EMAIL ---
|
$webinar_date_obj = new DateTime($webinar['scheduled_at']);
|
||||||
$webinar_date = new DateTime($webinar['starts_at']);
|
|
||||||
$subject = "Confirmation: You're Registered for " . $webinar['title'];
|
$subject = "Confirmation: You're Registered for " . $webinar['title'];
|
||||||
|
$body_html = "<h1>You're in!</h1><p>Thanks for registering for our webinar: <strong>{$webinar['title']}</strong>.</p><p>It will take place on <strong>" . $webinar_date_obj->format('l, F j, Y \a\t g:i A T') . "</strong>.</p><p>You can now log in to your dashboard to see the details.</p>";
|
||||||
$body_html = "<h1>You're in!</h1>"
|
|
||||||
. "<p>Thanks for registering for our webinar: <strong>{$webinar['title']}</strong>.</p>"
|
|
||||||
. "<p>It will take place on <strong>" . $webinar_date->format('l, F j, Y \a\t g:i A T') . "</strong>.</p>"
|
|
||||||
. "<p>You can now log in to your dashboard to see the details.</p>";
|
|
||||||
|
|
||||||
MailService::sendMail($email, $subject, $body_html);
|
MailService::sendMail($email, $subject, $body_html);
|
||||||
|
|
||||||
$response['success'] = true;
|
// --- PREPARE SUCCESS RESPONSE ---
|
||||||
$response['webinar_title'] = $webinar['title'];
|
$webinar_date = new DateTime($webinar['scheduled_at'], new DateTimeZone('UTC'));
|
||||||
$response['webinar_date_utc'] = $webinar['starts_at'];
|
$start_time_utc = $webinar_date->format('Ymd H is Z');
|
||||||
|
$webinar_date->add(new DateInterval('PT1H')); // Assume 1 hour duration
|
||||||
|
$end_time_utc = $webinar_date->format('Ymd H is Z');
|
||||||
|
|
||||||
|
$google_link = 'https://www.google.com/calendar/render?action=TEMPLATE&text=' . urlencode($webinar['title']) . '&dates=' . $start_time_utc . '/' . $end_time_utc . '&details=' . urlencode($webinar['description']) . '&ctz=UTC';
|
||||||
|
|
||||||
} catch (PDOException $e) {
|
$ics_content = implode("\r\n", [
|
||||||
// Log error
|
'BEGIN:VCALENDAR', 'VERSION:2.0', 'BEGIN:VEVENT',
|
||||||
$response['error'] = 'A database error occurred. Please try again later.';
|
'URL:' . 'http://' . $_SERVER['HTTP_HOST'],
|
||||||
} catch (Exception $e) {
|
'DTSTART:' . $start_time_utc, 'DTEND:' . $end_time_utc,
|
||||||
// Log error
|
'SUMMARY:' . $webinar['title'], 'DESCRIPTION:' . $webinar['description'],
|
||||||
$response['error'] = 'An error occurred: ' . $e->getMessage();
|
'END:VEVENT', 'END:VCALENDAR'
|
||||||
|
]);
|
||||||
|
$outlook_link = 'data:text/calendar;charset=utf-8,' . rawurlencode($ics_content);
|
||||||
|
|
||||||
|
$response = [
|
||||||
|
'success' => true,
|
||||||
|
'webinar_title' => $webinar['title'],
|
||||||
|
'google_link' => $google_link,
|
||||||
|
'outlook_link' => $outlook_link
|
||||||
|
];
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
error_log("Registration error: " . $e->getMessage());
|
||||||
|
$response = ['success' => false, 'error' => 'An unexpected error occurred. Please try again.'];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
echo json_encode($response);
|
echo json_encode($response);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- RENDER PAGE (GET REQUEST) ---
|
// --- RENDER PAGE (Initial GET Request) ---
|
||||||
|
$webinar_id = filter_input(INPUT_GET, 'webinar_id', FILTER_VALIDATE_INT) ?: 1;
|
||||||
|
$webinar = get_webinar_details($webinar_id);
|
||||||
|
|
||||||
if (!$webinar) {
|
if (!$webinar) {
|
||||||
http_response_code(404);
|
http_response_code(404);
|
||||||
echo "Webinar not found.";
|
echo "Webinar not found.";
|
||||||
@ -143,18 +128,24 @@ if (!$webinar) {
|
|||||||
.speakers h3 { font-size: 1.2rem; color: #cbd5e0; margin-bottom: 1rem; }
|
.speakers h3 { font-size: 1.2rem; color: #cbd5e0; margin-bottom: 1rem; }
|
||||||
.speaker { display: flex; align-items: center; margin-bottom: 1rem; }
|
.speaker { display: flex; align-items: center; margin-bottom: 1rem; }
|
||||||
.speaker img { width: 50px; height: 50px; border-radius: 50%; margin-right: 1rem; background-color: #4a5568; }
|
.speaker img { width: 50px; height: 50px; border-radius: 50%; margin-right: 1rem; background-color: #4a5568; }
|
||||||
.form-card { background-color: #2d3748; border-radius: 0.5rem; padding: 2rem; border: 1px solid #4a5568; }
|
|
||||||
.form-card h2 { margin-top: 0; font-size: 1.5rem; color: #f6e05e; text-align: center; }
|
.right-pane .card { background-color: #2d3748; border-radius: 0.5rem; padding: 2rem; border: 1px solid #4a5568; }
|
||||||
|
.right-pane h2 { margin-top: 0; font-size: 1.5rem; color: #f6e05e; text-align: center; }
|
||||||
.form-group { margin-bottom: 1.5rem; }
|
.form-group { margin-bottom: 1.5rem; }
|
||||||
label { display: block; margin-bottom: 0.5rem; font-weight: bold; }
|
label { display: block; margin-bottom: 0.5rem; font-weight: bold; }
|
||||||
input[type="email"], input[type="text"], input[type="password"] { width: 100%; padding: 0.75rem; background-color: #1a202c; border: 1px solid #4a5568; border-radius: 0.375rem; color: #e2e8f0; font-size: 1rem; box-sizing: border-box; }
|
input[type="email"], input[type="text"], input[type="password"] { width: 100%; padding: 0.75rem; background-color: #1a202c; border: 1px solid #4a5568; border-radius: 0.375rem; color: #e2e8f0; font-size: 1rem; box-sizing: border-box; }
|
||||||
.submit-btn { display: block; width: 100%; background-color: #f6e05e; color: #1a202c; padding: 0.85rem; border: none; border-radius: 0.375rem; font-weight: bold; font-size: 1.125rem; cursor: pointer; transition: background-color 0.2s; }
|
.submit-btn { display: block; width: 100%; background-color: #f6e05e; color: #1a202c; padding: 0.85rem; border: none; border-radius: 0.375rem; font-weight: bold; font-size: 1.125rem; cursor: pointer; transition: background-color 0.2s; }
|
||||||
.submit-btn:hover { background-color: #f6d32d; }
|
.submit-btn:hover { background-color: #f6d32d; }
|
||||||
.submit-btn:disabled { background-color: #4a5568; cursor: not-allowed; }
|
.submit-btn:disabled { background-color: #a0aec0; cursor: not-allowed; }
|
||||||
#form-result { margin-top: 1.5rem; text-align: center; }
|
|
||||||
.success-message { background-color: #2d3748; border: 1px solid #4a5568; padding: 2rem; border-radius: 0.5rem; text-align: center; }
|
.error-message { background-color: #c53030; color: #fff; padding: 1rem; border-radius: 0.375rem; text-align: center; margin-bottom: 1.5rem; }
|
||||||
.error-message { background-color: #c53030; padding: 1rem; border-radius: 0.375rem; }
|
|
||||||
.calendar-buttons a { display: inline-block; background-color: #4a5568; color: #e2e8f0; padding: 0.75rem 1.5rem; border-radius: 0.375rem; text-decoration: none; margin: 0.5rem; font-weight: bold; }
|
.success-message { text-align: center; }
|
||||||
|
.success-message h1 { color: #f6e05e; font-size: 2rem; margin-top: 0; }
|
||||||
|
.success-message p { color: #cbd5e0; font-size: 1.1rem; line-height: 1.6; }
|
||||||
|
.calendar-buttons a { display: inline-block; background-color: #4a5568; color: #e2e8f0; padding: 0.75rem 1.5rem; border-radius: 0.375rem; text-decoration: none; margin: 1rem 0.5rem 0; font-weight: bold; transition: background-color 0.2s; }
|
||||||
|
.calendar-buttons a:hover { background-color: #5a6578; }
|
||||||
|
|
||||||
@media (max-width: 768px) { .container { grid-template-columns: 1fr; } }
|
@media (max-width: 768px) { .container { grid-template-columns: 1fr; } }
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
@ -176,8 +167,9 @@ if (!$webinar) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="right-pane">
|
<div class="right-pane">
|
||||||
<div id="registration-form-container">
|
<div id="registration-container" class="card">
|
||||||
<form id="registration-form" class="form-card" method="POST">
|
<div id="error-container"></div>
|
||||||
|
<form id="registration-form" method="POST" action="register.php?webinar_id=<?= $webinar['id'] ?>">
|
||||||
<h2>Register & Get Calendar Invite</h2>
|
<h2>Register & Get Calendar Invite</h2>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="email">Email (required)</label>
|
<label for="email">Email (required)</label>
|
||||||
@ -207,7 +199,7 @@ if (!$webinar) {
|
|||||||
<label for="confirm_password">Confirm Password</label>
|
<label for="confirm_password">Confirm Password</label>
|
||||||
<input type="password" id="confirm_password" name="confirm_password" required>
|
<input type="password" id="confirm_password" name="confirm_password" required>
|
||||||
</div>
|
</div>
|
||||||
<input type="hidden" name="webinar_id" value="<?= $webinar_id ?>">
|
<input type="hidden" name="webinar_id" value="<?= $webinar['id'] ?>">
|
||||||
<input type="hidden" name="timezone" id="timezone">
|
<input type="hidden" name="timezone" id="timezone">
|
||||||
<input type="hidden" name="utm_source" id="utm_source">
|
<input type="hidden" name="utm_source" id="utm_source">
|
||||||
<input type="hidden" name="utm_medium" id="utm_medium">
|
<input type="hidden" name="utm_medium" id="utm_medium">
|
||||||
@ -218,21 +210,17 @@ if (!$webinar) {
|
|||||||
<input type="hidden" name="gclid" id="gclid">
|
<input type="hidden" name="gclid" id="gclid">
|
||||||
<input type="hidden" name="fbclid" id="fbclid">
|
<input type="hidden" name="fbclid" id="fbclid">
|
||||||
|
|
||||||
<button type="submit" class="submit-btn" id="submit-button">Register Now</button>
|
<button type="submit" class="submit-btn">Register Now</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div id="form-result"></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// --- TIMEZONE & DATE LOCALIZATION ---
|
// --- TIMEZONE & DATE LOCALIZATION ---
|
||||||
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
document.getElementById('timezone').value = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
||||||
document.getElementById('timezone').value = timezone;
|
const webinarDateUTC = '<?= $webinar["scheduled_at"] ?>';
|
||||||
|
const localDate = new Date(webinarDateUTC + 'Z');
|
||||||
const webinarDateUTC = '<?= $webinar["starts_at"] ?>';
|
|
||||||
const localDate = new Date(webinarDateUTC + 'Z'); // 'Z' for UTC
|
|
||||||
|
|
||||||
const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric' };
|
const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric' };
|
||||||
document.getElementById('local-date-time').textContent = localDate.toLocaleDateString(undefined, options);
|
document.getElementById('local-date-time').textContent = localDate.toLocaleDateString(undefined, options);
|
||||||
|
|
||||||
@ -245,94 +233,58 @@ if (!$webinar) {
|
|||||||
});
|
});
|
||||||
document.getElementById('referrer').value = document.referrer;
|
document.getElementById('referrer').value = document.referrer;
|
||||||
|
|
||||||
|
|
||||||
// --- AJAX FORM SUBMISSION ---
|
// --- AJAX FORM SUBMISSION ---
|
||||||
const form = document.getElementById('registration-form');
|
const form = document.getElementById('registration-form');
|
||||||
const formContainer = document.getElementById('registration-form-container');
|
const container = document.getElementById('registration-container');
|
||||||
const formResult = document.getElementById('form-result');
|
const errorContainer = document.getElementById('error-container');
|
||||||
const submitButton = document.getElementById('submit-button');
|
|
||||||
|
|
||||||
form.addEventListener('submit', function(e) {
|
form.addEventListener('submit', function(event) {
|
||||||
e.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
|
const submitButton = form.querySelector('.submit-btn');
|
||||||
submitButton.disabled = true;
|
submitButton.disabled = true;
|
||||||
submitButton.textContent = 'Processing...';
|
submitButton.textContent = 'Processing...';
|
||||||
|
errorContainer.innerHTML = '';
|
||||||
|
|
||||||
const formData = new FormData(form);
|
const formData = new FormData(form);
|
||||||
const xhr = new XMLHttpRequest();
|
|
||||||
xhr.open('POST', window.location.href, true);
|
|
||||||
|
|
||||||
xhr.onload = function() {
|
|
||||||
if (xhr.status >= 200 && xhr.status < 400) {
|
|
||||||
console.log("Response from server:", xhr.responseText);
|
|
||||||
let data;
|
|
||||||
try {
|
|
||||||
data = JSON.parse(xhr.responseText);
|
|
||||||
} catch (e) {
|
|
||||||
formResult.innerHTML = '<div class="error-message">An unexpected error occurred parsing the server response.</div>';
|
|
||||||
console.error("JSON Parsing Error:", e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
fetch(form.action, {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
if (data.success) {
|
if (data.success) {
|
||||||
formContainer.style.display = 'none';
|
container.innerHTML = `
|
||||||
const webinarTitle = encodeURIComponent(data.webinar_title);
|
|
||||||
const webinarDate = new Date(data.webinar_date_utc + 'Z');
|
|
||||||
|
|
||||||
const formatUTCDate = (date) => {
|
|
||||||
return date.toISOString().replace(/\.\d{3}Z$/, 'Z').replace(/[-:]/g, '');
|
|
||||||
};
|
|
||||||
|
|
||||||
const startTime = formatUTCDate(webinarDate);
|
|
||||||
const endTime = formatUTCDate(new Date(webinarDate.getTime() + (60 * 60 * 1000)));
|
|
||||||
|
|
||||||
const googleLink = `https://www.google.com/calendar/render?action=TEMPLATE&text=${webinarTitle}&dates=${startTime}/${endTime}&details=Join+the+webinar!&ctz=UTC`;
|
|
||||||
|
|
||||||
const icsContent = [
|
|
||||||
'BEGIN:VCALENDAR',
|
|
||||||
'VERSION:2.0',
|
|
||||||
'BEGIN:VEVENT',
|
|
||||||
`URL:${window.location.href}`,
|
|
||||||
`DTSTART:${startTime}`,
|
|
||||||
`DTEND:${endTime}`,
|
|
||||||
`SUMMARY:${data.webinar_title}`,
|
|
||||||
'DESCRIPTION:Join the webinar!',
|
|
||||||
'END:VEVENT',
|
|
||||||
'END:VCALENDAR'
|
|
||||||
].join('\n');
|
|
||||||
const outlookLink = `data:text/calendar;charset=utf-8,${encodeURIComponent(icsContent)}`;
|
|
||||||
|
|
||||||
formResult.innerHTML = `
|
|
||||||
<div class="success-message">
|
<div class="success-message">
|
||||||
<h3 style="color: #f6e05e; font-size: 1.75rem;">You’re in for ${data.webinar_title}!</h3>
|
<h1>You’re in!</h1>
|
||||||
<p style="color: #cbd5e0; font-size: 1.1rem;">Check your email for your confirmation. You can now log in to see the details.</p>
|
<p>Thanks for registering for <strong>${escapeHTML(data.webinar_title)}</strong>.</p>
|
||||||
|
<p>Check your email for your confirmation. You can now log in to see the details.</p>
|
||||||
<div class="calendar-buttons">
|
<div class="calendar-buttons">
|
||||||
<a href="${googleLink}" target="_blank">Add to Google Calendar</a>
|
<a href="${escapeHTML(data.google_link)}" target="_blank">Add to Google Calendar</a>
|
||||||
<a href="${outlookLink}" download="webinar.ics">Add to Outlook (ICS)</a>
|
<a href="${escapeHTML(data.outlook_link)}" download="webinar.ics">Add to Outlook (ICS)</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
} else {
|
} else {
|
||||||
formResult.innerHTML = `<div class="error-message">${data.error || 'An unknown error occurred.'}</div>`;
|
errorContainer.innerHTML = `<div class="error-message">${escapeHTML(data.error)}</div>`;
|
||||||
submitButton.disabled = false;
|
submitButton.disabled = false;
|
||||||
submitButton.textContent = 'Register Now';
|
submitButton.textContent = 'Register Now';
|
||||||
}
|
}
|
||||||
} else {
|
})
|
||||||
formResult.innerHTML = '<div class="error-message">A server error occurred. Please try again later.</div>';
|
.catch(error => {
|
||||||
|
console.error('Error:', error);
|
||||||
|
errorContainer.innerHTML = '<div class="error-message">A network error occurred. Please try again.</div>';
|
||||||
submitButton.disabled = false;
|
submitButton.disabled = false;
|
||||||
submitButton.textContent = 'Register Now';
|
submitButton.textContent = 'Register Now';
|
||||||
}
|
});
|
||||||
};
|
|
||||||
|
|
||||||
xhr.onerror = function() {
|
|
||||||
formResult.innerHTML = '<div class="error-message">A network error occurred. Please check your connection.</div>';
|
|
||||||
submitButton.disabled = false;
|
|
||||||
submitButton.textContent = 'Register Now';
|
|
||||||
};
|
|
||||||
|
|
||||||
xhr.send(formData);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function escapeHTML(str) {
|
||||||
|
var p = document.createElement("p");
|
||||||
|
p.appendChild(document.createTextNode(str));
|
||||||
|
return p.innerHTML;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
Loading…
x
Reference in New Issue
Block a user