text: //	WebHelp 5.10.002
  window.whname = "wh_stub";
  var gReplyMsgQ = new Object();
  
  function getFrameHandle(frames, framename) {
      var frame = null;
      if (null == frames) return null;
      if (typeof (frames[framename]) != 'undefined' && frames[framename] != null)
          return frames[framename];
      for (var i = 0; i < frames.length; i++) {
          if (frames[i].frames.length > 0) {
              frame = getFrameHandle(frames[i].frames, framename);
              if (null != frame)
                  return frame;
          }
      }
      return frame;
  }
  
  function listener(sName, oWindow) {
      this.sName = sName;
      this.oWindow = oWindow;
  }
  
  function MessageRouter() {
      this.msgListeners = {};
  
      this.registerListener = function(sWndName, msgId) {
          var listeners = this.getListeners(msgId);
          if (typeof (listeners) == 'undefined' || listeners == null)
              listeners = this.createListeners(msgId);
  
          if (listeners != null) {
              for (var i = 0; i < listeners.length; i++) {
                  if (listeners[i].sName == sWndName)
                      return false;
              }
              var oListener = new listener(sWndName, null);
              listeners[listeners.length] = oListener;
              return true;
          }
          else
              return false;
      }
      this.registerListener2 = function(oWnd, msgId) {
          var listeners = this.getListeners(msgId);
          if (typeof (listeners) == 'undefined' || listeners == null)
              listeners = this.createListeners(msgId);
  
          if (listeners != null) {
              var oListener = new listener("", oWnd);
              listeners[listeners.length] = oListener;
              return true;
          }
          else
              return false;
      }
  
      this.unregisterListener = function(sWndName, msgId) {
          var listeners = this.getListeners(msgId);
          if (listeners) {
              for (var i = 0; i < listeners.length; i++) {
                  if (listeners[i].sName == sWndName) {
                      removeItemFromArray(listeners, i);
                      return true;
                  }
              }
          }
          return false;
      }
      this.unregisterListener2 = function(oWnd, msgId) {
          var listeners = this.getListeners(msgId);
          if (listeners) {
              for (var i = 0; i < listeners.length; i++) {
                  if (listeners[i].oWindow == oWnd) {
                      removeItemFromArray(listeners, i);
                      return true;
                  }
              }
          }
          return false;
      }
  
      this.notify = function(oMsg) {
          var bDelivered = false;
          var listeners = this.getListeners(oMsg.msgId);
          if (listeners) {
              for (var i = 0; i < listeners.length; i++) {
                  if (listeners[i] != null) {
                      var pFrame = listeners[i].oWindow;
                      if (pFrame == null)
                          pFrame = getFrameHandle(frames, listeners[i].sName);
                      if (null != pFrame) {
                          if (this.checkChromeLocal()) {
                              bDelivered = true;
                              if (pFrame == window)
                                  pFrame.onReceiveNotification(oMsg);
                              else
                                  pFrame.postMessage(JSON.stringify(oMsg), "*");
                          }
                          else if (pFrame.onReceiveNotification) {
                              bDelivered = true;
                              pFrame.onReceiveNotification(oMsg);
                          }
                      }
                  }
              }
          }
          return bDelivered;
      }
  
      this.request = function(oMsg, oSrcWnd) {
          var bDelivered = false;
          var listeners = this.getListeners(oMsg.msgId);
          if (listeners) {
              for (var i = 0; i < listeners.length; i++) {
                  if (listeners[i] != null) {
                      var pFrame = listeners[i].oWindow;
                      if (pFrame == null)
                          pFrame = getFrameHandle(frames, listeners[i].sName);
                      if (null != pFrame) {
                          if (this.checkChromeLocal()) {
                              bDelivered = true;
                              var sReplyId = oMsg.srcWndName;
                              //sReplyId += oMsg.msgId.toString();
                              sReplyId += oMsg.msgSeqNum.toString();
                              if(gReplyMsgQ[sReplyId] == undefined) {
                                  gReplyMsgQ[sReplyId] = new Array();
                              }
                              gReplyMsgQ[sReplyId].push(oSrcWnd);
                              if (pFrame == window) {
                                  if (!pFrame.onReceiveRequest(oMsg))
                                      break;
                              }
                              else
                                  pFrame.postMessage(JSON.stringify(oMsg), "*");
                          }
                          else if (pFrame.onReceiveRequest) {
                              bDelivered = true;
                              if (!pFrame.onReceiveRequest(oMsg))
                                  break;
                          }
                      }
                  }
              }
          }
          return bDelivered;
      }
  
      this.reply = function(oMsg) {
          if (this.checkChromeLocal()) {
              oMsg.msgType = "reply";
              var sReplyId = oMsg.srcWndName;
              sReplyId += oMsg.msgSeqNum.toString();
              var oWnd = gReplyMsgQ[sReplyId].shift();
              if (oWnd) {
                  oWnd.postMessage(JSON.stringify(oMsg), "*");
              }
              else {
                  alert("Exception: reply for which no request exist");
              }
              if(gReplyMsgQ[sReplyId].length == 0) {
              delete gReplyMsgQ[sReplyId];
          }
      }
      }
  
  
      this.init = function() {
          if (this.checkChromeLocal()) {
              window.addEventListener("message", onReceiveMsg, false);
          }
      }
  
      //Helper Functions
      this.getListeners = function(nMessageId) {
          return this.msgListeners[nMessageId];
      }
  
      this.createListeners = function(nMessageId) {
          this.msgListeners[nMessageId] = new Array();
          return this.msgListeners[nMessageId];
      }
  
      this.checkChromeLocal = function() {
          if (window.chrome)
              if (document.location.protocol.substring(0, 4) == "file")
              return true;
          return false;
      }
  }
  
  function onReceiveMsg(event) {
  
  	var oMsg = JSON.parse(event.data);
      switch (oMsg.msgType) {
          case "register":
              if (oMsg.iParam)
                  msgRouter.registerListener(oMsg.iParam, oMsg.msgId);
              else
                  msgRouter.registerListener2(event.source, oMsg.msgId);
              break;
          case "unregister":
              if (oMsg.iParam)
                  msgRouter.unregisterListener(oMsg.iParam, oMsg.msgId);
              else
                  msgRouter.unregisterListener2(event.source, oMsg.msgId);
              break;
          case "notify":
              msgRouter.notify(oMsg);
              break;
          case "request":
              msgRouter.request(oMsg, event.source);
              break;
          case "reply":
              msgRouter.reply(oMsg);
              break;
      }
  }
  
  var msgRouter = new MessageRouter();
  msgRouter.init();
  
  function registerListener(frameName, msgId) {
      msgRouter.registerListener(frameName, msgId);
  }
  
  function registerListener2(oWnd, msgId) {
      msgRouter.registerListener2(oWnd, msgId);
  }
  
  function unregisterListener(frameName, msgId) {
      msgRouter.unregisterListener(frameName, msgId);
  }
  
  function unregisterListener2(oWnd, msgId) {
      msgRouter.unregisterListener2(oWnd, msgId);
  }
  
  function notify(oMsg) {
      msgRouter.notify(oMsg);
  }
  
  function request(oMsg) {
      msgRouter.request(oMsg, null);
  }
  
  function reply(oMsg) {
      msgRouter.reply(oMsg);
  }