Philip Dodds

October 13th, 2007

Philip Dodds passed away last week. I enjoyed working with Philip over the years. I first met Philip many years ago when he founded Visage, jeux crapsjeu au casinojeux casino machine a sousblack game jack onlineplay blackjackjeux gratuits casino pokerbonus de casino sans depotslot machine gratuitjeux casino gratuits,jeux casino internet,jeux casinojeu sur internetcasino vente en lignele nouveau casinocasinos francais en lignemeilleurs bonus casinowww groupe casinojouer au casino sans depotle baccaratcasino en ligne bonuscasinos on linewww casino en lignejeu casino gratuiscasino online,casinos online,top casinos en lignecasino bonus offertjeux casino sans telechargementcasino en ligne surwww produits casinojeu gratuites casinola roulette francaisejeu pcjeu flash gratuitesplay seven card stud onlinejeux flashjuego strep pokerpai gow,pai gow poker web,pai gow poker pagina webbonus de poker onlinejugar poker on linewww poquerjuegos pc pokerjuego al instante portal webcartas internetpoker caribe lineatorneo poker gratisworld series of pokerel poker gratisholdem poker descargarjuegos de poker para pcjuego omaha pokerpoker gratis descargarpoker caribe portalapuestas en linea a company that made products for Interactive

Video. I worked with Philip from time to time while he worked to create SCORM. Philip was such a delightful person to know. I will miss him.

Automatically scrolling a div containing divs

August 17th, 2007

I have a table-of-contents in  a course. The table of contents is a <div> that contains other <div>s. The table of contents can have so many items that it requires scrolling. I also have previous/next buttons that can switch from one item in the table-of-contents to the next. I had to make sure the current-item is always scrolled into view.

 The first part of this solution is to find the Y position of an item within the table of contents. I found a great public-domain function from firetree (the original code is from quirksmode).

Now, I had to write the scrolling code:

 // get the id of the TOC container
 var oSections = document.getElementById(’tocContainer’);
 
 // get the y position of the TOC section container
 var nSectionsY = findPosY(oSections);
 
 // get the y position of the selected item
 var nItemY = findPosY(document.getElementById(sItem)); 
 
 // adjust the item height to be in the coordinate space of the container
 nItemY -= nSectionsY;
 
 // get the height of the container and pull off the “px” part on the end
 var nHeight = parseInt(oSections.style.height);
 
 // see if the complete item is greater than the height of the container
 if ((nItemY+21) > nHeight) {
  // it is, scroll the selected page into view
  oSections.scrollTop = nItemY;
 } else {
  // see if the item is showing given the current scroll position
  if (oSections.scrollTop > nItemY) {
   // it is not, scroll the item into view
   oSections.scrollTop = nItemY;
  }

Using Flash V2 Components in a Course

January 15th, 2007

Flash 8 provides a set of components that make it easy to create interactivity in an e-learning course (the newer set of components in Flash are the version 2 or V2 components). One of the things you will need to know to use V2 components is the way Flash loads components and when ActionScript is called from listeners and frames. Here is a scenario that will give you an insight on the use of components in a course:

Scenario: Your course provides “next” and “previous” buttons that let the learner move forward and backward in the course. In Flash, you would have listener functions that process the click events for the ”next” and “previous” buttons. In the listener function for the “next” button you may want to load another part of the user interface in the course (for example, you may want to load a multiple choice question). A good way to load the user interface is to call gotoAndStop(name-of-frame). This frame would contain the components that  present a multiple choice question to the learner.

To make sure your course works correctly you should NOT set or get any of the properties of the components immediately after your call to the gotoAndStop() function. However, your components are not fully loaded until the frame with those components is loaded. So, if you need to get or set properties on those components you should do so in code executed from the loaded frame. You should not get or set the properties inside the listener of your “next” button.

Running JavaScript on your local computer

January 15th, 2007

Windows XP SP2 and Windows Vista will not let you run JavaScript from your local hard drive or CD-ROM. This restriction can make it difficult to distribute interactive web pages for use on a local computer. When you launch a HTML page with JavaScript on your computer, Internet Explorer 6 and 7 will tell you that the page contains Active Content. You have to authorize the page to run “Active Content” each time it is loaded or you have to change the default settings in “Internet Options…”

Microsoft has provided a work around for this problem. The HTML author can add the “Mark of the Web” (MOTW) to each HTML document. The MOTW is a comment line included in the HTML code. Here is a sample:

<!-- saved from url=(0014)about:internet -->

Creating a SCO with a HTML Frameset

January 4th, 2007

Here is the general way to create a SCO using a HTML frameset.

Your frameset will contain some or all of the code for your SCO. Your frameset will have the code to get and set the bookmark. Your frameset can also have the code to set the completion status, success status, score and other SCORM data items. Your frameset will contain at least one frame. You will display the content (HTML pages) of your SCO in a frame.

The frameset will initially display a blank page when it is loaded. Your frameset displays a blank page because it has to find out if this is the first time the learner has launched the SCO. If this is the first time the SCO is launched, the frameset will load the first page in the SCO into the frame. If the SCO has been launched at least once, your frameset will get the bookmark (previously saved by your SCO) and then use that bookmark to load the correct page.

In a SCORM 2004 SCO, your frameset can save the bookmark information in cmi.location or cmi.suspend_data. In a SCORM 1.2 SCO, your frameset can save the bookmark information in cmi.core.lesson_location or cmi.suspend_data. You will decide what kind of information to store in the bookmark. For example, you could store the name of the file that was previously viewed by the learner. You could also store a number that could be an index to an array of pages that you load when the SCO is launched.

We have created an e-learning toolkit that uses a frameset to manage bookmarks within a SCO. The toolkit comes with source code that you can use “as is” or modify to meet your specific needs.

Creating a course with a single SCO in SCORM 2004

November 12th, 2006

SCORM 2004 lets you create a course with multiple SCOs. However, many people prefer to create a their courses with a single SCO. One advantage of creating a course with a single SCO is that you do not have to spend much time learning how SCORM 2004 sequencing and navigation rules work. Unfortunately, your single-SCO course still gets the default sequencing and navigation rules if you like it or not. The defaults are usually not what you want so here is a tiny bit of SCORM manifest code that you may want to use in your single-SCO course. I’ll show the code first and then explain how it works.

<organizations default=”crs_hello”>
  <organization identifier=”crs_hello”>
    <title&rt;Hello World Course</title>
    <item identifier=”sco_hello” identifierref=”sco_hello_ref”>
      <title&rt;Hello World SCO</title>
    </item>
    <imsss:sequencing>
      <imsss:controlMode choiceExit=”true” flow=”true” />
      <imsss:deliveryControls completionSetByContent=”true” objectiveSetByContent=”true” />
    </imsss:sequencing>

  </organization>
</organizations>
 

The <organizations> section defines a course with a single activity. The activity is linked to a SCO with the identifierref = “sco_hello_ref” (this SCO is defined in the <resources> section not shown in this example). The course has some sequencing rules shown in bold type. Here are the rules:

  • choiceExit = true - this means the learner can exit from the activity. This is not really needed here because there is only one activity but a good thing to have if you will add more SCOs to this course
  • flow = true - this tells the LMS to flow automatically navigate to the first SCO in the course. This means that the learner will not have to take some action to launch the SCO.
  • completionSetByContent = true - the SCO will tell the LMS when it is complete by setting cmi.completion_status
  • objectiveSetByContent = true - the SCO will tell the LMS the status of its primary objective by setting cmi.success_status.

Flash 8 security settings

October 18th, 2006

I do quite a bit of course development with Flash. Flash 8 has some additional security. By default, it will not let you run content from your local hard drive that communicates between SWFs and JavaScript and between SWFs. This makes it seem like your course is suddenly broken. You can change thes default securlty settings of Flash with the Flash Settings Manager. You enable the communications by adding the folder to the list.

Active Directory

October 16th, 2006

I have been working with Active Directory today. I am writing some VBScript code that will automatically login a user to our Learning Management System using their Windows login managed by Active Directory. I needed to find all of the groups that a user belongs to. The LMS uses these groups to make course assignments. I found some excellent code examples from Richard Mueller. The samples help you see that ADSI (the library used to access Active Directory and other things) uses two different methods to get the user’s primary group and other groups.

I ran into one problem when getting the list of groups with VBScript. The memberof function usually returns a collection. However, this collection will be empty if ther user does not belong to any groups. In VbScript, you need to use the IsNull() function to see if a collection is empty. All of the ADSI examples that I found on the web used IsEmpty() - a function that will work fine in VB but will not work correctly in VBScript.

Hello world!

October 16th, 2006

I help people create e-learning tools and courses. I often run into technical challenges. This blog describes those challenges and provides the answers I have found. I hope these blog pages save you time in your work.Â