381 lines
14 KiB
JavaScript
381 lines
14 KiB
JavaScript
|
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
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
})();
|