I have spent a considerable amount of time searching for SCORM 1.2 API tutorials/examples, which turns out to be quite a difficult task.
The only sample I have found is
Building a SCORM player is hard. Are you sure you want to build a SCORM player at this stage of the SCORM specification's lifecycle, especially since there are plenty of commercial and even open source options already in existence? For the open source options, the players are generally embedded into an Open Source LMS so would need to be extracted (or you could just used the OS LMS!)
You may find it beneficial to look up Tin Can API which is a new specification designed to replace SCORM before you invest a lot of time on this. SCORM support is still important in today's world, but knowing about Tin Can might affect your SCORM player build/buy decision; if you're going to be using it for a shorter period of time it makes less sense to build your own.
Are you looking to create a SCORM player or are you creating courses? We have some great course samples here:
http://scorm.com/scorm-explained/technical-scorm/golf-examples/
We also have some good documentation on our site as well:
http://scorm.com/scorm-explained/scorm-resources/
Let me know if you have specific questions, we can certainly try to get you on a path.
Thank you,
Joe
support@scorm.com
I think the main difficulty is parsing the specificaion. Most of SCORM 1.2 is optional, so you can pick and choose what and how much of it you want to support. Triggering error codes, diagnostic messages, validating or not. All decisions you can make. But from a JavaScript perspective its about as easy as Nathan shows, with the exception you need to construct your CMI Object which you can do using JSON as an example.
I set up a similar mimic for running locally here https://github.com/cybercussion/SCOBot/blob/master/QUnit-Tests/js/scorm/SCOBot_API_1484_11.js with SCORM 2004 in mind. The name spaces between the two versions changed so it's not a 1:1. This does not include all the rich rules, validations and error messages commonly thrown by a true runtime, and it wasn't meant to.
Building out a complete Runtime API can be time consuming. You commonly need to blend in Test Driven Development, and shake out the hundreds of pages of the specification.
There are a lot of use cases, but I wouldn't talk you out of checking it all out. Good knowledge to have regardless.
Like Andrew mentioned it is really hard to fully implement SCORM yourself.
I believe Moodle doesn't even support Scorm 2004.
AICC is extremely easy to implement by comparison but it harder to do redirects on completion etc.. and has less functionality.
In my system I have implemented the minimum set of functionality to support simple courses generated with tools like Articulate. Different courses call the api in a different order or get/set different values in the model so you would want to test any new course formats closely. This is what I found to be the hardest part is compensating for the different behavior exhibited by different courses.
The vsscorm you mentioned is actually the best step by step explanation I have found on how to implement the server side I think he got up to 60 posts as he implemented more and more.
http://www.vsscorm.net/Once you get it communicating with the server the Rustici docs and Run-Time API reference is very helpful for referencing model value descriptions and default values
http://scorm.com/scorm-explained/technical-scorm/run-time/run-time-reference/Pipwerks has some interesting tools and blog posts though they are mostly focused on course creation.
http://pipwerks.com/downloads/Also the ADL docs but it's been a long time since I looked at them. http://www.adlnet.gov/scorm/scorm-version-1-2/
If you download the Scorm 1.2 version (Basic Run-Time Calls) and place the code posted below in an html file in the root of the course then open that page in the browser via a web server it will make the course think it's inside an LMS enough to not complain and will log all the api calls it makes.
http://scorm.com/scorm-explained/technical-scorm/golf-examples/
<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>
var API = {};
(function ($) {
$(document).ready(setupScormApi());
function setupScormApi() {
API.LMSInitialize = LMSInitialize;
API.LMSGetValue = LMSGetValue;
API.LMSSetValue = LMSSetValue;
API.LMSCommit = LMSCommit;
API.LMSFinish = LMSFinish;
API.LMSGetLastError = LMSGetLastError;
API.LMSGetDiagnostic = LMSGetDiagnostic;
API.LMSGetErrorString = LMSGetErrorString;
window.open("shared/launchpage.html", "popupname","resizable,scrollbars,status");
}
function LMSInitialize(initializeInput) {
displayLog("LMSInitialize: " + initializeInput);
return true;
}
function LMSGetValue(varname) {
displayLog("LMSGetValue: " + varname);
return "";
}
function LMSSetValue(varname, varvalue) {
displayLog("LMSSetValue: " + varname + "=" + varvalue);
return "";
}
function LMSCommit(commitInput) {
displayLog("LMSCommit: " + commitInput);
return true;
}
function LMSFinish(finishInput) {
displayLog("LMSFinish: " + finishInput);
return true;
}
function LMSGetLastError() {
displayLog("LMSGetLastError: ");
return 0;
}
function LMSGetDiagnostic(errorCode) {
displayLog("LMSGetDiagnostic: " + errorCode);
return "";
}
function LMSGetErrorString(errorCode) {
displayLog("LMSGetErrorString: " + errorCode);
return "";
}
function displayLog(textToDisplay){
var loggerWindow = document.getElementById("logDisplay");
var item = document.createElement("div");
item.innerText = textToDisplay;
loggerWindow.appendChild(item);
}
})(jQuery);
</script>
<div id="logDisplay">
</div>
</html>