The EnterPage 14-01
February 1, 2011

In this issue:

Tracker.Net 5 Released!

Thanks For Twelve Great TBCON Years

Tip Our Hats to Tim, Joel, and Company

New ToolBook Mini-Lessons

Programming for e-Learning Developers Segment

Expert Information from Learning & Mastering ToolBook

OpenScript Tip from Learning & Mastering ToolBook

Web Hint from Learning & Mastering ToolBook

ActionScript Tip

VBTrain.Net Nugget


It has been almost six months since our last newsletter. We've been heads-down working on a major new release of Tracker.Net. That leads this issue, but we also want to explain why we have ended The e-Learning Authoring Conference/ToolBook User's Conference, bid a fond farewell to great members of the ToolBook development team, and give you a healthy dose of Programming for e-Learning Developers tips on ToolBook, Flash/Flex, and .NET.

Tracker.Net 5 Released!

We are excited to announce that version 5 of our popular Tracker.Net Learning Management System (LMS) is now available. Here are just some of the new features:
  • Adds graphs for the first time. There are a total of 92 graphs: 14 student, 18 lesson, 19 course, 21 class, and 20 organization.
  • New and redesigned reports featuring drill-downs and popup certificates. There are a total of 97 reports: 23 student, 17 lesson, 24 course, 14 class, and 19 organization.
  • Reports and graphs can include multiple students, lessons, courses, classes, or organizations at a time.
  • Reports can now be saved to PDF, Word, or Excel.
  • Ability to sequence courses.
  • Can limit access to courses on a particular date, once completed, or X days after first use.
  • New Termination Date for students for only allowing access to the system for a fixed amount of time.
  • Updated Tracker Store offers the ability to extend the Termination Date as well as email username/password to users.
  • Ability to set the status, times, score, etc. for multiple students at once.
  • Redesigned Global Settings screen that organizes information by tabs.
  • New interface for selecting which reports you want included by category.
  • Match certificate graphics to organization, lesson, course, or class.
  • Choose individual lessons, courses, and classes to produce Continuing Education Unit (CEU) certificates.
  • Choose "filter" or "search box" interface for Administrator and Reporter screens.
  • Can optionally persist the filter or search box information between sessions.
  • Highly-optimized SCORM communication that dramatically reduces delay when exiting lessons.
  • Option to hide correct answers in student reports.
  • Scheduler application can now send organization emails as well as course/class emails. Any student information such as username and password can now be included.
  • Can choose to display lessons in a frame rather than a popup window. This avoids popup blocker issues as well as gives the e-Learning developer more control on exit behavior.
  • Ability to organize "Open Enrollment" courses into a Catalog. Users can then choose which course(s) to add to their "My Courses" screen.
  • Optional mobile student interface.
  • Downloadable trial version
Pricing for this new version is $6,995 for up to 500 users on a single web site, $8,995 for up to 2000 users on a single web site, and $10,995 for unlimited users on a single web site. The upgraded Tracker Scheduler program is $495 per user while the Tracker Store remains $995 per web site. Source code is available for internal use for an additional $4,995. An upgrade from the previous version is $2,895 (up to 500 users), $3,595 (up to 2000 users), or $4,295 (unlimited users). Upgrades from older versions are available as well.

In addition to our normal Wednesday morning webinars, we are holding special daily webinars at 2PM Mountain Time through February 16 to show the new version. Or feel free to request a custom demonstration.

Tracker.Net Information

Tracker.Net Demonstration Site

Tracker.Net Webinars

Thanks For Twelve Great TBCON Years

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

We have reluctantly decided to end The ToolBook User's Conference/e-Learning Authoring Conference. While we know this conference has been a professional highlight for many of you, we feel the need to concentrate on our core strengths, namely creating software for Improving the Lives of Training Developers.

It has been a joy to get to know all of you who have attended the conference over the past twelve years. Thank you for all your support. I also appreciate the personal emails and ToolBook List postings about the positive effect the conference has had on many of your lives. I look forward to interacting with many of you in other areas and forums!

Tip Our Hats to Tim, Joel, and Company

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

This is our first newsletter since SumTotal Systems consolidated its ToolBook and other product development teams in Gainesville, Florida. Many of us said farewell to key members of the team on the ToolBook List, but I wanted to publicly say thanks for building and improving such a great authoring tool. I have personally used ToolBook since 1993 and look forward to continuing to do so for many years to come.

Tim Barham created such important features as the Actions Editor, Simulation Editor, Book Explorer, and the Quiz Summary. He also made it to 11 TBCON's and helped developers from around the world on the ToolBook List. Joel Kittinger worked behind the scenes on the ToolBook system and also was a huge TBCON supporter. Aaron Smith helped make sure all the ToolBook features worked correctly and helped us with the same for our Learning & Mastering ToolBook and ToolBook Translation System (TTS) products. Drew Gilles created the PowerPoint exporter as well as managed the 10.5 ToolBook release. Michael Hamaoka built great installations and helped demonstrate ToolBook for new customers. Jianli Zhou helped many of you via technical support and also was the resident SumTotal expert on our TTS program. Thanks to you all!

New ToolBook Mini-Lessons

One key member of the ToolBook team who thankfully is still around is Denny Dedmore. In between technical support calls, Denny has been putting out very useful Mini-Lessons. Some of his more recent lessons are Playing Media Only the First Time a Page is Entered, How to Use the "On User Event", and Examples of Each Action in the Actions Editor.

You can find a table of contents and links to all the Mini-Lessons at You can also see the ToolBook FAQ at

Programming for e-Learning Developers Segment

This is a new feature. We'll put a short segment from Jeff's Programming for e-Learning Developers book.
Making SCORM Calls
One of the biggest challenges with creating e-Learning is making sure it is properly tracked when you run it in a Learning Management System (LMS). While tools like ToolBook and Flash give you quite a bit of tracking support out of the box, knowing how to interact with the LMS yourself can help you control your bookmarking, determine completion status, ask for the “mastery score,” and more. With HTML/JavaScript and Silverlight, you are totally on your own for tracking. The original standard for communicating between content and an LMS was the Aviation Industry CBT Committee (AICC) standard. It uses HTTP Post to do the communication. This has the advantage of easily supporting having the content on one web server and the LMS on another server. Its main disadvantage is that HTTP Post is seen as more difficult for content to implement. I’m not sure on that score, but it is pretty clear that the Sharable Content Object Reference Model (SCORM) is now the dominant standard, largely due to it being initially funded and adopted by the U.S. government. We looked at a SCORM manifest, which is part of its packaging specification, in the last chapter. The other main part of SCORM is its “Runtime Environment.” For that, SCORM uses an API model where messages between the content and LMS are passed via JavaScript. To introduce you how to make these calls as well as give you a “SCORM Tester” in each environment that you can use to test out your LMS, we’ll create an interface to send and receive SCORM messages.
SCORM Runtime Environment Overview
Before we jump into our examples, let’s take a quick look at how the SCORM Runtime Environment works. The gist is that the LMS launches the content in either a separate window or a frame. The content then “finds” the API JavaScript object in the LMS and does some handshaking to establish communication. The content then asks (LMSGetValue for SCORM 1.2 and GetValue for SCORM 1.3/2004) for data (student name, passing score, suspend data , bookmark, etc.) from the LMS as needed and sends (LMSSetValue in SCORM 1.2 and SetValue in SCORM 1.3/2004) data (test score, completion status, new suspend data, new bookmark, time spent, etc.). When the session is completed, the content sends a “Finish” message to the LMS. Listing 70 shows the complete list of methods for SCORM 1.2 and Listing 71 shows the list of methods for SCORM 1.3/2004. Our tester applications will implement all of these except LMSCommit/Commit (which tells the LMS to go ahead and save all student data in case there is an error condition afterwards) and LMSGetDiagnostics/GetDiagnostics (which allows the LMS to return specific information about an error condition).

Listing 70. SCORM 1.2 API Methods.

Listing 71. SCORM 1.3/2004 API Methods.

Programming for e-Learning Developers Information

Order Programming for e-Learning Developers ($45 with free shipping in the U.S.)

Expert Information from Learning & Mastering ToolBook 

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

Avoiding "Save Current Changes" Message

Question: Does anyone know how to eliminate the "Save current changes?" message when the user hyperlinks from one book to another?

Answer: You can set the saveOnClose property of the book to No. Easiest way to do this is to go to Properties for Book - General Tab. Set the "Save on Close" ComboBox to Never. Or you could go to the Command Window and use this script:
saveOnClose of this book = "No"

Be careful though, as doing this will keep you from being prompted to save changes in author level as well. If you want to be prompted at author level, you could put this in your book script:
to handle enterApplication
	if sysRuntime = TRUE -- runtime ToolBook
		saveOnClose of this book = "No"
	else -- author level ToolBook
		saveOnClose of this book = "Ask"
	end if
end enterApplication

OpenScript Tip from Learning & Mastering ToolBook

By Peter Jackson, and Tomas Lund, Elearning Specialist

RGB Color Under the Mouse

Peter: The code below will determine the RGB under the mouse when you click and hold down the mouse button, as you move it will display the new RGB if it is different from the last mouse position.

Note the line - put RGB, this is where you might send a message to display the RGB value. You might put this code in a shared script and assign it to multiple objects. This code is based on Tomas's Color Picker tool.
to handle buttonDown
	system _s_ScreenDC
	if _s_ScreenDC = "" then
		get ScreenDC() of self
	end if
	lastPosn = ""
	lastRGB = ""
	while KeyState(keyLeftButton) = "down"
		mPosn = mousePosition of mainWindow
		if objectFromPoint(mousePosition of focusWindow, focusWindow) <> self then
			if lastPosn <> mPosn then
				lastPosn = mPosn
				pixPos = pageUnitsToScreen(mPosn, mainWindow)
				RGB = pixelColor(_s_ScreenDC, item 1 of pixPos, item 2 of pixPos, TRUE)
				if lastRGB <> RGB then
					lastRGB = RGB
					redCol = getRed (RGB)
					greenCol = getGreen (RGB)
					blueCol = getBlue (RGB)
					RGB = redCol, greenCol, blueCol

					put RGB

				end if
			end if
		end if
	end while
	sysCursor = default
end buttonDown

to get ScreenDC
	system _s_ScreenDC
	-- Returns a DC to the Screen
	-- A DC is created if one does not exist
	if _s_ScreenDC = null then
		send LinkDLLs to self
		_s_ScreenDC = CreateDCA("DISPLAY", "", "","")
	end if

	return _s_ScreenDC
end ScreenDC

to get pixelColor hdc, nXPos, nYPos, HexFlag
	-- This is a wrapper for the GetPixel
	-- Function
	local RGB
	If hdc <> NULL
		RGB = GetPixel(hdc, nXPos, nYPos)
		if HexFlag = TRUE
			format RGB as "@h########"
		end if
	end if
	return RGB
end pixelColor

to get getRed colorRef
	-- Extracts the red color from a colorRef
	-- value
	redValue = Chars 7 to 8 of colorRef
	redValue = validateAndFormat(redValue)
	return redValue
end getRed

to get getGreen colorRef
	-- Extracts the Green color from a colorRef
	-- value
	greenValue = Chars 5 to 6 of colorRef
	greenValue = validateAndFormat(greenValue)
	return greenValue
end getGreen

to get getBlue colorRef
	-- Extracts the Blue color from a colorRef
	-- value
	blueValue = Chars 3 to 4 of colorRef
	blueValue = validateAndFormat(blueValue)
	return blueValue
end getBlue

to get validateAndFormat val
	val = ReplaceString(val," ",0)
	If val = null then
		val = 0
	end if
	val = "0x" & val
	format val as "@d#"
	return val
end validateAndFormat

to get isValidRGB RGB
	local logical colorOK
	local int i, numItems
	colorOK = true
	i = 1
	numItems = ItemCount(RGB)
	while i <= numItems and colorOK
		rgbNum = item i of RGB
		colorOK = (isType("INT",rgbNum) and (rgbNum >= 0) and (rgbNum <= 255))
		increment i
	end while
	return colorOK and (i = 4)
end isValidRGB

to handle LinkDLLs
	linkDLL32 "user32.dll"
	end linkDLL32

	linkDLL32 "gdi32.dll"
	end linkDLL32
end LinkDLLs

Web Hint from Learning & Mastering ToolBook

By Tim Barham

FireFox and Geolocation

Firefox won't always give geolocation information. I have found two scenarios where it doesn't:
  • Running content from my local file system (may be a security setting).
  • When I'm on our company VPN.
I guess there may be other situations. You are unlikely to get accurate values on a non-GPS enabled device anyway (unless you're using a known Wi-Fi hotspot).

ActionScript Tip

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

SCORM and Closing the Browser Window: Flash/Flex

One of the new features of Tracker.Net 5 is the ability to show content in a frame instead of a popup window. One thing we noticed in testing our Exam Engine and Training Studio content is that we were assuming a popup window in that the Exit button closed the browser window and then that triggered the SCORM calls. With a frame, we need to send the SCORM calls first since the LMS will then close the frame. Since deployment via a popup window still requires sending SCORM messages when the user closes the browser window, we needed a global variable to distinguish the two situations.

The "Exit Button" code for Training Studio is shown below. We'll leave the Exam Engine implementation for the next article since that has a Silverlight equivalent as well.
public function ImplementExitClick(e:MouseEvent):void {
    var exitMessage:String = ReadStructureSetting("ExitBtn_Message", "");
    var returnString:String;
    var okToExit:Boolean = true;

    if (exitMessage != "") {
        returnString ="confirmClose", exitMessage);
        okToExit = ConvertToBoolean(returnString);
    if (okToExit == true) {
        var exitSuccess:Boolean = ExitTraining();

        if (exitSuccess == true) {
            this.AlreadyExited = true;

We read our message ("Are you sure you want to exit?") and display that to the user via JavaScript. If the user confirms, we call the ExitTraining method. This is where all the SCORM messages are sent. Assuming all went well, we set the AlreadyExited global variable to true and attempt to close the window (this fails silently if you are in a frame).

When we started the application, we registered the "onunload" browser event with the cleanup method as shown below. Notice that we check the same AlreadyExited variable before calling ExitTraining. This avoids it being called twice if the user clicks the Exit button to close the window.
// Added for exit handling
ExternalInterface.addCallback("exitTraining", cleanUp);

public function cleanUp():void {
    if (this.AlreadyExited == false) {
        this.AlreadyExited = true;

VBTrain.Net Nugget

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

SCORM and Closing the Browser Window: Silverlight

As discussed in the previous article on ActionScript, we needed to change our logic somewhat to support showing our Exam Engine and Training Studio content in a Tracker.Net 5 (or other LMS) frame. Since Exam Engine has both a Flash/Flex implementation and a Silverlight implementation, I thought I would show the Silverlight implementation in this article. The logic is the same as with the previous article. We want to initiate the SCORM messages when the user clicks the Exit button and then be sure not to resend them when the window closes. In the popup window situation, however, the SCORM messages need to be sent when the user closes the browser window without clicking the Exit button.

The Exit button code is shown below.
Private Sub ExitBtn_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    Dim examRefId As ExamEngineSettings = ExamReferenceId
    Dim exitMessage As String = examRefId.ReadExamSetting("ExitMessage", "")
    Dim okToExit As Boolean = True

    If exitMessage <> "" Then
        okToExit = Browser.HtmlPage.Window.Confirm(exitMessage)
    End If
    If okToExit = True Then
        ' Changed the following since this did not work if the content is in an iFrame.
        ' Instead, call ExitExam directly and set a variable to skip the exit on the
        ' subsequent closing of the browser window
        Dim exitSuccess As Boolean = examRefId.ExitExam()

        If exitSuccess = True Then
            examRefId.AlreadyExited = True
        End If
    End If
End Sub

We again read our exit message and display that to the user via JavaScript. Notice how we can call the JavaScript confirm method directly from the Visual Basic code. If the user confirms exiting, we call the ExitExam method. This is where all the SCORM messages are sent. If that returns True, we set the AlreadyExited global variable to True and try to close the window.

As with the Flash/Flex implementation we registered the "onunload" browser event. In this case, we call ExitExamHandler as shown below. Notice that we check the same AlreadyExited variable before calling ExitExam. This avoids it being called twice if the user clicked the Exit button to close the window.
Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup
    Me.RootVisual = New Page()
    HtmlPage.Window.AttachEvent("onunload", AddressOf ExitExamHandler)
End Sub

Public Sub ExitExamHandler(ByVal sender As Object, ByVal e As EventArgs)
    Dim examRefId As ExamEngineSettings = ExamReferenceId

    If examRefId.AlreadyExited = False Then
        examRefId.AlreadyExited = True
    End If
End Sub

The EnterPage is distributed up to four times per year, with occasional special issues. Individuals who have expressed interest in Platte Canyon Multimedia Software Corporation or its products receive The EnterPage. Suggestions for articles or proposals for article submissions are welcome. Send information to Back issues of the EnterPage are available at:

Platte Canyon Multimedia Software Corporation, 8870 Edgefield Drive, Colorado Springs, CO 80920, (719) 548-1110