This entry is part 7 of 8 in the series Cleaning up Adobe Captivate 5.5's SCORM Publishing Template

I decided to post my revised Adobe Captivate publishing template to GitHub, where it can be easily copied, forked, and updated. Currently, the only files are for the Captivate 5.0 and 5.5 templates for SCORM 2004. I hope to add SCORM 1.2 soon, as well as replacing the default ‘standard.htm’ template, which doesn’t use any LMS-related code.

Update: The SCORM 1.2 template is now available.

If you take a look at Default.htm on GitHub, you’ll notice I’ve made a few changes since I wrote my series about editing the templates. I moved a few bits of markup/code around, added some configuration options (such as the ability to turn off centering, turn on logging, and require SCORM when loading), and added a ton of comments to explain some of the new options. Hopefully it’s all self-explanatory.

I also made a small edit to manifest2004.xml, and a few edits to scorm_support.js.

To use these template files, do the following:

  1. Make a backup of your entire publishing folder and put it somewhere safe!
  2. Go to Captivate’s TemplatesPublishSCORM2004 folder and replace Default.htm with the new file.
  3. Go to TemplatesPublishSCORM2004SCORM_support and replace scorm_support.js with the new file.
  4. While you’re in your SCORM_support folder, delete scorm_support.htm and scorm_support.swf, they won’t be used anymore.
  5. Go to TemplatesPublish and replace manifest2004.xml with the new file.
  6. While you’re still in the TemplatesPublish folder, replace standard.js with the new file.
  7. Restart Captivate and give it a try!

Find a bug? Think of a good edit for the template? Post a comment here, or better yet, file an issue on GitHub!


Comments

Weblingo wrote on January 25, 2012 at 8:43 am:

This is great and very helpfull, Its a shock that it was in this state!

I feel a bit ashamed, as you have put so much time and effort into this, but have you got an idea when we might see a modified captivate the 1.2 SCORM template?

I hope adobe are listening

WL

philip wrote on January 25, 2012 at 9:17 am:

@WL i only work on this in my spare time, so i don't have a timeline for SCORM 1.2. Basically, whenever I get to it.

Michael wrote on January 26, 2012 at 9:47 am:

You continue to be awesome! Here's hoping that you find copious spare time for the 1.2 revision. Our LMS, Peoplesoft ELM, only recently got 2004 support, and we are hesitant to use it.

All of our current captivate modules use 1.2, so any improvements would be gratefully accepted.

Anyhow, thanks for all the great work and thought on this!

Michael

Joel wrote on February 1, 2012 at 4:00 pm:

Hi,

I have also struggled with Captivate 5.5 Scorm 1.2 compatiability with Saba LMS. This is a road block to a commercial deliverable, so I am happy to pay for a robust solution, that can also be given away to the next guy?

All the Articulate users here in Singapore, are using your scripts from Saba support, so the fixes and work arounds are well know, not so much so with Captivate. Please email me when you have the chance.

Regards Joel

philip wrote on February 1, 2012 at 5:31 pm:

@joel i don't work with Articulate much, haven't written any scripts for Articulate, and I've never used Saba…

Jimmi Thøgersen wrote on February 2, 2012 at 3:32 am:

Hi Philip – and Joel

Just a few pointers on Saba (I'm afraid I can't help much there either, Joel): There are plenty of issues with Saba and Captivate (I should know, been writing a Captivate 5 SCORM 2004 template from scratch over the past weeks – with some great inspiration from these articles – thanks!).

For one, Saba doesn't like the SCO asking for cmi.score.*, cmi.suspend_data etc. when it's just told it a moment ago that cmi.entry is "ab-initio" (understandable). It also doesn't like how Captivate's rdcmdExit sends cmi.exit = "suspend" no matter if the course is completed.

Anyway, just to give <i>something</i> back (hopefully), I also submitted an issue on GitHub, which has to do with cmiCache never updating the value store. Hope it helps.

Not going to file an issue for this other one (because I don't have the time at the moment), but I'm quite sure this line (in the SetValue handler) won't do much:

if(parameter === "completion_status"){ courseStatus = value; }

Should be "cmi.completion_status" surely?

Anyway, thanks for some great insights – knowledge sharing in the e-learning/courseware business isn't exactly a given. 🙂

Jimmi

philip wrote on February 2, 2012 at 11:15 pm:

@jimmi thanks for the tips… much appreciated. Folded them into the GitHub code.

Jimmi Thøgersen wrote on February 3, 2012 at 4:19 am:

Looks good to me – can't actually test it (re: your reply on the issue), because our own code is quite different – for one, all the cases for handling Captivate's calls are moved into their own functions – which are then also used for our "manual" calls to the LMS (this means our manual calls to e.g. SetValue are cached too). And I'm an application developer, not a Captivate developer, so can't even make a course to test it on. 🙂 Still, the logic looks OK to me now.

Just a note about something you mentioned in regards to Captivate 5. As far as I can tell, there's no need for a helper SWF there – looks to me like your template could be used just as well for Captivate 5 courses – as long as they're SCORM 2004 and don't use the old LocalConnection API – i.e. as long as the course is published as AS3 and the URL parameters are "?SCORM_API=1.0&SCORM_TYPE=0".

philip wrote on February 3, 2012 at 9:26 am:

@jimmi Adobe intended to stop using LocalConnection in CP5, but I've been told there's a bug in their code that prevents ExternalInterface from being used in Firefox. The external SWF I mentioned is part of Captivate, and contains a copy of Captivate's internal tracking adapter code. When Captivate SWFs initialize, they immediately look to see if the external SWF is there; if found, the Captivate SWF will use the code found in the external SWF for tracking instead of its own internal tracking adapter. So basically a bugfix can be applied to that external SWF.

Jimmi Thøgersen wrote on February 3, 2012 at 3:59 pm:

Well, looking at a course published from Captivate 5, I see only a couple of lines of code in the external SWF – which open a LocalConnection and invoke a method specified in the URL parameters to the swf. Adobe reload that SWF (by rewriting the HTML in the Mozilla-specific <layer>) every time something needs to be sent to Flash.

Looking at the decompiled code of the published SWF, however, there's no use of LocalConnection at all, except for communicating between AVM2 (i.e. AS3) and an embedded AVM1 (AS1/2) movie. There are two lines of code referring to LocalConnection outside of that – on the main timeline:

public var LocalConnectionInUse:Boolean;

and

LocalConnectionInUse = false;

In other words, there seems to be no LocalConnection actually listening to anything the external SWF says. And LocalConnectionInUse is never set to "true" – or used – anywhere in the code.

I don't know how Captivate does the publishing internally – and as mentioned, I can't make my own course and test if LocalConnection <i>might</i> be used in some cases. But judging from the code in the published SWF, it seems it's a rather static process – i.e., the same code seems to be published to the SWF, no matter if the course actually uses it (mmquizzing, I'm looking at you), and no matter what settings are made on the course.

Adding to that, we haven't had a problem with our own template on Firefox (3.5 – 11) when removing it. And although it's very different from your template by now, I see nothing in terms of communication with Flash that would work differently.

Next stop (possibly): Articulate, which – although its javascript is much cleaner – is also much more cumbersome to modify, because it actually implements an entire javascript API (e.g. SCORM_GetMaxTimeAllowed), rather than just wrapping the functions of the SCORM API.

philip wrote on February 3, 2012 at 4:13 pm:

@jimmi

it's a different SWF, not the one in the scorm_support folder. It's called MMTracking.swf, and doesn't ship with Captivate.

As for the Firefox bug in CP5, I haven't encountered it myself, I've only heard of its existence.

RE: the Articulate code, it's a good idea to get familiar with it; it's provided by Rustici Software (scorm.com), and is becoming widely adopted.

Jimmi Thøgersen wrote on February 3, 2012 at 5:15 pm:

Ah, I finally get it. It's not a matter of mmtracking.swf being needed as such, but a matter of it being a place to fix Captivate's tracking (yeah, you said exactly that in the first post, but I somehow read it wrong – and yes, I was looking at scorm_support.swf) – thanks Philip 🙂

I'll wait until the problem shows up (if ever) before I fix it. Hoping this is the last time in a while that we'll have to support Captivate, and I can focus on our internal authoring tool.

Paul Linton wrote on February 3, 2012 at 10:38 pm:

Thanks for this series. It got CP 5 working with the BasicPlayer in the SharePoint Learning Kit (slk.codeplex.com) for me. I found that I need to SetValue("cmi.exit", "") and SetValue("adl.nav.request", "continue") just prior to calling Terminate("") within DoExternalInterface to get the BasicPlayer to correctly take back control when the course finishes.

Even though I removed the scorm_support.htm and .swf entries from the manifest template I find that Captivate complains when publishing that the files are missing. No big deal, I have just added two empty files to scorm_support.

My javascript knowledge is not great and I found myself scratching my head trying to understand the Adobe code, it seemed to do many silly things and redundent things (windows 3.1, yikes!). Then I found this series of articles and the light was turned on. Many, many thanks.

philip wrote on February 3, 2012 at 11:45 pm:

@paul you're welcome, thanks for the feedback

nancy wrote on February 14, 2012 at 4:45 pm:

I have no cents to add, just a few questions.

What is mmtracking.swf?

Why is our LMS vendor insisting it is a problem?

LMS is IntraLearn (the Yugo of LMSs) and we use Captivate 5.5.

philip wrote on February 15, 2012 at 1:08 pm:

mmtracking.swf is a SWF that enables you to plug custom tracking mechanisms into Captivate. 99.9% of Captivate users will never see it or need it — mmtracking.swf is not even publicly available. Your vendor might think it's a problem because Captivate SWFs always looks for the mmtracking.swf file when launching, generating a 404 "file not found" error. This is harmless and can be ignored.

WL wrote on February 16, 2012 at 5:56 am:

This is amazing stuff
I'm sure I speak for the whole community when I say thanks
One question if you can help….In the old template (yuk) I used to add 100% in place of the width and hight but doing so in the new improved one sends the swf off screen
how do I get the swf to resize with the browser?

thanks

WL

philip wrote on February 21, 2012 at 12:56 pm:

@wl it requires different CSS, and setting a scalemode in SWFObject. i'll add it to the wishlist for future updates.

Yemi wrote on February 27, 2012 at 3:10 am:

Hi,

Am really not good with swf and flash programming, although would love to learn, after replacing the scorm 1.4 and scorm 2004 files with the ones recommended, i attempted publishing and got some errors after publishing.

The title bar had "C:stagedevsourcecomponentsziputilsCPInternalZipUtils.cpp524

said "Filedoesnt exist…\publish_pathscorm_supportscorm_support.htm" and also for "scorm_support.swf"

I published using the default IMS setting in captivate.

I am using adobe captivate 5.5

Please advise.

philip wrote on February 27, 2012 at 10:57 am:

@yemi those files are no longer used by the template. it should be safe to ignore the warning.

Martin wrote on March 8, 2012 at 7:30 am:

Hi Philip,

Thanks a lot for your great work! We tried this hoping our problems get solved. Unfortunately we still have the same problem:

SCORM 1.2 or 2004 files (no matter which combination of reporting options – we've tested 40 combinations, f.e. self paced learning on/off) are freezing LMS (f.e. Clixx or SAP LSO) if module contains Quiz slides and "Send resume data" is activated. Error appears if SCORM module is closed being on a quiz slide. After resuming the module the module freezes. Tested on Firefox and Internet Explorer several times. Tried using different SCORM templates – even your new templates. Same result. Must be a problem of Captivate itself?

The result: Captivate modules containing quiz slides cannot be used in combination with "Send resume data" …

Any ideas? Many thanks for your help!

Best regards,
Martin

philip wrote on March 8, 2012 at 3:20 pm:

@martin i haven't encountered the issue myself, but i know it's a problem for many others, depending on the LMS being used. it's definitely a Captivate issue, and my hunch is that it's either a result of the string formatting being used by Captivate, or that the string is too large and gets truncated, causing an error. I know the string truncation occurs with suspend_data in SCORM 1.2; the official limit is 4096 bytes, so it's not hard to exceed that number when building large Captivate courses.

Marek wrote on April 17, 2012 at 2:34 am:

Hi,
I found one problem in new solution. When I published my course with template SendTrackingDataAtEnd, the content was not visible in Web browsers. I chceked in the console of Browser and I found one error – CONFIG is not defined. IHMO there is a problem, because:
– main htm file after publish with another template was changed,
– in SCORM_support folder there is no files (scorm_support.swf and scorm_support.js) which are used by another template.

philip wrote on April 17, 2012 at 12:53 pm:

@marek SendTrackingDataAtEnd is independent of my template. As described in my posts, when installing my template, you will be replacing the built-in SCORM code. It is implied that any Captivate files relying on the old Captivate SCORM code — such as SendTrackingDataAtEnd — will fail.

Really, the point of my template is to make SendTrackingDataAtEnd moot. SendTrackingDataAtEnd was created by Adobe as a workaround for the SCORM bugginess in their standard SCORM template; if you use my template you shouldn't encounter those issues anymore. I suggest deleting SendTrackingDataAtEnd.

Series Navigation<< Cleaning up Adobe Captivate’s SCORM Publishing Template, Part 6: Bugs & Scope CreepImportant Adobe Captivate SCORM template update >>

Similar Posts

24 Comments

  1. This is great and very helpfull, Its a shock that it was in this state!

    I feel a bit ashamed, as you have put so much time and effort into this, but have you got an idea when we might see a modified captivate the 1.2 SCORM template?

    I hope adobe are listening

    WL

  2. You continue to be awesome! Here’s hoping that you find copious spare time for the 1.2 revision. Our LMS, Peoplesoft ELM, only recently got 2004 support, and we are hesitant to use it.

    All of our current captivate modules use 1.2, so any improvements would be gratefully accepted.

    Anyhow, thanks for all the great work and thought on this!

    Michael

  3. Hi,

    I have also struggled with Captivate 5.5 Scorm 1.2 compatiability with Saba LMS. This is a road block to a commercial deliverable, so I am happy to pay for a robust solution, that can also be given away to the next guy?

    All the Articulate users here in Singapore, are using your scripts from Saba support, so the fixes and work arounds are well know, not so much so with Captivate. Please email me when you have the chance.

    Regards Joel

  4. Hi Philip – and Joel

    Just a few pointers on Saba (I’m afraid I can’t help much there either, Joel): There are plenty of issues with Saba and Captivate (I should know, been writing a Captivate 5 SCORM 2004 template from scratch over the past weeks – with some great inspiration from these articles – thanks!).

    For one, Saba doesn’t like the SCO asking for cmi.score.*, cmi.suspend_data etc. when it’s just told it a moment ago that cmi.entry is “ab-initio” (understandable). It also doesn’t like how Captivate’s rdcmdExit sends cmi.exit = “suspend” no matter if the course is completed.

    Anyway, just to give something back (hopefully), I also submitted an issue on GitHub, which has to do with cmiCache never updating the value store. Hope it helps.

    Not going to file an issue for this other one (because I don’t have the time at the moment), but I’m quite sure this line (in the SetValue handler) won’t do much:

    if(parameter === “completion_status”){ courseStatus = value; }

    Should be “cmi.completion_status” surely?

    Anyway, thanks for some great insights – knowledge sharing in the e-learning/courseware business isn’t exactly a given. 🙂

    Jimmi

  5. Looks good to me – can’t actually test it (re: your reply on the issue), because our own code is quite different – for one, all the cases for handling Captivate’s calls are moved into their own functions – which are then also used for our “manual” calls to the LMS (this means our manual calls to e.g. SetValue are cached too). And I’m an application developer, not a Captivate developer, so can’t even make a course to test it on. 🙂 Still, the logic looks OK to me now.

    Just a note about something you mentioned in regards to Captivate 5. As far as I can tell, there’s no need for a helper SWF there – looks to me like your template could be used just as well for Captivate 5 courses – as long as they’re SCORM 2004 and don’t use the old LocalConnection API – i.e. as long as the course is published as AS3 and the URL parameters are “?SCORM_API=1.0&SCORM_TYPE=0”.

    1. @jimmi Adobe intended to stop using LocalConnection in CP5, but I’ve been told there’s a bug in their code that prevents ExternalInterface from being used in Firefox. The external SWF I mentioned is part of Captivate, and contains a copy of Captivate’s internal tracking adapter code. When Captivate SWFs initialize, they immediately look to see if the external SWF is there; if found, the Captivate SWF will use the code found in the external SWF for tracking instead of its own internal tracking adapter. So basically a bugfix can be applied to that external SWF.

  6. Well, looking at a course published from Captivate 5, I see only a couple of lines of code in the external SWF – which open a LocalConnection and invoke a method specified in the URL parameters to the swf. Adobe reload that SWF (by rewriting the HTML in the Mozilla-specific <layer>) every time something needs to be sent to Flash.

    Looking at the decompiled code of the published SWF, however, there’s no use of LocalConnection at all, except for communicating between AVM2 (i.e. AS3) and an embedded AVM1 (AS1/2) movie. There are two lines of code referring to LocalConnection outside of that – on the main timeline:

    public var LocalConnectionInUse:Boolean;

    and

    LocalConnectionInUse = false;

    In other words, there seems to be no LocalConnection actually listening to anything the external SWF says. And LocalConnectionInUse is never set to “true” – or used – anywhere in the code.

    I don’t know how Captivate does the publishing internally – and as mentioned, I can’t make my own course and test if LocalConnection might be used in some cases. But judging from the code in the published SWF, it seems it’s a rather static process – i.e., the same code seems to be published to the SWF, no matter if the course actually uses it (mmquizzing, I’m looking at you), and no matter what settings are made on the course.

    Adding to that, we haven’t had a problem with our own template on Firefox (3.5 – 11) when removing it. And although it’s very different from your template by now, I see nothing in terms of communication with Flash that would work differently.

    Next stop (possibly): Articulate, which – although its javascript is much cleaner – is also much more cumbersome to modify, because it actually implements an entire javascript API (e.g. SCORM_GetMaxTimeAllowed), rather than just wrapping the functions of the SCORM API.

  7. @jimmi

    it’s a different SWF, not the one in the scorm_support folder. It’s called MMTracking.swf, and doesn’t ship with Captivate.

    As for the Firefox bug in CP5, I haven’t encountered it myself, I’ve only heard of its existence.

    RE: the Articulate code, it’s a good idea to get familiar with it; it’s provided by Rustici Software (scorm.com), and is becoming widely adopted.

  8. Ah, I finally get it. It’s not a matter of mmtracking.swf being needed as such, but a matter of it being a place to fix Captivate’s tracking (yeah, you said exactly that in the first post, but I somehow read it wrong – and yes, I was looking at scorm_support.swf) – thanks Philip 🙂

    I’ll wait until the problem shows up (if ever) before I fix it. Hoping this is the last time in a while that we’ll have to support Captivate, and I can focus on our internal authoring tool.

  9. Thanks for this series. It got CP 5 working with the BasicPlayer in the SharePoint Learning Kit (slk.codeplex.com) for me. I found that I need to SetValue(“cmi.exit”, “”) and SetValue(“adl.nav.request”, “continue”) just prior to calling Terminate(“”) within DoExternalInterface to get the BasicPlayer to correctly take back control when the course finishes.

    Even though I removed the scorm_support.htm and .swf entries from the manifest template I find that Captivate complains when publishing that the files are missing. No big deal, I have just added two empty files to \scorm_support.

    My javascript knowledge is not great and I found myself scratching my head trying to understand the Adobe code, it seemed to do many silly things and redundent things (windows 3.1, yikes!). Then I found this series of articles and the light was turned on. Many, many thanks.

  10. I have no cents to add, just a few questions.

    What is mmtracking.swf?

    Why is our LMS vendor insisting it is a problem?

    LMS is IntraLearn (the Yugo of LMSs) and we use Captivate 5.5.

    1. mmtracking.swf is a SWF that enables you to plug custom tracking mechanisms into Captivate. 99.9% of Captivate users will never see it or need it — mmtracking.swf is not even publicly available. Your vendor might think it’s a problem because Captivate SWFs always looks for the mmtracking.swf file when launching, generating a 404 “file not found” error. This is harmless and can be ignored.

  11. This is amazing stuff
    I’m sure I speak for the whole community when I say thanks
    One question if you can help….In the old template (yuk) I used to add 100% in place of the width and hight but doing so in the new improved one sends the swf off screen
    how do I get the swf to resize with the browser?

    thanks

    WL

  12. Hi,

    Am really not good with swf and flash programming, although would love to learn, after replacing the scorm 1.4 and scorm 2004 files with the ones recommended, i attempted publishing and got some errors after publishing.

    The title bar had “C:\stage\dev\source\components\ziputils\CPInternalZipUtils.cpp524

    said “Filedoesnt exist…\\publish_path\scorm_support\scorm_support.htm” and also for “scorm_support.swf”

    I published using the default IMS setting in captivate.

    I am using adobe captivate 5.5

    Please advise.

  13. Hi Philip,

    Thanks a lot for your great work! We tried this hoping our problems get solved. Unfortunately we still have the same problem:

    SCORM 1.2 or 2004 files (no matter which combination of reporting options – we’ve tested 40 combinations, f.e. self paced learning on/off) are freezing LMS (f.e. Clixx or SAP LSO) if module contains Quiz slides and “Send resume data” is activated. Error appears if SCORM module is closed being on a quiz slide. After resuming the module the module freezes. Tested on Firefox and Internet Explorer several times. Tried using different SCORM templates – even your new templates. Same result. Must be a problem of Captivate itself?

    The result: Captivate modules containing quiz slides cannot be used in combination with “Send resume data” …

    Any ideas? Many thanks for your help!

    Best regards,
    Martin

    1. @martin i haven’t encountered the issue myself, but i know it’s a problem for many others, depending on the LMS being used. it’s definitely a Captivate issue, and my hunch is that it’s either a result of the string formatting being used by Captivate, or that the string is too large and gets truncated, causing an error. I know the string truncation occurs with suspend_data in SCORM 1.2; the official limit is 4096 bytes, so it’s not hard to exceed that number when building large Captivate courses.

  14. Hi,
    I found one problem in new solution. When I published my course with template SendTrackingDataAtEnd, the content was not visible in Web browsers. I chceked in the console of Browser and I found one error – CONFIG is not defined. IHMO there is a problem, because:
    – main htm file after publish with another template was changed,
    – in SCORM_support folder there is no files (scorm_support.swf and scorm_support.js) which are used by another template.

    1. @marek SendTrackingDataAtEnd is independent of my template. As described in my posts, when installing my template, you will be replacing the built-in SCORM code. It is implied that any Captivate files relying on the old Captivate SCORM code — such as SendTrackingDataAtEnd — will fail.

      Really, the point of my template is to make SendTrackingDataAtEnd moot. SendTrackingDataAtEnd was created by Adobe as a workaround for the SCORM bugginess in their standard SCORM template; if you use my template you shouldn’t encounter those issues anymore. I suggest deleting SendTrackingDataAtEnd.

Comments are closed.