An example of importing Embedded Coder code into the mbed IDE. Currently doesn't connect IO to PWM, ADC, and Encoder, instead provides random inputs and measures execution time.

Dependencies:   mbed-dsp mbed Nucleo_pmsmfoc

Dependents:   Nucleo_pmsmfoc

Revision:
2:bbc155b0b886
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/html/html/rtwhilite.js	Tue Nov 25 07:52:02 2014 +0000
@@ -0,0 +1,1850 @@
+// Copyright 2007-2014 The MathWorks, Inc.
+
+// Class RTW_Hash ------------------------------------------------------------
+// Internal web browser doesn't change window.location.hash if the link points
+// to the same page.
+// RTW_Hash remembers the hash value when the page is loaded in the first time 
+// or a link is clicked.
+// removeHiliteByHash cleans the high lighted elements according to the stored 
+// hash value
+function RTW_Hash(aHash) {
+    if (aHash == null) {
+        this.fHash = "";
+    } else {
+        this.fHash = aHash;
+    };
+    
+    this.getHash = function() {
+        return this.fHash;
+    }
+
+    this.setHash = function(aHash) {
+        this.fHash = aHash;
+    }
+}
+
+RTW_Hash.instance = null;
+
+// Class RTW_TraceInfo --------------------------------------------------------
+function RTW_TraceInfo(aFileLinks) {
+  this.fFileLinks = aFileLinks;
+  this.fLines = new Array();
+  this.fTotalLines = 0; // total number of highlighted lines
+  this.fNumLines = new Array();
+  this.fFileIdxCache = new Array();
+  this.fDisablePanel = false;
+  this.fCurrFileIdx = 0;
+  this.fCurrLineIdx = 0;
+  this.fCurrCodeNode = null;
+  this.getHtmlFileName = function(aIndex) {
+    if (aIndex < this.fFileLinks.length) {
+      var href = this.fFileLinks[aIndex].href;
+      return href.substring(href.lastIndexOf('/')+1);
+    }
+  }
+  this.getSrcFileName = function(aIndex) {
+    var name = this.getHtmlFileName(aIndex);
+    if (name)
+      name = RTW_TraceInfo.toSrcFileName(name);
+    return name;
+  }
+  this.getNumFileLinks = function() {
+    return this.fFileLinks.length;
+  }
+  this.setFileLinkColor = function(aIndex, aColor) {
+    var link = this.fFileLinks[aIndex];
+    if (link && link.parentNode && link.parentNode.style)
+      link.parentNode.style.backgroundColor = aColor;
+  }
+  this.highlightFileLink = function(aIndex, aColor) {
+    for (var i = 0; i < this.fFileLinks.length; ++i) {
+      this.setFileLinkColor(i, i == aIndex ? aColor : "");
+    }
+  }
+  this.highlightCurrFileLink = function(aColor) {
+    this.highlightFileLink(this.fCurrFileIdx);
+  }
+  this.highlightLines = function(aCodeNode,aColor) {
+    this.fCurrCodeNode = aCodeNode;
+    var lines = this.fLines[this.getHtmlFileName(this.fCurrFileIdx)];
+    if (lines && aCodeNode) {
+      for (var i = 0; i < lines.length; ++i) {
+        var lineObj = aCodeNode.childNodes[lines[i]-1];
+        if (lineObj)
+          lineObj.style.backgroundColor=aColor;
+      }
+    }
+  }
+  this.getFileIdx = function(aFile) {
+    if (this.fFileIdxCache[aFile] != null)
+      return this.fFileIdxCache[aFile];
+    for (var i = 0; i < this.fFileLinks.length; ++i) {
+      if (this.getHtmlFileName(i) == aFile) {
+        this.fFileIdxCache[aFile] = i;
+        return i;
+      }
+    }
+    return null;
+  }
+  this.getCurrFileIdx = function() { return this.fCurrFileIdx; }
+  this.setNumHighlightedLines = function(aFileIdx, aNumLines) {
+    this.fNumLines[aFileIdx] = aNumLines;
+    updateNumHighlightedLines(this.fFileLinks[aFileIdx], aNumLines);
+  }
+  this.getNumLines = function(aFileIdx) {
+    return this.fNumLines[aFileIdx] != null ? this.fNumLines[aFileIdx] : 0;
+  }
+  this.getNumLinesAll = function() {
+      var sum = 0;
+      var len = this.fNumLines.length;
+      for (var i = 0; i < len; ++i) {
+          sum += this.getNumLines(i);
+      }
+      return sum;
+  }
+  this.getPrevButton = function() {
+      var aFrame = getNavFrame();
+      if (typeof aFrame !== "undefined" && aFrame !== null)
+          return aFrame.document.getElementById("rtwIdButtonPrev");
+      else
+          return document.getElementById("rtwIdButtonPrev");
+  }
+  this.getNextButton = function() {
+      var aFrame = getNavFrame();
+      if (typeof aFrame !== "undefined" && aFrame !== null)
+          return aFrame.document.getElementById("rtwIdButtonNext");
+      else
+          return document.getElementById("rtwIdButtonNext");
+  }
+  this.getPanel = function() {
+      var aFrame = getNavFrame();
+      if (typeof aFrame !== "undefined" && aFrame !== null)
+          return aFrame.document.getElementById("rtwIdTracePanel");
+      else
+          return document.getElementById("rtwIdTracePanel");
+  }
+  this.removeHighlighting = function() {
+    for (var i = 0; i < this.fFileLinks.length; ++i) {
+      this.setFileLinkColor(i, "");
+      this.setNumHighlightedLines(i, 0);
+    }
+    // remove highlight and reset current code node
+    try {
+        if (this.fCurrCodeNode != null)
+            this.highlightLines(getCodeNode(),"");
+    } catch (e) {};
+    this.fCurrCodeNode = null;    
+    if (this.getPrevButton()) { this.getPrevButton().disabled = true; }
+    if (this.getNextButton()) { this.getNextButton().disabled = true; }
+    if (this.getPanel()) { this.getPanel().style.display = "none"; }
+    this.fCurrFileIdx = 0;
+    this.fCurrLineIdx = 0;
+  }
+  this.setCurrLineIdx = function(aLineIdx) {
+    this.fCurrLineIdx = aLineIdx;
+  }
+  this.getCurrLineIdx = function() { return this.fCurrLineIdx; }
+  this.setCurrent = function(aFileIdx, aLineIdx) {
+    this.fCurrFileIdx = aFileIdx;
+    var numLines = this.getNumLines(aFileIdx);
+    if (!numLines || aLineIdx >= numLines)
+      this.fCurrLineIdx = -1;
+    else
+      this.fCurrLineIdx = aLineIdx;
+    var allNumLines = this.getNumLinesAll();
+    if (this.getPrevButton()) {
+      this.getPrevButton().disabled = (allNumLines <= 1 || !this.hasPrev());
+    }
+    if (this.getNextButton()) {
+      this.getNextButton().disabled = (allNumLines <= 1 || !this.hasNext());
+    }
+    if (this.getPanel() && !this.fDisablePanel) {
+      this.getPanel().style.display = 'block';
+    }
+  }
+  this.setDisablePanel = function(aDisable) {
+    this.fDisablePanel = aDisable;
+  }
+  this.getPrevFileIdx = function() {
+    if (this.fCurrLineIdx > 0)
+      return this.fCurrFileIdx;
+    for (var i = this.fCurrFileIdx - 1; i >= 0; --i)
+      if (this.fNumLines[i] > 0)
+        return i;
+    return null;
+  }
+  // update the navigation bar state
+  this.updateNavState = function() {
+      if (this.getPrevButton())
+          this.getPrevButton().disabled = !this.hasPrev();
+      if (this.getNextButton())
+          this.getNextButton().disabled = !this.hasNext();
+      setTraceNumber();
+  }
+  this.hasPrev = function() {
+    return this.getPrevFileIdx() != null;
+  }
+  this.getFirstFileIdx = function() {
+      for (var i = 0; i < this.getNumFileLinks(); ++i)
+          if (this.fNumLines[i] > 0)
+              return i;
+  }
+  this.getLastFileIdx = function() {
+      for (var i = this.getNumFileLinks(); i >= 0; --i)
+          if (this.fNumLines[i] > 0)
+              return i;
+  }
+  this.goFirst = function() {
+    this.fCurrFileIdx = this.getFirstFileIdx();
+    this.fCurrLineIdx = 0;
+    this.updateNavState();
+  }
+  this.goLast = function() {
+    this.fCurrFileIdx = this.getLastFileIdx();;
+    this.fCurrLineIdx = this.getNumLines(this.fCurrFileIdx) - 1;
+    this.updateNavState();
+  }
+  this.goPrev = function() {
+    var fileIdx = this.getPrevFileIdx();
+    if (fileIdx == null)
+      return;
+    if (fileIdx == this.fCurrFileIdx)
+      --this.fCurrLineIdx;
+    else {
+      this.fCurrFileIdx = fileIdx;
+      this.fCurrLineIdx = this.getNumLines(fileIdx) - 1;
+    }
+    this.updateNavState();
+  }
+  this.getNextFileIdx = function() {
+    if (this.fCurrLineIdx < this.getNumLines(this.fCurrFileIdx) - 1 && this.getNumLines(this.fCurrFileIdx) > 0)
+      return this.fCurrFileIdx;
+    for (var i = this.fCurrFileIdx + 1; i < this.getNumFileLinks(); ++i)
+      if (this.fNumLines[i] > 0)
+        return i;
+    return null;
+  }
+  this.hasNext = function() {
+    return this.getNextFileIdx() != null;
+  }
+  this.goNext = function() {
+    var fileIdx = this.getNextFileIdx();
+    if (fileIdx == null)
+      return;
+    if (fileIdx == this.fCurrFileIdx)
+      ++this.fCurrLineIdx;
+    else {
+      this.fCurrFileIdx = fileIdx;
+      this.fCurrLineIdx = 0;
+    }
+    this.updateNavState();
+  }
+  this.setTotalLines = function(num) {
+      this.fTotalLines = num;
+  }
+  this.getTotalLines = function() { return this.fTotalLines;}
+  this.setLines = function(aFile, aLines) {
+    this.fLines[aFile] = aLines;
+    var index = this.getFileIdx(aFile);
+    if (index != null)
+      this.setNumHighlightedLines(index,aLines.length);
+  }
+  this.getLines = function(aFile) {
+    return this.fLines[aFile];
+  }
+  // get current on focus line number
+  this.getCurrLine = function() {
+      var file = this.getHtmlFileName(this.getCurrFileIdx());
+      var lines = this.fLines[file];
+      var line = null;
+      if (lines) {
+          var line = lines[this.fCurrLineIdx];
+      }
+      return line;
+  }
+  this.getHRef = function(aFileIdx, aLineIdx, offset) {
+    var file = this.getHtmlFileName(aFileIdx);
+    var lines = this.fLines[file];
+    if (lines) {
+      var line = lines[aLineIdx];
+      line = offset_line(line, offset);
+      file = file+"#"+line;
+    }
+    return file;
+  }
+    
+  this.getCurrentHRef = function(offset) {
+      return this.getHRef(this.fCurrFileIdx, this.fCurrLineIdx, offset);
+  }
+  this.setInitLocation = function(aFile, aLine) {
+    var fileIdx = this.getFileIdx(aFile);
+    var lineIdx = null;
+    if (fileIdx != null && aLine) {
+      var lines = this.getLines(aFile);
+      for (var i = 0; i < lines.length; ++i) {
+        if (lines[i] == aLine) {
+          lineIdx = i;
+          break;
+        } 
+      }
+    }
+    if (fileIdx == null || lineIdx == null)
+      this.setCurrent(0,-1);
+    else
+      this.setCurrent(fileIdx,lineIdx);
+  }
+}
+
+// Static methods in RTW_TraceInfo
+
+RTW_TraceInfo.getFileLinks = function(docObj) {
+  var links;
+  if (docObj && docObj.getElementsByName)
+    links = docObj.getElementsByName("rtwIdGenFileLinks");
+  return links ? links : new Array();
+}
+
+RTW_TraceInfo.toSrcFileName = function(aHtmlFileName) {
+  aHtmlFileName = aHtmlFileName.replace(/_c.html$/,".c");
+  aHtmlFileName = aHtmlFileName.replace(/_h.html$/,".h");
+  aHtmlFileName = aHtmlFileName.replace(/_cpp.html$/,".cpp");
+  aHtmlFileName = aHtmlFileName.replace(/_hpp.html$/,".hpp");
+  aHtmlFileName = aHtmlFileName.replace(/_cc.html$/,".hpp");
+  return aHtmlFileName;
+}
+
+RTW_TraceInfo.instance = null;
+
+// Class RTW_TraceArgs --------------------------------------------------------
+// file.c:10,20,30&file.h:10,20,30[&color=value] or 
+// sid=model:1[&color=value]
+RTW_TraceArgs = function(aHash) {
+  this.fColor = null;
+  this.fFontSize = null;
+  this.fInitFile = null;
+  this.fInitLine = null;
+  this.fSID = null;
+  this.fFiles = new Array();
+  this.fLines = new Array();
+  this.fMessage = null;
+  this.fBlock = null;  
+  this.fUseExternalBrowser = true;
+  this.fModel2CodeSrc = null;
+  this.fInCodeTrace = false;
+  this.fTraceData = null;
+  this.fFileIdx = []; // filename to fileId
+  this.fRows = []; // highlighted rows indexed by fileId
+  this.fIDs = []; // highlighted IDs indexed by fileId
+
+  this.hasSid = function() {
+      return !(this.fSID == null);
+  }
+  this.parseCommand = function(aHash) {
+      var args = new Array();
+      args = aHash.split('&');
+      for (var i = 0; i < args.length; ++i) {
+          var arg = args[i];
+          sep = arg.indexOf('=');
+          if (sep != -1) {
+              var cmd = arg.substring(0,sep);
+              var opt = arg.substring(sep+1);
+              switch (cmd.toLowerCase()) {
+                case "color":
+                  this.fColor = opt;
+                  break;
+                case "fontsize":
+                  this.fFontSize = opt;
+                  break;
+                case "initfile":
+                  this.fInitFile = RTW_TraceArgs.toHtmlFileName(opt);
+                  break;
+                case "initline":
+                  this.fInitLine = opt;
+                  break;
+                case "msg":
+                  this.fMessage = opt;
+                  break;
+                case "block":
+                  this.fBlock = unescape(opt);
+                  break;
+                case "sid":
+                  this.fSID = opt;
+                  // convert sid to code location
+                  break;
+                case "model2code_src":
+                  // model2code_src from model or webview
+                  this.fModel2CodeSrc = opt;
+                  break;
+                case "useexternalbrowser":
+                  this.fUseExternalBrowser = (opt=="true");
+                  break;
+                case "incodetrace":
+                  this.fInCodeTrace = (opt=="true");
+                  break;
+                case "tracedata":
+                  this.fTraceData = decodeURI(opt);
+                  break;
+              }
+          }
+      }    
+  }
+  this.parseUrlHash = function(aHash) {
+      var rows;
+      if (aHash) {
+          args = aHash.split('&');
+          for (var i = 0; i < args.length; ++i) {
+              var arg = args[i];
+              sep = arg.indexOf(':');
+              if (sep != -1) {
+                  var fileLines = arg.split(':');
+                  var htmlFileName = RTW_TraceArgs.toHtmlFileName(fileLines[0]);
+                  this.fFileIdx[htmlFileName] = i;
+                  this.fFiles.push(htmlFileName);
+                  if (fileLines[1]) {
+                      rows = fileLines[1].split(',');
+                      rows = uniqueRows(rows);
+                      this.fLines.push(rows);
+                      this.fRows[i] = rows;
+                  }
+              }
+          }
+          if (this.fInitFile == null && this.fFiles.length > 0) {
+              this.fInitFile = this.fFiles[0];
+              this.fInitLine = (this.fLines[0] == null ? -1 : this.fLines[0][0]);
+          }
+      }
+  }
+  this.parseUrlHash2 = function(aHash) {
+      aHash = decodeURI(aHash);    
+      var rows;
+      var ids;
+      if (aHash && aHash.length > 0 && aHash[0] === "[") {
+          var input = eval(aHash);  
+          var i;
+          var j;
+          // set highlight files from url
+          for (i=0; i<input.length;i++) {
+              rows = new Array();
+              ids = new Array();
+              this.fFileIdx[input[i].file] = i;
+              this.fFiles.push(input[i].file);
+              ids = input[i].id;
+              for (j=0; j<ids.length;j++) {
+                  // get row number
+                  if (ids[j].indexOf("c") !== -1)
+                      rows.push(Number(ids[j].substring(0,ids[j].indexOf("c")))); 
+                  else
+                      rows.push(Number(ids[j]));
+              }
+              rows = uniqueRows(rows);
+              this.fRows[i] = rows;
+              this.fIDs[i] = ids;
+          }
+      } else {
+          // reset all states
+          this.fFiles = [];
+          this.fRows = [];
+          this.fIDs = [];
+      }
+      return;
+  }
+  this.getFileIdx = function(aFileName) {
+      if (aFileName) {
+          return this.fFileIdx[aFileName];
+      } else {
+          // return the fileIdx of the current display file
+          var pathname = top.rtwreport_document_frame.location.pathname;
+          pathname = pathname.substr(pathname.lastIndexOf("/")+1);
+          // find the highlight file name
+          return this.getFileIdx(pathname);
+      }
+  }
+
+  this.getColor = function() { return this.fColor; }
+  this.getFontSize = function() { return this.fFontSize; }
+  this.getInitFile = function() { return this.fInitFile; }
+  this.getInitLine = function() { return this.fInitLine; }
+  this.getNumFiles = function() { return this.fFiles.length; }
+  this.getSID = function() { return this.fSID; }
+  this.getFile = function(aIdx) { if (isNaN(aIdx)) return this.fFiles; return this.fFiles[aIdx];}
+  this.getLines = function(aIdx) { return this.fLines[aIdx]; } 
+  this.getUseExternalBrowser = function() { return this.fUseExternalBrowser; } 
+  this.getInCodeTrace = function() { return this.fInCodeTrace; } 
+  this.getTraceData = function() { return this.fTraceData; } 
+  this.getModel2CodeSrc = function() { return this.fModel2CodeSrc; }
+  this.setUseExternalBrowser = function(val) { this.fUseExternalBrowser = val; } 
+  this.setInCodeTrace = function(val) { this.fInCodeTrace = val; } 
+  this.setTraceData = function(val) { this.fTraceData = val; } 
+  this.setModel2CodeSrc = function(val) { this.fModel2CodeSrc = val; }
+  this.getRows = function(aIdx) { return this.fRows[aIdx];}
+  this.getIDs = function(aIdx) { return this.fIDs[aIdx]; }
+  this.getBlock = function() { return this.fBlock; }
+  // constructor
+  this.parseCommand(aHash);
+}
+
+// Static methods in RTW_TraceArgs
+
+RTW_TraceArgs.toHtmlFileName = function(aFile) {
+  f = aFile;
+  aFile = f.substring(0,f.lastIndexOf('.')) + '_' + f.substring(f.lastIndexOf('.')+1) + ".html";
+  return aFile;
+}
+
+RTW_TraceArgs.instance = null;
+
+RTW_MessageWindow = function(aWindow, aParagraph) {
+  this.fWindow    = aWindow;
+  this.fParagraph = aParagraph;
+  
+  this.print = function(msg) {
+    this.fParagraph.innerHTML = msg;
+    if (msg)
+      this.fWindow.style.display = "block";
+    else
+      this.fWindow.style.display = "none";
+  }
+  this.clear = function() {
+    this.print("");
+  }
+}
+
+// RTW_MessageWindow factory
+RTW_MessageWindowFactory = function(aDocObj) {
+  this.fDocObj = aDocObj;
+  this.fInstance = null;
+
+  this.getInstance = function() {
+    if (this.fInstance)
+      return this.fInstance;
+    if (!this.fDocObj)
+      return;
+      
+    var table     = this.fDocObj.getElementById("rtwIdMsgWindow");
+    var paragraph = this.fDocObj.getElementById("rtwIdMsg");
+    var button    = this.fDocObj.getElementById("rtwIdButtonMsg");
+
+    if (!table || !paragraph || !button)
+      return null;
+
+    obj = new RTW_MessageWindow(table,paragraph);
+    button.onclick = function() { obj.clear(); }
+    this.fInstance = obj;
+    return this.fInstance;
+  }
+}
+
+RTW_MessageWindowFactory.instance = null;
+RTW_MessageWindow.factory = function(aDocObj) {
+  if (!RTW_MessageWindowFactory.instance)
+    RTW_MessageWindowFactory.instance = new RTW_MessageWindowFactory(aDocObj);
+  return RTW_MessageWindowFactory.instance.getInstance();
+}
+
+// Callbacks and helper functions ---------------------------------------------
+
+// Helper functions
+function getCodeNode() {
+    return rtwSrcFrame().document.getElementById("RTWcode");
+}
+
+function rtwMidFrame() {
+    return top.document.getElementById('rtw_midFrame');
+}
+function rtwSrcFrame() {
+  return top.rtwreport_document_frame;
+}
+function rtwTocFrame() {
+  return top.rtwreport_contents_frame;
+}
+function rtwNavToolbarFrame() {
+  return top.rtwreport_navToolbar_frame; // return rtwTocFrame();
+}
+function rtwInspectFrame() {
+  return top.rtwreport_inspect_frame; // return rtwTocFrame();
+}
+function rtwGetFileName(url) {
+  var slashIdx = url.lastIndexOf('/');
+  var hashIdx  = url.indexOf('#', slashIdx);
+  if (hashIdx == -1)
+    return url.substring(slashIdx+1)
+  else
+    return url.substring(slashIdx+1,hashIdx);
+}
+
+// Help function to expand the file group
+function expandFileGroup(docObj, tagID) {
+  if (docObj.getElementById) {
+    var obj_table = docObj.getElementById(tagID);
+    var o;
+    while (obj_table.nodeName != "TABLE") {
+      if (obj_table.parentNode) {
+        obj_table = obj_table.parentNode;
+      } else {
+        return;
+      }
+    }
+    if (obj_table.style.display == "none") {
+      var category_table = obj_table.parentNode;
+      while (category_table.nodeName != "TABLE") {
+        if (category_table.parentNode) {
+          category_table = category_table.parentNode;
+        } else {
+          return;
+        }        
+      }
+      var o = category_table.id + "_button";
+      o = docObj.getElementById(o);
+      if (o && top.rtwreport_contents_frame.rtwFileListShrink) {
+        top.rtwreport_contents_frame.rtwFileListShrink(o, category_table.id, 0);
+      }
+    }
+  }
+}
+// Help function to set the background color based on Element's Id in a document
+// object
+function setBGColorByElementId(docObj, tagID, bgColor) {
+    var status = false;
+    if (bgColor == "") {
+      bgColor = "TRANSPARENT";
+    }
+    
+    if (docObj.getElementById) {
+        var obj2Hilite = docObj.getElementById(tagID);
+        if (obj2Hilite && obj2Hilite.parentNode) {
+            obj2Hilite.parentNode.style.backgroundColor = bgColor;
+            status = true;
+        }
+    }
+    return status;
+}
+
+// Help function to set the background color based on Element's name in a document
+// object
+function setBGColorByElementsName(docObj, tagName, bgColor) {
+  if (bgColor == "") {
+    bgColor = "TRANSPARENT";
+  }  
+  if (docObj.getElementsByName) {
+    var objs2Hilite = docObj.getElementsByName(tagName);
+    for (var objIndex = 0; objIndex < objs2Hilite.length; ++objIndex) {     
+        if (objs2Hilite[objIndex].parentNode)
+            objs2Hilite[objIndex].parentNode.style.backgroundColor = bgColor;
+    }
+  }
+}
+
+// Help function to highlight lines in source file based on Element's name
+// Note: Name of docHiliteByElementsName would be better
+function hiliteByElementsName(winObj, tagName) {
+    var hiliteColor = "#aaffff";
+    if (winObj.document)
+        setBGColorByElementsName(winObj.document, tagName, hiliteColor);
+}
+
+// Help function to remove the highlight of lines in source file based on Element's name
+function removeHiliteByElementsName(winObj, tagName) {
+    if (winObj.document)
+        setBGColorByElementsName(winObj.document, tagName, "");
+}
+
+// Help function to set the background color based on the URL's hash
+function setBGColorByHash(docObj, bgColor) {    
+    if (docObj.location) {
+        var tagName = docObj.location.hash;
+        // Use the stored hash value if it exists because the location.hash
+        // may be wrong in internal web browser
+        if (RTW_Hash.instance)
+            tagName = RTW_Hash.instance.getHash();
+        if (tagName != null)
+            tagName = tagName.substring(1);
+        
+        var codeNode = docObj.getElementById("RTWcode");
+        if (tagName != null && tagName != "") {        
+            if (!isNaN(tagName))
+                tagName = Number(tagName) + 10;            
+            setBGColorByElementsName(docObj, tagName, bgColor);
+        }
+   }
+}
+
+// Highlight the lines in document frame based on the URL's hash
+function hiliteByHash(docObj) {       
+    var hiliteColor = "#aaffff";  
+    setBGColorByHash(docObj, hiliteColor);
+}
+
+// Remove highlight of lines in document frame based on the URL's hash
+function removeHiliteByHash(winObj) {
+    if (winObj.document)
+        setBGColorByHash(winObj.document, "");
+}
+
+// Highlight the filename Element in TOC frame based on the URL's filename
+function hiliteByFileName(aHref) {       
+    var status = false;
+    if (!top.rtwreport_contents_frame)
+        return status;
+    var hiliteColor = GlobalConfig.fileLinkHiliteColor;
+    var fileName = rtwGetFileName(aHref);    
+    if (top.rtwreport_contents_frame.document) {
+        removeHiliteFileList(top.rtwreport_contents_frame);
+        status = setBGColorByElementId(top.rtwreport_contents_frame.document, fileName, hiliteColor);
+        if (status)
+            expandFileGroup(top.rtwreport_contents_frame.document, fileName);
+    }
+    return status;
+}
+
+// Clear the highlights in the code navigation frame.
+function removeHiliteCodeNav(winObj) {    
+    removeHiliteTOC(winObj);
+    removeHiliteFileList(winObj);
+}
+// Clear the highlights in TOC frame. TOC links are named TOC_List
+function removeHiliteTOC(winObj) {    
+    removeHiliteByElementsName(winObj, "TOC_List"); 
+}
+// Clear the highlights in Generated File List. 
+// The filename links are named rtwIdGenFileLinks,
+function removeHiliteFileList(winObj) {    
+    removeHiliteByElementsName(winObj, "rtwIdGenFileLinks");
+}
+
+// Highlight TOC hyperlinks by their Ids.
+function tocHiliteById(id) {
+    hiliteColor = GlobalConfig.fileLinkHiliteColor;    
+    if (top && top.rtwreport_contents_frame && top.rtwreport_contents_frame.document) {
+        removeHiliteCodeNav(top.rtwreport_contents_frame);
+        setBGColorByElementId(top.rtwreport_contents_frame.document, id, hiliteColor);
+    }
+}
+
+// onClick function to highlight the link itself
+function tocHiliteMe(winObj, linkObj, bCleanTrace) {
+    hiliteColor = GlobalConfig.fileLinkHiliteColor;
+    // remove the trace info (previous highlighted source code and the navigate
+    // panel)
+    // Clean Trace info only when links in TOC clicked. Links of filenames won't
+    // clean trace info. 
+    if (bCleanTrace) {
+        if (RTW_TraceInfo.instance) {
+            RTW_TraceInfo.instance.setDisablePanel(true);
+            rtwRemoveHighlighting();
+        }
+        closeInspectWindow();        
+    }        
+    removeHiliteCodeNav(winObj);
+    if (linkObj.parentNode) {
+        linkObj.parentNode.style.backgroundColor= hiliteColor;
+    }
+}
+
+// onClick function to clean the currently highlighed lines in document frame
+// based on URL's hash
+// Then highlight lines in document frame based on Element's name
+// It works for links to some elements in the same page, otherwise, 
+// rtwFileOnLoad() in loading page does the job.
+function docHiliteMe(winObj, elementName) {
+    // First, remove the highlighted elements by stored hash value
+    removeHiliteByHash(winObj);
+    // Store the new hash value defined by elementName
+    if (RTW_Hash.instance) {
+      RTW_Hash.instance.setHash("#"+elementName);
+    } else {
+      RTW_Hash.instance = new RTW_Hash("#"+elementName);
+    }
+    hiliteByElementsName(winObj, elementName);
+}
+
+// Callback for generated file load callback
+function rtwFileOnLoad(docObj) {
+  if (!docObj.location || !docObj.location.href)
+      return;
+  // Save the hash value when file is loaded in the first time
+  if (!RTW_Hash.instance) {
+     RTW_Hash.instance = new RTW_Hash(docObj.location.hash);
+  } else {
+     RTW_Hash.instance.setHash(docObj.location.hash);
+  }  
+   
+  updateHyperlinks();
+  // highlight lines in source code file according to the URL hash
+  hiliteByHash(docObj);
+  // highlight the filename in the TOC frame
+  if (top.rtwreport_contents_frame) {
+    if (hiliteByFileName(docObj.location.href)) {
+        // remove the highlights in the TOC frame if filename is hilite successfully
+        removeHiliteTOC(top.rtwreport_contents_frame);
+    }
+  }
+     
+  if (!RTW_TraceInfo.instance)
+    return;
+  if (!docObj.getElementById)
+    return;
+  if (rtwSrcFrame())
+    rtwSrcFrame().focus();
+  var fileName = rtwGetFileName(docObj.location.href);
+  var fileIdx = RTW_TraceInfo.instance.getFileIdx(fileName);
+  if (fileIdx != null) {
+    if (fileIdx != RTW_TraceInfo.instance.getCurrFileIdx())
+      RTW_TraceInfo.instance.setCurrent(fileIdx,-1);
+    var codeNode = docObj.getElementById("RTWcode");
+    var hiliteColor = RTW_TraceArgs.instance.getColor();
+    if (!hiliteColor) {
+        hiliteColor = "#aaffff";
+    }
+    var fontSize = RTW_TraceArgs.instance.getFontSize();
+    if (fontSize) {
+        codeNode.style.fontSize = fontSize;
+    }
+    RTW_TraceInfo.instance.highlightLines(codeNode,hiliteColor);
+    RTW_TraceInfo.instance.highlightFileLink(fileIdx, GlobalConfig.fileLinkHiliteColor);
+  }
+}
+
+function Nav(fileIdx1, fileIdx2) {
+    var filename = top.rtwreport_document_frame.location.pathname.split(/\//);
+    filename = filename[filename.length-1];
+    var currentFileIdx = RTW_TraceInfo.instance.getFileIdx(filename);
+    if (fileIdx1 === currentFileIdx) {
+        top.rtwreport_document_frame.document.location.href = RTW_TraceInfo.instance.getCurrentHRef();
+        top.initLine = top.rtwreport_document_frame.document.location.hash.substr(1);
+        addTagToCurrentLine();
+        if (top.rtwreport_contents_frame) {            
+            if (hiliteByFileName(top.rtwreport_document_frame.location.href))
+                removeHiliteTOC(top.rtwreport_contents_frame);
+        }
+    } else {
+        var aUrl = RTW_TraceInfo.instance.getCurrentHRef();
+        if (hasWebviewFrame()) {
+            top.rtwreport_document_frame.document.location.href=aUrl;
+        } else {
+            top.rtwreport_document_frame.document.location.href=aUrl + "+newPage";
+        }
+    }
+}
+// Callback for "Prev" button
+function rtwGoPrev() {
+  if (RTW_TraceInfo.instance && top.rtwreport_document_frame) {
+    var prevfileIdx = RTW_TraceInfo.instance.getPrevFileIdx();
+    var currfileIdx = RTW_TraceInfo.instance.fCurrFileIdx;
+    rmTagToCurrentLine();
+    RTW_TraceInfo.instance.goPrev();
+    Nav(prevfileIdx, currfileIdx);
+  }
+}
+// Callback for "First" button
+function rtwGoFirst() {
+  if (RTW_TraceInfo.instance && top.rtwreport_document_frame) {
+    var prevfileIdx = RTW_TraceInfo.instance.getFirstFileIdx();
+    var currfileIdx = RTW_TraceInfo.instance.fCurrFileIdx;
+    rmTagToCurrentLine();
+    RTW_TraceInfo.instance.goFirst();
+    Nav(prevfileIdx, currfileIdx);
+  }
+}
+
+// Callback for navigation button onclick
+var navButtonStatus = (function() {
+    var isclicked = false;
+    return {
+        clicked: function () {
+            isclicked = true;
+            return false;
+        },
+        reset: function () {
+            isclicked = false;
+        },
+        isClicked: function () {
+            return isclicked;
+        }
+    };
+})();
+
+// Callback for "Next" button
+function rtwGoNext() {
+  if (RTW_TraceInfo.instance && top.rtwreport_document_frame) {
+    var nextfileIdx = RTW_TraceInfo.instance.getNextFileIdx();
+    var currfileIdx = RTW_TraceInfo.instance.fCurrFileIdx;
+    rmTagToCurrentLine();
+    RTW_TraceInfo.instance.goNext();
+    Nav(nextfileIdx, currfileIdx);
+  }
+}
+// Callback for "Last" button
+function rtwGoLast() {
+  if (RTW_TraceInfo.instance && top.rtwreport_document_frame) {
+    var nextfileIdx = RTW_TraceInfo.instance.getLastFileIdx();
+    var currfileIdx = RTW_TraceInfo.instance.fCurrFileIdx;
+    rmTagToCurrentLine();
+    RTW_TraceInfo.instance.goLast();
+    Nav(nextfileIdx, currfileIdx);
+  }
+}
+
+function addTagToCurrentLine() {
+    rmHiliteClickedToken();
+    tagCurrentLine(true);
+}
+function rmTagToCurrentLine() {
+    tagCurrentLine(false);
+}
+// tag current line by changing the bacgkround color of the line 
+function tagCurrentLine(addColor) {
+    if (RTW_TraceInfo.instance) {
+        var o = top.rtwreport_document_frame.document.getElementById(RTW_TraceInfo.instance.getCurrLine());
+        if (o) {
+            if (addColor) {
+                o.className = "hiliteCurrentLine";            
+            } else {
+                o.className = "hilite";
+            }
+        }
+    }
+}
+// Helper function for main document load callback
+function rtwMainOnLoadFcn(topDocObj,aLoc,aPanel,forceReload) {
+  var loc;
+  var aHash="";
+  var lastArgs = null;
+  var tocDocObj = top.rtwreport_contents_frame.document;
+  if (typeof forceReload === "undefined") {
+      forceReload = false;
+  }
+  // get the hash value from location.
+  if (!aLoc) {
+      loc = topDocObj.location;
+      if (loc.search || loc.hash) {
+          if (loc.search)
+              aHash = loc.search.substring(1);
+          else
+              aHash = loc.hash.substring(1);
+      }
+  } else {
+      aHash = aLoc;
+      if (RTW_TraceArgs.instance)
+          lastArgs = RTW_TraceArgs.instance;
+  }
+
+  // parse URL hash value
+  RTW_TraceArgs.instance = new RTW_TraceArgs(aHash);
+  // load metrics
+  load_metrics();
+  // use incode traceability
+  if (RTW_TraceArgs.instance.getInCodeTrace()) {
+      RTW_TraceArgs.instance.parseUrlHash2(RTW_TraceArgs.instance.getTraceData());
+      inCodeTraceOnload();
+      return;
+  }
+  if (lastArgs !== null) {
+      RTW_TraceArgs.instance.setUseExternalBrowser(lastArgs.getUseExternalBrowser());
+      RTW_TraceArgs.instance.setModel2CodeSrc(lastArgs.getModel2CodeSrc());
+  }    
+
+  // get highlight url using sid
+  if (RTW_TraceArgs.instance.hasSid()) {
+    sid = RTW_TraceArgs.instance.getSID();
+    aHash = RTW_Sid2UrlHash.instance.getUrlHash(sid);    
+  }
+  // parse hash to look for msg=...&block=... pattern
+  RTW_TraceArgs.instance.parseCommand(aHash);
+  // parse hash to look for file.c:10,12&file.h:10,12 
+  RTW_TraceArgs.instance.parseUrlHash(aHash);
+
+  // hide navigation buttons if not in MATLAB
+  if (RTW_TraceArgs.instance.getUseExternalBrowser() && tocDocObj.getElementById) {
+      var o = tocDocObj.getElementById("nav_buttons");
+      if (o != null) {
+          o.style.display = "none";
+      }
+  }
+
+  // hide web view frameset if model2code_src is model
+  if (RTW_TraceArgs.instance.getModel2CodeSrc() === "model") {
+      var o = top.document.getElementById('rtw_webviewMidFrame');
+      if (o) {
+          o.rows = "100%,0%";
+      }
+  }
+
+  // stop onload when it has been loaded
+  if (window.location.search.indexOf("loaded=true") > 0 
+        && top.rtwreport_document_frame.location.href !== "about:blank" && forceReload !== true) {
+      updateHyperlinks();
+      return;
+  }  
+  
+  // modify modelref links
+  update_modelref_report_link(top.rtwreport_contents_frame.document);
+  try {
+      // ignore browser security error 
+      update_modelref_report_link(top.rtwreport_document_frame.document);
+  } catch(e) {};
+
+  // redirect the page based on the url    
+  var initPage = null;
+  if (RTW_TraceArgs.instance.getNumFiles()) {
+    var fileLinks = RTW_TraceInfo.getFileLinks(tocDocObj);
+    RTW_TraceInfo.instance = new RTW_TraceInfo(fileLinks);
+    RTW_TraceInfo.instance.removeHighlighting()
+    var numFiles = RTW_TraceArgs.instance.getNumFiles();
+    var tLines = 0;
+    for (var i = 0; i < numFiles; ++i) {
+      RTW_TraceInfo.instance.setLines(RTW_TraceArgs.instance.getFile(i),RTW_TraceArgs.instance.getLines(i));
+        tLines += RTW_TraceArgs.instance.getLines(i).length;
+    }
+    RTW_TraceInfo.instance.setTotalLines(tLines);
+    if (aPanel == false) {
+      RTW_TraceInfo.instance.setDisablePanel(true);
+    }
+    var initFile = RTW_TraceArgs.instance.getInitFile();
+    RTW_TraceInfo.instance.setInitLocation(initFile,RTW_TraceArgs.instance.getInitLine());
+    if (!hasInCodeTrace()) {
+        initPage = RTW_TraceInfo.instance.getCurrentHRef();
+    } else {
+        initPage = initFile;
+    }
+  } else {
+      // catch error that document frame is in another domain
+      try {
+          var fileDocObj = top.rtwreport_document_frame.document;
+          if (fileDocObj.location && (!fileDocObj.location.href || fileDocObj.location.href == "about:blank")) {
+              var summaryPage = tocDocObj.getElementById("rtwIdSummaryPage");
+              var tracePage = tocDocObj.getElementById("rtwIdTraceability");
+              if (summaryPage) {
+                  initPage = summaryPage.href;
+              } else if (tracePage) {
+                  initPage = tracePage;
+              }
+          }
+      } catch(e) {};
+  }
+  if (RTW_TraceArgs.instance && RTW_TraceArgs.instance.fMessage) {
+    // display diagnostic message
+    var linkId = "rtwIdMsgFileLink";
+    var msgFile = tocDocObj.getElementById(linkId);
+    if (msgFile && msgFile.style) {
+      msgFile.style.display = "block";
+      // Highlight the background of msg link
+      tocHiliteById(linkId);      
+    }
+    initPage = "rtwmsg.html";
+  }
+  if (initPage) {
+      var is_same_page = false;
+      try {
+          var fileDocObj = top.rtwreport_document_frame.document;
+          is_same_page = isSamePage(fileDocObj.location.href, initPage);
+      } catch(e) {};          
+      if (is_same_page) {
+        top.rtwreport_document_frame.location.href = initPage;
+        // Goto the same page won't trigger onload function.
+        // Call it manuelly to highligh new code location.
+          rtwFileOnLoad(top.rtwreport_document_frame.document);        
+     } else {
+        // change current fileDocObj to initPage
+        top.rtwreport_document_frame.location.href = initPage;
+     }
+  }
+}
+
+// Compare if href1(i.e. file:///path/file1.html#222) and href2(i.e.file2.html) are same pages.
+// isSamePage return true if file1 == file2.
+function isSamePage(href1, href2) {
+  var page1 = href1.substring(href1.lastIndexOf('/')+1,href1.lastIndexOf('.html'));
+  var page2 = href2.substring(href2.lastIndexOf('/')+1,href2.lastIndexOf('.html'));
+  return (page1 == page2);
+}
+
+// Callback for main document loading
+function rtwMainOnLoad() {    
+    rtwMainOnLoadFcn(document,null,true, false);
+    var newUrl;
+    // modify history state to avoid reload from pressing back 
+    if (RTW_TraceArgs.instance && !RTW_TraceArgs.instance.getUseExternalBrowser() && 
+        typeof window.history.replaceState === "function") {
+        if (window.location.search.length > 0) {
+            if (window.location.search.indexOf("loaded=true") === -1) {
+                newUrl = document.location.pathname + window.location.search + '&loaded=true';
+            } else {
+                newUrl = document.location.pathname + window.location.search;
+            }
+        } else {
+            newUrl = document.location.pathname + window.location.search + '?loaded=true';
+        }
+        window.history.replaceState("","",newUrl);
+    }
+}
+
+// Helper function for traceability report
+function rtwMainReload(location) {
+  // remove highlight filename and lines before reloading the page
+  if (RTW_TraceInfo.instance)
+     RTW_TraceInfo.instance.removeHighlighting();  
+  rtwMainOnLoadFcn(document,location,true,true);
+}
+
+function rtwMainReloadNoPanel(location) {
+  rtwMainOnLoadFcn(document,location,false,true);
+}
+
+// Callback for hyperlink "Remove Highlighting"
+function rtwRemoveHighlighting() {
+  if (RTW_TraceInfo.instance)
+    RTW_TraceInfo.instance.removeHighlighting();
+    if (rtwSrcFrame()) {
+        rtwSrcFrame().focus();
+    }
+    if (hasInCodeTrace()) {
+        removeInCodeTraceHighlight();
+    }
+}
+
+// Display diagnostic message in document frame
+function rtwDisplayMessage() {
+  var docObj = top.rtwreport_document_frame.document;
+  var msg = docObj.getElementById(RTW_TraceArgs.instance.fMessage);
+  if (!msg) {
+    msg = docObj.getElementById("rtwMsg_notTraceable");
+  }
+  if (msg && msg.style) {
+    msg.style.display = "block"; // make message visible
+    var msgstr = msg.innerHTML;
+    if (RTW_TraceArgs.instance.fBlock) {
+      // replace '%s' in message with block name
+      msgstr = msgstr.replace("%s",RTW_TraceArgs.instance.fBlock);
+    }
+    msg.innerHTML = msgstr;
+  }
+}
+
+function updateHyperlinks() {
+    docObj = top.rtwreport_document_frame;
+    if (docObj && docObj.document) {
+        if (RTW_TraceArgs.instance === null || !RTW_TraceArgs.instance.getUseExternalBrowser()) {
+            var plain_link =  docObj.document.getElementById("linkToText_plain");
+            if (plain_link && plain_link.href && plain_link.href.indexOf("matlab:coder.internal.editUrlTextFile") === -1 ) {
+                plain_link.href = "matlab:coder.internal.editUrlTextFile('" + str2StrVar(plain_link.href) + "')";
+            }          
+            var alink = docObj.document.getElementById("linkToCS");
+            var linkCmd = "matlab:coder.internal.viewCodeConfigsetFromReport";
+            if (alink && alink.href && alink.href.indexOf(linkCmd) === -1) {
+                alink.href = linkCmd+ "('" + str2StrVar(alink.href) + "');";
+            }
+        } else {
+            var alink = docObj.document.getElementById("linkToCS");
+            if (alink && alink.style) {
+                alink.style.display = "none";
+                hidden_link = docObj.document.getElementById("linkToCS_disabled");
+                if (hidden_link)
+                    hidden_link.style.display = "";
+            }
+            if (typeof docObj.document.getElementsByClassName === "function")
+                alinks = docObj.document.getElementsByClassName("callMATLAB");
+            else if (typeof docObj.document.getElementsByName === "function")
+                alinks = docObj.document.getElementsByName("callMATLAB");
+            else
+                alinks = [];
+            for (i = 0; i < alinks.length; i++) {
+ 		alinks[i].href = "javascript:alert('This hyperlink is available only in MATLAB browser.');";
+                alinks[i].style.color = "gray";
+            }
+            alink = docObj.document.getElementById("CodeGenAdvCheck");
+            if (alink && alink.href && alink.href.indexOf("externalweb=true")===-1) {
+                alink.href = alink.href + "?externalweb=true";
+            }
+
+            if (typeof docObj.document.getElementsByName === "function") 
+                var objs = docObj.document.getElementsByName("MATLAB_link");
+            else 
+                objs = [];
+            for (var objIndex = 0; objIndex < objs.length; ++objIndex) {     
+                objs[objIndex].style.display = "none";
+            }
+        }
+    }
+    updateCode2ModelLinks(docObj.document);
+    // modify modelref links
+    update_modelref_report_link(top.rtwreport_contents_frame.document);
+    try {
+        // ignore browser security error 
+        update_modelref_report_link(top.rtwreport_document_frame.document);
+    } catch(e) {};
+}
+
+function update_modelref_report_link(docObj) {
+    if (docObj.getElementsByName) {
+      var arg = "";
+      if (RTW_TraceArgs.instance && !RTW_TraceArgs.instance.getUseExternalBrowser()) {
+          arg = "?useExternalBrowser=false";
+      }
+      if (RTW_TraceArgs && RTW_TraceArgs.instance && RTW_TraceArgs.instance.getModel2CodeSrc() != null) {
+          if (arg.length > 0)
+              arg = arg + "&model2code_src=" + RTW_TraceArgs.instance.getModel2CodeSrc();
+          else
+              arg = "?model2code_src=" + RTW_TraceArgs.instance.getModel2CodeSrc();
+      }
+      if (arg.length > 0) {
+          links = docObj.getElementsByName('external_link');
+          for (var link_idx = 0; link_idx < links.length; ++link_idx) {
+              links[link_idx].href = links[link_idx].href + arg;
+          }
+      }
+  }
+}
+
+function rtwPageOnLoad(id) {
+    // highlight toc entry
+    tocHiliteById(id);
+    // restore elements state
+    if (top && top.restoreState) {
+        if (top.rtwreport_contents_frame && top.rtwreport_contents_frame.document)
+            top.restoreState(top.rtwreport_contents_frame.document);
+        if (top.rtwreport_document_frame && top.rtwreport_document_frame.document)
+            top.restoreState(top.rtwreport_document_frame.document);
+    }
+    updateHyperlinks();
+}
+
+// highlight code after changeSys
+function rtwChangeSysCallback(sid) {
+    if (sid == "" || typeof RTW_Sid2UrlHash == "undefined" || !RTW_Sid2UrlHash.instance)
+        return false;
+    urlHash = RTW_Sid2UrlHash.instance.getUrlHash(sid);
+    if (urlHash != undefined) {
+        if (RTW_TraceArgs && RTW_TraceArgs.instance && 
+            !RTW_TraceArgs.instance.getUseExternalBrowser())
+            urlHash = (urlHash == "")? "?useExternalBrowser=false" : 
+                      urlHash+"&useExternalBrowser=false";
+        rtwMainReload(urlHash, true);
+        return true;
+    } else {
+        // remove highlighting from traceinfo
+        rtwRemoveHighlighting();
+        return false;
+    }
+}
+
+// eml file onload function: highlight line in eml file
+function emlFileOnload(docObj) {
+    var loc = docObj.location;
+    if (loc.hash) {
+        var line = loc.hash.substring(1);
+        hiliteEmlLine(docObj, line);		            
+    }	
+}
+
+// highlight line in an eml file. Ynhighlight previously highligted line first.
+function hiliteEmlLine(docObj, line) {
+    var bgColor;
+    if (top.HiliteCodeStatus)
+        bgColor = "#66CCFF";
+    else
+        bgColor = "#E8D152";
+    // unhighlight
+    if (typeof docObj.HiliteLine != "undefined") {
+	trObj = docObj.getElementById("LN_"+docObj.HiliteLine);
+	if (trObj != null) {
+	    trObj.style.backgroundColor = "";			
+	}
+    }	
+    // hilighlight
+    trObj = docObj.getElementById("LN_"+line);
+    if (trObj != null) {
+	trObj.style.backgroundColor = bgColor;
+	docObj.HiliteLine = line;
+    }
+}
+// eml line onclick callback: highlight C code and current line in eml file
+function emlLineOnClick(docObj,sid,line) {
+    if (top) {
+	top.HiliteCodeStatus = top.rtwChangeSysCallback(sid);        
+    }
+    hiliteEmlLine(docObj, line);
+}
+
+function updateCode2ModelLinks(docObj) {
+    var webviewFrame = top.document.getElementById('rtw_webviewMidFrame');
+    if (webviewFrame) {
+        if (RTW_TraceArgs.instance && 
+            (RTW_TraceArgs.instance.getModel2CodeSrc() !== "model" ||
+             RTW_TraceArgs.instance.getUseExternalBrowser())
+           ) {
+            hiliteCmd = "javascript:top.rtwHilite(";
+        } else {
+            hiliteCmd = "matlab:coder.internal.code2model(";
+        }
+        var objs = docObj.getElementsByName('code2model');
+        var o = null;
+        var str = '';
+        var pattern = "'code2model',";
+        for (var objIndex = 0; objIndex < objs.length; ++objIndex) {     
+            o = objs[objIndex];
+            str = o.href.substring(o.href.indexOf('(')+1);
+            if (str.indexOf(pattern) > -1) {
+                str = str.substring(str.indexOf(pattern) + pattern.length);
+            }
+            o.href = hiliteCmd + str;
+        }
+    }
+}
+
+function rtwHilite(aBlock,aParentSID) {
+    if (aBlock.indexOf('-') !== -1) { 
+        // remove sid range: model:sid:2-10 => model:sid 
+        var s; 
+        s = aBlock.split(':'); 
+        if (s.length > 0) { 
+            s = s[s.length-1]; 
+            if (s.indexOf('-') != -1) { 
+                aBlock = aBlock.substring(0, aBlock.lastIndexOf(':')); 
+            } 
+        } 
+    } 
+    if (typeof aParentSID === "undefined") {
+        if (top.RTW_SidParentMap && top.RTW_SidParentMap.instance)
+            aParentSID = top.RTW_SidParentMap.instance.getParentSid(aBlock);
+        else
+            aParentSID = aBlock;
+    }
+    top.HiliteCodeStatus = true;
+    if (hiliteBlockForRTWReport(aBlock,aParentSID) === false) {
+        if (hiliteBlockForRTWReport(aBlock, aBlock) === false) {
+            rtwHilite(aParentSID);
+        }
+    }
+}
+
+function str2StrVar(str) {
+    return str.replace(/'/g,"''");
+}
+window.onload=rtwMainOnLoad;
+
+// handle incode traceability highlighting
+function inCodeTraceOnload() {  
+    var tocDocObj = top.rtwreport_contents_frame.document;
+    if (!top.RTW_TraceArgs.instance) {
+        var summaryPage = tocDocObj.getElementById("rtwIdSummaryPage");			
+	top.rtwreport_document_frame.location.href = summaryPage.href;	
+	return;
+    }
+
+    var files = top.RTW_TraceArgs.instance.getFile();
+    if (files.length === 0) {
+        if (top.RTW_TraceArgs.instance) {
+          var block = top.RTW_TraceArgs.instance.getBlock();
+            block = block.replace("<", "&lt;").replace(">", "&gt;");
+        }
+	top.rtwreport_document_frame.document.write("<pre>No traceability information for block " + block + ".</pre>");
+	return;
+    };
+
+    var fileLinks = RTW_TraceInfo.getFileLinks(tocDocObj);
+    RTW_TraceInfo.instance = new RTW_TraceInfo(fileLinks);
+
+    // update filelist with num of highlighted lines
+    var tocDoc = top.rtwreport_contents_frame.document;
+    var tLines = 0;
+    for (var i=0; i<files.length;i++) {
+        var fileIdx = top.RTW_TraceArgs.instance.getFileIdx(files[i]);
+        if (typeof fileIdx !== "undefined") {
+            var rows = top.RTW_TraceArgs.instance.getRows(fileIdx);
+            var linkNode =  tocDoc.getElementById(files[i]);
+            updateNumHighlightedLines(linkNode, rows.length);
+            RTW_TraceInfo.instance.setLines(files[i], rows);
+            tLines += rows.length;
+        }
+    }
+    // set number of total lines
+    RTW_TraceInfo.instance.setTotalLines(tLines);
+    // update highligthed from
+    var node = tocDoc.getElementById("rtwIdTraceBlock");
+    if (node) node.textContent = RTW_TraceArgs.instance.getBlock();
+    // set the initial file and line
+    fileIdx = top.RTW_TraceArgs.instance.getFileIdx(files[0]);
+    rows = top.RTW_TraceArgs.instance.getRows(fileIdx);
+    RTW_TraceInfo.instance.setInitLocation(files[0],rows[0]);
+
+    // highlight first file
+    top.rtwreport_document_frame.location.href = files[0];
+    return;
+}
+
+function updateNumHighlightedLines(linkObj, aNumLines) {
+    var parent = linkObj.parentNode;
+    if (parent && parent.childNodes && parent.childNodes.length > 1) {
+        var spanNodes = parent.getElementsByTagName('span');
+        var len = spanNodes.length;
+        if (len > 0) {
+            if (aNumLines > 0) {
+                /* display number of matches */
+                spanNodes.item(len-1).innerHTML = "&nbsp;("+aNumLines+")";
+            } else {
+                /* clear number of matches */
+                spanNodes.item(len-1).innerHTML = "";
+            }
+        }
+    }
+}
+
+function toggleNavSideBar(val) {
+    if (top.main) {
+        var tmp = top.main.cols.split(",");    
+
+        if (val === "on") {
+            tmp[tmp.length-1] = "15px";        
+        } else {
+            tmp[tmp.length-1] = "0";        
+        }
+        top.main.cols = tmp.join();    
+        if (top.rtwreport_nav_frame) 
+            top.rtwreport_nav_frame.location.href = "nav.html";    
+    }
+};
+
+function toggleNavToolBar(val) 
+{    
+    var midFrame = rtwMidFrame();
+    if (midFrame) {
+        var tmp1 = midFrame.rows.split(",");
+        var frameIdx = getNavToolbarFrameIdx();
+        if (val === "on") {
+            tmp1[frameIdx] = "40px";
+        } else {
+            tmp1[frameIdx] = "0";
+        }    
+        midFrame.rows = tmp1.join();
+        if (top.rtwreport_navToolbar_frame) {
+            top.rtwreport_navToolbar_frame.location.href = "navToolbar.html";
+        }
+    }
+};
+
+var GlobalConfig = {
+    navHiliteColor: "#0000ff",
+    fileLinkHiliteColor: "#ffff99",
+    navToolbarBgcolor: "#aaffff",
+    offset: 10,
+    hiliteToken: false
+};
+var NavSideBarState = {
+    calLineHeight: 0, 
+    overLink: false,
+    linkTarget: null,
+    lastLinkTarget: null,
+    linkTargetIdx: 0
+}
+function drawNavSideBar() {
+    var rectHeight = 1;
+    if (!top || !top.rtwreport_document_frame || !top.rtwreport_nav_frame) return;
+    
+    if (!top.RTW_TraceArgs.instance) return;
+    var fileIdx = top.RTW_TraceArgs.instance.getFileIdx();
+    if (fileIdx === undefined) return;
+    var rows = top.RTW_TraceArgs.instance.getRows(fileIdx);                
+    if (rows.length === 0) return; // no highlighted line 
+    
+    var codeTbl = top.rtwreport_document_frame.document.getElementById("codeTbl");
+    if (!codeTbl) return; // no code table
+    
+    var nRows = codeTbl.rows.length + 1;
+    var canvas = top.rtwreport_nav_frame.document.getElementById("canvas");                
+    canvas.width = top.rtwreport_nav_frame.innerWidth;
+    canvas.height = top.rtwreport_nav_frame.innerHeight-2;
+    NavSideBarState.calLineHeight = canvas.height/nRows;
+    if (canvas.getContext) {
+        var ctx = canvas.getContext("2d");
+        ctx.clearRect(0, 0, canvas.width, canvas.height);
+        // fill background 
+        ctx.fillStyle = GlobalConfig.navToolbarBgcolor;
+        ctx.fillRect(0, 0, canvas.width, canvas.height);
+        ctx.fillStyle = GlobalConfig.navHiliteColor;
+        for (var i=0;i<rows.length;i++) {
+            ctx.fillRect(0, Number(rows[i])*NavSideBarState.calLineHeight, canvas.width, rectHeight);
+        }
+        if (canvas.addEventListener) { 
+            canvas.addEventListener("mousemove", navBarOnMousemove, false);
+            canvas.addEventListener("click", navBarOnClick, false);
+        } else if (canvas.attachEvent) {
+            canvas.attachEvent("mousemove", navBarOnMousemove);
+            canvas.attachEvent("click", navBarOnClick);
+        }
+    }
+}
+
+function navBarOnMousemove(e) {
+    var y = e.clientY;
+    var tolerable_range = 5;
+    if (!top.RTW_TraceArgs.instance || !top.rtwreport_nav_frame) return;
+    var fileIdx = top.RTW_TraceArgs.instance.getFileIdx();
+    var rows = top.RTW_TraceArgs.instance.getRows(fileIdx);
+    var lineLoc,nextLineLoc;
+    top.rtwreport_nav_frame.document.body.style.cursor="";
+    NavSideBarState.overLink = false;
+    NavSideBarState.linkTarget = null;                 
+    NavSideBarState.linkTargetIdx = null;
+    for (var i=0;i<rows.length;i++) {
+        loc = rows[i]*NavSideBarState.calLineHeight;
+        // if within the tolerable range
+        if (Math.abs(y-loc) <= tolerable_range) {
+            top.rtwreport_nav_frame.document.body.style.cursor="pointer";
+            var canvas = top.rtwreport_nav_frame.document.getElementById("canvas");                
+            canvas.title = "navigate to line " + rows[i];
+            NavSideBarState.overLink = true;
+            NavSideBarState.linkTarget = rows[i];
+            NavSideBarState.linkTargetIdx = i;
+            break;
+        } 
+    }
+}
+
+function navBarOnClick(e) {
+    if (NavSideBarState.overLink && top.rtwreport_document_frame) {
+        rmTagToCurrentLine(); // remove current line tag
+        top.RTW_TraceInfo.instance.setCurrLineIdx(NavSideBarState.linkTargetIdx);
+        top.rtwreport_document_frame.document.location.href=RTW_TraceInfo.instance.getCurrentHRef();
+        top.addTagToCurrentLine(); // add current line tag
+        RTW_TraceInfo.instance.updateNavState();
+    }                
+}
+
+function removeInCodeTraceHighlight() {
+    var docObj = top.rtwreport_document_frame.document;
+    toggleNavSideBar("off");
+    toggleNavToolBar("off");
+    var nodes = docObj.getElementsByClassName("hilite");
+    // nodes is a live nodeList. Changing className modifies the list.
+    while(nodes.length) {
+        nodes[0].className = nodes[0].className.replace("hilite", "");
+    }
+    var nodes = docObj.getElementsByClassName("hiliteCurrentLine");
+    // nodes is a live nodeList. Changing className modifies the list.
+    while(nodes.length) {
+        nodes[0].className = nodes[0].className.replace("hiliteCurrentLine", "");
+    }
+    // reset RTW_TraceArgs.instance
+    RTW_TraceArgs.instance = null;
+    // remove highlight in content panel except the filelink
+    if (RTW_TraceInfo && RTW_TraceInfo.instance) {
+        var currFileIdx = RTW_TraceInfo.instance.getCurrFileIdx();
+        RTW_TraceInfo.instance.removeHighlighting();
+        RTW_TraceInfo.instance.highlightFileLink(currFileIdx);
+    }
+}
+
+function getInspectWindow() {
+    var divObj = document.createElement("div");
+    divObj.id = "popup_window";
+    return divObj;    
+}
+function getInspectData(file, anchorObj) {   
+    var metricsData = null;
+    var propObj = null;
+    var type = null;
+    var size = null;
+    var cm; 
+    if (top.rtwreport_nav_frame && top.rtwreport_nav_frame.CodeMetrics && 
+        top.rtwreport_nav_frame.CodeMetrics.instance && 
+        top.RTW_TraceArgs && top.RTW_TraceArgs.instance && 
+        !top.RTW_TraceArgs.instance.getUseExternalBrowser()) {
+        cm = top.rtwreport_nav_frame.CodeMetrics.instance;
+    }
+    if (cm && cm.getMetrics) {
+        metricsData = cm.getMetrics(anchorObj.text);
+        if (!metricsData) {
+            // try static token
+            metricsData =  cm.getMetrics(RTW_TraceInfo.toSrcFileName(file) + ":" + anchorObj.text);
+        }
+        if (metricsData) {            
+            type = metricsData.type;
+            if (type === "var") {
+                type = "Global Variable";
+                size = "(" + metricsData.size + " byte)";
+            } else if (type === "fcn") {
+                type = "Function";
+                size = "(stack: " + metricsData.stack + " byte, total stack: "
+                      + metricsData.stackTotal + " byte)";
+            }            
+        }
+    }    
+    if (type === null) {
+        var defObj = top.CodeDefine.instance.def[anchorObj.text];
+        if (defObj) {
+            type = defObj.type;
+            if (type === "var") {
+                type = "Variable";
+            } else if (type === "fcn") {
+                type = "Function";
+            } else if (type === "type") {
+                type = "Type";
+            }
+            size = "";
+        }
+    }   
+    var propObj = document.createElement("div");
+    propObj.id = "token_property";
+    
+    var ulObj = document.createElement("ul");
+    ulObj.className = "popup_attrib_list";
+    ulObj.innerHTML = "<li>" + type + ": <var>" + anchorObj.text + "</var></li><li>"+
+                    size + "</li>";
+    propObj.appendChild(ulObj);   
+    
+    return propObj;
+}
+function getInspectLink(file, pathname, anchorObj) {
+    var model = top.reportModel;
+    var tokenId = anchorObj.id;
+    var navObj = document.createElement("div");
+    navObj.id = "token_usage_nav";
+    ulObj = document.createElement("ul");
+    ulObj.id = "token_nav_links";
+    ulObj.className="popup_attrib_list";
+    var defObj = top.CodeDefine.instance.def[anchorObj.text];
+    var line = anchorObj.id.substring(0,anchorObj.id.indexOf("c"));
+    // link to model
+    if (top.TraceInfoFlag && top.TraceInfoFlag.instance && 
+        top.TraceInfoFlag.instance.traceFlag[RTW_TraceInfo.toSrcFileName(file)+":"+anchorObj.id]) {
+        ulObj.innerHTML +=  "<li><a href=\"matlab:rtw.report.code2model(\'" + top.reportModel 
+            + "\',\'"+pathname+"\',\'" + tokenId + "');\">Navigate to model</a></li>";
+    }
+    // link to def/decl
+    if (defObj) {
+        var filename = defObj.file.split(/\//);
+        filename = filename[filename.length-1];
+        ulObj.innerHTML += "<li><i>" + anchorObj.text + "</i> defined at <a target='rtwreport_document_frame' onclick=\"top.tokenLinkOnClick(event)\" href='" + defObj.file + "#" + defObj.line +
+            "'>" + RTW_TraceInfo.toSrcFileName(filename) + " line " + defObj.line + "</a></li>";
+    }
+    navObj.appendChild(ulObj);
+    return navObj;
+}
+
+var LastHiliteTokenId = null;
+function rmHiliteClickedToken() {
+   if (LastHiliteTokenId) {
+        var o = top.rtwreport_document_frame.document.getElementById(LastHiliteTokenId);
+        if (o) {
+            o.className = o.className.replace("hiliteToken", "");
+        }
+    }
+}
+function hiliteClickedToken(elem) {
+    rmHiliteClickedToken();
+    LastHiliteTokenId = elem.id;
+    elem.className += " hiliteToken";
+}
+
+var initLine = null;
+function scrollToInitLine() {
+    if (initLine) {
+        var lineElem = top.rtwreport_document_frame.document.getElementById(initLine);
+        if (lineElem) {
+            lineElem.scrollIntoView();
+        }
+    }
+}
+
+function scrollToLineBasedOnHash(hashValue) {
+    // move to the current highlight line if the hash is not empty
+    if (hashValue === "") {
+        if (top.RTW_TraceInfo.instance && top.RTW_TraceInfo.instance.getCurrLine() !== null) {
+            top.rtwreport_document_frame.document.location.href=top.RTW_TraceInfo.instance.getCurrentHRef();
+            top.initLine = top.rtwreport_document_frame.document.location.hash.substr(1);
+        }
+    } else {
+        // scroll and hilite line
+        hashValue = hashValue.substr(1);
+        if (isNaN(hashValue)) {
+            // #fcn_name
+            var pattern = "+newPage";
+            if (hashValue.indexOf(pattern) != -1) {
+                hashValue = hashValue.replace(pattern, '');
+                var lineElem = top.rtwreport_document_frame.document.getElementById(hashValue);
+                initLine = hashValue; // save initLine in case the dom is updated later by anootation
+                if (lineElem) {
+                    lineElem.scrollIntoView(); 
+                    addTagToCurrentLine();
+                }
+
+            } else {
+                var token = null;
+                pattern = ["var_", "fcn_", "type_"];
+                for (var i =0; i < pattern.length; i++) {
+                    if (hashValue.indexOf(pattern[i]) === 0) {
+                        token = hashValue.substr(pattern[i].length);
+                        break;
+                    }
+                }
+                if (token !== null && top.CodeDefine && top.CodeDefine.instance) {
+                    var addr = top.CodeDefine.instance.def[token];
+                    if (addr) {
+                        hilite_line(addr.line);
+                    }
+                } else { // token id like #line"c"#col
+		    if (hashValue.indexOf("c") !== -1) {
+			hilite_line(hashValue.substr(0, hashValue.indexOf("c")), hashValue);
+		    }
+		}
+            }
+        } else { // #line
+            hilite_line(hashValue);
+        }
+    }
+    return false;
+    // hilite line number and scroll with an offset
+    function hilite_line(line, tokenId) {
+        if (isNaN(line)) return;
+	if (!tokenId) {
+	    tokenId = line;
+	}
+	var elem = top.rtwreport_document_frame.document.getElementById(tokenId);		
+        hiliteClickedToken(elem);
+        initLine = offset_line(line);
+        scrollToInitLine();
+    }
+}
+
+function tokenLinkOnClick(event) {
+    var alink = event.currentTarget;
+    if (alink.pathname === top.rtwreport_document_frame.location.pathname) {
+        event.preventDefault();
+        scrollToLineBasedOnHash(alink.hash);
+    }
+    return false;
+}
+function inspectToken(file, pathname, event) {
+    var height = "70px";
+    // show inspect data
+    if (top.rtwreport_inspect_frame) { 
+        var windowObj = getInspectWindow();
+        var propObj = getInspectData(file, event.currentTarget);
+        var navObj = getInspectLink(file, pathname, event.currentTarget);
+        if (propObj === null) {
+            height = "50px";
+        } else {
+            windowObj.appendChild(propObj);
+        }
+        windowObj.appendChild(navObj);
+        var data = top.rtwreport_inspect_frame.document.getElementById("popup_window");
+        if (data) {
+            data.parentNode.replaceChild(windowObj.cloneNode(true), data);
+        }
+    }
+    setInspectWindow(height);
+    return false;
+}
+function setInspectWindow(height) {
+    // show inspect code frame
+    var midFrame = rtwMidFrame();
+    var tmp = midFrame.rows.split(",");
+    tmp[getInspectFrameIdx()] = height;    
+    midFrame.rows = tmp.join();
+}
+function closeInspectWindow() {
+    setInspectWindow(0);
+    return false;
+}
+
+// set the trace number in the navigation toolbar
+function setTraceNumber() {
+    if (RTW_TraceInfo.instance) {
+        var aFrame = rtwNavToolbarFrame();
+        if (aFrame) {
+            var node = aFrame.document.getElementById("rtwIdTraceNumber");
+            // calculate current line index over total highlighted lines
+            var currNum = RTW_TraceInfo.instance.getCurrLineIdx();
+            for (var idx=0;idx<RTW_TraceInfo.instance.getCurrFileIdx();idx++) {
+                currNum += RTW_TraceInfo.instance.getNumLines(idx);
+            }
+            if (node) {
+                node.innerHTML = String(currNum+1) + " of " + String(RTW_TraceInfo.instance.getTotalLines());
+            }
+        }
+    }
+}
+
+function offset_line(line, offset) {
+    if (offset == undefined)
+        offset = GlobalConfig.offset;
+    if (offset > 0)
+        line = (line > GlobalConfig.offset ? line - GlobalConfig.offset : 1);
+    return line;
+}
+
+function load_js(frame, file) {
+    var h = frame.document.getElementsByTagName("head")[0];
+    var o = h.getElementsByTagName('script');
+    for (var i=0;i<o.length;++i) {
+        if (o[i].getAttribute("src") === file) {
+            h.removeChild(o[i]);
+        }
+    }
+    var s = top.document.createElement("script");
+    s.type = "text/javascript";
+    s.src = file;
+    h.appendChild(s);
+}
+
+function reqOnClick(event) {
+    top.hiliteClickedToken(event.currentTarget);
+    return true;
+}
+function resize_NavToolbar_frame() {
+    resize_frame(getNavToolbarFrameIdx(), rtwNavToolbarFrame().document.height);
+}
+function resize_Inspect_frame() {
+    resize_frame(getInspectFrameIdx(), rtwInspectFrame().document.height);
+}
+function resize_frame(id, height) {
+    if (height) {
+        var midFrame = top.rtwMidFrame();
+        var tmp = midFrame.rows.split(",");
+        if (tmp[id] !== "0%" && tmp[id] !== "0") {
+            tmp[id] = "" + height - 8 + "px";
+            midFrame.rows = tmp.join();
+        }
+    }
+}
+function getNavToolbarFrameIdx() {
+    return 0;
+}
+function getInspectFrameIdx() {
+    return 2;
+}
+function load_metrics() {
+    var alink = top.document.createElement("a");
+    alink.href = "metrics.js";
+    if (top.RTW_TraceArgs && top.RTW_TraceArgs.instance && !top.RTW_TraceArgs.instance.getUseExternalBrowser()) {
+        try {
+            load_js(top.rtwreport_nav_frame, alink.href);
+        } catch (err) {};
+    }
+}
+
+function getNavFrame() {
+    if (hasWebviewFrame()) {
+        return rtwTocFrame();
+    } else {
+        return rtwNavToolbarFrame();
+    }
+}
+
+function hasWebviewFrame() {
+    if (top.document.getElementById('rtw_webviewMidFrame')) {
+        return true;
+    } else {
+        return  false;
+    }
+}
+function hasInCodeTrace() {
+    return (typeof(Html2SrcLink) === "function") && !hasWebviewFrame();
+}
+function uniqueRows(rows) {
+    return rows.sort(function(a,b) {return a-b}).filter(
+        function(el,idx, arr) {
+            if (idx===arr.indexOf(el)) return true; return false;
+        }
+    );
+}