The EnterPage 11-04
December 4, 2008

In this issue:

Special ToolBook Upgrade Pricing through December 12

2009 ToolBook User's Conference / e-Learning Authoring Conference Pricing Set

TBCON Faculty Proposals Now Being Accepted

Exam Engine 3 Preview

Plug-In Pro Spotlight - Options

Expert Information from the Learning & Mastering ToolBook Series

OpenScript Tip from the Learning & Mastering ToolBook Series

Web Hint from the Learning & Mastering ToolBook Series

Flash ActionScript Tip

VBTrain.Net Nugget



Introduction

We hope that you are surviving these tough economic times and are able to enjoy the upcoming holiday season. We know many of our subscribers personally and hope to meet many of the rest. We wish you all a happy and prosperous 2009. For those of you not yet using ToolBook 9.5, we want to make you aware of some specials available through December 12. We also are happy to announce that TBCON 2009 will have the same low prices as TBCON 2008. If you have some end-of-year training money available, now would be a great time to sign up. We also have a limited number of faculty slots available. In addition, we give you a sneak peak at what we believe to be the first commercial e-Learning authoring tool based on Microsoft Silverlight, our Exam Engine version 3. Finally, we have our normal tips and tricks on ToolBook, Flash, and .NET.



Special ToolBook Upgrade Pricing through December 12

If you have not moved to ToolBook 9.5, which we reviewed in our last issue, take advantage of special discounts on upgrading to ToolBook from older versions or Lectora until December 12, 2008. Upgrade from ToolBook 9 for $2,072 with Premium Support - or $1,912 with Maintenance. Upgrade from ToolBook 2004 or 8.x for $3,032 with Premium Support - or $2,872 with Maintenance. SumTotal Platform customers can get ToolBook at this same low price. Upgrade from Lectora for $2,274 with Premium Support. All upgrades come with a $50 credit on any Platte Canyon product or The ToolBook User's Conference.

Platte Canyon is authorized to sell ToolBook to customers within the U.S. and Canada. If you live in another country, please contact your local reseller or SumTotal directly.
Online Store

2009 ToolBook User's Conference / e-Learning Authoring Conference Pricing Set

Rates are set for the eleventh annual ToolBook User's Conference / e-Learning Authoring Conference to be held August 3 - 5, 2009 (preconference training August 1 and 2) in Colorado Springs, Colorado. With all the food, drink, camaraderie, great sessions, and lodging (for all options except "Off Campus") included, you won't find a better learning opportunity anywhere. We are able to offer the exact same low prices as last year, though prices rise by $50 on July 1, 2009. Sign up today while there is still training money in the budget:). Here are the rates:
  • Off Campus ($780)
  • Windom House/Loomis Double ($855)
  • Windom House/Loomis Single ($925)
  • CC Inn Single ($975)
  • Apartment Multiple Occupancy ($975)
  • Apartment Single ($1,175)
Preconference workshops are also the same great prices as in the past:
  • One Preconference Session ($150)
  • Two Preconference Sessions ($285)
  • Three Preconference Sessions ($420)
  • Four Preconference Sessions ($555)
Here are some great links. Note that some of these show TBCON 2008 information but will be updated for TBCON 2009 once the faculty, sessions, and preconference workshops are finalized.

Rates

Sessions

Faculty

Preconference

Attendee Comments

Register


TBCON Faculty Proposals Now Being Accepted

Do you have the "Right Stuff" for being on the 2009 faculty of The ToolBook User's Conference / e-Learning Authoring Conference? Are you not only an expert in the one or more of the technologies listed below but willing and able to explain how and why you make things work?
  • ToolBook (Introductory)
  • ToolBook (Intermediate/Advanced)
  • Flash/Silverlight
  • Web Technologies
Do you have or can you build sample applications (with source included) that you can provide to attendees as part of the Archives for Attendees? Does helping others make their e-Learning better get you jazzed? Do you want to see your name in the bright lights (well at least on the TBCON postcard)? If so, we are taking speaking proposals at the link below.

Session Proposals


Exam Engine 3 Preview

Since its introduction in late 2003, Exam Engine has become one of Platte Canyon's most popular products. Its key features are:
  • Pull Random Questions from a Pool By Objective
  • Communicate with an LMS via SCORM
  • Store or Email Individual or Composite Results
  • Create Questions via a Dedicated Editor
The advent of Microsoft Silverlight gives us the power to keep the features above plus add more question types (such as drag & drop, matching, hot spots, and hot objects), use question templates editable by designers in Microsoft Expression Blend, have easier deployment, improve audio, graphic, and video performance, and more. We anticipate releasing Exam Engine 3 in the first quarter of 2009. If you want to try your luck on a random exam of Beatles, Eagles, Led Zeppelin, and Van Halen, try the sample link below. You will be prompted to install Silverlight if you don't already have it. This has a fair amount of video so will take a minute or so to load.

Sample Exam

Information Page (Version 2)

Plug-In Pro Spotlight - Options 

With over 150 tools and shortcuts to take advantage of, sometimes developers forget about the power within the Plug-In Pro Options screen, available via the Platte menu in author-level ToolBook. Here are some highlights:

Text Paste
Have you ever pasted text from Word or PowerPoint and gotten a bunch of font tags in addition to the formatted text? If so, this is the option for you. Just check the Plug-In Pro's "Paste All Text as Unformatted" box and this problem goes away. You can then uncheck it again if you want to paste some formatted text from within ToolBook.

Action On Close
Are you running via a SCORM Learning Management System (LMS) and need to set whether clicking the "x" on the browser will cause the lesson to be marked as completed, whether to discard results, or whether to suspend the lesson? If so, the Plug-In Pro gives you an interface for setting this behavior. Otherwise, you need to find and remember the relevant .ini file changes to make.

Export Debug
Having issues with your LMS and want to see all the messages between your lesson and the LMS? Simply check the "Display LMS Debug Window" box. Again, this avoids the need to find the right .ini file and make the changes to enable (and later disable) this functionality.

Graphic Paste
When pasting from PhotoShop and other graphic programs, images can be pasted by default as Pictures rather than Paint Objects. If you don't want to remember to choose "Paste Special" and choose the type of graphic that you want, you can use the Plug-In Pro to default always to Paint Objects, Pictures, or to just ToolBook's normal default for the object type.

To learn more, you can follow these links:

Help topic

Plug-In Pro web page

Expert Information from the Learning & Mastering ToolBook Series 

By Simon Price, University of Bristol, http://simonprice.info

msxml.sbk Availability and Examples

I've uploaded an open source ToolBook system book I created to make it easier to use MSXML: http://www.toolbook.org/download/msxml_wrapper.zip. Just bind this book (msxml.sbk) to your application and you should be able to do XSLT transforms like this...
-- transform data.xml using stylesheet.xslt, returning string
str = xml_xsltTransform("data.xml", "stylesheet.xslt")

Two examples of XSLT style sheets are given below. The first (stylesheet1.xslt) works on an IMS manifest (which is an XML document) and produces a plain text list of chapters which I subsequently display in an ordinary ToolBook text field. The second (stylesheet2.xslt) produces an XHTML (which is XML) web page that is a full table of contents when applied to the same IMS manifest.

My wrapper for XPath queries are slightly more complicated in that you need to populate a data structure as shown below and then decode the results. However, you can go straight to MSXML yourself by using the same technique as my xml_xpathQuery function. The key parts are:
querystr = "//page/title"   --any xpath query string

xmlDoc = xml_getDocumentObject("data.xml")

sysError = null
oss = sysSuspend; sysSuspend = false
nodeList = extSelectNodes(querystr) of xmlDoc
sysSuspend = oss
if sysError <> null
	request "Error: " & querystr & CRLF & CRLF & sysError
else
	-- fetch results one by one
	ilim = extLength of nodeList
	step i from 1 to ilim
		node = extItem(i-1) of nodeList
		txt = extText of node
		if txt <> null and extNodeTypeString of node <> "attribute"
			result = nodeXMLstring(node)
		else
			result = txt
		end
		-- do something with result
		request "Match " & i &" is:" & result
	end
end

You can load XML files for XPath querying etc. from the local file system, a string or from over the web like this...
-- file
xmlDoc = xml_loadDocument()

-- string
xmlDoc = xml_loadXML("hello world")

-- url
xmlDoc = xml_loadURL("http://www.toolbook.org/feed/")

The system book caches files (until you close your ToolBook application) and so if you want to re-run with new xml while you test or at runtime then you need to put this in your enterApplication handler...
-- flush any cached style sheets and xml docs from previous runs
send xml_releaseAllMSXML

You can turn caching off if want using the boolean setter:
xml_useCache() = false

Take a look at the book script of the sbk to see what else is possible (e.g., tweaking whitespace behavior, callback for each xpath result).
By the way, as a bonus, you can also use MSXML to fetch other content over the web (e.g., text files or web pages) like this...
str = xml_http_get("http://www.google.com/robots.txt")

...but remember the bonkers 64K string limit in OpenScript when fetching any large amount of text. Fortunately, you *can* handle XML files of really huge size using MSXML, which is very fast, provided you only want to xslt transform it or extract <64K strings using xpath.

Dom Sinclair, a frequent ToolBook List contributor from the UK, asked Simon to "Now perhaps you'd like to translate that into English like wot is spoke by the quoon!!!!" after Simon posted the above to the List.

Simon responded with this humorous speech.

THE QUOON'S SPEECH 2007

"My Lords and Members of the House of ToolBook.

My Microsoft XML Core Services (MSXML) will pursue a set of services that allow applications written in OpenScript to build Windows-native XML-based applications meeting the challenges which the E-Learning Community faces at home and abroad.

A stable MSXML automation object is the foundation of a fair and prosperous ToolBook and will support XML 1.0, DOM, SAX, an XSLT 1.0 processor, XML schema support including XSD and XDR, as well as other XML-related technologies.
.
.
.
My open source system book, msxml.sbk, will work to foster a strong partnership between ToolBook and the MSXML Core Services.

Other urls have been laid before you.

My Lords and Members of the House of ToolBook: I pray that the blessing of Almighty SumTotal may rest upon your scripts."

OpenScript Tip from the Learning & Mastering ToolBook Series

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

Listing All Voice Recordings in a Book

Here is a script for listing all the voice recordings configured for the current book. It steps through each page looking at the TBK_VoiceRecording user property (null, true, or false) and then the TBK_VoiceRecordingFileRef user property (which holds the file name). Notice the use of the push command to make a comma-delimited list. Since this will put the pages in reverse order (pages at the end of the book will be at the front of the list), we use the ASYM_ReverseStack() method to put it back in page order. To get it in readable format, we use the listToTextline() function to covert from a comma-delimited list to each page on its own line. Finally, the put command displays the result back in the Command Window (where we run this code from in the first place).

fileList = ""
step num from 1 to (pageCount of this book)
	pageId = page num
	if TBK_VoiceRecording of pageId = TRUE AND 
		TBK_VoiceRecordingFileRef of pageId <> null
		fileLine = "Page " & num & " (" & name of 
			pageId & "): " & 
			TBK_VoiceRecordingFileRef of pageId
		push fileLine onto fileList
	end if
end step 
put listToTextline(ASYM_ReverseStack(fileList))

-- returns a list like this
Page 2 (Multi-Choice Question and Image): 80086675.wav
Page 3 (Remedial Feedback): 88606795.wav
Page 4 (Glossary): 17527685.wav



Web Hint from the Learning & Mastering ToolBook Series

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

Multiple Languages and ToolBook DHTML

One of our ToolBook Translation System (TTS) and Tracker.Net LMS customers wanted to deploy both English and Spanish versions of their ToolBook lessons but not add each language version as lessons within the LMS. I recommended that they have a single lesson such as "Introduction to Sales" and then let the user pick the language from there. In other words, the customer would use TTS to publish both an English and Spanish version of the lesson and put each in its own directory. When the LMS launched the lesson, it would display a simple HTML page with a button for English and one for Spanish.

For this scheme to work, however, we needed the ToolBook DHTML runtime to go to its opener window (the page where the user picks the language) and then onto ITS opener as it looks for the window with the SCORM "API" object. I was optimistic since the normal DHTML export has an intermediate window that the customer was NOT using. So this setup would be similar the default situation. But we wouldn't know for sure unless we tried it. I wrote a quick HTML page as part of our "GoTo Meeting" with the customer, fired up our SCORM Watch tool, and tried it out. The outcome was good; the SCORM communication worked fine. Here is the simple HTML page contents. Notice how the JavaScript uses a relative path so that this HTML page will work with ANY of their lessons. They just need to have an English and a Spanish subdirectory and put their exported content in each.
<html>
<head>
	<title>Training</title>
	<script language="javascript">
		var openWindowString = "left=10,top=10,width=800,
		    height=600,status=no,resizable=no,scrollbars=no,
		    toolbar=no,menubar=no";

		function runEnglish() {
			window.open("English/index.html", "Training", 
			    openWindowString);
		}

		function runSpanish() {
			window.open("Spanish/index.html", "Training", 
			    openWindowString);
		}

	</script>
</head>

<body>
	Be sure to click one of these buttons. If you exit without 
	running the lesson, you'll need to leave the 'My Courses' screen.
	<input id="English" value="English" 
	    onclick="runEnglish();" type="button" />
	<br>
	<input id="Spanish" value="Spanish" 
	    onclick="runSpanish();" type="button" />

</body>
</html>



Flash ActionScript Tip

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

Update: Using External Interface to Check Flash Version

As I discussed in the last issue, Dan Carr (http://www.dancarrdesign.com) and I worked up some ActionScript and Actions Editor code to verify that users had the correct Flash version when running ToolBook DHTML that required at least Flash 8. All was working fine until Flash 10 was released in October. Then the ToolBook lessons started reporting that users did not have the right Flash version when they were running Flash 10! It took some debugging to first determine that the problem was on the Flash side and some strategic "trace" lines to get at the root of the problem. Here is the original ActionScript:

var versionNumber:Number = Number(System.capabilities.version.charAt(4));
	
if( versionNumber >= 8 ){
	if( ExternalInterface.available == true ){
		version_txt.text = "Click the 'Run Test' button, if the 'next' 
		button on this page is available, you have the right Flash player 
		version and may continue to the next page."
		isFlashOk = true;
		logo._visible = true;
	}else{
		version_txt.text = "Click the 'Run Test' button, if the 'next' button 
		is still unavailable, your Flash player is not behaving correctly and 
		you will not be able to take this CBT.  Please call the IT help desk 
		and ask for a Flash player update.  You must exit now.";
		logo._visible = false;
	}
}
else{
	version_txt.text = "You don't have Flash Player 8 or higher, please call 
	the IT help desk and ask for the latest Flash player.  You will not be 
	able to take this CBT until you get a Flash player update.  You must exit now.";
	logo._visible = false;
}

Some of you may already have spotted the problem, but I must confess that it was not obvious to me at first. But when I put a trace on the versionNumber variable and saw that it had a value of 1, I saw that the problem was this line:
var versionNumber:Number = Number(System.capabilities.version.charAt(4));
Since it uses the charAt function to get the Flash version, the code above assumes a single digit for the Flash version, which obviously breaks down once we got to 10. The System.capabilities.version call returns a string like this: WIN 10,0,12,36. To avoid further problems with Flash 100 or whatever, we need to take a different approach to get the major version:
var capString:String = System.capabilities.version;
var capArray:Array = capString.split(" ");
var versionString = capArray[1];
var versionArray:Array = versionString.split(",");
var versionNumber:Number = Number(versionArray[0]);	

We first use the split command to separate the WIN part from the rest of the version string. Notice that it puts each part in its own array element. We then take the second element (10,0,12,36) and split on the "," to put each part of the version into its own array element. The part we want is the first part. The rest of the code is the same.

VBTrain.Net Nugget

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

JavaScript Calls from Silverlight

One of the many nice things about Silverlight is how well you can interact with HTML elements on the container page as well as send and receive JavaScript messages. For example, the Exam Engine 3 Sample mentioned earlier in this newsletter has an "Email Results" button on the "Score Exam" page. Since we haven't implemented this functionality, we want a simple alert to come up instead. Here is the Visual Basic code for that button:
Private Sub EmailResultsBtn_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    Browser.HtmlPage.Window.Alert("Email Results")
End Sub
Notice how we can call the Alert method of the HTML window object directly from our Visual Basic code. Silverlight then takes care of communicating with the HTML page for us. We can use similar techniques to make SCORM calls to send or receive data from the LMS.



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