if (typeof console == 'undefined') console = { log: function () { } }; // sniff chrome var CHROME_5_LOCAL = false; var CHROME = false; var WEBKIT = false; var OS_MAC = false; (function () { var chromeRegex = /Chrome\/([0-9]+).([0-9]+)/g ; var chromeMatch = chromeRegex.exec(window.navigator.userAgent); CHROME = Boolean(chromeMatch); CHROME_5_LOCAL = chromeMatch && Number(chromeMatch[1]) >= 5 && location.href.indexOf('file://') >= 0; var webkitRegex = /WebKit\//g ; WEBKIT = Boolean(webkitRegex.exec(window.navigator.userAgent)); var macRegex = /Mac/g ; OS_MAC = Boolean(macRegex.exec(window.navigator.platform)); })(); (function() { var _topMessageCenter; var _messageCenter = {}; var _listeners = []; var _stateListeners = []; var _state = {}; var _eventObject = null; var _queuedMessages = []; var _initialized = false; // this is for the non Chrome 5 local scenarios. The "top" message center will dispatch to all the bottom ones var _childrenMessageCenters = []; // create $axure if it hasn't been created if (!window.$axure) window.$axure = function() {}; $axure.messageCenter = _messageCenter; // isolate scope, and initialize _topMessageCenter. (function() { if (!CHROME_5_LOCAL) { var topAxureWindow = window; try { while(topAxureWindow.parent && topAxureWindow.parent !== topAxureWindow && topAxureWindow.parent.$axure) topAxureWindow = topAxureWindow.parent; } catch(e) {} _topMessageCenter = topAxureWindow.$axure.messageCenter; } })(); $(window.document).ready(function() { if (CHROME_5_LOCAL) { $('body').append("" + ""); _eventObject = window.document.createEvent('Event'); _eventObject.initEvent('axureMessageSenderEvent', true, true); $('#axureEventReceiverDiv').bind('axureMessageReceiverEvent', function () { var request = JSON.parse($(this).text()); _handleRequest(request); }); } else { if (_topMessageCenter != _messageCenter) { _topMessageCenter.addChildMessageCenter(_messageCenter); console.log('adding from ' + window.location.toString()); } } }); var _handleRequest = function (request) { // route the request to all the listeners for(var i = 0; i < _listeners.length; i++) _listeners[i](request.message, request.data); // now handle the queued messages if we're initializing if (request.message == 'initialize') { _initialized = true; // send all the queued messages and return for (var i = 0; i < _queuedMessages.length; i++) { var qRequest = _queuedMessages[i]; _messageCenter.postMessage(qRequest.message, qRequest.data); } _queuedMessages = []; } // and then handle the set state messages, if necessary if (request.message == 'setState') { _state[request.data.key] = request.data.value; for (var i = 0; i < _stateListeners.length; i++) { var keyListener = _stateListeners[i]; // if thep passed a null or empty value, always post the message if (!keyListener.key || keyListener.key == request.data.key) { keyListener.listener(request.data.key, request.data.value); } } } }; // ----------------------------------------------------------------------------------------- // This method allows for dispatching messages in the non-chromelocal scenario. // Each child calls this on _topMessageCenter // ----------------------------------------------------------------------------------------- _messageCenter.addChildMessageCenter = function(messageCenter) { _childrenMessageCenters[_childrenMessageCenters.length] = messageCenter; }; // ----------------------------------------------------------------------------------------- // This method allows for dispatching messages in the non-chromelocal scenario. // Each child calls this on _topMessageCenter // ----------------------------------------------------------------------------------------- _messageCenter.dispatchMessage = function(message, data) { _handleRequest({ message: message, data: data }); }; // ----------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------- _messageCenter.dispatchMessageRecursively = function(message, data) { console.log("dispatched to " + window.location.toString()); // dispatch to the top center first _messageCenter.dispatchMessage(message, data); $('iframe').each(function(index, frame) { //try,catch to handle permissions error in FF when loading pages from another domain try { if (frame.contentWindow.$axure && frame.contentWindow.$axure.messageCenter) { frame.contentWindow.$axure.messageCenter.dispatchMessageRecursively(message, data); } }catch(e) {} }); }; _messageCenter.postMessage = function(message, data) { if(!CHROME_5_LOCAL) { _topMessageCenter.dispatchMessageRecursively(message, data); } else { var request = { message: message, data: data }; if(_initialized) { var senderDiv = window.document.getElementById('axureEventSenderDiv'); var messageText = JSON.stringify(request); // console.log('sending event: ' + messageText); senderDiv.innerText = messageText; senderDiv.dispatchEvent(_eventObject); // console.log('event sent'); } else { _queuedMessages[_queuedMessages.length] = request; } } }; _messageCenter.setState = function(key, value) { var data = { key: key, value: value }; _messageCenter.postMessage('setState', data); }; _messageCenter.getState = function(key) { return _state[key]; }; _messageCenter.addMessageListener = function(listener) { _listeners[_listeners.length] = listener; }; _messageCenter.addStateListener = function(key, listener) { _stateListeners[_stateListeners.length] = { key: key, listener: listener }; }; })();