<?php
// Start output buffering to prevent headers already sent errors
ob_start();
// Include database configuration
require_once '../config/database.php';
// Include header and sidebar
include_once 'includes/header.php';
// include_once 'includes/sidebar.php';
// Check if user is logged in and has admin or director role
if (!isset($_SESSION['user_id']) || ($_SESSION['role'] !== 'admin' && $_SESSION['role'] !== 'director')) {
header('Location: login.php');
exit;
}
// Handle form submission
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Get form data
$title = trim($_POST['title']);
$description = trim($_POST['description']);
$course_id = $_POST['course_id'];
$exam_date = $_POST['exam_date'];
$start_time = $_POST['start_time'];
$end_time = $_POST['end_time'];
$duration = $_POST['duration'];
$passing_percentage = $_POST['passing_percentage'];
$status = $_POST['status'];
$instructions = trim($_POST['instructions']);
// Validate input
$errors = [];
if (empty($title)) {
$errors[] = "Title is required";
}
if (empty($course_id)) {
$errors[] = "Course is required";
}
if (empty($exam_date)) {
$errors[] = "Exam date is required";
}
if (empty($start_time)) {
$errors[] = "Start time is required";
}
if (empty($end_time)) {
$errors[] = "End time is required";
}
if (empty($duration) || !is_numeric($duration) || $duration <= 0) {
$errors[] = "Duration must be a positive number";
}
if (empty($passing_percentage) || !is_numeric($passing_percentage) || $passing_percentage < 0 || $passing_percentage > 100) {
$errors[] = "Passing percentage must be between 0 and 100";
}
// Check if start time is before end time
if (!empty($start_time) && !empty($end_time)) {
$start = strtotime($start_time);
$end = strtotime($end_time);
if ($start >= $end) {
$errors[] = "Start time must be before end time";
}
}
// If no errors, insert the exam
if (empty($errors)) {
$query = "INSERT INTO exam_schedules (title, description, course_id, exam_date, start_time, end_time, duration_minutes, passing_percentage, is_active, instructions, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())";
// Convert status to is_active (1 for active, 0 for inactive)
$is_active = ($status == 'active') ? 1 : 0;
$stmt = $conn->prepare($query);
$stmt->bind_param("ssisssiiss", $title, $description, $course_id, $exam_date, $start_time, $end_time, $duration, $passing_percentage, $is_active, $instructions);
if ($stmt->execute()) {
$_SESSION['success'] = "Exam added successfully";
header("Location: manage_exams.php");
exit;
} else {
$_SESSION['error'] = "Error adding exam: " . $conn->error;
}
}
}
// Get all courses for the dropdown
$courses_query = "SELECT id, title FROM courses ORDER BY title";
$courses_result = $conn->query($courses_query);
?>
<div class="content-wrapper">
<div class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0">Add New Exam</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="index.php">Home</a></li>
<li class="breadcrumb-item"><a href="manage_exams.php">Manage Exams</a></li>
<li class="breadcrumb-item active">Add New Exam</li>
</ol>
</div>
</div>
</div>
</div>
<section class="content">
<div class="container-fluid">
<?php if (isset($errors) && !empty($errors)): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<h5><i class="icon fas fa-ban"></i> Error!</h5>
<ul>
<?php foreach ($errors as $error): ?>
<li><?php echo $error; ?></li>
<?php endforeach; ?>
</ul>
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<?php endif; ?>
<div class="card">
<div class="card-header">
<h3 class="card-title">Exam Details</h3>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-card-widget="collapse">
<i class="fas fa-minus"></i>
</button>
</div>
</div>
<div class="card-body">
<form action="" method="POST">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="title">Exam Title <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="title" name="title" value="<?php echo isset($_POST['title']) ? htmlspecialchars($_POST['title']) : ''; ?>" required>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="course_id">Course <span class="text-danger">*</span></label>
<select class="form-control" id="course_id" name="course_id" required>
<option value="">Select Course</option>
<?php while ($course = $courses_result->fetch_assoc()): ?>
<option value="<?php echo $course['id']; ?>" <?php echo (isset($_POST['course_id']) && $_POST['course_id'] == $course['id']) ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($course['title']); ?>
</option>
<?php endwhile; ?>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group">
<label for="description">Description</label>
<textarea class="form-control" id="description" name="description" rows="3"><?php echo isset($_POST['description']) ? htmlspecialchars($_POST['description']) : ''; ?></textarea>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="form-group">
<label for="exam_date">Exam Date <span class="text-danger">*</span></label>
<input type="date" class="form-control" id="exam_date" name="exam_date" value="<?php echo isset($_POST['exam_date']) ? $_POST['exam_date'] : date('Y-m-d'); ?>" required>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="start_time">Start Time <span class="text-danger">*</span> (IST)</label>
<input type="time" class="form-control" id="start_time" name="start_time" value="<?php echo isset($_POST['start_time']) ? $_POST['start_time'] : '09:00'; ?>" required>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="end_time">End Time <span class="text-danger">*</span> (IST)</label>
<input type="time" class="form-control" id="end_time" name="end_time" value="<?php echo isset($_POST['end_time']) ? $_POST['end_time'] : '11:00'; ?>" required>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="form-group">
<label for="duration">Duration (minutes) <span class="text-danger">*</span></label>
<div class="input-group">
<input type="number" class="form-control" id="duration" name="duration" value="<?php echo isset($_POST['duration']) ? $_POST['duration'] : '120'; ?>" min="1" required readonly>
<div class="input-group-append">
<span class="input-group-text"><i class="fas fa-clock"></i></span>
</div>
</div>
<small class="text-muted">Automatically calculated from start and end time</small>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="passing_percentage">Passing Percentage <span class="text-danger">*</span></label>
<input type="number" class="form-control" id="passing_percentage" name="passing_percentage" value="<?php echo isset($_POST['passing_percentage']) ? $_POST['passing_percentage'] : '40'; ?>" min="0" max="100" required>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="status">Status <span class="text-danger">*</span></label>
<select class="form-control" id="status" name="status" required>
<option value="active" <?php echo (isset($_POST['status']) && $_POST['status'] == 'active') ? 'selected' : ''; ?>>Active</option>
<option value="inactive" <?php echo (isset($_POST['status']) && $_POST['status'] == 'inactive') ? 'selected' : ''; ?>>Inactive</option>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group">
<label for="instructions">Instructions</label>
<textarea class="form-control" id="instructions" name="instructions" rows="5"><?php echo isset($_POST['instructions']) ? htmlspecialchars($_POST['instructions']) : "1. Read all questions carefully before answering.\n2. You cannot go back to previous questions once answered.\n3. Ensure you have a stable internet connection during the exam.\n4. For multiple choice questions, select only one option.\n5. Submit your exam before the time expires."; ?></textarea>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col-md-12">
<div class="alert alert-info">
<i class="fas fa-info-circle"></i> After creating the exam, you will need to add questions from the Manage Exams page.
</div>
</div>
</div>
<div class="row mt-3">
<div class="col-md-12">
<button type="submit" class="btn btn-primary">
<i class="fas fa-save"></i> Save Exam
</button>
<a href="manage_exams.php" class="btn btn-secondary">
<i class="fas fa-times"></i> Cancel
</a>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Function to calculate duration in minutes between two times
function calculateDuration() {
const startTime = document.getElementById('start_time').value;
const endTime = document.getElementById('end_time').value;
if (startTime && endTime) {
// Convert to Date objects to calculate the difference
const startDate = new Date(`1970-01-01T${startTime}:00`);
const endDate = new Date(`1970-01-01T${endTime}:00`);
// Check if end time is earlier than start time (next day scenario)
let diff = endDate - startDate;
if (diff < 0) {
// End time is on the next day, add 24 hours
diff += 24 * 60 * 60 * 1000;
}
// Convert milliseconds to minutes
const durationMinutes = Math.round(diff / 60000);
// Update duration field
document.getElementById('duration').value = durationMinutes;
}
}
// Calculate duration on load
calculateDuration();
// Set up event listeners for time inputs
document.getElementById('start_time').addEventListener('change', calculateDuration);
document.getElementById('end_time').addEventListener('change', calculateDuration);
});
</script>
<?php
// Include footer
include_once 'includes/footer.php';
?>