Introduction 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:
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 http://www.toolbook.com/kb/P732. You can also see the ToolBook FAQ at http://www.toolbook.com/faq. |
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 CallsOne 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 OverviewBefore 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).LMSInitialize LMSGetValue LMSSetValue LMSCommit LMSFinish LMSGetLastError LMSGetErrorString LMSGetDiagnostic Listing 70. SCORM 1.2 API Methods. Initialize GetValue SetValue Commit Terminate GetLastError GetErrorString GetDiagnostic 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 forward 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, ToolBookDeveloper.com 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" DWORD GetDC(DWORD) end linkDLL32 linkDLL32 "gdi32.dll" DWORD CreateDCA(STRING, STRING, STRING, STRING) LONG DeleteDC(DWORD) DWORD GetPixel(DWORD, LONG,LONG) 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:
|
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 = ExternalInterface.call("confirmClose", exitMessage); okToExit = ConvertToBoolean(returnString); } if (okToExit == true) { var exitSuccess:Boolean = ExitTraining(); if (exitSuccess == true) { this.AlreadyExited = true; ExternalInterface.call("closeWindow"); } } } 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) { ExitTraining(); 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 Browser.HtmlPage.Window.Eval("window.close()") 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 ExamReferenceId.ExitExam() 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 ep@plattecanyon.com. Back issues of the EnterPage are available at: http://www.plattecanyon.com/enterpage.aspx |
Platte Canyon Multimedia Software Corporation, 8870 Edgefield Drive, Colorado Springs, CO 80920, (719) 548-1110 |