The EnterPage 10-04
November 27, 2007

In this issue:

Upgrade ToolBook and Receive a 20% Discount When Purchasing Support/Maintenance

TBK Tracker Provides Offline Tracking for Flash and ToolBook Content

Tracker Sync Allows Synchronization Between TBK Tracker and Tracker.Net

Learning & Mastering ToolBook Assistant 9 Released

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

TBCON Faculty Proposals Now Being Accepted

ToolBook SmartStyles Article Available

Plug-In Pro Spotlight - Importing and Validating Web Graphic Placeholders

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

Welcome to The EnterPage newsletter. We consider our subscribers as part of our extended family, whether we've met you in person at The ToolBook User's Conference / e-Learning Authoring Conference (TBCON), shared ToolBook tips with us on the ToolBook List, purchased one of our products, or signed up via our web site. We wish you all a happy and safe holiday season. We've been busy as always, this time with a major update to TBK Tracker to allow it to track Flash content created with Training Studio or other tools, a companion "Tracker Sync" to synchronize the offline TBK Tracker content with our Tracker.Net, and of course and update to our popular "Learning & Mastering ToolBook Assistant" product. We're also gearing up for the tenth TBCON. With apologies to REO Speedwagon, we might call it "A Decade of ToolBook Rock & Roll." In between all this, we hope this newsletter contains some useful information for you about the latest news in the Platte Canyon and ToolBook worlds and serves as a source of tips and tricks about ToolBook, Flash, and .NET. Enjoy!



Upgrade ToolBook and Receive a 20% Discount When Purchasing Support/Maintenance

We reviewed the new, 32-bit ToolBook Instructor 9 in our last issue - it is a great new release! With Assistant 9.01 and a corresponding Instructor 9.01 update, there has never been a better time to upgrade. Act by December 15th and you can receive 20% when you upgrade either Instructor or Assistant and also purchase support & maintenance. Plus, receive $50 off any of our products or The ToolBook User's Conference / e-Learning Authoring Conference when you upgrade from Platte Canyon. You can order online (just put add a note reminding us of the special pricing as we don't list that on the site), via email (sales@plattecanyon.com), via fax (719-548-1114), or phone (888-866-5251 or 719-548-1110). Here are some links:

ToolBook Instructor Information

ToolBook Assistant Information

Order

TBK Tracker Provides Offline Tracking for Flash and ToolBook Content

Our TBK Tracker Learning Management System (LMS) has allowed ToolBook developers to track their native ToolBook content deployed via CD or Local Area Network (LAN) since 1998. Over the years, we've had frequent requests for similar functionality for other types of content. But when we released our first Flash-based authoring tool, Training Studio, we realized that we needed a good way for customers not running via a SCORM LMS to track the content. After looking as some commercially-available "projectors," we decided to write our own freely-distributable projector in .NET. This projector reads the database (Access or SQL Server), provides student login, allows the student to select a course, and serves up the Flash content. Training Studio content works right out of the box. Other Flash content needs to make some well-documented calls via FSCommand or ExternalInterface. Licensing is $2,995 ($1,995 if you own the ToolBook version) per developer with free runtime distribution. Here are some links:

Information

Sample Installation

Projector Documentation

Order


Tracker Sync Allows Synchronization Between TBK Tracker and Tracker.Net

Another longtime functionality request related to our offline (TBK Tracker) and online (Tracker.Net) LMS's was the ability to allow users to take training offline and then to add that to the online system. The work that we did on our Training Studio comment tracking web service made us realize that we could use a similar approach to pull this off. The result is Tracker Sync. It is a simple client-side application that connects to the TBK Tracker database, authenticates the student, and passes the local TBK Tracker information to the web service, which does the bulk of the heavy lifting. An Access database on the web site stores the mapping between the TBK Tracker and Tracker.Net lessons and courses. Here are some links:

Information

Editor Help

Web Service Documentation

Order


Learning & Mastering ToolBook Assistant 9 Released

Coinciding with the upcoming release of Assistant 9, we've completely updated Learning & Mastering Assistant. There is new content on such topics as:
  • SmartPages and SmartStyles
  • Book Explorer
  • Working with Flash
The new version has over 30 hours of training with 26 Show Me demonstrations, 21 Let Me Try simulations, 101 Web Hints, and 233 Expert Information topics. Available from both Platte Canyon and SumTotal Systems, a full version is $595 and upgrades are either $195 or $385. Here are some links:

Information

Outline

Order

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

Rates are set for the tenth annual ToolBook User's Conference / e-Learning Authoring Conference. With all the food, drink, comaraderie, great sessions, and lodging (if desired) included, you won't find a better learning opportunity anywhere. Prices rise by $50 on May 15, 2008, but you can sign up today while there is still training money in the budget:). Here are the rates:
  • Off Campus ($780)
  • Windom House Double ($855)
  • Windom House Single ($925)
  • CC Inn Single ($975)
  • Apartment Multiple Occupancy ($975)
  • Apartment Single ($1,175)
Preconference workshops are 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:

Rates

Sessions

Faculty

Preconference

Attendee Comments

Register

TBCON Faculty Proposals Now Being Accepted 


Do you have the "Right Stuff" for being on the 2008 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
  • Management
Do you have sample applications (with source included) that you can give the attendees? Does helping others making 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

ToolBook SmartStyles Article Available 


SumTotal has published an initial version of Tim Barham's Create ToolBook SmartStyles article. While it is not totally finished, it is still an excellent reference for this great feature of ToolBook 9.


Plug-In Pro Spotlight - Importing and Validating Web Graphic Placeholders 

Many of us use ToolBook's Web Graphic Placeholder for most of our graphics since it grabs the original graphic and uses it for the exported web content rather converting the bitmap stored inside the book itself. But the process for linking up a number of placeholders can be a bit time-consuming:
  • Drag the placeholder out of the catalog
  • Position it correctly
  • Use the editor to navigate to the desired external graphic
With the Importing Web Graphic Placeholders tool in the Plug-In Pro, you put all the graphics you want to link to in a directory, select the extensions you want to look for (.JPG, .JPEG, and/or .GIF), choose whether you want to put the placeholders all on one page or, more typically, spread them out starting at the current page, and choose the coordinates to locate the placeholder. Clicking the "OK" button then instantly creates and links all your placeholders, saving a tremendous amount of time and reducing the chances of error. You can also validate all the placeholders in a book to make sure the external graphics are still there, but we'll cover that in a later issue.

To learn more, you can follow these links:

Help topic

Plug-In Pro web page

Expert Information from the Learning & Mastering ToolBook Series 

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

Action Methods - Common Elements

We created a ToolBook prototype for our Training Studio product that shows the power of Action Methods. The concept behind Training Studio is database-driven training where the Subject Matter Expert (SME) selects a template and then enters associated information into an editor for storage in a database. So the implementation of the templates (pages in ToolBook) needs to be generalized to work with lots of different content, media, etc. The core design feature was to have key operations like playing media and checking completion status accomplished by the Action Methods of a "Common Elements" button on each page. That allowed the methods to be tailored somewhat for each template if needed, copied with each template page, and be isolated to its own script for the OpenScript code [to keep from getting over 64K of code in any single script]. Here is the PlayMedia action:

-- Action Method "PlayMedia" ---------------------------------------------------
If mediaId <> ""
  Execute extStop() of MediaPlayer "MediaPlayer"
  Execute extStop() of ShockwaveFlash "FlashPlayer"
  Comment: Trigger moves players off the screen, User Event moves them back on
  If offset(".swf",mediaId) > 0
    Trigger MediaPlayer "MediaPlayer"
    Send User event to ShockwaveFlash "FlashPlayer"
    Set extMovie of ShockwaveFlash "FlashPlayer" to "media\" & mediaId
  Else if offset(".wma",mediaId) > 0 or offset(".mp3",mediaId) > 0
    Trigger MediaPlayer "MediaPlayer"
    Trigger ShockwaveFlash "FlashPlayer"
    Set extFileName of MediaPlayer "MediaPlayer" to "media\" & mediaId
  Else
    Trigger ShockwaveFlash "FlashPlayer"
    Send User event to MediaPlayer "MediaPlayer"
    Set extFileName of MediaPlayer "MediaPlayer" to "media\" & mediaId
  End if
End if
As you can guess, there is a Windows Media Player (WMP) and Flash Player on each page. We first stop each in case it is playing. The "mediaId" variable contains the name of the file to play. If it ends in .swf, then we know it is Flash. Otherwise, we use WMP. We "Trigger" the one we don't want to move it off the page (needed in native ToolBook as ActiveX controls have a hard time being hidden) and send a user event to the one we want to move it into position. We then set the appropriate property (extMovie for Flash and extFileName for WMP) to tell the player which file to play.

Here is the "DetermineCompletion" Action Method:

-- Action Method "DetermineCompletion" -----------------------------------------
Define local variable "allCompleted" (Initial value: "")
Define local variable "completionId" (Initial value: "")
Define local variable "num" (Initial value: "")
Define local variable "numHotspots" (Initial value: "")

If completionArray[g_selectionNum] <> "true"
  Set completionArray[g_selectionNum] to "true"
  Set numHotspots to text of field "numHotspots"
  Set allCompleted to true
  Step num from 1 to numHotspots by 1
    Set completionId to completionArray[num]
    If completionId <> "true"
      Set allCompleted to false
      Break out of step loop
    End if
  End step loop
  If allCompleted = true
    Set visible of Web Graphic "CompletionImage" of This Background to true
  End if
End if
In this case, we are trying to determine when all of the interactions on the page have been completed. Each "hotspot" sets a global variable (g_selectionNum) to its own number and then calls this method. We have a global array (completionArray) that keeps track of overall completion on the page. We set the corresponding element of that array to "true" and then check to see if all of the interactions have been completed. Notice that we read the number of interactions from a field which in turn got set from the databases. If the page has been completed, we show a "completion image" that is located on a background.

These are complicated actions for sure. But consider how much LESS code is involved compared with having all this logic in the actions for each hotspot. And when it comes time to change the code, you can do it one place rather than multiple places.


OpenScript Tip from the Learning & Mastering ToolBook Series

By Peter Jackson, ToolBookDeveloper.com

Setting Action Global Variables from OpenScript

Question: For authoring purposes, is there a way to set the initial value of an actions editor global variable through OpenScript? I have a variable which is going to determine how my "exit" button behaves and would like to build a tool in OpenScript that sets this by checking a box while in authoring mode.

AE Global variables are OS system variables and they (Global) are assigned after enterBook and after reader. If you add the scripts shown to your book or system book you may change the value of the Global variable. As OpenScript is not exported this will work for Native.

to handle enterBook
        forward
        get setNativeGlobalVars() of self
end enterBook

to handle reader
    forward
    get setNativeGlobalVars() of self
end reader

to get setNativeGlobalVars
    system InternetOn, flashPath
-- Use this function to Initialise Global
-- variables used in the Action System.
-- The Global variables should be created
-- using the "Define Variables..." and then
-- select the "Global Variables" tab.
-- Each variable should have the
-- "Initial Value:" assigned for export, 
-- therefore we use this function to change the
-- "Initial Value" for Native deployment.
-- InternetOn is a global variable with initial
-- value set to true. This is used to stop calls
-- to JavaScript function and/or HTTP Posts
-- when in TB native mode.

	InternetOn = false
	flashPath = ASYM_PathOfFile(name of self) & "flashFiles\"
    return null
end setNativeGlobalVars

There is an alternative. Add the actions to your exit button for DHTML only. Now create and assign a sharedScript to the exit button to do what you want for native or development time and include the ASYM_Reset handler shown:

notifyBefore ASYM_Reset
    clear script of self
end ASYM_Reset
This will remove (clear) all of the OpenScript that is created from the Actions allowing your sharedScript to take control. As with OpenScript in an object, sharedScripts are also NOT exported.


Web Hint from the Learning & Mastering ToolBook Series

By Tim Barham, SumTotal Systems, Inc.

Testing Locally in IE7

OK, I have a work-around for ToolBook content not working from your local file system in IE7.

First, the background:

ToolBook uses the JavaScript XMLHTTPRequest object for various forms of communication with the server, including downloading a page's JavaScript. In Mozilla-based browsers, this is implemented as a native browser object. In IE, prior to version 7, it was implemented as an ActiveX control. In IE7, Microsoft has added the XMLHTTPRequest object as a native browser object.

Our JavaScript code first looks for the native browser object, and if it doesn't find it, tries to instantiate the ActiveX version. Hence, in IE7, we are using the native browser version rather than the ActiveX version (note that for content running off the server this is actually good news - it means we can use the XMLHTTPRequest object even if ActiveX support is turned off in IE).

Anyway... For the most part they function the same, but there is an important difference. When we download a page's JavaScript file, we use a relative path (simply "p0.js", for example). The normal expectation with a relative URL is that the browser would use the same protocol and path as the current document. When running from your local file system, the ActiveX version of the XMLHTTPRequest object is quite happy with that. The Mozilla implementation of the XMLHTTPRequest object is also fine. But the IE7 native browser implementation of the XMLHTTPRequest object is NOT happy with that. It requires that the protocol be specified ("file:p0.js" rather than just "p0.js"). Hence we get an "Access denied" error and we can't download the file.

When running from a web server (via HTTP or HTTPS), there is no such requirement (which is why ToolBook content doesn't have this problem when run from a web server).

Now for the work-around:

It is possible to turn OFF the native XMLHTTPRequest implementation in IE7. To do this, go to Tools \ Internet Options \ Advanced tab. Scroll down to the Security section and clear the "Enable native XMLHTTP support" option. On your machine, the native XMLHTTPRequest object will no longer function in IE7, and ToolBook content will revert to using the ActiveX control version as it does in IE6.


Flash ActionScript Tip

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

Dynamically Loading Images with ActionScript 3

Here is a sample from my "Flash for Programmers" session at TBCON. In it, we load an image from subdirectory of the Flash movie. Our first tasks is to create some "global" variables to be shared among multiple functions in the Actions layer:
var imageMediaLoader:Loader = new Loader();
var imageId:Bitmap;
Notice the use of the Loader class, which is used to load images or external Flash files. Our next step is to associate the loadImage function with its associated button:
LoadImageButton.addEventListener(MouseEvent.CLICK, loadImage);
Here is the loadImage function:
function loadImage(event:MouseEvent):void {
	var moviePath:String = "images/desperado.gif";
	var request:URLRequest = new URLRequest(moviePath);
	
	imageMediaLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadImageComplete);
	imageMediaLoader.load(request);
}
We create a relative path to the image we want to load. We then create an instance of the URLRequest class, which we use to upload and download information or external files. Notice how the "constructor" of the object is the path of the image we want to import into our movie. Next, we use another event listener to tell Flash what function (onLoadImageComplete) that we want to call when the image has been successfully loaded (using the imageMediaLoader object). Then, we actually start the importing with a call to the Loader's load method. Here is the onLoadImageComplete function:

function onLoadImageComplete(event:Event):void {
	imageId = Bitmap(imageMediaLoader.content);
	
	var imageObjectId:Object = addChild(imageId);
	
	imageObjectId.x = (LoadImageButton.x + LoadImageButton.width + 10);
	imageObjectId.y = LoadImageButton.y;
	statusTextId.text = "Loaded Image.";
}
The reference to what we loaded is stored as the content property of our loader. We tell Flash that we know is it a Bitmap and assign it to our global imageId variable. We then call the addChild method to add the image to the stage. This step is crucial or the image will never show up. The return value is a reference to the object. We use this to set the x and y coordinates of the image. Why did we need the imageId to be a global variable? That is so we can remove the image when leaving the key frame:

if (imageId != null) {
    removeChild(imageId);
}


VBTrain.Net Nugget

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

User Properties via My.Settings

One of the challenges in creating a "projector" for Flash content in .NET was how to allow the user to customize the graphics, settings, look and feel, etc. In ToolBook, we have the user open the "front end book" in author-level ToolBook. But asking the training developer to purchase and use Visual Studio is a bit much. So we needed another mechanism. A nice fit was the new My.Settings capability in .NET 2.0. It allows both application-level and user-level settings to be stored in an external XML file. We can then refer to those "properties" in our code. Here is a simple example for the initial splash screen. The code is from the Load handler for the splash screen form.
Dim bitmapId As Bitmap = Training_Graphic(Me)

If bitmapId IsNot Nothing Then
    Me.ClientSize = New Size(bitmapId.Width, bitmapId.Height)
    Me.BackgroundImage = bitmapId
End If

The part of interest in this article is the implementation of the Training_Graphic property. It is defined in a Module since it is used elsewhere in the program:
Friend ReadOnly Property Training_Graphic(ByVal formId As Form) As Bitmap
	Get
	    If c_Training_Graphic Is Nothing Then
		Dim graphicName As String = GetApplicationSetting(My.Settings.Training_Graphic, "")
		Dim graphicValid As Boolean = False

		If graphicName <> "" Then
		    Dim graphicPath As String = String.Format("{0}\{1}", Application.StartupPath, graphicName)

		    If File.Exists(graphicPath) Then
			    Try
			        c_Training_Graphic = New Bitmap(graphicPath)
			        graphicValid = True
			    Catch ex As Exception

			    End Try
		    End If
		End If
		If graphicValid = False Then
		    Dim streamId As Stream = formId.GetType().Assembly.GetManifestResourceStream("TBKTrackerProjector.trainingstudio.gif")

		    c_Training_Graphic = New Bitmap(streamId)
		End If
	    End If

	    Return c_Training_Graphic
	End Get
End Property
We only want to read in the graphic once, so once we do so, we store the reference in the c_Training_Graphic variable. If that doesn't yet exist, we call the GetApplicationSetting, as shown below.
Friend Function GetApplicationSetting(ByVal settingValue As String, ByVal defaultValue As String) As String
	Dim returnString As String = settingValue

	If settingValue Is Nothing OrElse settingValue = "" Then
	    returnString = defaultValue
	End If

	Return returnString
End Function
The parameter is the external value, referred to as My.Settings.Training_Graphic. If it is set, it looks like this in the external configuration file:
<setting name="Training_Graphic" serializeAs="String">
    <value>trainingstudio.gif</value>
</setting>
If the graphic name is not null, we turn it from a relative path to a complete path and try to create a "new" bitmap. If it is not null or we have a problem, we default to a graphic that is stored as a resource of the executable itself. Notice the use of the GetManifestResourceStream method in this case. Either way, we return the bitmap that we use for the splash graphic. A user can change that graphic by simply editing the configuration file.



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