// 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); }