private void init() throws IOException {
   // Make sure its there
   if (scormSettingsHandler.getManifestFile().exists()) {
     try {
       _navViewer = new NavigationViewer(scormSettingsHandler);
     } catch (IOException e) {
       throw e;
     } catch (JDOMParseException e) {
       throw new IOException("Parse exception", e);
     } catch (Exception ex) {
       throw new OLATRuntimeException(ScormManager.class, "Could not load manifest", ex);
     }
     // Package Links - use a clone so we can add referenced elements
     Element manifestRoot = (Element) _navViewer.getRootElement().clone();
     // now get the organizations node
     Element orgs = manifestRoot.getChild(CP_Core.ORGANIZATIONS, manifestRoot.getNamespace());
     Element[] tmp = _navViewer.getOrganizationList();
     organizationElements = new LinkedList();
     for (int i = 0; i < tmp.length; ++i) {
       organizationElements.add(tmp[i]);
     }
     // remember the default organization
     _defaultorg = _navViewer.getDefaultOrgElement(orgs);
     // NO orgs, so cant play - flag it
     if (_defaultorg == null) {
       _ReloadNoItemFoundExceptionFlag = false;
     } else {
       _sequence =
           new SequenceManager(
               _defaultorg.getAttributeValue(CP_Core.IDENTIFIER), scormSettingsHandler);
       // it exists so try to load it...
       try {
         initialize();
       } catch (Exception ex) {
         _error_found = true;
         throw new OLATRuntimeException(ScormManager.class, "Could not initialise manifest", ex);
       }
     } //
   } else {
     // problems if we cannot find the nav file...
     _error_found = true;
   }
 }
 /**
  * Recursive method to find all of the javascript strings (item info) and populate the sequencer
  *
  * @param javascriptStrings
  * @param element
  * @param menuParent
  * @param useRelativePaths
  */
 protected void createNavLinks(
     Vector javascriptStrings, Element element, String menuParent, boolean useRelativePaths) {
   String name = element.getName();
   // ORGANIZATION
   if (name.equals(CP_Core.ORGANIZATION) && _navViewer.isDocumentNamespace(element)) {
     ++_orgCount;
     String orgId = element.getAttributeValue(CP_Core.IDENTIFIER);
     menuParent = "menu";
     String title = "Organization";
     // Display Title if there is one
     Element titleElement = element.getChild(CP_Core.TITLE, element.getNamespace());
     if (titleElement != null) {
       if (!titleElement.getText().equals("")) title = titleElement.getText();
     }
     // find out if this the default organization...
     String _defaultOrganization = _defaultorg.getAttributeValue(CP_Core.IDENTIFIER);
     if (_defaultOrganization != null) {
       if (_defaultOrganization.equals(orgId)) {
         writePackageSettings(javascriptStrings, "_defaultOrg", _orgCount);
       }
     }
     writeOrganization(javascriptStrings, title, orgId);
   }
   // ITEM
   else if (name.equals(CP_Core.ITEM) && _navViewer.isDocumentNamespace(element)) {
     ++_itemCount;
     String itemId = element.getAttributeValue(CP_Core.IDENTIFIER);
     String hyperLink = "";
     String url = "";
     String scoType = "";
     // Display Title if there is one
     String title = "Item";
     Element titleElement = element.getChild(CP_Core.TITLE, element.getNamespace());
     if (titleElement != null) {
       if (!titleElement.getText().equals("")) title = titleElement.getText();
     }
     // check to see that the isvisible attribute is not set to false...
     String isVisibleAttrib = element.getAttributeValue(CP_Core.ISVISIBLE);
     if (isVisibleAttrib != null) {
       if (isVisibleAttrib.equals("false")) {
         title = "* hidden";
       }
     }
     // What does this Item reference?
     Element ref_element = _navViewer.getScormCore().getReferencedElement(element);
     String prerequisites = "";
     if (ref_element != null) {
       String ref_name = ref_element.getName();
       // A RESOURCE
       if (ref_name.equals(CP_Core.RESOURCE)) {
         scoType = _navViewer.findScoType(element);
         // Relative path for export - Note the "../" is relative to where the
         // Nav file is!
         if (useRelativePaths) {
           url = _navViewer.getScormCore().getRelativeURL(element);
           // Only if local path add relative bit
           if (isExternalURL(url) == false) {
             url = "../" + url;
           }
         }
         // Absolute Paths for Previewing in-situ
         else {
           String turl = _navViewer.getLaunch(element);
           url = turl;
         }
         if (url != null) {
           hyperLink = url;
           if (!title.equals("* hidden")) {
             prerequisites = _navViewer.getPrerequisites(element);
             if (prerequisites == null) {
               prerequisites = "";
             }
           }
         }
       }
       // A sub-MANIFEST
       else if (ref_name.equals(CP_Core.MANIFEST)) {
         hyperLink = "javascript:void(0)";
         // Get ORGANIZATIONS Element
         Element orgsElement =
             ref_element.getChild(CP_Core.ORGANIZATIONS, ref_element.getNamespace());
         // Now we have to get the default ORGANIZATION
         if (orgsElement != null)
           ref_element = _navViewer.getScormCore().getDefaultOrganization(orgsElement);
         // Get the children of the referenced <organization> element and graft
         // clones
         if (ref_element != null) {
           Iterator it = ref_element.getChildren().iterator();
           while (it.hasNext()) {
             Element ref_child = (Element) it.next();
             element.addContent((Element) ref_child.clone());
           }
         }
       }
     } else {
       hyperLink = "javascript:void(0)";
     }
     // System.out.println("adding to sequencer:"+ itemId + " " + hyperLink+ "
     // " + _itemCount+ " " + scoType+ " " +title+ " " + prerequisites);
     _sequence.addNewItem(itemId, hyperLink, _itemCount, scoType, title, prerequisites);
     writeItem(javascriptStrings, title, hyperLink, itemId, menuParent);
     menuParent = itemId;
   }
   // round we go again...
   Iterator it = element.getChildren().iterator();
   while (it.hasNext()) {
     Element child = (Element) it.next();
     createNavLinks(javascriptStrings, child, menuParent, useRelativePaths);
   }
 }
 public int getNumOfSCOs() {
   return _navViewer.getAllScoIdentifiers().length;
 }
 public String[] getAllScoIdentifiers() {
   return _navViewer.getAllScoIdentifiers();
 }
 /**
  * A method to do some initialising before we actually play the package. Here we get the default
  * organization and then pass that to a method which will parse that organization (JDOM) and
  * figure out what we need, in terms of items, sequence, prerequisites, etc
  */
 public void initialize() {
   if (_navViewer.getDocument() == null) {
     return;
   }
   _javascriptStrings = parse(false);
 }