28
The ambiguities of status 
The SCORM 1.2 specification inherited much of the data model used for communication 
between the content and the runtime service from the older AICC Computer Managed 
Instruction (CMI) Guidelines and Recommendations. The names of the elements reflect this 
heritage. For example, "
cmi.core.lesson_status
" means "the lesson_status element 
defined in the core data model of the CMI data model." 
One odd aspect of this specification is that the SCO status ("
cmi.core.lesson_status
") can 
have only one value, but that value must represent different kinds of status information. The 
allowed values that represent completion are 
"not attempted"
"incomplete",
"completed"
. The allowed values that represent mastery are 
"passed"
or 
"failed".
There 
is no way to express "incomplete and passed," for example, since that would require two 
values and only one is allowed.  
Future versions of the SCORM specification will fix this problem, but in the meantime you must 
assume that "
passed
" or "
failed
" implies "
completed
", at least where any single SCO is 
concerned. 
How and when to set status information 
When a SCO is first launched, its status is "
not attempted
". SCORM specifies that this is the 
value that should be passed to the SCO in this case. As soon as the user can interact with it, 
the status of the SCO can become "
incomplete
". If the user has done everything the designer 
of the SCO intended her to do, the status can become "
completed
". If there is a measure of 
satisfaction involved, which can be summarized as pass/fail value, the status becomes either 
"
passed
" or "
failed
", which also means "
completed
".  
Note that there is at least one case where the status may change beyond the control of the 
SCO: If the SCO reports a score, and the runtime service knows of a mastery score, the status 
is changed to "
passed
" or "
failed
" by the runtime service by comparing the reported score 
with the mastery score. The SCO can get the value of that mastery score and use it to 
determine pass/fail status also, but the runtime service will always have the last word. 
The reusable script in Sample listing 7.2 manages the status information according to these 
simple rules, which is why the scripts for the SCOs themselves can be so simple. 
COOKING UP A SCORM V.1.2 
COPYRIGHT © 2003  
How to convert pdf into powerpoint on - C# Create PDF from PowerPoint Library to convert pptx, ppt to PDF in C#.net, ASP.NET MVC, WinForms, WPF
Online C# Tutorial for Creating PDF from Microsoft PowerPoint Presentation
export pdf to powerpoint; drag and drop pdf into powerpoint
How to convert pdf into powerpoint on - VB.NET Create PDF from PowerPoint Library to convert pptx, ppt to PDF in vb.net, ASP.NET MVC, WinForms, WPF
VB.NET Tutorial for Export PDF file from Microsoft Office PowerPoint
embed pdf into powerpoint; pdf page to powerpoint
29
Chapter 8 - A layered architecture for SCOs 
You may have begun to detect a trend in the examples above: The SCO page scripts are 
doing only lightweight work; reusable scripts do the heavy lifting. Also, the reusable scripts 
themselves tend to isolate the details communication with the API from the logic of what to 
communicate and when.  
This layered approach is summarized in Figure 8.1. 
Applet or object  
(e.g. simulation or Flash movie) 
SCO content, user interfaces, 
response processing 
(HTML, custom scripts) 
Translation functions  
(e.g. JavaScript catchers for 
Flash FSCommands) 
SCO-specific logic  
(e.g. navigation, common response processing, state) 
SCO generic logic  
(e.g. score and status management, etc.) 
SCO API method calls  
(including data translation or reshaping where necessary) 
API object discovery,  
management of the communication session with the API object 
Figure 8.1 – An approach SCO scripting layers 
There are three main reasons why this approach was chosen for these examples: 
‰ 
Easier customization of the example SCOs. Once one of the lower layers has been 
debugged, it can be reused again and again and it saves time to concentrate on the upper 
layers.  
‰ 
Ease of maintenance. By separating the functions into separate layers, layers can be 
maintained separately. For example, adding data translation logic to one layer does not 
affect the other layers. 
‰ 
Future proofing. Future versions of SCORM will probably introduce subtle or not so subtle 
changes in the API, the API protocol, the communication data model, or error codes. 
Revising only the lower, reusable layers can accommodate most if not all of these 
changes. For example, if a future version of SCORM starts using XML to communicate 
data "packages" rather than relying on individual calls, the generic, reusable scripts can be 
modified to provide the necessary translations. If a future version of SCORM starts using 
SOAP instead of the DOM object API interface, this can be managed by replacing only the 
bottom two layers in Figure 8.1, thus preserving the investment in the more expensive 
custom layers of the content. 
The examples that follow will build on this layered approach to add more functionality. 
COOKING UP A SCORM V.1.2 
COPYRIGHT © 2003  
Online Convert PowerPoint to PDF file. Best free online export
Convert a PPTX/PPT File to PDF. Just upload your file by clicking on the blue button or drag-and-drop your pptx or ppt file into the drop area.
convert pdf into ppt online; how to change pdf to powerpoint on
C# PDF insert text Library: insert text into PDF content in C#.net
Parameters: Name, Description, Valid Value. value, The char wil be added into PDF page, 0
convert pdf to editable powerpoint online; how to convert pdf into powerpoint slides
30
Chapter 9 - Suspend and resume 
An attempt to complete a SCO may require more than one session. SCORM 1.2 allows the 
delivery of a SCO to be suspended and resumed in a later session.. 
Before the SCO session terminates: 
‰ 
The SCO must report that its exit mode is "
suspend
". 
‰ 
The SCO must ask the API adapter to store either suspend data or some designation of a 
location. The form and content of suspend data or location data are defined by the SCO. 
An LMS or runtime service does not attempt to interpret this information; it must only store 
it and make it available to the SCO when it is launched again in a later session. The size 
of the suspend data is limited to 4096 characters. 
The suspend information is contextual. If a SCO is launched in a different context, i.e. for a 
different user, in a new attempt, or because the same SCO is used in a different learning 
activity, the suspend information will not carry over to that other context.  
When the SCO is launched again in the same context: 
‰ 
The SCO asks the API adapter whether there was a previous suspended session.  
‰ 
If the response is "
resume
", then the SCO asks the API adapter for the suspend and/or 
location data that were stored during the previous session. 
Note that nothing prevents a SCO from immediately declaring that it wants to be suspended 
whenever it is unloaded, and from storing suspend or location data at every significant juncture 
throughout the delivery of the SCO. Especially in brittle delivery environments, this allows the 
SCO to resume from that point if for some reason delivery was interrupted abnormally without 
an opportunity to do an orderly shutdown. 
A multi-page SCO that can be suspended at any page 
The following example is a multi-page SCO that can be suspended at any time, and resume 
from the page where it was suspended. For the sake of brevity, the example will only use the 
location data element and very simple suspend data, but you can easily expand it to store 
other meaningful suspend data as needed. 
This example contains a few more components and behaviors than the previous examples, so 
we will provide a little more upfront explanation before showing the listings. 
Structure 
This SCO is built as a frameset, following the model in a previous chapter. However, the page 
structure is a little different. The page structure includes a load page, to which the user will not 
be able to navigate, and an end page, from which the user cannot navigate to another page. 
Page 1 could be a table of content with links to other pages within the SCO, or it could be the 
first in a straightforward sequence of pages. 
 
Load page
(page 0) 
Page 1 
More 
navigable 
pages 
Last 
navigable 
page 
End page
Figure 9.1 – Structure template for multiple pages 
How it works 
The frameset is the SCO and scripts to communicate with the API are managed by the 
frameset. The SCO calls the API only after it is fully loaded. Therefore, it cannot find out 
whether it is resuming or starting ab initio until a page has already been displayed. If resuming, 
it may have to show a page other than page 1. Therefore, when the SCO is launched, it 
always starts with a load page, which is not part of the normal page sequence. That page is 
COOKING UP A SCORM V.1.2 
COPYRIGHT © 2003  
C# PDF Convert to Tiff SDK: Convert PDF to tiff images in C#.net
with specified zoom value and save it into stream The magnification of the original PDF page size Description: Convert to DOCX/TIFF with specified resolution and
convert pdf to powerpoint with; convert pdf into powerpoint online
RasterEdge XDoc.PowerPoint for .NET - SDK for PowerPoint Document
Convert. Convert PowerPoint to PDF. Convert PowerPoint to ODP/ ODP to PowerPoint. Document & Page Process. PowerPoint Page Edit. Insert Pages into PowerPoint File
how to convert pdf to ppt using; convert pdf to editable ppt online
31
shown as "Page 0" in Figure 9.1. Normal navigation through the pages of the SCO will never 
go to page 0. It is used only to display something other than page 1 while the SCO is 
initializing. Using a load page also solves a problem with the timing of scripts triggered by load 
events, because when the browser initializes the frameset it typically trigger the load event of 
the pages loaded into frames before triggering the load event for the frameset itself. If this first 
loaded page did attempt to call the API through its parent frameset when it is loaded, it would 
fail. 
What happens next depends on the data the SCO gets through the API adapter. If the SCO is 
not being resumed, or if no location was stored during the previous session, it then goes 
immediately to page 1. If it is being resumed, and a valid location is available from the previous 
session, it goes immediately to that location without ever showing page 1.  
Figure 9.1 also shows an "end page." You may or may not use such an end page in your own 
application. If the user does something that you consider "terminal," navigation would go to that 
page and the user would not be able to navigate back to another page. For example, if your 
page set is a series of questions in a quiz, the end page could display a final score after the 
user clicks a "Done" button on another page. Unloading the SCO when that page is displayed 
would not set the exit value to "
suspend
", but it would set the exit to "" (an empty string), and 
report a score and possibly a status of "
passed
" or "
failed
". On the other hand, unloading the 
SCO when any other page is displayed would set the exit mode to  "
suspend
", but would also 
leave the status with a value of "
incomplete
." 
In this example, each time a navigable page is displayed, the SCO sets some suspend 
information. If the SCO is unloaded while on a navigable page, and is later launched again in 
the same context, this suspend information will be provided by the runtime service and used to 
return to the same page. The end page is used as a destination if the user clicks "All done" on 
the last page. If the user chose "All done," the end page is displayed. When the SCO is 
unloaded while on the end page, it sets the exit value to "" (an empty string). The next time the 
SCO is launched it will be as if it was a new beginning.  
Reusing generic logic 
This example reuses the script shown in Sample listing 7.2. It adds its own logic to the logic 
defined in that script, in order to manage the suspend and resume functionality. For the sake of 
brevity, this example does not include things such as tracking and setting scores, but only sets 
completion once all pages have been displayed to the user. Which pages have been visited is 
stored from session to session in suspend data. The most current page is stored from session 
to session as the value for the location data. 
This frameset is almost exactly the same as the one in Sample listing 6.2, with the addition of 
logic to keep track of which page have been seen, setting completion, and suspend/resume 
behavior. 
Sample listing 9.1 – HTML Source: Resumable multi-page SCO frameset 
<html> 
<head> 
<script src="SCORMGenericLogic.js" type="text/javascript" 
language="JavaScript"> 
</script> 
<script type="text/javascript" language="JavaScript"> 
// Manage page navigation 
var znNavigablePages=3; 
var znThisPage=0; 
var zaVisitedPages = new Array(znNavigablePages) 
function NextPage() { 
if (znThisPage < znNavigablePages){ 
znThisPage++; 
myStage.location.href = "page" + znThisPage + ".htm" 
COOKING UP A SCORM V.1.2 
COPYRIGHT © 2003  
C# PDF Convert to Word SDK: Convert PDF to Word library in C#.net
with specified zoom value and save it into stream The magnification of the original PDF page size Description: Convert to DOCX/TIFF with specified resolution and
how to convert pdf to powerpoint in; convert pdf to powerpoint slides
C# PDF insert image Library: insert images into PDF in C#.net, ASP
Import graphic picture, digital photo, signature and logo into PDF document. Merge several images into PDF. Insert images into PDF form field.
how to change pdf file to powerpoint; convert pdf to powerpoint slide
32
function PreviousPage() { 
if (znThisPage > 1){ 
znThisPage--; 
myStage.location.href = "page" + znThisPage + ".htm" 
function GoToPage(n) { 
if ((!isNaN(n)) && (n >= 1) && (n <= znNavigablePages)){ 
myStage.location.href = "page" + n + ".htm"; 
function SetThisPage(n) { // called by each navigable page when displayed 
var i = 0; var nCnt = 0 
znThisPage = n; 
zaVisitedPages[n-1] = true; 
for (i = 0 ; i < znNavigablePages; i++){ 
if (zaVisitedPages[i]) { nCnt++ } 
if (nCnt == znNavigablePages) { 
SCOSetStatusCompleted() 
// Make sure this is recorded, just in case 
SCOSetValue("cmi.core.exit","suspend"); 
SCOSetValue("cmi.core.lesson_location", znThisPage); 
SCOSetValue("cmi.suspend_data",zaVisitedPages.join(",")); 
SCOCommit() 
function AllDone() { 
znThisPage = znNavigablePages + 1; 
myStage.location.href = "endpage.htm" 
function SCOInitData() { 
var loc = 1; 
if (SCOGetValue("cmi.core.entry") == "resume"){ 
var SuspendData = SCOGetValue("cmi.suspend_data") 
if (SuspendData.length > 0) { 
zaVisitedPages = SuspendData.split(",") 
var loc =(parseInt(SCOGetValue("cmi.core.lesson_location"))); 
if (isNaN(loc)) loc = 1; 
GoToPage(loc) 
function SCOSaveData() { 
if (znThisPage > znNavigablePages) { 
SCOSetValue("cmi.core.exit","") // this is the endpage, no need to resume 
</script> 
<title>Sample Multiple Page SCO with Suspend and Resume</title> 
</head> 
<frameset rows="100%,*"  
onload="SCOInitialize()"  
onunload="SCOFinish()"  
onbeforeunload="SCOFinish()"> 
<frame name="myStage" title="Learning Object display window" src="page0.htm" /> 
<frame src="dummypage.htm" /> 
</frameset> 
</html> 
COOKING UP A SCORM V.1.2 
COPYRIGHT © 2003  
C# PDF File Split Library: Split, seperate PDF into multiple files
Divide PDF File into Two Using C#. This is an C# example of splitting a PDF to two new PDF files. Split PDF Document into Multiple PDF Files in C#.
conversion of pdf to ppt online; export pdf into powerpoint
C# PDF Page Insert Library: insert pages into PDF file in C#.net
from the ability to inserting a new PDF page into existing PDF or pages from various file formats, such as PDF, Tiff, Word, Excel, PowerPoint, Bmp, Jpeg
convert pdf back to powerpoint; convert pdf to powerpoint slide
33
Sample listing 9.2 – HTML Source: Dummy page in a multi-page resumable SCO frameset 
<html><!-- saved as file "dummypage.htm" --> 
<head><title>empty</title></head> 
<body>&nbsp;</body> 
</html> 
Sample listing 9.3 – HTML Source: Page 0 of a multi-page resumable SCO frameset 
<html><!-- saved as file "page0.htm" --> 
<head><title>---</title></head> 
<body>One moment, please...</body> 
</html> 
Sample listing 9.4 – HTML Source: Page 1 of a multi-page resumable SCO frameset 
<html><!-- saved as file "page1.htm" --> 
<head><title>Page 1</title></head> 
<body onload="window.parent.SetThisPage(1)"> 
<p>This is page 1</p> 
<p align="right"> 
<a href="JavaScript:window.parent.NextPage()">Next</a> 
</p> 
</body> 
</html> 
Sample listing 9.5 – HTML Source: Page 2 of a multi-page resumable SCO frameset 
<html><!-- saved as file "page2.htm" --> 
<head><title>Page 2</title></head> 
<body onload="window.parent.SetThisPage(2)"> 
<p>This is page 2</p> 
<p align="right"> 
<a href="JavaScript:window.parent.PreviousPage()">Previous</a> 
<a href="JavaScript:window.parent.NextPage()">Next</a> 
</p> 
</body> 
</html> 
Sample listing 9.6 – HTML Source: Last navigable page of a multi-page resumable SCO frameset 
<html><!-- saved as file "page3.htm" --> 
<head><title>Page 3</title></head> 
<body onload="window.parent.SetThisPage(3)"> 
<p>This is page 3 (the last navigable page)</p> 
<p align="right"> 
<a href="JavaScript:window.parent.PreviousPage()">Previous</a> 
<a href="JavaScript:window.parent.AllDone()">All done</a> 
</p> 
</body> 
</html> 
Sample listing 9.7 – HTML Source: End page of a multi-page resumable SCO frameset 
<html><!-- saved as file "endpage.htm" --> 
<head><title>---</title></head> 
<body>All done!</body> 
</html> 
COOKING UP A SCORM V.1.2 
COPYRIGHT © 2003  
34
Chapter 10 - 
Tracking objectives within a SCO 
SCORM 1.2 allows a SCO to track objectives. A few facts about objectives: 
‰ 
The SCO objectives are really just small records of the status for something called an 
objective that is private to the SCO. There may be one or more objectives tracked by a 
SCO. For example, if your SCO includes 3 activities, you can define a SCO objective for 
each activity and use that objective data to keep track of whether an activity has been 
done already. 
‰ 
The status information you can use for an objective includes completion and score. You 
may use one, both or none of these data elements depending on what the objectives 
mean to you. 
‰ 
The status of objectives is expected to be maintained by the LMS at least from session to 
session within an attempt to complete the SCO. But if a new attempt is started, SCORM 
does not specify whether this status persists or not. This is a matter of LMS 
implementation policy. 
‰ 
The SCORM specification does not define whether SCO objectives are or are not related 
to a learning objective an author might associate with the use of the SCO.  
‰ 
There is no defined relationship between the status of an objective and the overall status 
of the SCO, or between the status of an objective and the status of interactions in a SCO. 
If you choose, you may create such a relationship, but what they are and what they mean 
is not defined by SCORM. For example, you might decide that a SCO will be considered 
completed when all the objectives you defined for the SCO are completed. Or you might 
decide that a SCO will be considered completed when a score of 80% has been achieved 
for 67% of the objectives. Or you might use the objectives just to keep track of whether 
certain pages have been seen and not define any relationship with the SCO as a whole. 
‰ 
It is not defined whether the objectives correspond to actual educational objectives that 
may be tracked outside the context of delivering this particular SCORM package. One 
could envision an implementation where the tracking status information for an objective 
may be preset before launching the content, based on existing information in the learner's 
profile. But there is currently no standard way to specify or expect this. 
‰ 
Not every LMS keeps track of objective data. SCORM 1.2 conformance statements define 
this feature as optional, which means that a conforming LMS may not implement it. It has 
been verified that Click2learn Aspen LMS does implement it. 
How objectives differ from suspend data 
Suspend data and location data are opaque to an LMS. The LMS is not expected to be able to 
interpret the information in those data elements. Objectives, on the other hand, use a well-
defined, standardized data model. This allows an LMS to read and possibly even set the 
objective data.  
Another difference is that suspend data and location should not be maintained by an LMS 
between attempts, but only between sessions during the same attempt. As soon as the 
attempt is deemed completed, the suspend data and location can be discarded. Objective 
data, on the other hand, may or may not persist beyond the life span of an attempt. This is 
determined by the policies that govern the LMS. 
A practical example 
The example in this chapter is almost identical to the previous example that was using 
suspend data and location. The difference is that it uses objectives to keep track of whether 
the user has performed a couple of specific actions while traversing the SCO. With actual 
content, this action might be completing a practice exercise or playing a demonstration, or 
demonstrating mastery of a particular objective. To keep the example simple, we will just make 
the action the clicking of some page elements on pages 2 and 3. 
COOKING UP A SCORM V.1.2 
COPYRIGHT © 2003  
35
What it does 
As the user navigates from page to page, the appearance and behavior of pages 2 and 3 
change, depending on the status of objectives related to those pages. On page 2, the user is 
invited to click a link if she has not done it before. If the user arrives on page 2 and that link had 
been clicked previously, the invitation is no longer displayed but rather a confirmation that the 
action had been done previously. Page 3 does the same thing, but with two actions which it 
tracks as two different objectives. Page 3 reuses the objective from page 2, so you can see 
how completing the same objective in different pages can work even when objective data is 
recorded out of sequence. The user may navigate backward and forward between pages 1, 2, 
and 3, and forward only from page 3 to the end page, which shows the final status of the 
objectives. 
Load page 
(page 0) 
Page 1 
Page 2 
Action to 
satisfy 
Objective A
Page 3 
Actions to 
satisfy 
Objectives 
A and B 
End page 
Figure 10.1 – The pages in a SCO that keeps track of some individual objectives  
Technical notes about the example 
This example relies on the LMS to keep track of the status of the objectives. If this SCO is run 
in an LMS environment that does not support SCO objectives, then it will not work properly. 
This example uses the same files as the previous example, except pages 2 and 3, which have 
additional behavior, and the frameset itself that includes another script fragment to manage 
SCO objectives. Only that script fragment, which should be included in the frameset, and 
pages 2 and 3 will be shown entirely in the listings below. Refer to the previous example for the 
other components of the SCO.  
Technical notes about the reusable script 
Each objective has a unique identifier, but a record about each objective is stored in the 
equivalent of an array. Because SCORM does not specify whether the order of the records will 
be the same from run to run, the unique identifier should be used instead of the position in the 
array. Note also that an objective record can only be added to the array by specifying a 
position that is in sequence with existing objective records for the SCO. In other words, you 
cannot add an objective at position 3 unless there are already objectives at positions 1 and 2.    
The SCORM 1.2 specification states that the objective ID is optional. That was a mistake that 
will be corrected in SCORM 1.3. Without the objective ID, you would have to rely on the 
relative position of the data in the objective array, which may not be reliable, in order to get the 
objective data. The reusable script avoids this pitfall by using the ID as the key every time you 
get or set objective data. If you get data about an objective, it looks for the objective record that 
has that ID. If you set data for an objective, it looks for the record for this objective. If it exists, it 
updates it. If it does not exist, it adds a record for this objective. You can see by inspecting the 
scripts for pages 2 and 3 and the end page how this simplifies the managing of objectives. The 
only thing you need to remember is to give different objectives distinct values for the ID.  
Some LMS implementers have interpreted the Objectives information model as a journaling 
model, i.e. they create a new record for each change to an objective, rather than updating an 
existing record. The script works with either implementation, but always attempts to update an 
existing record first, and if that fails it attempts to append a record. In case the implementation 
already has an objective array instantiated before the SCO starts, searching for an existing 
objective data record among the existing records is done in reverse, to always find the latest 
record for that objective in case there is more than one record with the same ID value. 
COOKING UP A SCORM V.1.2 
COPYRIGHT © 2003  
36
Sample listing 10.1 – A JavaScript fragment to manage SCO objectives 
// Saved as file "SCORMObjectiveLogic.js" 
function SCOSetObjectiveData(id, elem, v) { 
var result = "false"; 
var i = SCOGetObjectiveIndex(id); 
if (isNaN(i)) { 
i = parseInt(SCOGetValue("cmi.objectives._count")); 
if (isNaN(i)) i = 0; 
if (SCOSetValue("cmi.objectives." + i + ".id", id) == "true"){ 
result = SCOSetValue("cmi.objectives." + i + "." + elem, v) 
} else { 
result = SCOSetValue("cmi.objectives." + i + "." + elem, v); 
if (result != "true") {  
// Maybe this LMS accepts only journaling entries 
i = parseInt(SCOGetValue("cmi.objectives._count")); 
if (!isNaN(i)) { 
if (SCOSetValue("cmi.objectives." + i + ".id", id) == "true"){ 
result = SCOSetValue("cmi.objectives." + i + "." + elem, v) 
return result 
function SCOGetObjectiveData(id, elem) { 
var i = SCOGetObjectiveIndex(id); 
if (!isNaN(i)) { 
return SCOGetValue("cmi.objectives." + i + "."+elem) 
return "" 
function SCOGetObjectiveIndex(id){ 
var i = -1; 
var nCount = parseInt(SCOGetValue("cmi.objectives._count")); 
if (!isNaN(nCount)) { 
for (i = nCount-1; i >= 0; i--){ //walk backward in case LMS does journaling 
if (SCOGetValue("cmi.objectives." + i + ".id") == id) { 
return i 
return NaN 
Sample listing 10.2 – Fragment of a frameset modified to include objective logic 
<html> 
<head> 
<script src="SCORMGenericLogic.js" type="text/javascript" language="JavaScript"> 
</script> 
<script src="SCORMObjectiveLogic.js" type="text/javascript" language="JavaScript"> 
</script> 
... 
COOKING UP A SCORM V.1.2 
COPYRIGHT © 2003  
37
Sample listing 10.3 – HTML and JavaScript: Get and set data for an objective 
<html><!-- saved as file "page2.htm" --> 
<head><title>Page 2</title></head> 
<body onload="window.parent.SetThisPage(2)"> 
<p>This is page 2</p> 
<p align="right"> 
<a href="JavaScript:window.parent.PreviousPage()">Previous</a> 
<a href="JavaScript:window.parent.NextPage()">Next</a> 
</p> 
<script type="text/javascript" language="JavaScript"> 
var s = "<p>"; 
var objectiveID = "myUniqueObjectiveName001"; 
function MarkADone(){ 
window.parent.SCOSetObjectiveData(objectiveID, "status", "completed"); 
window.parent.SCOCommit(); 
window.location.href=window.location.href; 
if (window.parent.SCOGetObjectiveData(objectiveID, "status") != "completed") { 
s = 'Please click <a href="JavaScript:MarkADone()">here</a> for objective A.' 
else { s = 'You already completed objective A.' } 
document.write('<p>' + s + '</p>') 
</script> 
</body> 
</html> 
Sample listing 10.4 – HTML and JavaScript: Get and set data for more than one objective 
<html><!-- saved as file "page3.htm" --> 
<head><title>Page 3</title></head> 
<body onload="window.parent.SetThisPage(3)"> 
<p>This is page 3 (the last navigable page)</p> 
<p align="right"> 
<a href="JavaScript:window.parent.PreviousPage()">Previous</a> 
<a href="JavaScript:window.parent.AllDone()">All done</a> 
</p> 
<script type="text/javascript" language="JavaScript"> 
function MarkObjectiveCompleted(objectiveID){ 
window.parent.SCOSetObjectiveData(objectiveID, "status", "completed"); 
window.parent.SCOCommit(); 
window.location.href=window.location.href; 
var s = ""; 
var objectiveID = "myUniqueObjectiveName001"; 
if (window.parent.SCOGetObjectiveData(objectiveID, "status") != "completed") { 
s = 'Please click <a href="JavaScript:MarkObjectiveCompleted(\''; 
s += objectiveID +'\')">here</a> to complete objective A.' 
else { 
s = 'You already completed objective A.' 
document.write(s + '</p><p>'); 
objectiveID = "myUniqueObjectiveName002"; 
if (window.parent.SCOGetObjectiveData(objectiveID, "status") != "completed") { 
s = 'Please click <a href="JavaScript:MarkObjectiveCompleted(\''; 
s += objectiveID + '\')">here</a> to complete objective B.' 
else { s = 'You already completed objective B.' } 
document.write('<p>' + s + '</p>') 
</script> 
</body> 
</html> 
COOKING UP A SCORM V.1.2 
COPYRIGHT © 2003  
Documents you may be interested
Documents you may be interested