Source code of the tutorial is available for download.

index.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>HTML5 Doctor Appointment Scheduling (JavaScript/PHP)</title>
<link type="text/css" rel="stylesheet" href="css/layout.css" />
<!-- DayPilot library -->
<script src="js/daypilot/daypilot-all.min.js"></script>
</head>
<body>
<?php require_once '_header.php'; ?>
<div class="main">
<?php require_once '_navigation.php'; ?>
<div>
<div style="float:left; width:160px">
<div id="nav"></div>
</div>
<div style="margin-left: 160px">
<div class="space">Available time slots:</div>
<div id="calendar"></div>
</div>
</div>
</div>
<script src="js/jquery-1.9.1.min.js"></script>
<script src="js/daypilot/daypilot-all.min.js"></script>
<script>
var nav = new DayPilot.Navigator("nav");
nav.selectMode = "week";
nav.showMonths = 3;
nav.skipMonths = 3;
nav.onTimeRangeSelected = function(args) {
loadEvents(args.start.firstDayOfWeek(), args.start.addDays(7));
};
nav.init();
var calendar = new DayPilot.Calendar("calendar");
calendar.viewType = "Week";
calendar.timeRangeSelectedHandling = "Disabled";
calendar.eventMoveHandling = "Disabled";
calendar.eventResizeHandling = "Disabled";
calendar.onBeforeEventRender = function(args) {
if (!args.data.tags) {
return;
}
switch (args.data.tags.status) {
case "free":
args.data.barColor = "green";
args.data.html = "Available<br/>" + args.data.tags.doctor;
args.data.toolTip = "Click to request this time slot";
break;
case "waiting":
args.data.barColor = "orange";
args.data.html = "Your appointment, waiting for confirmation";
break;
case "confirmed":
args.data.barColor = "#f41616"; // red
args.data.html = "Your appointment, confirmed";
break;
}
};
calendar.onEventClick = function(args) {
if (args.e.tag("status") !== "free") {
calendar.message("You can only request a new appointment in a free slot.");
return;
}
var modal = new DayPilot.Modal({
onClosed: function(args) {
if (args.result) { // args.result is empty when modal is closed without submitting
loadEvents();
}
}
});
modal.showUrl("appointment_request.php?id=" + args.e.id());
};
calendar.init();
loadEvents();
function loadEvents(day) {
var start = nav.visibleStart() > new DayPilot.Date() ? nav.visibleStart() : new DayPilot.Date();
var params = {
start: start.toString(),
end: nav.visibleEnd().toString()
};
$.post("backend_events_free.php", JSON.stringify(params), function(data) {
if (day) {
calendar.startDate = day;
}
calendar.events.list = data;
calendar.update();
nav.events.list = data;
nav.update();
});
}
</script>
</body>
</html>