The EnterPage 13-02
June 1, 2010

In this issue:

Two Weeks Until The e-Learning Authoring Conference - Sign Up Now

Tracker Reports Offers 164 Reports/Charts via Reporting Services

Introducing Remote Tracker

ToolBook 10.5 Preview Available

Expert Information from the Learning & Mastering ToolBook Series

OpenScript Tip from the Learning & Mastering ToolBook Series

Web Hint from the Learning & Mastering ToolBook Series

ActionScript Tip

VBTrain.Net Nugget



Introduction

Welcome to The EnterPage newsletter. We've been building reports for months for our new Tracker Reports product. For our existing Tracker.Net customers, we think you'll be amazed at the useful information you can provide your users. If you haven't yet decided on Tracker.Net, this might be the reason to take the plunge. Speaking of Tracker, we also created a whole solution for locating your content on another web server. We call this new product Remote Tracker. We are glad both these products are out of the way, though, as the 2010 e-Learning Authoring Conference is just around the corner. We can still get you in and prices are very low, so sign up today. We've got a great lineup of ToolBook, Flash, Flex, Silverlight, JavaScript, instruction design, and e-Learning Management sessions on tap. What will also be on tap are a great microbrew and a good choice of wine and other refreshments while you share ideas with developers from around the world. ToolBook 10.5 and Captivate 5 are just around the corner while Flash CS5, Flash Builder 4, and Visual Studio 2010 have recently shipped. This is the best place to get the inside scoop. Beyond Tracker, conference, and ToolBook news, this issue has the normal assortment of ToolBook, Flash, and .NET news, tips, and tricks. Enjoy!



Two Weeks Until The e-Learning Authoring Conference - Sign Up Now

We're up to 40 attendees. But we still have plenty of room and will be happy to fit you in, even if it is at the last minute. We'll have another great lineup of 18 one-hour session blocks over three days, with each block containing four sessions to choose from. We will be repeating many sessions twice so that you are not stuck with multiple "must attend" sessions in a single block. We'll have our usual strong lineup of ToolBook content as well as great sessions on Flash, Flex, Captivate, JavaScript, and other technologies. The sessions will be grouped into these subject areas: Flash/Flex/Silverlight, Management, ToolBook (Intermediate/Advanced), ToolBook (Introduction), and Web Technologies. There are many sessions for beginners, so don't feel like you need to be an experienced developer.

If that isn't enough, we have an excellent lineup of preconference workshops. In addition to all the scheduled learning, there will be some great receptions, numerous networking opportunities, and the Help Desk where you can get answers to your individual questions. Frontier Airlines is also offering nice prices into Denver when you purchase by June 4th.

Dates

June 14 - 16, 2010
Preconference Training June 12 - 13, 2010

Conference Rates (Based on Your Choice of Lodging)
  • Off Campus ($835)
  • CC Inn Double ($915)
  • CC Inn Single ($980)
  • Apartment Multiple Occupancy ($1,030)
  • Apartment Single ($1,255)
All options include three meals per day plus snacks. All except "Off Campus" include lodging as well. If you have three or more attendees from one organization, you will all get a 5% discount across the board (including preconference workshops)!

Register

Rates

Sessions

Faculty

Daily Schedule


Preconference Workshops

In addition to great information in the conference, you can participate in these outstanding preconference workshops:

Saturday Morning, June 12, 2010
  • Flash for Beginners - Dane Williams
  • Introduction to ToolBook - Tom Hall
  • Programming for e-Learning Developers: Flex - Jeff Rhodes
Saturday Afternoon, June 12, 2010
  • e-Learning with Flash - Dane Williams
  • Intermediate ToolBook - Tom Hall
  • Programming for e-Learning Developers: .NET - Jeff Rhodes
Sunday Morning, June 13, 2010
  • Introduction to Flash ActionScript 3.0 - Dan Carr
  • Programming for e-Learning Developers: ToolBook - Jeff Rhodes
Sunday Afternoon, June 13, 2010
  • Intermediate/Advanced Flash ActionScript 3.0 - Dan Carr
  • Rapid Development Tricks with ToolBook: Templates, Smart Styles, Importing from PowerPoint, and Best Practices - Bill Hurley
  • Using the ToolBook Translation System - Jeff Rhodes

Preconference Rates (Does Not Include Meals or Lodging)
  • One Preconference Session ($150)
  • Two Preconference Sessions ($285)
  • Three Preconference Sessions ($420)
  • Four Preconference Sessions ($555)

Register

Preconference Workshops

Tracker Reports Offers 164 Reports/Charts via Reporting Services

We are pleased to announce the availability of Tracker Reports™, which offers 70 reports and 94 charts for use in SQL Server 2008 Reporting Services. Each report and chart includes its own database access as well as the ability to select some or all students, courses, lessons, classes, or organization. Many reports include "drill-down" capabilities where users can click on a parent item like a course and see child (lesson) information. Deployment is a matter of uploading to Report Manager and connecting to your Platte Canyon® Tracker.Net™ database. Within Report Manager, users can be given permissions to particular folders or reports, set up reports for a pre-selected organization or other items, email reports daily/weekly/monthly, and much more. Ad-hoc reporting using the Tracker Model and the SQL Server Report Builder is also included.

More Information

Tracker Reports Documentation

Order Tracker Reports


Introducing Remote Tracker

We are also happy to tell you about Remote Tracker™. This innovative product allows e-Learning content to be hosted on a different web site than your Tracker.Net learning management system (LMS). Without Remote Tracker, security restrictions within all browsers prevent the necessary SCORM™ communication when the content is on a different domain/web site than the LMS. With Remote Tracker, the remote content communicates directly with the Remote Tracker instance on the remote server. Remote Tracker then communicates the data back to the source LMS - all transparently to the user.

More Information

Remote Tracker Documentation

Order Remote Tracker


ToolBook 10.5 Preview Available

If you aren't already working with the ToolBook 10.5 preview version, we recommend trying it out today. Some of the exciting new features include:
  • Geolocation support for mobile content
  • Support for Apple iPad and Windows mobile devices
  • Simplified Quick Start tab on the Startup Dialog
  • iPhone Support for drag & drop
  • Smoother Resizing of Graphics
  • Exit Buttons Functionality and Appearance Improved
  • Prompt to Resize Page When Changing Styles
  • Paste Unformatted Text Menu Item
  • Checkbox added to Publish to Web Wizard to Enable Diagnostics
We've had versions of these bottom two features in the Plug-In Pro for a number of years:) But, seriously, this looks like a nice release. Be sure to renew your support/maintenance contract to ensure you get the new version once it ships.
Note that Denny Dedmore of SumTotal Systems (as well as other faculty members) will be showing off 10.5 at the upcoming e-Learning Authoring Conference.

ToolBook 10.5 Preview Information

Download ToolBook 10.5 Preview

Expert Information from the Learning & Mastering ToolBook Series 

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

Using Resources of Another Book

Question: I want to use a system book as a source of my images. Is this possible?

Answer: This is definitely possible. I have included some code from our Plug-In Pro below that should help. The main idea is that you want to check to see if the resource is already there. If so, either use it or call replace resource. If not, you want to use import bitmap resource. In the code below, callingBookId would refer to your system book. You could get your hands on that by using sysBooks. For example:

callingBookId = book (item 1 of sysBooks)
Here is the code I mentioned.
shortName = chars max(1, maxChars - 31) to maxChars of fullImageFile 
tempRef = "bitmap" && quote & shortName & quote && "of" && callingBookId 
oldImageRef = normalGraphic of placeholderId 
if isObject (tempRef)
        replace resource tempRef with imageFile
        normalGraphic of placeholderId = tempRef
        errString = ASYM_RestoreSuspend(blkSus) 
else
        import bitmap resource imageFile as shortName
        normalGraphic of placeholderId = bitmap shortName
        errString = ASYM_RestoreSuspend(blkSus) 
end if


OpenScript Tip from the Learning & Mastering ToolBook Series

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

Aligning Objects within Groups

I was doing a demo of the Plug-In Pro awhile back and we got into a discussion of how it is a hassle if objects within a group (such as a multiple choice question) have gotten moved around slightly. I came up with the script to the left to deal with that. You figure out the desired left coordinate (4403 page units in this example), select the group, and then press Enter in the Command Window. The getObjectList function grabs all the objects within the selected object (group). We then pop each item from the list into a separate variable and set the x coordinate (item 1 of position) to the desired value. Note that passing FALSE to getObjectList means that all matching objects are included, regardless of whether they have a script.
leftVal = 4403

objList = getObjectList(selection, "", FALSE)

while objList <> null
	pop objList into objId
	item 1 of position of objId = leftVal
end while


Web Hint from the Learning & Mastering ToolBook Series

By Peter Jackson, ToolBookDeveloper.com

Determining SkipNavigation via JavaScript

Question: Does anyone know how to get the "skipNavigation" (DHTML) property of a page using either the Actions Editor or JavaScript?

Answer: Take a look at the global.js file in the export folders e.g., ...\WebExport\{bookname}\ie7\

You will see close to the top:

TBK._Gc.__b[TBK._Gc.__b.length]=new _wz(0,false,new Array("p0","p1","p2","p12","p3","p11","p4","p6","*p7","*p8","*p9","*p10"));

Note that the above shows that page IDs 7, 8, 9 and 10 have skipNavigation set to true.


ActionScript Tip

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

Converting a Value to Boolean

In a typical week, I'll work with ActionScript, Visual Basic, OpenScript, JavaScript, and perhaps even InstallScript. One of the possible traps of moving between languages is making assumptions that similar functions in different languages will in fact operate the same way. One recent example that bit me was in working with a Boolean (true/false) value in Flex and ActionScript. The issue as in a simple confirmation as to whether it was OK to exit the lesson. The design was to call this JavaScript function in order to get a standard "confirmation" dialog from the browser:

confirmClose = function (message) {
    return window.confirm(message);
}

Here is how we called it from ActionScript:
var returnString:String = ExternalInterface.call("confirmClose", exitMessage);

So far, so good. But how do we convert the string returnString into a Boolean value? In other words, returnString will be either "true" or "false." My mistake was to use the syntax:
var okToExit:Boolean = Boolean(returnString);
You would this would work since the ActionScript Number() function will take a numeric string and convert it to a number. Similarly, the Visual Basic CBool() function will take "true" or "True" and convert it to the Boolean True. However, this "casting" function returns true for both "true" and "false!" So the user exited even if she clicked the "Cancel" button in the dialog. This is NOT what we wanted. If I had read the Flex documentation, this behavior is clearly stated:

Casting to Boolean from a String value returns false if the string is either null or an empty string (""). Otherwise, it returns true.

So what was the fix? Easiest for me was to create a ConvertToBoolean function that operated like I expected. The new syntax plus the function is shown below.
var okToExit:Boolean = ConvertToBoolean(returnString);

public function ConvertToBoolean(inputVal:String):Boolean {
    var returnVal:Boolean;
			
    if (inputVal == "true") { // need to check string since Boolean() looks for 1 or 0
        returnVal = true;
        	}
    else {
        returnVal = false; 
    }
        	
    return returnVal;			
}


VBTrain.Net Nugget

By Jeff Rhodes, Platte Canyon Multimedia Software Corporation

Visual Basic in Reports

As I mentioned in the introduction to this newsletter, I've been spending a great deal of time building reports in Visual Studio for our new Tracker Reports product. While SQL Server Reporting Services has a number of great features, one of my favorites is the fact that you can embed Visual Basic code in the report itself. This can be extremely helpful with complex logic. For example, the completion status of a lesson or course can be expired, critical, or alert when it has an expiration date. Here is what the function looks like:

Public Function DetermineCompletionStatus(ByVal completionStatusObj As Object, _
    ByVal expirationDateObj As Object, ByVal currentDays_CriticalObj As Object, _
    ByVal currentDays_AlertObj As Object, Optional ByVal isCourse as Boolean = True) As String
    
    Dim completionStatus As String
    Dim expirationDateId, currencyCriticalDate, currencyAlertDate As DateTime
    Dim currencyCriticalDays, currencyAlertDays As Integer
    Dim checkExpiration As Boolean = isCourse
    Dim defaultStatus as String = "Not Started"
    
    If isCourse = False Then
    	defaultStatus = "not attempted"
    End If
    

    If IsDBNull(completionStatusObj) = True Then
        completionStatus = defaultStatus
    Else
        completionStatus = CStr(completionStatusObj)
        If completionStatus = ""
        	completionStatus = defaultStatus
        End If
    End If

    Dim returnString As String = completionStatus

    If IsDBNull(expirationDateObj) = True OrElse expirationDateObj Is String.Empty OrElse _
        IsNothing(expirationDateObj) = True OrElse expirationDateObj.ToString = "" Then
        
        expirationDateId = DateTime.MinValue
    Else
        Try
            expirationDateId = Convert.ToDateTime(expirationDateObj)
        Catch ex As Exception
            expirationDateId = DateTime.MinValue
        End Try

        If expirationDateId > DateTime.MinValue Then
            If IsDBNull(currentDays_CriticalObj) = True OrElse IsNothing(currentDays_CriticalObj) = True OrElse _
                currentDays_CriticalObj.ToString = "" OrElse currentDays_CriticalObj.ToString = "-10" Then
                
                currencyCriticalDays = 0
                currencyCriticalDate = expirationDateId
            Else
                currencyCriticalDays = CInt(currentDays_CriticalObj)
                currencyCriticalDate = expirationDateId.AddDays(-(currencyCriticalDays))
            End If

            If IsDBNull(currentDays_AlertObj) = True OrElse IsNothing(currentDays_AlertObj) = True OrElse _
                currentDays_AlertObj.ToString = "" OrElse currentDays_AlertObj.ToString = "0" OrElse _
                currentDays_AlertObj.ToString = "-10" Then
                
                currencyAlertDays = 0
                currencyAlertDate = expirationDateId
            Else
                currencyAlertDays = CInt(currentDays_AlertObj)
                currencyAlertDate = expirationDateId.AddDays(-(currencyAlertDays))
            End If
        End If
    End If
    
    Select Case completionStatus.ToLower
    Case "completed", "passed"
	' expiration Date

	checkExpiration = True
    End Select

    If checkExpiration = True Then
        If expirationDateId <> DateTime.MinValue Then
            If (expirationDateId <= Now) Then
                Dim expiredString As String = "Expired"

                returnString = expiredString
            ElseIf (currencyCriticalDate <= Now) Then
                returnString = "Critical"
            ElseIf (currencyAlertDate <= Now) Then
                returnString = "Alert"
            End If
        End If
    End If

	returnString = StrConv(returnString, VbStrConv.ProperCase)
    Return returnString
End Function
Within the report itself, we can use an expression for the value for the "status" rather than linking to just a single column from our query. For example, here is an expression for the course status:
=Code.DetermineCompletionStatus(Fields!CompletionStatus.Value, Fields!ExpirationDate.Value, _
    Fields!CurrencyDaysFlag_Critical.Value, Fields!CurrencyDaysFlag_Alert.Value)

Notice how we begin the expression with Code to denote that we are using our own code rather than built-in operators.



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