summaryrefslogtreecommitdiff
path: root/resources/scripts/messagecenter.js
diff options
context:
space:
mode:
Diffstat (limited to 'resources/scripts/messagecenter.js')
-rw-r--r--resources/scripts/messagecenter.js380
1 files changed, 380 insertions, 0 deletions
diff --git a/resources/scripts/messagecenter.js b/resources/scripts/messagecenter.js
new file mode 100644
index 0000000..2cc41cb
--- /dev/null
+++ b/resources/scripts/messagecenter.js
@@ -0,0 +1,380 @@
+if (typeof console == 'undefined') console = {
+ log: function () { }
+};
+
+// sniff chrome
+var CHROME_5_LOCAL = false;
+var CHROME = false;
+var SAFARI = false;
+var FIREFOX = false;
+var WEBKIT = false;
+var QQ = false;
+var UC = false;
+var OS_MAC = false;
+var IOS = false;
+var ANDROID = false;
+var MOBILE_DEVICE = false;
+var SHARE_APP = false;
+
+var IE = false;
+var IE_10_AND_BELOW = false; //ie 10 and lower
+var IE_11_AND_ABOVE = false; //ie 11 and above
+var BROWSER_VERSION = 5000;
+(function () {
+ if(!window.$axure) window.$axure = function() {};
+ var useragent = window.navigator.userAgent;
+
+ IOS = useragent.match(/iPhone/i) || useragent.match(/iPad/i) || useragent.match(/iPod/i);
+ ANDROID = useragent.match(/Android/i);
+
+ MOBILE_DEVICE = ANDROID || IOS
+ || navigator.userAgent.match(/webOS/i)
+ || navigator.userAgent.match(/BlackBerry/i)
+ || navigator.userAgent.match(/Tablet PC/i)
+ || navigator.userAgent.match(/Windows Phone/i);
+
+ var edgeRegex = /Edge\/([0-9]+)/g;
+ var edgeMatch = edgeRegex.exec(useragent);
+ $axure.browser = { isEdge: Boolean(edgeMatch) };
+ if ($axure.browser.isEdge) BROWSER_VERSION = Number(edgeMatch[1]);
+
+ if(!$axure.browser.isEdge) {
+ var chromeRegex = /Chrome\/([0-9]+).([0-9]+)/g;
+ var chromeMatch = chromeRegex.exec(useragent);
+ CHROME = Boolean(chromeMatch);
+ CHROME_5_LOCAL = chromeMatch &&
+ Number(chromeMatch[1]) >= 5 &&
+ location.href.indexOf('file://') >= 0 &&
+ !MOBILE_DEVICE; // Otherwise, Android webview will show up as CHROME_5_LOCAL
+ if (CHROME) BROWSER_VERSION = Number(chromeMatch[1]);
+ }
+
+ var safariRegex = /Safari\/([0-9]+)/g;
+ var safariMatch = safariRegex.exec(useragent);
+ SAFARI = Boolean(safariMatch) && !CHROME && !$axure.browser.isEdge; //because chrome also inserts safari string into user agent
+ if (SAFARI) BROWSER_VERSION = Number(safariMatch[1]);
+
+ var webkitRegex = /WebKit\//g ;
+ WEBKIT = Boolean(webkitRegex.exec(useragent));
+
+ var firefoxRegex = /Firefox\/([0-9]+)/g;
+ var firefoxMatch = firefoxRegex.exec(useragent);
+ FIREFOX = useragent.toLowerCase().indexOf('firefox') > -1;
+ if (FIREFOX) BROWSER_VERSION = Number(firefoxMatch[1]);
+
+ QQ = useragent.toLowerCase().indexOf('qqbrowser') > -1;
+ UC = useragent.toLowerCase().indexOf('ucbrowser') > -1 || useragent.toLowerCase().indexOf('ubrowser') > -1;
+
+ SHARE_APP = useragent.toLowerCase().indexOf('shareapp') > -1;
+
+ var macRegex = /Mac/g ;
+ OS_MAC = Boolean(macRegex.exec(window.navigator.platform));
+
+ if($.browser) {
+ if($.browser.msie) IE_10_AND_BELOW = true;
+ else IE_11_AND_ABOVE = useragent.toLowerCase().indexOf('trident') > -1;
+
+ BROWSER_VERSION = $.browser.version;
+ }
+
+ IE_11_AND_ABOVE = useragent.toLowerCase().indexOf('trident') > -1;
+ IE_10_AND_BELOW = !IE_11_AND_ABOVE && useragent.toLowerCase().indexOf('msie') > -1;
+ IE = IE_10_AND_BELOW || IE_11_AND_ABOVE;
+
+ var _supports = $axure.mobileSupport = {};
+ _supports.touchstart = typeof window.ontouchstart !== 'undefined';
+ _supports.touchmove = typeof window.ontouchmove !== 'undefined';
+ _supports.touchend = typeof window.ontouchend !== 'undefined';
+ _supports.mobile = _supports.touchstart && _supports.touchend && _supports.touchmove;
+
+ if (!MOBILE_DEVICE && _supports.mobile) {
+ _supports.touchstart = false;
+ _supports.touchmove = false;
+ _supports.touchend = false;
+ _supports.mobile = false;
+ }
+
+ var _eventNames = $axure.eventNames = {};
+ _eventNames.mouseDownName = _supports.touchstart ? 'touchstart' : 'mousedown';
+ _eventNames.mouseUpName = _supports.touchend ? 'touchend' : 'mouseup';
+ _eventNames.mouseMoveName = _supports.touchmove ? 'touchmove' : 'mousemove';
+
+ //Used by sitemap and variables.js getLinkUrl functions so that they know
+ //whether to embed global variables in URL as query string or hash string
+ //_shouldSendVars persists the value for sitemap instead of re-checking every time
+ var _shouldSendVars;
+ var _shouldSendVarsToServer = function(url) {
+ if(typeof _shouldSendVars != 'undefined') {
+ return _shouldSendVars;
+ }
+
+ if(SAFARI || (IE_10_AND_BELOW && BROWSER_VERSION < 10)) {
+ var urlToCheck = typeof url != 'undefined' ? url : window.location.href;
+ var serverRegex = /http:\/\/127\.0\.0\.1:[0-9]{5}/g;
+ var serverMatch = serverRegex.exec(urlToCheck);
+ var previewRegex = /[0-9]{2}\.[0-9]{2}\.[0-9]{2}/g;
+ var previewMatch = previewRegex.exec(urlToCheck);
+ if(Boolean(serverMatch) && Boolean(previewMatch)) {
+ _shouldSendVars = true;
+ return _shouldSendVars;
+ }
+ }
+
+ _shouldSendVars = false;
+ return _shouldSendVars;
+ };
+ $axure.shouldSendVarsToServer = _shouldSendVarsToServer;
+})();
+
+(function () {
+ var matched, browser;
+
+ // Use of jQuery.browser is frowned upon.
+ // More details: http://api.jquery.com/jQuery.browser
+ // jQuery.uaMatch maintained for back-compat
+ jQuery.uaMatch = function (ua) {
+ ua = ua.toLowerCase();
+
+ var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
+ /(webkit)[ \/]([\w.]+)/.exec(ua) ||
+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
+ /(msie) ([\w.]+)/.exec(ua) ||
+ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
+ [];
+
+ return {
+ browser: match[1] || "",
+ version: match[2] || "0"
+ };
+ };
+
+ matched = jQuery.uaMatch(navigator.userAgent);
+ browser = {};
+
+ if (matched.browser) {
+ browser[matched.browser] = true;
+ browser.version = matched.version;
+ }
+
+ // Chrome is Webkit, but Webkit is also Safari.
+ if (browser.chrome) {
+ browser.webkit = true;
+ } else if (browser.webkit) {
+ browser.safari = true;
+ }
+
+ jQuery.browser = browser;
+
+ jQuery.sub = function () {
+ function jQuerySub(selector, context) {
+ return new jQuerySub.fn.init(selector, context);
+ }
+ jQuery.extend(true, jQuerySub, this);
+ jQuerySub.superclass = this;
+ jQuerySub.fn = jQuerySub.prototype = this();
+ jQuerySub.fn.constructor = jQuerySub;
+ jQuerySub.sub = this.sub;
+ jQuerySub.fn.init = function init(selector, context) {
+ if (context && context instanceof jQuery && !(context instanceof jQuerySub)) {
+ context = jQuerySub(context);
+ }
+
+ return jQuery.fn.init.call(this, selector, context, rootjQuerySub);
+ };
+ jQuerySub.fn.init.prototype = jQuerySub.fn;
+ var rootjQuerySub = jQuerySub(document);
+ return jQuerySub;
+ };
+
+})();
+
+(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;
+ }
+ })();
+
+ if (CHROME_5_LOCAL) {
+ document.addEventListener("DOMContentLoaded", function () {
+ $('body').append("<div id='axureEventReceiverDiv' style='display:none'></div>" +
+ "<div id='axureEventSenderDiv' style='display:none'></div>");
+
+ _eventObject = window.document.createEvent('Event');
+ _eventObject.initEvent('axureMessageSenderEvent', true, true);
+
+ $('#axureEventReceiverDiv')[0].addEventListener('axureMessageReceiverEvent',
+ function () {
+ var request = JSON.parse($(this).text());
+ _handleRequest(request);
+ });
+ });
+ } else {
+ $(window.document).ready(function () {
+ 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) {}
+ });
+ };
+
+ var _combineEventMessages = false;
+ var _compositeEventMessageData = [];
+ _messageCenter.startCombineEventMessages = function() {
+ _combineEventMessages = true;
+ }
+
+ _messageCenter.endCombineEventMessages = function () {
+ _messageCenter.sendCompositeEventMessage();
+ _combineEventMessages = false;
+ }
+
+ _messageCenter.sendCompositeEventMessage = function () {
+ _messageCenter.postMessage('axCompositeEventMessage', _compositeEventMessageData);
+ _compositeEventMessageData = [];
+ }
+
+ _messageCenter.postMessage = function (message, data) {
+ if(_combineEventMessages) {
+ if(message == 'axEvent' || message == 'axCase' || message == 'axAction' || message == 'axEventComplete') {
+ _compositeEventMessageData.push({ 'message': message, 'data': data });
+ if(_compositeEventMessageData.length >= 10) _messageCenter.sendCompositeEventMessage();
+ return;
+ }
+ }
+
+ 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
+ };
+ };
+
+})();