diff --git a/_sources/lectures/TWP52_en.rst b/_sources/lectures/TWP52_en.rst index e19079513c..518fd3b8c2 100644 --- a/_sources/lectures/TWP52_en.rst +++ b/_sources/lectures/TWP52_en.rst @@ -305,7 +305,11 @@ Review + OptionMenu() +.. raw:: html + .. disqus:: :shortname: pyzombis diff --git a/_static/APIWrapper.js b/_static/APIWrapper.js new file mode 100644 index 0000000000..b37d2f2daa --- /dev/null +++ b/_static/APIWrapper.js @@ -0,0 +1,59 @@ +// SCORM API Wrapper +var findAPITries = 0; +var API = null; + +function findAPI(win) { + while ((win.API == null) && (win.parent != null) && (win.parent != win)) { + findAPITries++; + if (findAPITries > 7) { + return null; + } + win = win.parent; + } + return win.API; +} + +function getAPI() { + var theAPI = findAPI(window); + if ((theAPI == null) && (window.opener != null) && (typeof(window.opener) != "undefined")) { + theAPI = findAPI(window.opener); + } + if (theAPI == null) { + alert("Unable to find an API adapter"); + } + return theAPI; +} + +function initializeAPI() { + API = getAPI(); + if (API != null) { + API.LMSInitialize(""); + } +} + +function terminateAPI() { + if (API != null) { + API.LMSFinish(""); + } +} + +function setProgress(progress) { + if (API != null) { + API.LMSSetValue("cmi.core.lesson_status", progress); + API.LMSCommit(""); + } +} + +function setSuspendData(data) { + if (API != null) { + API.LMSSetValue("cmi.suspend_data", data); + API.LMSCommit(""); + } +} + +function getSuspendData() { + if (API != null) { + return API.LMSGetValue("cmi.suspend_data"); + } + return ""; +} diff --git a/_static/SCORMFunctions.js b/_static/SCORMFunctions.js new file mode 100644 index 0000000000..30f1f62fa8 --- /dev/null +++ b/_static/SCORMFunctions.js @@ -0,0 +1,62 @@ +// SCORM Functions + +function loadPage() { + initializeAPI(); + console.log("SCORM API initialized."); +} + +function unloadPage() { + saveTextBoxData(); // Save data when the page is unloaded + terminateAPI(); + console.log("SCORM API terminated."); +} + +function loadChapter(chapter) { + loadPage(); + + var suspendData = getSuspendData(); + if (suspendData) { + console.log("Suspend data retrieved:", suspendData); + // Restore the text data in the textbox + document.getElementById("chapter-textbox").value = suspendData; + } + + var completionStatus = API.LMSGetValue("cmi.core.lesson_status"); + + if (completionStatus === "completed") { + document.getElementById("completion-status").innerText = "This chapter has been completed."; + document.getElementById("complete-button").style.display = "none"; + } else { + document.getElementById("completion-status").innerText = "This chapter has not been completed."; + document.getElementById("reset-button").style.display = "none"; + } +} + +function completeChapter(chapter) { + setProgress("completed"); + alert(chapter + " completed! Progress recorded."); + document.getElementById("completion-status").innerText = "This chapter has been completed."; + document.getElementById("complete-button").style.display = "none"; + document.getElementById("reset-button").style.display = "block"; + + // Optionally save some suspend data when the chapter is completed + setSuspendData(document.getElementById("chapter-textbox").value); +} + +function resetChapter(chapter) { + setProgress("incomplete"); + alert(chapter + " reset to incomplete."); + document.getElementById("completion-status").innerText = "This chapter has not been completed."; + document.getElementById("complete-button").style.display = "block"; + document.getElementById("reset-button").style.display = "none"; + + // Clear the suspend data if the chapter is reset + setSuspendData(""); + document.getElementById("chapter-textbox").value = ""; // Clear the textbox as well +} + +function saveTextBoxData() { + // Save the current state of the textbox into suspend data + var textBoxData = document.getElementById("chapter-textbox").value; + setSuspendData(textBoxData); +} diff --git a/_static/auth.js b/_static/auth.js new file mode 100644 index 0000000000..1b478cfddf --- /dev/null +++ b/_static/auth.js @@ -0,0 +1,52 @@ +// auth.js + +function registerUser() { + const username = document.getElementById('newUsername').value; + const password = document.getElementById('newPassword').value; + + // Store the new user in local storage + localStorage.setItem('username', username); + localStorage.setItem('password', password); + + alert('Registration successful! Please log in.'); + window.location.href = '../scorm_package/login.html'; + return false; +} + +function loginUser() { + const username = document.getElementById('username').value; + const password = document.getElementById('password').value; + const rememberMe = document.getElementById('rememberMe').checked; + + const storedUsername = localStorage.getItem('username'); + const storedPassword = localStorage.getItem('password'); + + if (username === storedUsername && password === storedPassword) { + if (rememberMe) { + localStorage.setItem('loggedInUser', username); + } + sessionStorage.setItem('loggedInUser', username); + alert('Login successful!'); + window.location.href = '../scorm_package/chapter1.html'; // Redirect to the first chapter + } else { + alert('Invalid username or password!'); + } + return false; +} + +function logoutUser() { + sessionStorage.removeItem('loggedInUser'); + alert('You have been logged out.'); + window.location.href = '../scorm_package/login.html'; +} + +function checkLogin() { + const loggedInUser = sessionStorage.getItem('loggedInUser') || localStorage.getItem('loggedInUser'); + + if (!loggedInUser) { + alert('You are not logged in. Please log in first.'); + window.location.href = '../scorm_package/login.html'; + } +} + +window.onload = checkLogin; diff --git a/_templates/layout.html b/_templates/layout.html index 00a8807a4f..68b4225437 100644 --- a/_templates/layout.html +++ b/_templates/layout.html @@ -275,6 +275,8 @@ {% endraw %} {% endif %} + + {% endblock %} {# Silence the sidebar's, relbar's #} diff --git a/scorm_package/chapter1.html b/scorm_package/chapter1.html new file mode 100644 index 0000000000..6d51ab2a9a --- /dev/null +++ b/scorm_package/chapter1.html @@ -0,0 +1,21 @@ + + +
+ + +Checking completion status...
+ + + + + + + diff --git a/scorm_package/chapter2.html b/scorm_package/chapter2.html new file mode 100644 index 0000000000..f3e3f9f554 --- /dev/null +++ b/scorm_package/chapter2.html @@ -0,0 +1,21 @@ + + + + + +Checking completion status...
+ + + + + + + diff --git a/scorm_package/imsmanifest.xml b/scorm_package/imsmanifest.xml new file mode 100644 index 0000000000..59ef4aba7c --- /dev/null +++ b/scorm_package/imsmanifest.xml @@ -0,0 +1,48 @@ + +Don't have an account? Sign Up
+ + diff --git a/scorm_package/scorm_package.zip b/scorm_package/scorm_package.zip new file mode 100644 index 0000000000..2fde218991 Binary files /dev/null and b/scorm_package/scorm_package.zip differ diff --git a/scorm_package/signup.html b/scorm_package/signup.html new file mode 100644 index 0000000000..43f2e7651e --- /dev/null +++ b/scorm_package/signup.html @@ -0,0 +1,20 @@ + + + + + +Already have an account? Login
+ +