This commit is contained in:
shuhongfan
2023-09-04 16:40:17 +08:00
commit cf5ac25c14
8267 changed files with 1305066 additions and 0 deletions

View File

@@ -0,0 +1,688 @@
$axure.internal(function($ax) {
$ax.adaptive = {};
$axure.utils.makeBindable($ax.adaptive, ["viewChanged"]);
var _auto = true;
var _autoIsHandledBySidebar = false;
var _views;
var _idToView;
var _enabledViews = [];
var _initialViewToLoad;
var _initialViewSizeToLoad;
var _loadFinished = false;
$ax.adaptive.loadFinished = function() {
if(_loadFinished) return;
_loadFinished = true;
if($ax.adaptive.currentViewId) $ax.viewChangePageAndMasters();
else $ax.postAdaptiveViewChanged();
};
var _handleResize = function(forceSwitchTo) {
if(!_auto) return;
if(_auto && _autoIsHandledBySidebar && !forceSwitchTo) return;
var $window = $(window);
var height = $window.height();
var width = $window.width();
var toView = _getAdaptiveView(width, height);
var toViewId = toView && toView.id;
_switchView(toViewId, forceSwitchTo);
};
var _setAuto = $ax.adaptive.setAuto = function(val) {
if(_auto != val) {
_auto = Boolean(val);
}
};
var _setLineImage = function(id, imageUrl) {
$jobj(id).attr('src', imageUrl);
};
var _switchView = function (viewId, forceSwitchTo) {
//if(!$ax.pageData.isAdaptiveEnabled) return;
var previousViewId = $ax.adaptive.currentViewId;
if(typeof previousViewId == 'undefined') previousViewId = '';
if(typeof viewId == 'undefined') viewId = '';
if (viewId == previousViewId) {
if(forceSwitchTo) $ax.postAdaptiveViewChanged(forceSwitchTo);
return;
}
$ax('*').each(function(obj, elementId) {
if (!$ax.public.fn.IsTreeNodeObject(obj.type)) return;
if(!obj.hasOwnProperty('isExpanded')) return;
var query = $ax('#' + elementId);
var defaultExpanded = obj.isExpanded;
query.expanded(defaultExpanded);
});
// reset all the inline positioning from move and rotate actions including size and transformation
$axure('*').each(function (diagramObject, elementId) {
if(diagramObject.isContained) return;
if($ax.getParentRepeaterFromElementIdExcludeSelf(elementId)) return;
var element = document.getElementById(elementId);
if(element) {
var resetCss = {
top: "", left: "", width: "", height: "", opacity: "",
transform: "", webkitTransform: "", MozTransform: "", msTransform: "", OTransform: ""
};
var query = $(element);
query.css(resetCss);
var isPanel = $ax.public.fn.IsDynamicPanel(diagramObject.type);
if(!isPanel || diagramObject.fitToContent) { //keeps size on the panel states when switching adaptive views to optimize fit to panel
if(diagramObject.fitToContent) $ax.dynamicPanelManager.setFitToContentCss(elementId, true);
var children = query.children();
if(children.length) children.css(resetCss);
}
$ax.dynamicPanelManager.resetFixedPanel(diagramObject, element);
$ax.dynamicPanelManager.resetAdaptivePercentPanel(diagramObject, element);
}
});
$ax.adaptive.currentViewId = viewId; // we need to set this so the enabled and selected styles will apply properly
if(previousViewId) {
$ax.style.clearAdaptiveStyles();
$('*').removeClass(previousViewId);
} else {
$ax.style.reselectElements();
}
$axure('*').each(function (obj, elementId) {
if($ax.getParentRepeaterFromElementIdExcludeSelf(elementId)) return;
$ax.style.updateElementIdImageStyle(elementId); // When image override exists, fix styling/borders
});
//$ax.style.startSuspendTextAlignment();
// reset all the images only if we're going back to the default view
if(!viewId) {
$axure('*').each(function (diagramObject, elementId) {
if($ax.getParentRepeaterFromElementIdExcludeSelf(elementId)) return;
$ax.placeholderManager.refreshPlaceholder(elementId);
var images = diagramObject.images;
if(diagramObject.type == 'horizontalLine' || diagramObject.type == 'verticalLine') {
var startImg = images['start~'];
_setLineImage(elementId + "_start", startImg);
var endImg = images['end~'];
_setLineImage(elementId + "_end", endImg);
var lineImg = images['line~'];
_setLineImage(elementId + "_line", lineImg);
} else if(diagramObject.type == $ax.constants.CONNECTOR_TYPE) {
_setAdaptiveConnectorImages(elementId, images, '');
} else if(images) {
if (diagramObject.generateCompound) {
if($ax.style.IsWidgetDisabled(elementId)) {
disabledImage = _getImageWithTag(images, 'disabled~');
if(disabledImage) $ax.style.applyImage(elementId, disabledImage, 'disabled');
return;
}
if($ax.style.IsWidgetSelected(elementId)) {
selectedImage = _getImageWithTag(images, 'selected~');
if(selectedImage) $ax.style.applyImage(elementId, selectedImage, 'selected');
return;
}
$ax.style.applyImage(elementId, _getImageWithTag(images, 'normal~'), 'normal');
} else {
if ($ax.style.IsWidgetDisabled(elementId)) {
var disabledImage = _matchImage(elementId, images, [], 'disabled', true);
if (disabledImage) $ax.style.applyImage(elementId, disabledImage, 'disabled');
return;
}
if ($ax.style.IsWidgetSelected(elementId)) {
var selectedImage = _matchImage(elementId, images, [], 'selected', true);
if (selectedImage) $ax.style.applyImage(elementId, selectedImage, 'selected');
return;
}
var normalImage = _matchImage(elementId, images, [], 'normal', true);
$ax.style.applyImage(elementId, normalImage, 'normal');
}
}
//align all text
var child = $jobj(elementId).children('.text');
if(child.length) $ax.style.transformTextWithVerticalAlignment(child[0].id, function() { });
});
// we have to reset visibility if we aren't applying a new view
$ax.visibility.resetLimboAndHiddenToDefaults();
$ax.visibility.clearMovedAndResized();
$ax.repeater.refreshAllRepeaters();
$ax.dynamicPanelManager.updateParentsOfNonDefaultFitPanels();
$ax.dynamicPanelManager.updatePercentPanelCache($ax('*'));
} else {
$ax.visibility.clearLimboAndHidden();
$ax.visibility.clearMovedAndResized();
_applyView(viewId);
$ax.repeater.refreshAllRepeaters();
$ax.dynamicPanelManager.updateAllLayerSizeCaches();
$ax.dynamicPanelManager.updateParentsOfNonDefaultFitPanels();
}
$ax.annotation.updateAllFootnotes();
//$ax.style.resumeSuspendTextAlignment();
$ax.adaptive.triggerEvent('viewChanged', {});
if(_loadFinished) $ax.viewChangePageAndMasters(forceSwitchTo);
};
var _getImageWithTag = function(image, tag) {
var flattened = {};
for (var component in image) {
var componentImage = image[component][tag];
if(componentImage) flattened[component] = componentImage;
}
return flattened;
}
// gets the inheritance chain of a particular view.
var _getAdaptiveIdChain = $ax.adaptive.getAdaptiveIdChain = function(viewId) {
if(!viewId) return [];
var view = _idToView[viewId];
var chain = [];
var current = view;
while(current) {
chain[chain.length] = current.id;
current = _idToView[current.baseViewId];
}
return chain.reverse();
};
var _getMasterAdaptiveIdChain = $ax.adaptive.getMasterAdaptiveIdChain = function (masterId, viewId) {
if (!viewId) return [];
var master = $ax.pageData.masters[masterId];
var masterViews = master.adaptiveViews;
var idToMasterView = {};
if (masterViews && masterViews.length > 0) {
for (var i = 0; i < masterViews.length; i++) {
var view = masterViews[i];
idToMasterView[view.id] = view;
}
}
if (!idToMasterView) return [];
var view = idToMasterView[viewId];
var chain = [];
var current = view;
while (current) {
chain[chain.length] = current.id;
current = idToMasterView[current.baseViewId];
}
return chain.reverse();
};
var _getPageStyle = $ax.adaptive.getPageStyle = function() {
var currentViewId = $ax.adaptive.currentViewId;
var adaptiveChain = _getAdaptiveIdChain(currentViewId);
var currentStyle = $.extend({}, $ax.pageData.page.style);
for(var i = 0; i < adaptiveChain.length; i++) {
var viewId = adaptiveChain[i];
$.extend(currentStyle, $ax.pageData.page.adaptiveStyles[viewId]);
}
return currentStyle;
};
var _setAdaptiveLineImages = function(elementId, images, viewIdChain) {
for(var i = viewIdChain.length - 1; i >= 0; i--) {
var viewId = viewIdChain[i];
var startImg = images['start~' + viewId];
if(startImg) {
_setLineImage(elementId + "_start", startImg);
var endImg = images['end~' + viewId];
_setLineImage(elementId + "_end", endImg);
var lineImg = images['line~' + viewId];
_setLineImage(elementId + "_line", lineImg);
break;
}
}
};
var _setAdaptiveConnectorImages = function (elementId, images, view) {
var conn = $jobj(elementId);
var count = conn.children().length-1; // -1 for rich text panel
for(var i = 0; i < count; i++) {
var img = images['' + i + '~' + view];
$jobj(elementId + '_seg' + i).attr('src', img);
}
};
var _applyView = $ax.adaptive.applyView = function(viewId, query) {
var limboIds = {};
var hiddenIds = {};
var jquery;
if(query) {
jquery = query.jQuery();
jquery = jquery.add(jquery.find('*'));
var jqueryAnn = $ax.annotation.jQueryAnn(query);
jquery = jquery.add(jqueryAnn);
} else {
jquery = $('*').not('#ios-safari-fixed');
query = $ax('*');
}
jquery.addClass(viewId);
var viewIdChain = _getAdaptiveIdChain(viewId);
// this could be made more efficient by computing it only once per object
query.each(function(diagramObject, elementId) {
_applyAdaptiveViewOnObject(diagramObject, elementId, viewIdChain, viewId, limboIds, hiddenIds);
});
$ax.visibility.addLimboAndHiddenIds(limboIds, hiddenIds, query);
//$ax.dynamicPanelManager.updateAllFitPanelsAndLayerSizeCaches();
$ax.dynamicPanelManager.updatePercentPanelCache(query);
};
var _applyAdaptiveViewOnObject = function(diagramObject, elementId, viewIdChain, viewId, limboIds, hiddenIds) {
var adaptiveChain = [];
for(var i = 0; i < viewIdChain.length; i++) {
var viewId = viewIdChain[i];
var viewStyle = diagramObject.adaptiveStyles[viewId];
if(viewStyle) {
adaptiveChain[adaptiveChain.length] = viewStyle;
if (viewStyle.size) $ax.public.fn.convertToSingleImage($jobj(elementId));
}
}
var state = $ax.style.generateState(elementId);
// set the image
var images = diagramObject.images;
if(images) {
if(diagramObject.type == 'horizontalLine' || diagramObject.type == 'verticalLine') {
_setAdaptiveLineImages(elementId, images, viewIdChain);
} else if (diagramObject.type == $ax.constants.CONNECTOR_TYPE) {
_setAdaptiveConnectorImages(elementId, images, viewId);
} else if (diagramObject.generateCompound) {
var compoundUrl = _matchImageCompound(diagramObject, elementId, viewIdChain, state);
if (compoundUrl) $ax.style.applyImage(elementId, compoundUrl, state);
}else {
var imgUrl = _matchImage(elementId, images, viewIdChain, state);
if(imgUrl) $ax.style.applyImage(elementId, imgUrl, state);
}
}
// addaptive override style (not including default style props)
var adaptiveStyle = $ax.style.computeAllOverrides(elementId, undefined, state, viewId);
// this style INCLUDES the object's my style
var compoundStyle = $.extend({}, diagramObject.style, adaptiveStyle);
if (diagramObject.owner.type == 'Axure:Master' && diagramObject.adaptiveStyles) {
adaptiveStyle = $ax.style.computeFullStyle(elementId, state, viewId);
}
if(!diagramObject.isContained) {
$ax.style.setAdaptiveStyle(elementId, adaptiveStyle);
}
var scriptId = $ax.repeater.getScriptIdFromElementId(elementId);
if(compoundStyle.limbo && !diagramObject.isContained) limboIds[scriptId] = true;
// sigh, javascript. we need the === here because undefined means not overriden
if(compoundStyle.visible === false) hiddenIds[scriptId] = true;
};
var _matchImage = function(id, images, viewIdChain, state, doNotProgress) {
var override = $ax.style.getElementImageOverride(id, state);
if(override) return override;
if(!images) return undefined;
var scriptId = $ax.repeater.getScriptIdFromElementId(id);
// first check all the images for this state
for(var i = viewIdChain.length - 1; i >= 0; i--) {
var viewId = viewIdChain[i];
var img = images[scriptId + "~" + state + "~" + viewId];
if(!img) img = images[state + "~" + viewId];
if(img) return img;
}
// check for the default state style
var defaultStateImage = images[scriptId + "~" + state + "~"];
if(!defaultStateImage) defaultStateImage = images[state + "~"];
if(defaultStateImage) return defaultStateImage;
if(doNotProgress) return undefined;
state = $ax.style.progessState(state);
if (state) return _matchImage(scriptId, images, viewIdChain, state);
// SHOULD NOT REACH HERE! NORMAL SHOULD ALWAYS CATCH AT THE DEFAULT!
return images['normal~']; // this is the default
};
var _matchImageCompound = function(diagramObject, id, viewIdChain, state) {
var images = [];
for(var i = 0; i < diagramObject.compoundChildren.length; i++) {
var component = diagramObject.compoundChildren[i];
images[component] = _matchImage(id, diagramObject.images[component], viewIdChain, state);
}
return images;
};
$ax.adaptive.getImageForStateAndView = function(id, state) {
var viewIdChain = _getAdaptiveIdChain($ax.adaptive.currentViewId);
var diagramObject = $ax.getObjectFromElementId(id);
if (diagramObject.generateCompound) return _matchImageCompound(diagramObject, id, viewIdChain, state);
else return _matchImage(id, diagramObject.images, viewIdChain, state);
};
var _getAdaptiveView = function(winWidth, winHeight) {
var _isViewOneGreaterThanTwo = function (view1, view2, winHeight) {
if (view1.size.width > view2.size.width) return true;
if (view1.size.width == view2.size.width) {
if (view2.size.height <= winHeight) return view1.size.height > view2.size.height && view1.size.height <= winHeight;
else return view1.size.height < view2.size.height;
}
return false;
};
var _isViewOneLessThanTwo = function(view1, view2) {
var width2 = view2.size.width || 1000000; // artificially large number
var height2 = view2.size.height || 1000000;
var width1 = view1.size.width || 1000000;
var height1 = view1.size.height || 1000000;
return width1 < width2 || (width1 == width2 && height1 < height2);
};
var _isWindowWidthGreaterThanViewWidth = function(view, width) {
return width >= view.size.width;
};
var _isWindowWidthLessThanViewWidth = function(view1, width) {
var viewWidth = view1.size.width || 1000000;
return width <= viewWidth;
};
var greater = undefined;
var less = undefined;
var defaultView = $ax.pageData.defaultAdaptiveView;
if (_isWindowWidthGreaterThanViewWidth(defaultView, winWidth, winHeight)) greater = defaultView;
less = defaultView;
for(var i = 0; i < _enabledViews.length; i++) {
var view = _enabledViews[i];
if(_isWindowWidthGreaterThanViewWidth(view, winWidth, winHeight)) {
if(!greater || _isViewOneGreaterThanTwo(view, greater, winHeight)) greater = view;
}
if(_isWindowWidthLessThanViewWidth(view, winWidth, winHeight)) {
if(!less || _isViewOneLessThanTwo(view, less)) less = view;
}
}
return greater || less;
};
var _isAdaptiveInitialized = function() {
return typeof _idToView != 'undefined';
};
$ax.messageCenter.addMessageListener(function(message, data) {
//If the adaptive plugin hasn't been initialized yet then
//save the view to load so that it can get set when initialize occurs
if (message == 'switchAdaptiveView') {
if (window.name != 'mainFrame') return;
var href = window.location.href.split('#')[0];
var lastSlash = href.lastIndexOf('/');
href = href.substring(lastSlash + 1);
if(href != data.src) return;
var view = data.view == 'auto' ? undefined : (data.view == 'default' ? '' : data.view);
if(!_isAdaptiveInitialized()) {
_initialViewToLoad = view;
} else _handleLoadViewId(view);
} else if (message == 'setAdaptiveViewForSize') {
if (window.name != 'mainFrame') return;
_autoIsHandledBySidebar = true;
if(!_isAdaptiveInitialized()) {
_initialViewSizeToLoad = data;
} else _handleSetViewForSize(data.width, data.height);
} else if (message == 'getScale') {
if (window.name != 'mainFrame') return;
var prevScaleN = data.prevScaleN;
var newScaleN = 1;
var contentOriginOffset = 0;
var $body = $('body');
$body.css('height', '');
if (data.scale != 0) {
var adjustScrollScale = false;
if ($('html').getNiceScroll().length == 0 && !MOBILE_DEVICE && !SAFARI) {
//adding nicescroll so width is correct when getting scale
_addNiceScroll($('html'), { emulatetouch: false, horizrailenabled: false });
adjustScrollScale = true;
}
if (!MOBILE_DEVICE && SAFARI) _removeNiceScroll($('html'));
$('html').css('overflow-x', 'hidden');
var bodyWidth = $body.width();
var isCentered = $body.css('position') == 'relative';
// screen width does not adjust on screen rotation for iOS (width is always shorter screen measurement)
var isLandscape = window.orientation != 0 && window.orientation != 180;
var mobileWidth = (IOS ? (isLandscape ? window.screen.height : window.screen.width) : window.screen.width) - data.panelWidthOffset;
var scaleN = newScaleN = (MOBILE_DEVICE ? mobileWidth : $(window).width()) / bodyWidth;
if (data.scale == 2) {
var pageSize = $ax.public.fn.getPageSize();
var hScaleN = (MOBILE_DEVICE ? data.viewportHeight : $(window).height()) / Math.max(1, pageSize.bottom);
if (hScaleN < scaleN) {
scaleN = newScaleN = hScaleN;
}
if (isCentered) contentOriginOffset = scaleN * (bodyWidth / 2);
}
if ((SAFARI && IOS) || SHARE_APP) {
var pageSize = $ax.public.fn.getPageSize();
$body.first().css('height', pageSize.bottom + 'px');
} //else $body.css('height', $body.height() + 'px');
if (adjustScrollScale) {
_removeNiceScroll($('html'));
_addNiceScroll($('html'), { emulatetouch: false, horizrailenabled: false, cursorwidth: Math.ceil(6 / newScaleN) + 'px', cursorborder: 1 / newScaleN + 'px solid #fff', cursorborderradius: 5 / newScaleN + 'px' });
}
}
var contentScale = {
scaleN: newScaleN,
prevScaleN: prevScaleN,
contentOriginOffset: contentOriginOffset,
clipToView: data.clipToView,
viewportHeight: data.viewportHeight,
viewportWidth: data.viewportWidth,
panelWidthOffset: data.panelWidthOffset,
scale: data.scale
};
$axure.messageCenter.postMessage('setContentScale', contentScale);
} else if (message == 'setDeviceMode') {
if (window.name != 'mainFrame') return;
_isDeviceMode = data.device;
if (data.device) {
// FIXES firefox cursor not staying outside initial device frame border
// SAFARI needs entire content height so that trackpad can be disabled
//if (FIREFOX || (SAFARI && !IOS)) {
// var pageSize = $ax.public.fn.getPageSize();
// $('html').css('height', pageSize.bottom + 'px');
//}
_removeNiceScroll($('html'));
if (!MOBILE_DEVICE) {
_addNiceScroll($('html'), { emulatetouch: true, horizrailenabled: false });
$('html').addClass('mobileFrameCursor');
$('html').css('cursor', 'url(resources/css/images/touch.cur), auto');
$('html').css('cursor', 'url(resources/css/images/touch.svg) 32 32, auto');
$('html').css('overflow-x', 'hidden');
if (IE) {
document.addEventListener("click", function () {
// IE still sometimes wants an argument here
this.activeElement.releasePointerCapture();
}, false);
}
if ($axure.browser.isEdge) {
document.addEventListener("pointerdown", function (e) {
this.activeElement.releasePointerCapture(e.pointerId);
}, false);
}
$ax.dynamicPanelManager.initMobileScroll();
}
// Gives horizontal scroll to android in 100% (handled outside of iframe)
$('html').css('overflow-x', 'hidden');
$('body').css('margin', '0px');
$(function () { _setHorizontalScroll(false); });
} else {
_removeNiceScroll($('html'));
$('html').css('overflow-x', '');
$('html').css('cursor', '');
//$('html').removeAttr('style');
$('body').css('margin', '');
$('html').removeClass('mobileFrameCursor');
$(function () { _setHorizontalScroll(!data.scaleToWidth); });
$ax.dynamicPanelManager.initMobileScroll();
}
}
});
var _isDeviceMode = false;
$ax.adaptive.isDeviceMode = function () {
return _isDeviceMode;
}
var _removeNiceScroll = $ax.adaptive.removeNiceScroll = function ($container, blockResetScroll) {
if (!blockResetScroll) {
$container.scrollLeft(0);
$container.scrollTop(0);
}
$container.getNiceScroll().remove();
//clean up nicescroll css
if (IE) $container.css({ '-ms-overflow-y': '', 'overflow-y': '', '-ms-overflow-style': '', '-ms-touch-action': '' });
}
var _addNiceScroll = $ax.adaptive.addNiceScroll = function ($container, options, blockResetScroll) {
if (!blockResetScroll) {
$container.scrollLeft(0);
$container.scrollTop(0);
}
$container.niceScroll(options);
//clean up nicescroll css so child scroll containers show scrollbars in IE
if (IE) $container.css({ '-ms-overflow-y': '', '-ms-overflow-style': '' });
}
$ax.adaptive.updateMobileScrollOnBody = function () {
var niceScroll = $('html').getNiceScroll();
if (niceScroll.length == 0) return;
niceScroll.resize();
}
var _setTrackpadHorizontalScroll = function (active) {
var preventScroll = function (e) {
if (Math.abs(e.wheelDeltaX) != 0) {
e.preventDefault();
}
}
if (!active) {
document.body.addEventListener("mousewheel", preventScroll, { passive: false });
document.getElementById('html').addEventListener("mousewheel", preventScroll, { passive: false });
} else {
document.body.removeEventListener("mousewheel", preventScroll, { passive: false });
document.getElementById('html').removeEventListener("mousewheel", preventScroll, { passive: false });
}
}
var _setHorizontalScroll = function (active) {
var $body = $(document);
if (!active) {
$body.bind('scroll', function () {
if ($body.scrollLeft() !== 0) {
$body.scrollLeft(0);
}
});
} else {
$body.unbind('scroll');
}
}
$ax.adaptive.setAdaptiveView = function(view) {
var viewIdForSitemapToUnderstand = view == 'auto' ? undefined : (view == 'default' ? '' : view);
if(!_isAdaptiveInitialized()) {
_initialViewToLoad = viewIdForSitemapToUnderstand;
} else _handleLoadViewId(viewIdForSitemapToUnderstand);
};
$ax.adaptive.initialize = function() {
_views = $ax.pageData.adaptiveViews;
_idToView = {};
var useViews = $ax.document.configuration.useViews;
if(_views && _views.length > 0) {
for(var i = 0; i < _views.length; i++) {
var view = _views[i];
_idToView[view.id] = view;
if(useViews) _enabledViews[_enabledViews.length] = view;
}
if(_autoIsHandledBySidebar && _initialViewSizeToLoad) _handleSetViewForSize(_initialViewSizeToLoad.width, _initialViewSizeToLoad.height);
else _handleLoadViewId(_initialViewToLoad);
}
$axure.resize(function(e) {
_handleResize();
$ax.postResize(e); //window resize fires after view changed
});
};
var _handleLoadViewId = function (loadViewId, forceSwitchTo) {
if(typeof loadViewId != 'undefined') {
_setAuto(false);
_switchView(loadViewId != 'default' ? loadViewId : '', forceSwitchTo);
} else {
_setAuto(true);
_handleResize(forceSwitchTo);
}
};
var _handleSetViewForSize = function (width, height) {
var toView = _getAdaptiveView(width, height);
var toViewId = toView && toView.id;
_switchView(toViewId, "auto");
};
$ax.adaptive.getSketchKey = function() {
return $ax.pageData.sketchKeys[$ax.adaptive.currentViewId || ''];
}
});

View File

@@ -0,0 +1,161 @@
// ******* Annotation MANAGER ******** //
$axure.internal(function($ax) {
var NOTE_SIZE = 10;
var _annotationManager = $ax.annotation = {};
var _updateLinkLocations = $ax.annotation.updateLinkLocations = function(elementId) {
var textId = $ax.GetTextPanelId(elementId);
if(!textId) return;
var rotation = $ax.getObjectFromElementId(elementId).style.rotation;
//we have to do this because webkit reports the post-transform position but when you set positions it's pre-transform
if(WEBKIT && rotation) {
//we can dynamiclly rotate a widget now, show need to remember the transform rather than just remove it
//here jquery.css will return 'none' if element is display none
var oldShapeTransform = document.getElementById(elementId).style['-webkit-transform'];
var oldTextTransform = document.getElementById(textId).style['-webkit-transform'];
$('#' + elementId).css('-webkit-transform', 'scale(1)');
$('#' + textId).css('-webkit-transform', 'scale(1)');
}
$('#' + textId).find('div[id$="_ann"]').each(function(index, value) {
var elementId = value.id.replace('_ann', '');
var $link = $('#' + elementId);
var annPos = $link.position();
annPos.left += $link.width();
//var annPos = $(value).position();
var left = annPos.left;// - NOTE_SIZE;
var top = annPos.top - 5;
$(value).css('left', left).css('top', top);
});
//undo the transform reset
if(WEBKIT && rotation) {
$('#' + elementId).css('-webkit-transform', oldShapeTransform || '');
$('#' + textId).css('-webkit-transform', oldTextTransform || '');
}
};
var _toggleAnnotationDialog = function (elementId, event) {
var win = $(window);
var scrollY = win.scrollTop();
var scrollX = win.scrollLeft();
var messageData = { id: elementId, x: event.pageX - scrollX, y: event.pageY - scrollY }
if (window.name != 'mainFrame') messageData.page = $ax.pageData.notesData;
$ax.messageCenter.postMessage('toggleAnnDialog', messageData);
}
$ax.annotation.initialize = function () {
_createFootnotes($ax('*'), true);
}
var _createFootnotes = $ax.annotation.createFootnotes = function(query, create) {
if(!$ax.document.configuration.showAnnotations) return;
var widgetNotes = $ax.pageData.notesData.widgetNotes;
if (widgetNotes) {
var ownerToFns = $ax.pageData.notesData.ownerToFns;
if(!$.isEmptyObject(ownerToFns)) {
query.each(function(dObj, elementId) {
var fns = ownerToFns[dObj.id];
if (fns !== undefined) {
var elementIdQuery = $('#' + elementId);
if (dObj.type == 'hyperlink') {
var parentId = $ax.GetParentIdFromLink(elementId);
if (create) {
elementIdQuery.after("<div id='" + elementId + "_ann' class='annnote'>&#8203;</div>");
appendFns($('#' + elementId + "_ann"), fns);
}
_updateLinkLocations(parentId);
} else {
if (create) {
elementIdQuery.after("<div id='" + elementId + "_ann' class='annnote'>&#8203;</div>");
appendFns($('#' + elementId + "_ann"), fns);
}
_adjustIconLocation(elementId, dObj);
}
if (create) {
$('#' + elementId + "_ann").click(function (e) {
_toggleAnnotationDialog(dObj.id, e);
return false;
});
var isVisible = true;
var isMaster = $ax.public.fn.IsReferenceDiagramObject(dObj.type);
if (isMaster) isVisible = dObj.visible;
else isVisible = $ax.visibility.IsIdVisible(elementId);
if (!isVisible) {
var ann = document.getElementById(elementId + "_ann");
if (ann) $ax.visibility.SetVisible(ann, false);
}
}
}
});
}
}
function appendFns($parent, fns) {
for (var index = 0; index < fns.length; index++) {
$parent.append("<div class='annnotelabel' >" + fns[index] + "</div>");
}
}
};
$ax.annotation.updateAllFootnotes = function () {
_createFootnotes($ax('*'), false);
}
$ax.annotation.jQueryAnn = function(query) {
var elementIds = [];
query.each(function(diagramObject, elementId) {
if(diagramObject.annotation) elementIds[elementIds.length] = elementId;
});
var elementIdSelectors = jQuery.map(elementIds, function(elementId) { return '#' + elementId + '_ann'; });
var jQuerySelectorText = (elementIdSelectors.length > 0) ? elementIdSelectors.join(', ') : '';
return $(jQuerySelectorText);
};
$(window.document).ready(function() {
//$ax.annotation.InitializeAnnotations($ax(function(dObj) { return dObj.annotation; }));
$ax.messageCenter.addMessageListener(function(message, data) {
//If the annotations are being hidden via the Sitemap toggle button, hide any open dialogs
if(message == 'annotationToggle') {
if (data == true) {
$('div.annnote').show();
} else {
$('div.annnote').hide();
}
}
});
});
//adjust annotation location to a element's top right corner
var _adjustIconLocation = $ax.annotation.adjustIconLocation = function(id, dObj) {
var ann = document.getElementById(id + "_ann");
if(ann) {
var corners = $ax.public.fn.getCornersFromComponent(id);
var width = $(ann).width();
var newTopRight = $ax.public.fn.vectorPlus(corners.relativeTopRight, corners.centerPoint);
//note size is 14x8, this is how rp calculated it as well
ann.style.left = (newTopRight.x - width) + "px";
var elementType = dObj ? dObj.type : $ax.getTypeFromElementId(id);
var yOffset = $ax.public.fn.IsTableCell(elementType) ? 0 : -8;
ann.style.top = (newTopRight.y + yOffset) + "px";
}
var ref = document.getElementById(id + "_ref");
if(ref) {
if(!corners) corners = $ax.public.fn.getCornersFromComponent(id);
var newBottomRight = $ax.public.fn.vectorPlus(corners.relativeBottomRight, corners.centerPoint);
ref.style.left = (newBottomRight.x - 8) + 'px';
ref.style.top = (newBottomRight.y - 10) + 'px';
}
}
});

View File

@@ -0,0 +1,404 @@
$axure = function(query) {
return $axure.query(query);
};
// ******* AxQuery and Page metadata ******** //
(function() {
var $ax = function() {
var returnVal = $axure.apply(this, arguments);
var axFn = $ax.fn;
for (var key in axFn) {
returnVal[key] = axFn[key];
}
return returnVal;
};
$ax.public = $axure;
$ax.fn = {};
$axure.internal = function(initFunction) {
//Attach messagecenter to $ax object so that it can be used in viewer.js, etc in internal scope
if(!$ax.messageCenter) $ax.messageCenter = $axure.messageCenter;
return initFunction($ax);
};
var _lastFiredResize = 0;
var _resizeFunctions = [];
var _lastTimeout;
var _fireResize = function() {
if (_lastTimeout) window.clearTimeout(_lastTimeout);
_lastTimeout = undefined;
_lastFiredResize = new Date().getTime();
for(var i = 0; i < _resizeFunctions.length; i++) _resizeFunctions[i]();
};
$axure.resize = function(fn) {
if(fn) _resizeFunctions[_resizeFunctions.length] = fn;
else $(window).resize();
};
$(window).resize(function() {
var THRESHOLD = 50;
var now = new Date().getTime();
if(now - _lastFiredResize > THRESHOLD) {
_updateWindowInfo();
_fireResize();
} else if(!_lastTimeout) {
_lastTimeout = window.setTimeout(_fireResize, THRESHOLD);
}
});
$(window).scroll(function () {
_updateWindowInfo();
});
var _windowInfo;
var _updateWindowInfo = $axure.updateWindowInfo = function () {
var win = {};
var jWin = $(window);
var scrollWin = $('#ios-safari-html').length > 0 ? $('#ios-safari-html') : jWin;
win.width = jWin.width();
win.height = jWin.height();
win.scrollx = scrollWin.scrollLeft();
win.scrolly = scrollWin.scrollTop();
_windowInfo = win;
};
$ax.getWindowInfo = function () {
if(!_windowInfo) _updateWindowInfo();
return _windowInfo;
};
window.$obj = function(id) {
return $ax.getObjectFromElementId(id);
};
window.$id = function(obj) {
return obj.scriptIds[0];
};
window.$jobj = function(id) {
return $(document.getElementById(id));
};
window.$jobjAll = function(id) {
return $addAll($jobj(id), id);
};
window.$addAll = function(jobj, id) {
return jobj.add($jobj(id + '_ann')).add($jobj(id + '_ref'));
};
$ax.INPUT = function(id) { return id + "_input"; };
$ax.IsImageFocusable = function (type) { return $ax.public.fn.IsImageBox(type) || $ax.public.fn.IsVector(type) || $ax.public.fn.IsTreeNodeObject(type) || $ax.public.fn.IsTableCell(type); };
$ax.IsTreeNodeObject = function (type) { return $ax.public.fn.IsTreeNodeObject(type); };
$ax.IsSelectionButton = function (type) { return $ax.public.fn.IsCheckBox(type) || $ax.public.fn.IsRadioButton(type); };
var _fn = {};
$axure.fn = _fn;
$axure.fn.jQuery = function() {
var elements = this.getElements();
return $(elements);
};
$axure.fn.$ = $axure.fn.jQuery;
var _query = function(query, queryArg) {
var returnVal = {};
var _axQueryObject = returnVal.query = { };
_axQueryObject.filterFunctions = [];
if (query == '*') {
_axQueryObject.filterFunctions[0] = function() { return true; };
} else if (typeof(query) === 'function') {
_axQueryObject.filterFunctions[0] = query;
} else {
var firstString = $.trim(query.toString());
if (firstString.charAt(0) == '@') {
_axQueryObject.filterFunctions[0] = function(diagramObject) {
return diagramObject.label == firstString.substring(1);
};
} else if (firstString.charAt(0) == '#') {
_axQueryObject.elementId = firstString.substring(1);
} else {
if (firstString == 'label') {
_axQueryObject.filterFunctions[0] = function(diagramObject) {
return queryArg instanceof Array && queryArg.indexOf(diagramObject.label) > 0 ||
queryArg instanceof RegExp && queryArg.test(diagramObject.label) ||
diagramObject.label == queryArg;
};
} else if(firstString == 'elementId') {
_axQueryObject.filterFunctions[0] = function(diagramObject, elementId) {
return queryArg instanceof Array && queryArg.indexOf(elementId) > 0 ||
elementId == queryArg;
};
}
}
}
var axureFn = $axure.fn;
for (var key in axureFn) {
returnVal[key] = axureFn[key];
}
return returnVal;
};
$axure.query = _query;
var _getFilterFnFromQuery = function(query) {
var filter = function(diagramObject, elementId) {
// Non diagram objects are allowed to be queryed, such as text inputs.
if (diagramObject && !$ax.public.fn.IsReferenceDiagramObject(diagramObject.type) && !document.getElementById(elementId)) return false;
var retVal = true;
for(var i = 0; i < query.filterFunctions.length && retVal; i++) {
retVal = query.filterFunctions[i](diagramObject, elementId);
}
return retVal;
};
return filter;
};
$ax.public.fn.filter = function(query, queryArg) {
var returnVal = _query(query, queryArg);
if(this.query.elementId) returnVal.query.elementId = this.query.elementId;
//If there is already a function, offset by 1 when copying other functions over.
var offset = returnVal.query.filterFunctions[0] ? 1 : 0;
//Copy all functions over to new array.
for(var i = 0; i < this.query.filterFunctions.length; i++) returnVal.query.filterFunctions[i+offset] = this.query.filterFunctions[i];
//Functions are in reverse order now
returnVal.query.filterFunctions.reverse();
return returnVal;
};
$ax.public.fn.each = function(fn) {
var filter = _getFilterFnFromQuery(this.query);
var elementIds = this.query.elementId ? [this.query.elementId] : $ax.getAllElementIds();
for (var i = 0; i < elementIds.length; i++) {
var elementId = elementIds[i];
var diagramObject = $ax.getObjectFromElementId(elementId);
if (filter(diagramObject, elementId)) {
fn.apply(diagramObject, [diagramObject, elementId]);
}
}
};
$ax.public.fn.getElements = function() {
var elements = [];
this.each(function(dObj, elementId) {
var elementById = document.getElementById(elementId);
if(elementById) elements[elements.length] = elementById;
});
return elements;
};
$ax.public.fn.getElementIds = function() {
var elementIds = [];
this.each(function(dObj, elementId) { elementIds[elementIds.length] = elementId; });
return elementIds;
};
// Deep means to keep getting parents parent until at the root parent. Parent is then an array instead of an id.
// Filter options: layer, rdo, repeater, item, dynamicPanel, state
$ax.public.fn.getParents = function (deep, filter) {
if(filter == '*') filter = ['layer', 'rdo', 'repeater', 'item', 'dynamicPanel', 'state'];
var elementIds = this.getElementIds();
var parentIds = [];
var getParent = function(elementId) {
var containerIndex = elementId.indexOf('_container');
if(containerIndex !== -1) elementId = elementId.substring(0, containerIndex);
if(elementId.indexOf('_text') !== -1) elementId = $ax.GetShapeIdFromText(elementId);
// Check repeater item before layer, because repeater item detects it's parent layer, but wants to go directly to it's repeater first.
// if repeater item, then just return repeater
var scriptId = $ax.repeater.getScriptIdFromElementId(elementId);
var itemNum = $ax.repeater.getItemIdFromElementId(elementId);
var parentRepeater = $ax.getParentRepeaterFromScriptId(scriptId);
// scriptId is item or repeater itself
if (parentRepeater == scriptId) {
// If you are repeater item, return your repeater
if (itemNum) return filter.indexOf('repeater') != -1 ? scriptId : getParent(scriptId);
// Otherwise you are actually at repeater, clean parentRepeater, or else you loop
parentRepeater = undefined;
}
// Layer only references it if it is a direct layer to it
var parent = $ax.getLayerParentFromElementId(elementId);
// If layer is allowed we found parent, otherwise ignore and keep climbing
if (parent) return filter.indexOf('layer') != -1 ? parent : getParent(parent);
// if state, then just return panel
if(scriptId.indexOf('_state') != -1) {
var panelId = $ax.repeater.createElementId(scriptId.split('_')[0], itemNum);
// If dynamic panel is allowed we found parent, otherwise ignore and keep climbing
return filter.indexOf('dynamicPanel') != -1 ? panelId : getParent(panelId);
}
var parentType = '';
if(parentRepeater) {
parentType = 'item';
parent = $ax.repeater.createElementId(parentRepeater, itemNum);
}
var masterPath = $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(elementId));
masterPath.pop();
if(masterPath.length > 0) {
var masterId = $ax.getElementIdFromPath(masterPath, { itemNum: itemNum }, true);
if(!masterId) return undefined;
var masterRepeater = $ax.getParentRepeaterFromElementId($ax.repeater.getScriptIdFromElementId(masterId));
if(!parentRepeater || masterRepeater) {
parentType = 'rdo';
parent = masterId;
}
}
var obj = $obj(elementId);
var parentDynamicPanel = obj.parentDynamicPanel;
if(parentDynamicPanel) {
// Make sure the parent if not parentRepeater, or dynamic panel is also in that repeater
// If there is a parent master, the dynamic panel must be in it, otherwise parentDynamicPanel would be undefined.
var panelPath = masterPath;
panelPath[panelPath.length] = parentDynamicPanel;
panelId = $ax.getElementIdFromPath(panelPath, { itemNum: itemNum }, true);
if(!panelId) return undefined;
var panelRepeater = $ax.getParentRepeaterFromElementId(panelId);
if(!parentRepeater || panelRepeater) {
parentType = 'state';
parent = panelId + '_state' + obj.panelIndex;
}
}
// If at top or parent type is desired, then return parent, otherwise keep climbing
return !parent || filter.indexOf(parentType) != -1 ? parent : getParent(parent);
};
for(var i = 0; i < elementIds.length; i++) {
var parent = getParent(elementIds[i]);
if(deep) {
var parents = [];
while(parent) {
parents[parents.length] = parent;
// If id is not a valid object, you are either repeater item or dynamic panel state
//if(!$obj(parent)) parent = $ax.visibility.getWidgetFromContainer($jobj(parent).parent().attr('id'));
parent = getParent(parent);
}
parent = parents;
}
parentIds[parentIds.length] = parent;
}
return parentIds;
};
// Get the path to the child, where non leaf nodes can be masters, layers, dynamic panels, and repeaters.
$ax.public.fn.getChildren = function(deep, ignoreUnplaced) { // ignoreUnplaced should probably be the default, but when that is done a full audit of usages should be done
var elementIds = this.getElementIds();
var children = [];
var getChildren = function (elementId) {
var obj = $obj(elementId);
//if(!obj) return undefined;
var isRepeater = obj && obj.type == $ax.constants.REPEATER_TYPE;
if (isRepeater && $ax.repeater.getScriptIdFromElementId(elementId) != elementId) {
//prevent repeater items from being marked as isRepeater
//TODO: evaluate changing the naming convention to be more like panel states which don't seem to have this problem
obj = undefined;
isRepeater = false;
}
var isDynamicPanel = obj && obj.type == $ax.constants.DYNAMIC_PANEL_TYPE;
//var isLayer = obj.type == $ax.constants.LAYER_TYPE;
//var isMaster = obj.type == $ax.constants.MASTER_TYPE || obj.type == $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE;
var isMenu = obj && obj.type == $ax.constants.MENU_OBJECT_TYPE;
var isTreeNode = obj && obj.type == $ax.constants.TREE_NODE_OBJECT_TYPE;
//var isTable = obj.type == $ax.constants.TABLE_TYPE;
//var isCompoundVector = obj.type == $ax.constants.VECTOR_SHAPE_TYPE && obj.generateCompound;
//if (isRepeater || isDynamicPanel || isLayer || isMaster || isMenu || isTreeNode || isTable) {// || isCompoundVector) {
// Find parent that children should be pulled from. Default is just the elementId query (used by table and master)
var parent = $jobj(elementId);
if(isRepeater) {
parent = $();
var itemIds = $ax.getItemIdsForRepeater(elementId);
for(var itemIndex = 0; itemIndex < itemIds.length; itemIndex++) parent = parent.add($jobj($ax.repeater.createElementId(elementId, itemIds[itemIndex])));
} else if(isDynamicPanel) {
// Really only need to do active state probably...
parent = $jobj(elementId).children();
// Get through all containers
while ($(parent[0]).attr('id').indexOf('container') != -1) parent = parent.children();
// Now at states, but want states content
parent = parent.children();
} else if(isTreeNode) parent = $jobj($ax.repeater.applySuffixToElementId(elementId, '_children'));
// Menu doesn't want all children, only tables and menus, so it must be handled specially
var children = isMenu ? parent.children('.ax_table').add(parent.children('.ax_menu')) : parent.children();
children = $ax.visibility.getRealChildren(_fixForBasicLinks(children));
// For tree nodes you want the the button shape contained by the elementQuery too
if(isTreeNode) {
var treeNodeChildren = $jobj(elementId).children();
for(var treeNodeIndex = 0; treeNodeIndex < treeNodeChildren.length; treeNodeIndex++) {
var treeNodeChild = $(treeNodeChildren[treeNodeIndex]);
var childObj = $obj(treeNodeChild.attr('id'));
if (childObj && $ax.public.fn.IsVector(childObj.type)) children = children.add(treeNodeChild);
}
}
var childrenIds = [];
for(var childIndex = 0; childIndex < children.length; childIndex++) {
var childObj = $(children[childIndex]);
var id = childObj.attr('id');
if(typeof(id) == 'undefined' && childObj.is('a')) id = $(childObj.children()[0]).attr('id');
// Ignore annotations and any other children that are not elements
if (id.split('_').length > 1) continue;
// Ignore Unplaced
if(ignoreUnplaced && $ax.visibility.isScriptIdLimbo($ax.repeater.getScriptIdFromElementId(id))) continue;
childrenIds.push(id);
}
if(deep) {
var childObjs = [];
for(var i = 0; i < childrenIds.length; i++) {
var childId = childrenIds[i];
childObjs[i] = { id: childId, children: getChildren(childId) };
}
childrenIds = childObjs;
}
return childrenIds;
//}
//return undefined;
};
for(var i = 0; i < elementIds.length; i++) {
var elementId = elementIds[i];
//if the state is passed in, look for children in the content element
if (elementId.indexOf('_state') > -1 && elementId.indexOf('_content') < 0) elementId = elementId + '_content';
children[children.length] = { id: elementId, children: getChildren(elementId)};
}
return children;
};
var _fixForBasicLinks = function(query) {
var hasBasicLinks = query.filter('.basiclink').length > 0;
if(!hasBasicLinks) return query;
var retval = $();
for(var i = 0; i < query.length; i++) {
var child = $(query[i]);
if(child.hasClass('basiclink')) retval = retval.add(child.children());
else retval = retval.add(child);
}
return retval;
};
})();

View File

@@ -0,0 +1,901 @@
$axure.internal(function($ax) {
var _pageData;
var _initializePageFragment = function(pageFragment, objIdToObject) {
var objectArrayHelper = function(objects, parent) {
for(var i = 0; i < objects.length; i++) {
diagramObjectHelper(objects[i], parent);
}
};
var diagramObjectHelper = function(diagramObject, parent) {
$ax.initializeObject('diagramObject', diagramObject);
objIdToObject[pageFragment.packageId + '~' + diagramObject.id] = diagramObject;
diagramObject.parent = parent;
diagramObject.owner = pageFragment;
diagramObject.scriptIds = [];
if(diagramObject.diagrams) { //dynamic panel
for(var i = 0; i < diagramObject.diagrams.length; i++) {
var diagram = diagramObject.diagrams[i];
objectArrayHelper(diagram.objects, diagram);
}
} else if($ax.public.fn.IsLayer(diagramObject.type)) {
var layerObjs = diagramObject.objs;
objectArrayHelper(layerObjs, parent);
}
if(diagramObject.objects) objectArrayHelper(diagramObject.objects, diagramObject);
};
objectArrayHelper(pageFragment.diagram.objects, pageFragment.diagram);
};
var _initalizeStylesheet = function(stylesheet) {
var stylesById = {};
var customStyles = stylesheet.customStyles;
for(var key in customStyles) {
var style = customStyles[key];
stylesById[style.id] = style;
}
var duplicateStyles = stylesheet.duplicateStyles;
for(var duplicateKey in duplicateStyles) {
stylesById[duplicateKey] = stylesById[duplicateStyles[duplicateKey]];
}
stylesheet.stylesById = stylesById;
};
var _initializeDocumentData = function() {
_initalizeStylesheet($ax.document.stylesheet);
};
var _initializePageData;
// ******* Dictionaries ******** //
(function() {
var scriptIdToParentLayer = {};
var elementIdToObject = {};
var scriptIdToObject = {};
var scriptIdToRepeaterId = {};
var repeaterIdToScriptIds = {};
var repeaterIdToItemIds = {};
var scriptIdToPath = {};
var _scriptIds = [];
var elementIdToText = {};
var radioGroupToSelectedElementId = {};
_initializePageData = function() {
if(!_pageData || !_pageData.page || !_pageData.page.diagram) return;
var objIdToObject = {};
_initializePageFragment(_pageData.page, objIdToObject);
for(var masterId in _pageData.masters) {
var master = _pageData.masters[masterId];
_initializePageFragment(master, objIdToObject);
}
var _pathsToScriptIds = [];
_pathToScriptIdHelper(_pageData.objectPaths, [], _pathsToScriptIds, scriptIdToPath);
for(var i = 0; i < _pathsToScriptIds.length; i++) {
var path = _pathsToScriptIds[i].idPath;
var scriptId = _pathsToScriptIds[i].scriptId;
var packageId = _pageData.page.packageId;
if(path.length > 1) {
for(var j = 0; j < path.length - 1; j++) {
var rdoId = path[j];
var rdo = objIdToObject[packageId + '~' + rdoId];
packageId = rdo.masterId;
}
}
var diagramObject = objIdToObject[packageId + '~' + path[path.length - 1]];
diagramObject.scriptIds[diagramObject.scriptIds.length] = scriptId;
scriptIdToObject[scriptId] = diagramObject;
_scriptIds[_scriptIds.length] = scriptId;
}
// Now map scriptIds to repeaters and layers
var mapScriptIdToRepeaterId = function(scriptId, repeaterId) {
scriptIdToRepeaterId[scriptId] = repeaterId;
var scriptIds = repeaterIdToScriptIds[repeaterId];
if(scriptIds) scriptIds[scriptIds.length] = scriptId;
else repeaterIdToScriptIds[repeaterId] = [scriptId];
};
var mapScriptIdToLayerId = function(obj, layerId, path) {
var pathCopy = $ax.deepCopy(path);
pathCopy[path.length] = obj.id;
var scriptId = $ax.getScriptIdFromPath(pathCopy);
scriptIdToParentLayer[scriptId] = layerId;
}
var mapIdsToRepeaterAndLayer = function(path, objs, repeaterId) {
var pathCopy = $ax.deepCopy(path);
for(var i = 0; i < objs.length; i++) {
var obj = objs[i];
pathCopy[path.length] = obj.id;
var scriptId = $ax.getScriptIdFromPath(pathCopy);
// Rdo have no element on page and are not mapped to the repeater
if(repeaterId) mapScriptIdToRepeaterId(scriptId, repeaterId);
if($ax.public.fn.IsDynamicPanel(obj.type)) {
for(var j = 0; j < obj.diagrams.length; j++) mapIdsToRepeaterAndLayer(path, obj.diagrams[j].objects, repeaterId);
} else if($ax.public.fn.IsReferenceDiagramObject(obj.type)) {
mapIdsToRepeaterAndLayer(pathCopy, $ax.pageData.masters[obj.masterId].diagram.objects, repeaterId);
} else if($ax.public.fn.IsRepeater(obj.type)) {
mapScriptIdToRepeaterId(scriptId, scriptId);
mapIdsToRepeaterAndLayer(path, obj.objects, scriptId);
} else if($ax.public.fn.IsLayer(obj.type)) {
var layerObjs = obj.objs;
for(var j = 0; j < layerObjs.length; j++) {
mapScriptIdToLayerId(layerObjs[j], scriptId, path);
}
mapIdsToRepeaterAndLayer(path, layerObjs, repeaterId);
} else if(obj.objects && obj.objects.length) {
if(repeaterId) {
for(var j = 0; j < obj.objects.length; j++) {
mapIdsToRepeaterAndLayer(path, obj.objects, repeaterId);
}
}
}
}
};
mapIdsToRepeaterAndLayer([], $ax.pageData.page.diagram.objects);
};
$ax.getPathFromScriptId = function(scriptId) {
var reversedPath = [];
var path = scriptIdToPath[scriptId];
while(path && path.uniqueId) {
reversedPath[reversedPath.length] = path.uniqueId;
path = path.parent;
}
return reversedPath.reverse();
};
var _getScriptIdFromFullPath = function(path) {
var current = $ax.pageData.objectPaths;
for(var i = 0; i < path.length; i++) {
current = current[path[i]];
if(!current) return current;
}
return current && current.scriptId;
};
var _getScriptIdFromPath = function(path, relativeTo, includeLimbo) {
var relativePath = [];
var includeMasterInPath = false;
if(relativeTo) {
var relativeToScriptId;
if(relativeTo.srcElement) { //this is eventInfo
relativeToScriptId = $ax.repeater.getScriptIdFromElementId(relativeTo.srcElement);
includeMasterInPath = relativeTo.isMasterEvent;
} else if(typeof relativeTo === 'string') { //this is an element id
relativeToScriptId = relativeTo;
}
if(relativeToScriptId) {
relativePath = $ax.getPathFromScriptId(relativeToScriptId);
if(!includeMasterInPath) relativePath = relativePath.slice(0, relativePath.length - 1);
} else if(relativeTo instanceof Array) { //this is a path
relativePath = relativeTo;
}
}
var fullPath = relativePath.concat(path);
var scriptId = _getScriptIdFromFullPath(fullPath);
return (includeLimbo || !$ax.visibility.isScriptIdLimbo(scriptId)) && scriptId;
};
$ax.getScriptIdFromPath = _getScriptIdFromPath;
var _getElementIdsFromPath = function(path, eventInfo) {
var scriptId = _getScriptIdFromPath(path, eventInfo);
if(!scriptId) return [];
// Don't need placed check hear. If unplaced, scriptId will be undefined and exit out before here.
return $ax.getElementIdsFromEventAndScriptId(eventInfo, scriptId);
};
$ax.getElementIdsFromPath = _getElementIdsFromPath;
var _getElementIdFromPath = function(path, params, includeLimbo) {
var scriptId = _getScriptIdFromPath(path, params.relativeTo, includeLimbo);
if(!scriptId) return scriptId;
var itemNum = params.itemNum;
if(params.relativeTo && typeof params.relativeTo === 'string') {
if($jobj(params.relativeTo)) itemNum = $ax.repeater.getItemIdFromElementId(params.relativeTo);
}
return $ax.repeater.createElementId(scriptId, itemNum);
};
$ax.getElementIdFromPath = _getElementIdFromPath;
var _getElementsIdFromEventAndScriptId = function(eventInfo, scriptId) {
var itemId = eventInfo && $ax.repeater.getItemIdFromElementId(eventInfo.srcElement);
var target = false;
// Try to get itemId from target if you can't get it from source.
if(!itemId) {
itemId = eventInfo && eventInfo.targetElement && $ax.repeater.getItemIdFromElementId(eventInfo.targetElement);
if(itemId) target = true;
}
var parentRepeater = $ax.getParentRepeaterFromScriptId(scriptId);
if(parentRepeater && scriptId != parentRepeater) {
if(itemId && (!eventInfo || parentRepeater == $ax.getParentRepeaterFromScriptId($ax.repeater.getScriptIdFromElementId(target ? eventInfo.targetElement : eventInfo.srcElement)))) {
return [$ax.repeater.createElementId(scriptId, itemId)];
}
var elementIds = [];
var itemIds = $ax.getItemIdsForRepeater(parentRepeater);
if(!itemIds) return [];
for(var i = 0; i < itemIds.length; i++) elementIds[i] = $ax.repeater.createElementId(scriptId, itemIds[i]);
return elementIds;
}
return [scriptId];
};
$ax.getElementIdsFromEventAndScriptId = _getElementsIdFromEventAndScriptId;
var _getSrcElementIdFromEvent = function(event) {
var currentQuery = $(event.srcElement || event.target);
while(currentQuery && currentQuery.length && (!$obj(currentQuery.attr('id')) || $jobj(currentQuery.attr('id')).hasClass('text'))) {
currentQuery = currentQuery.parent();
};
return currentQuery.attr('id');
};
$ax.getSrcElementIdFromEvent = _getSrcElementIdFromEvent;
var _getEventInfoFromEvent = function(event, skipShowDescriptions, elementId) {
var eventInfo = {};
eventInfo.srcElement = elementId;
eventInfo.now = new Date();
if(event != null) {
//elementId can be empty string, so can't simple use "or" assignment here.
eventInfo.srcElement = elementId || elementId == '' ? elementId : _getSrcElementIdFromEvent(event);
eventInfo.which = event.which;
// When getting locations in mobile, need to extract the touch object to get the mouse location attributes
var mouseEvent = (event.originalEvent && event.originalEvent.changedTouches && event.originalEvent.changedTouches[0]) || event.originalEvent;
if(mouseEvent && !mouseEvent.type) mouseEvent.type = event.type;
if(skipShowDescriptions) eventInfo.skipShowDescriptions = true;
// Always update mouse location if possible
$ax.event.updateMouseLocation(mouseEvent);
}
// Always set event info about cursor
var _cursor = eventInfo.cursor = {};
_cursor.x = $ax.mouseLocation.x;
_cursor.y = $ax.mouseLocation.y;
var body = $('body');
if(body.css('position') == 'relative') {
_cursor.x -= ($ax.getNumFromPx(body.css('left')) + Math.max(0, ($(window).width() - body.width()) / 2));
}
eventInfo.pageX = _cursor.x + 'px';
eventInfo.pageY = _cursor.y + 'px';
// Do Keyboard Info
eventInfo.keyInfo = $ax.event.keyState();
eventInfo.window = $ax.getWindowInfo();
eventInfo.thiswidget = _getWidgetInfo(eventInfo.srcElement);
eventInfo.item = _getItemInfo(eventInfo.srcElement);
eventInfo.dragInfo = $ax.drag.GetWidgetDragInfo();
return eventInfo;
};
$ax.getEventInfoFromEvent = _getEventInfoFromEvent;
$ax.getBasicEventInfo = function() {
var eventInfo = {};
eventInfo.now = new Date();
eventInfo.window = $ax.getWindowInfo();
eventInfo.cursor = { x: 0, y: 0};
return eventInfo;
};
//var _getWindowInfo = function() {
// var win = {};
// win.width = $(window).width();
// win.height = $(window).height();
// win.scrollx = $(window).scrollLeft();
// win.scrolly = $(window).scrollTop();
// return win;
//};
//$ax.getWindowInfo = _getWindowInfo;
var repeaterInfoCache = [];
$ax.cacheRepeaterInfo = function(repeaterId, repeaterInfo) {
repeaterInfoCache[repeaterId] = repeaterInfo;
}
$ax.removeCachedRepeaterInfo = function(repeaterId) {
repeaterInfoCache[repeaterId] = undefined;
}
var _getItemInfo = function(elementId) {
if(!elementId) return { valid: false };
elementId = _getParentElement(elementId);
var index = $ax.repeater.getItemIdFromElementId(elementId);
if(!index) return { valid: false };
var item = { valid: true };
var scriptId = $ax.repeater.getScriptIdFromElementId(elementId);
var repeaterId = $ax.getParentRepeaterFromScriptId(scriptId);
item.repeater = repeaterInfoCache[repeaterId] ? repeaterInfoCache[repeaterId] : _getWidgetInfo(repeaterId);
$ax.repeater.setDisplayProps(item, repeaterId, index);
item.ismarked = $ax.repeater.isEditItem(repeaterId, index);
item.isvisible = Boolean($jobj(elementId).length);
return item;
};
$ax.getItemInfo = _getItemInfo;
var _getWidgetInfo = function(elementId) {
if(!elementId) return { valid: false };
elementId = _getParentElement(elementId);
//var elementAxQuery = $ax('#' + elementId);
var elementQuery = $jobj(elementId);
var obj = $obj(elementId);
var widget = { valid: true, isWidget: true, obj: obj, elementQuery: elementQuery, isLayer: $ax.public.fn.IsLayer(obj.type) };
widget.elementId = elementId;
widget.name = widget.label = (elementQuery.data('label') ? elementQuery.data('label') : '');
//widget.text = $ax('#' + elementId).text();
widget.opacity = Number(elementQuery.css('opacity')) * 100;
//widget.rotation = $ax.move.getRotationDegree(widget.elementId);
var scriptId = $ax.repeater.getScriptIdFromElementId(elementId);
var repeaterId = $ax.getParentRepeaterFromScriptId(scriptId);
if(repeaterId) widget.repeater = $ax.public.fn.IsRepeater(obj.type) ? widget : _getWidgetInfo(repeaterId);
// Right now only dynamic panel can scroll
if($ax.public.fn.IsDynamicPanel(obj.type)) {
var stateId = $ax.visibility.GetPanelState(elementId);
//can be empty when refreshing repeater and applying filter
if(stateId) {
var stateQuery = $('#' + stateId);
widget.scrollx = stateQuery.scrollLeft();
widget.scrolly = stateQuery.scrollTop();
//widget.stateQuery = stateQuery;
}
} else {
widget.scrollx = 0;
widget.scrolly = 0;
}
// repeater only props
if($ax.public.fn.IsRepeater(obj.type)) {
widget.visibleitemcount = repeaterIdToItemIds[scriptId] ? repeaterIdToItemIds[scriptId].length : $ax.repeater.getVisibleDataCount(scriptId);
widget.itemcount = $ax.repeater.getFilteredDataCount(scriptId);
widget.datacount = $ax.repeater.getDataCount(scriptId);
widget.pagecount = $ax.repeater.getPageCount(scriptId);
widget.pageindex = $ax.repeater.getPageIndex(scriptId);
}
// Get widget info funcs
//widget.elementAxQuery = function () {
// return this.elementAxQueryProp || (this.elementAxQueryProp = $ax('#' + this.elementId));
//}
//widget.isFitToContent = function () {
// if (this.isFitToContentProp === undefined) {
// if (!this.stateQuery) this.isFitToContentProp = false;
// else this.isFitToContentProp = $ax.dynamicPanelManager.isIdFitToContent(this.elementId);
// }
// return this.isFitToContentProp;
//}
widget.x = function () { return this.getProp('x'); }
widget.y = function () { return this.getProp('y'); }
widget.pagex = function () { return this.getProp('pagex'); }
widget.pagey = function () { return this.getProp('pagey'); }
widget.width = function () { return this.getProp('width'); }
widget.height = function () { return this.getProp('height'); }
widget.left = function () { return this.x(); }
widget.top = function () { return this.y(); }
widget.right = function () { return this.x() + this.width(); }
widget.bottom = function () { return this.y() + this.height(); }
widget.rotation = function () { return this.getProp('rotation'); }
widget.text = function () { return this.getProp('text'); }
widget.getProp = function (prop) {
var propName = prop + 'Prop';
if (typeof (this[propName]) != 'undefined') return this[propName];
return this[propName] = this.cacheProp(prop);
};
widget.cacheProp = function (prop) {
if(prop == 'x' || prop == 'y' || prop == 'width' || prop == 'height') {
var boundingRect = $ax('#' + this.elementId).offsetBoundingRect(true);
this.xProp = boundingRect.left;
this.yProp = boundingRect.top;
this.widthProp = boundingRect.width;
this.heightProp = boundingRect.height;
}
if(prop == 'pagex' || prop == 'pagey') {
var viewportLocation = $ax('#' + this.elementId).viewportLocation();
this.pagexProp = viewportLocation.left;
this.pageyProp = viewportLocation.top;
}
if(prop == 'rotation') {
this.rotationProp = $ax.move.getRotationDegree(this.elementId);
}
if (prop == 'text') {
this.textProp = $ax('#' + this.elementId).text();
}
return this[prop + 'Prop'];
//// I'm keeping the returned undefineds the same as before, but really I could probably return undefined right away if elementQuery is empty
//if (this.isLayer) {
// if (prop == 'pagex' || prop == 'pagey') {
// if (this.elementQuery.length > 0) {
// if (prop == 'pagex') return this.elementAxQuery().left();
// else return this.elementAxQuery().top();
// }
// return undefined; // Otherwise, it is undefined as there is no element
// }
// var boundingRect = $ax.public.fn.getWidgetBoundingRect(this.elementId);
// this.xProp = boundingRect.left;
// this.yProp = boundingRect.top;
// this.widthProp = boundingRect.width;
// this.heightProp = boundingRect.height;
// return this[prop + 'Prop'];
//}
//if (this.elementQuery.length <= 0) return prop == 'x' || prop == 'y' ? 0 : undefined;
//switch (prop) {
// case 'x': return this.elementAxQuery().locRelativeIgnoreLayer(false);
// case 'y': return this.elementAxQuery().locRelativeIgnoreLayer(true);
// case 'pagex': return this.elementAxQuery().left();
// case 'pagey': return this.elementAxQuery().top();
//}
//var val = this.elementAxQuery()[prop]();
//if (this.isFitToContent()) val = this.stateQuery[prop]();
//return val;
};
//widget.leftfixed = function() { this.getFixed('left'); }
//widget.topfixed = function() { this.getFixed('top'); }
//widget.rightfixed = function() { this.getFixed('right'); }
//widget.bottomfixed = function() { this.getFixed('bottom'); }
//widget.isFixed = function() {
// if(this.isFixedProp === undefined) this.isFixedProp = this.elementQuery.css('position') == 'fixed)';
// return this.isFixedProp;
//}
//widget.getFixed = function (prop) {
// var fixed = prop + 'fixedProp';
// if(!this.isFixed()) widget[fixed] = widget[prop]();
// if(widget[fixed] === undefined) {
// if(prop == 'left' || prop == 'right') {
// if(this.windowScrollX === undefined) this.windowScrollX = $(window).scrollLeft();
// var windowScroll = this.windowScrollX;
// } else {
// if(this.windowScrollY === undefined) this.windowScrollY = $(window).scrollTop();
// windowScroll = this.windowScrollY;
// }
// widget[fixed] = widget[prop]() - windowScroll;
// }
// return widget[fixed];
//}
return widget;
};
$ax.getWidgetInfo = _getWidgetInfo;
$ax.GetTextPanelId = function (id, create) {
if(!$ax('#' + id).SupportsRichText()) return '';
var buttonShape = $ax.GetButtonShape(id);
var panelDiv = buttonShape.find('.text')[0];
if(!panelDiv) {
if(!create) return "";
var adaptiveId = $ax.adaptive.currentViewId;
var newId = id + "_text";
//var newDiv = $('<div id="' + newId + '" class="text" style="visibility: inherit; position: absolute"></div>');
var newDiv = $('<div id="' + newId + '" class="text' + (adaptiveId ? (' ' + adaptiveId) : '') + '" style="visibility: inherit; position: absolute"><p><span></span></p></div>');
buttonShape.append(newDiv);
$ax.style.setAdaptiveStyle(id, $ax.style.computeAllOverrides(id, undefined, $ax.style.generateState(id), adaptiveId));
panelDiv = newDiv[0];
}
return panelDiv.id;
}
$ax.GetParentIdFromLink = function(id) {
return $ax.GetShapeIdFromText($jobj(id).parentsUntil('.text').parent().attr('id'));
};
$ax.GetButtonShapeId = function(id) {
var obj = $obj(id);
switch(obj.type) {
case $ax.constants.TREE_NODE_OBJECT_TYPE:
return obj.buttonShapeId ? $ax.getElementIdFromPath([obj.buttonShapeId], { relativeTo: id }) : "";
case $ax.constants.LINK_TYPE:
return "";
default:
return id;
}
};
$ax.GetButtonShape = function(id) {
return $jobj($ax.GetButtonShapeId(id));
};
$ax.GetShapeIdFromText = function(id) {
if(!id) return undefined; // this is to prevent an infinite loop.
var current = document.getElementById(id);
if(!current) return undefined;
current = current.parentElement;
while(current && current.tagName != 'BODY') {
var currentId = current.id;
if(currentId && currentId != 'base') return $ax.visibility.getWidgetFromContainer(currentId);
current = current.parentElement;
}
return undefined;
};
$ax.GetImageIdFromShape = function(id) {
var image = $ax.GetButtonShape(id).find('img[id$=img]');
if(!image.length) image = $jobj(id).find('img[id$=image_sketch]');
return image.attr('id');
};
var _getParentElement = $ax.getParentElement = function(elementId) {
var obj = $obj(elementId);
while(obj.isContained) {
var path = $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(elementId));
var itemId = $ax.repeater.getItemIdFromElementId(elementId);
path[path.length - 1] = obj.parent.id;
elementId = $ax.getElementIdFromPath(path, { itemNum: itemId });
obj = $obj(elementId);
}
return elementId;
};
$ax.addItemIdToRepeater = function(itemId, repeaterId) {
var itemIds = repeaterIdToItemIds[repeaterId];
if(itemIds) itemIds[itemIds.length] = itemId;
else repeaterIdToItemIds[repeaterId] = [itemId];
var scriptIds = repeaterIdToScriptIds[repeaterId];
for(var i = 0; i < scriptIds.length; i++) elementIdToObject[$ax.repeater.createElementId(scriptIds[i], itemId)] = $ax.getObjectFromScriptId(scriptIds[i]);
};
$ax.getAllElementIds = function() {
var elementIds = [];
for(var i = 0; i < _scriptIds.length; i++) {
var scriptId = _scriptIds[i];
var repeaterId = scriptIdToRepeaterId[scriptId];
if(repeaterId && repeaterId != scriptId) {
var itemIds = repeaterIdToItemIds[repeaterId] || [];
for(var j = 0; j < itemIds.length; j++) elementIds[elementIds.length] = $ax.repeater.createElementId(scriptId, itemIds[j]);
} else elementIds[elementIds.length] = scriptId;
}
return elementIds;
};
$ax.getAllScriptIds = function() {
return _scriptIds;
};
$ax.getObjectFromElementId = function(elementId) {
return $ax.getObjectFromScriptId($ax.repeater.getScriptIdFromElementId(elementId));
};
$ax.getObjectFromScriptId = function(scriptId) {
return scriptIdToObject[scriptId];
};
$ax.getParentRepeaterFromElementId = function(elementId) {
return $ax.getParentRepeaterFromScriptId($ax.repeater.getScriptIdFromElementId(elementId));
};
$ax.getParentRepeaterFromElementIdExcludeSelf = function (elementId) {
var repeaterId = $ax.getParentRepeaterFromElementId(elementId);
return repeaterId != elementId ? repeaterId : undefined;
};
$ax.getParentRepeaterFromScriptId = function(scriptId) {
return scriptIdToRepeaterId[scriptId];
};
var _getChildScriptIdsForRepeater = function(repeaterId) {
return repeaterIdToScriptIds[repeaterId];
};
var _getItemIdsForRepeater = function(repeaterId) {
return repeaterIdToItemIds[repeaterId] || [];
};
$ax.getItemIdsForRepeater = _getItemIdsForRepeater;
var _clearItemIdsForRepeater = function(repeaterId) {
repeaterIdToItemIds[repeaterId] = [];
};
$ax.clearItemsForRepeater = _clearItemIdsForRepeater;
$ax.getChildElementIdsForRepeater = function(repeaterId) {
var scriptIds = _getChildScriptIdsForRepeater(repeaterId);
var itemIds = _getItemIdsForRepeater(repeaterId);
var retVal = [];
if(!itemIds || !scriptIds) return retVal;
for(var i = 0; i < scriptIds.length; i++) {
for(var j = 0; j < itemIds.length; j++) {
retVal[retVal.length] = $ax.repeater.createElementId(scriptIds[i], itemIds[j]);
}
}
return retVal;
};
$ax.getRdoParentFromElementId = function(elementId) {
var scriptId = $ax.repeater.getScriptIdFromElementId(elementId);
var rdoId = scriptIdToPath[scriptId].parent.scriptId;
if($ax.getParentRepeaterFromScriptId(rdoId)) rdoId = $ax.repeater.createElementId(rdoId, $ax.repeater.getItemIdFromElementId(elementId));
return rdoId;
};
$ax.getLayerParentFromElementId = function (elementId) {
var itemId = $ax.repeater.getItemIdFromElementId(elementId);
var scriptId = scriptIdToParentLayer[$ax.repeater.getScriptIdFromElementId(elementId)];
return $ax.getParentRepeaterFromElementId(scriptId) ? $ax.repeater.createElementId(scriptId, itemId) : scriptId;
}
$ax.updateElementText = function(elementId, text) {
elementIdToText[elementId] = text;
};
$ax.hasElementTextChanged = function(elementId, text) {
return elementIdToText[elementId] != text;
};
$ax.updateRadioButtonSelected = function(group, elementId) {
var old = radioGroupToSelectedElementId[group];
radioGroupToSelectedElementId[group] = elementId;
return old;
};
$ax.hasRadioButtonSelectedChanged = function(group, elementId) {
return radioGroupToSelectedElementId[group] != elementId;
};
})();
//Recursively populates fullPathArray with:
// [ { idPath, scriptId }, ... ]
//for every scriptId in the object
//also populates an object of scriptId -> path
var _pathToScriptIdHelper = function(currentPath, currentChain, fullPathArray, scriptIdToPath) {
for(var key in currentPath) {
if(key != "scriptId") {
var nextPath = currentPath[key];
_pathToScriptIdHelper(nextPath, currentChain.concat(key), fullPathArray, scriptIdToPath);
nextPath.parent = currentPath;
nextPath.uniqueId = key;
} else {
fullPathArray[fullPathArray.length] = { idPath: currentChain, scriptId: currentPath.scriptId };
scriptIdToPath[currentPath.scriptId] = currentPath;
}
}
};
$ax.public.loadCurrentPage = $ax.loadCurrentPage = function(pageData) {
$ax.pageData = _pageData = pageData;
_initializePageData();
};
$ax.public.loadDocument = $ax.loadDocument = function(document) {
$ax.document = document;
_initializeDocumentData();
};
/**
Navigates to a page
*/
$ax.public.navigate = $ax.navigate = function(to) { //url, includeVariables, type) {
var targetUrl;
if(typeof (to) === 'object') {
includeVariables = to.includeVariables;
targetUrl = !includeVariables ? to.url : $ax.globalVariableProvider.getLinkUrl(to.url);
if(to.target == "new") {
window.open(targetUrl, "");
} else if(to.target == "popup") {
var features = _getPopupFeatures(to.popupOptions);
window.open(targetUrl, "", features);
} else {
var targetLocation = window.location;
if(to.target == "current") {
} else if(to.target == "parent") {
if(!top.opener) return;
targetLocation = top.opener.window.location;
} else if(to.target == "parentFrame") {
targetLocation = parent.location;
} else if(to.target == "frame") {
// targetLocation = to.frame.contentWindow.location;
$(to.frame).attr('src', targetUrl || 'about:blank');
return;
}
if (!_needsReload(targetLocation, to.url)) {
targetLocation.href = targetUrl || 'about:blank';
} else {
targetLocation.href = $axure.utils.getReloadPath() + "#" + encodeURI(targetUrl);
}
}
} else {
$ax.navigate({
url: to,
target: "current",
includeVariables: arguments[1]
});
}
};
var _needsReload = function(oldLocation, newBaseUrl) {
var reload = false;
try {
var oldUrl = oldLocation.href;
var oldBaseUrl = oldUrl.split("#")[0];
var lastslash = oldBaseUrl.lastIndexOf("/");
if(lastslash > 0) {
oldBaseUrl = oldBaseUrl.substring(lastslash + 1, oldBaseUrl.length);
if(oldBaseUrl == encodeURI(newBaseUrl)) {
reload = true;
}
}
} catch(e) {
}
return reload;
};
var _getPopupFeatures = function(options) {
var defaultOptions = {
toolbar: true,
scrollbars: true,
location: true,
status: true,
menubar: true,
directories: true,
resizable: true,
centerwindow: true,
left: -1,
top: -1,
height: -1,
width: -1
};
var selectedOptions = $.extend({}, defaultOptions, options);
var optionsList = [];
optionsList.push('toolbar=' + (selectedOptions.toolbar ? 'yes' : 'no'));
optionsList.push('scrollbars=' + (selectedOptions.scrollbars ? 'yes' : 'no'));
optionsList.push('location=' + (selectedOptions.location ? 'yes' : 'no'));
optionsList.push('status=' + (selectedOptions.status ? 'yes' : 'no'));
optionsList.push('menubar=' + (selectedOptions.menubar ? 'yes' : 'no'));
optionsList.push('directories=' + (selectedOptions.directories ? 'yes' : 'no'));
optionsList.push('resizable=' + (selectedOptions.resizable ? 'yes' : 'no'));
if(selectedOptions.centerwindow == false) {
if(selectedOptions.left > -1) {
optionsList.push('left=' + selectedOptions.left);
}
if(selectedOptions.top > -1) {
optionsList.push('top=' + selectedOptions.top);
}
}
var height = 0;
var width = 0;
if(selectedOptions.height > 0) {
optionsList.push('height=' + selectedOptions.height);
height = selectedOptions.height;
}
if(selectedOptions.width > 0) {
optionsList.push('width=' + selectedOptions.width);
width = selectedOptions.width;
}
var features = optionsList.join(',');
if(selectedOptions.centerwindow) {
var winl = (window.screen.width - width) / 2;
var wint = (window.screen.height - height) / 2;
features = features + ',left=' + winl + ',top=' + wint;
}
return features;
};
/**
Closes a window
*/
$ax.public.closeWindow = $ax.closeWindow = function() {
parent.window.close();
};
/**
Goes back
*/
$ax.public.back = $ax.back = function() {
window.history.go(-1);
};
/**
Reloads the current page.
# includeVariables: true if it should re-include the variables when the page is reloaded
*/
$ax.public.reload = $ax.reload = function(includeVariables) {
var targetUrl = (includeVariables === false)
? $axure.utils.getReloadPath() + "#" + encodeURI($ax.pageData.url)
: $axure.utils.getReloadPath() + "#" + encodeURI($ax.globalVariableProvider.getLinkUrl($ax.pageData.url));
window.location.href = targetUrl;
};
/**
Sets a variable.
# name: The name of the global variable to set
# value: The value that should be set
*/
$ax.public.setGlobalVariable = $ax.setGlobalVariable = function(name, value) {
if(!name || !value) {
return;
}
$ax.globalVariableProvider.setVariableValue(name, value);
};
/**
Gets the value of a global variable
# name: The name of the global variable value to get
*/
$ax.public.getGlobalVariable = $ax.getGlobalVariable = function(name) {
$ax.globalVariableProvider.getVariableValue(name);
};
$ax.getObjectFromElementIdDisregardHex = function (elementId) {
var elementIdInput = elementId.charAt(0) == '#' ? elementId.substring(1) : elementId;
return this.getObjectFromElementId(elementIdInput);
}
$ax.getTypeFromElementId = function(elementId) {
var obj = this.getObjectFromElementIdDisregardHex(elementId);
return obj && obj.type;
};
$ax.getNumFromPx = function(pxNum) {
return Number(pxNum.replace('px', ''));
}
});

View File

@@ -0,0 +1,256 @@
$axure.internal(function($ax) {
var widgetDragInfo = new Object();
var _drag = {};
$ax.drag = _drag;
$ax.drag.GetWidgetDragInfo = function() {
return $.extend({}, widgetDragInfo);
};
$ax.drag.StartDragWidget = function(event, id) {
$ax.setjBrowserEvent(jQuery.Event(event));
if(event.donotdrag) return;
var x, y;
var tg;
if(IE_10_AND_BELOW) {
x = window.event.clientX + window.document.documentElement.scrollLeft + window.document.body.scrollLeft;
y = window.event.clientY + window.document.documentElement.scrollTop + window.document.body.scrollTop;
tg = window.event.srcElement;
} else {
if(event.changedTouches) {
x = event.changedTouches[0].pageX;
y = event.changedTouches[0].pageY;
} else {
x = event.pageX;
y = event.pageY;
event.preventDefault();
}
tg = event.target;
}
widgetDragInfo.hasStarted = false;
widgetDragInfo.widgetId = id;
widgetDragInfo.cursorStartX = x;
widgetDragInfo.cursorStartY = y;
widgetDragInfo.lastX = x;
widgetDragInfo.lastY = y;
widgetDragInfo.currentX = x;
widgetDragInfo.currentY = y;
widgetDragInfo.movedWidgets = new Object();
widgetDragInfo.startTime = (new Date()).getTime();
widgetDragInfo.targetWidget = tg;
var movedownName = IE_10_AND_BELOW && $ax.features.supports.windowsMobile ?
$ax.features.eventNames.mouseDownName : $ax.features.eventNames.mouseMoveName;
$ax.event.addEvent(document, movedownName, _dragWidget, true);
$ax.event.addEvent(document, $ax.features.eventNames.mouseUpName, _stopDragWidget, true);
$ax.legacy.SuppressBubble(event);
};
var _dragWidget = function(event) {
$ax.setjBrowserEvent(jQuery.Event(event));
var x, y;
if(IE_10_AND_BELOW) {
x = window.event.clientX + window.document.documentElement.scrollLeft + window.document.body.scrollLeft;
y = window.event.clientY + window.document.documentElement.scrollTop + window.document.body.scrollTop;
} else {
if(event.changedTouches) {
x = event.changedTouches[0].pageX;
y = event.changedTouches[0].pageY;
//allow scroll (defaults) if only swipe events have cases and delta x is less than 5px and not blocking scrolling
var deltaX = x - widgetDragInfo.currentX;
var target = window.document.getElementById(widgetDragInfo.widgetId);
if($ax.event.hasSyntheticEvent(widgetDragInfo.widgetId, "onDrag") || $ax.event.hasSyntheticEvent(widgetDragInfo.widgetId, "onSwipeUp") ||
$ax.event.hasSyntheticEvent(widgetDragInfo.widgetId, "onSwipeDown") || (deltaX * deltaX) > 25
|| ($ax.document.configuration.preventScroll && $ax.legacy.GetScrollable(target) == window.document.body)) {
event.preventDefault();
}
} else {
x = event.pageX;
y = event.pageY;
}
}
widgetDragInfo.xDelta = x - widgetDragInfo.currentX;
widgetDragInfo.yDelta = y - widgetDragInfo.currentY;
widgetDragInfo.lastX = widgetDragInfo.currentX;
widgetDragInfo.lastY = widgetDragInfo.currentY;
widgetDragInfo.currentX = x;
widgetDragInfo.currentY = y;
widgetDragInfo.currentTime = (new Date()).getTime();
$ax.legacy.SuppressBubble(event);
if(!widgetDragInfo.hasStarted) {
widgetDragInfo.hasStarted = true;
$ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onDragStart");
widgetDragInfo.oldBodyCursor = window.document.body.style.cursor;
window.document.body.style.cursor = 'move';
var widget = window.document.getElementById(widgetDragInfo.widgetId);
widgetDragInfo.oldCursor = widget.style.cursor;
widget.style.cursor = 'move';
}
$ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onDrag");
};
var _suppressClickAfterDrag = function(event) {
_removeSuppressEvents();
$ax.legacy.SuppressBubble(event);
};
var _removeSuppressEvents = function () {
if(IE_10_AND_BELOW) {
$ax.event.removeEvent(event.srcElement, 'click', _suppressClickAfterDrag, undefined, true);
$ax.event.removeEvent(widgetDragInfo.targetWidget, 'mousemove', _removeSuppressEvents, undefined, true);
} else {
$ax.event.removeEvent(document, "click", _suppressClickAfterDrag, true);
$ax.event.removeEvent(document, 'mousemove', _removeSuppressEvents, true);
}
};
var _stopDragWidget = function(event) {
$ax.setjBrowserEvent(jQuery.Event(event));
var tg;
var movedownName = IE_10_AND_BELOW && $ax.features.supports.windowsMobile ?
$ax.features.eventNames.mouseDownName : $ax.features.eventNames.mouseMoveName;
$ax.event.removeEvent(document, movedownName, _dragWidget, true);
$ax.event.removeEvent(document, $ax.features.eventNames.mouseUpName, _stopDragWidget, true);
tg = IE_10_AND_BELOW ? window.event.srcElement : event.target;
if(widgetDragInfo.hasStarted) {
widgetDragInfo.currentTime = (new Date()).getTime();
$ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onDragDrop");
if($ax.globalVariableProvider.getVariableValue('totaldragx') < -30 && $ax.globalVariableProvider.getVariableValue('dragtime') < 1000) {
$ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onSwipeLeft");
}
if($ax.globalVariableProvider.getVariableValue('totaldragx') > 30 && $ax.globalVariableProvider.getVariableValue('dragtime') < 1000) {
$ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onSwipeRight");
}
var totalDragY = $ax.globalVariableProvider.getVariableValue('totaldragy');
if(totalDragY < -30 && $ax.globalVariableProvider.getVariableValue('dragtime') < 1000) {
$ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onSwipeUp");
}
if(totalDragY > 30 && $ax.globalVariableProvider.getVariableValue('dragtime') < 1000) {
$ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onSwipeDown");
}
window.document.body.style.cursor = widgetDragInfo.oldBodyCursor;
var widget = window.document.getElementById(widgetDragInfo.widgetId);
// It may be null if OnDragDrop filtered out the widget
if(widget != null) widget.style.cursor = widgetDragInfo.oldCursor;
if(widgetDragInfo.targetWidget == tg && !event.changedTouches) {
// suppress the click after the drag on desktop browsers
if(IE_10_AND_BELOW && widgetDragInfo.targetWidget) {
$ax.event.addEvent(widgetDragInfo.targetWidget, 'click', _suppressClickAfterDrag, true, true);
$ax.event.addEvent(widgetDragInfo.targetWidget, "onmousemove", _removeSuppressEvents, true, true);
} else {
$ax.event.addEvent(document, "click", _suppressClickAfterDrag, true);
$ax.event.addEvent(document, "mousemove", _removeSuppressEvents, true);
}
}
}
widgetDragInfo.hasStarted = false;
widgetDragInfo.movedWidgets = new Object();
return false;
};
$ax.drag.GetDragX = function() {
if(widgetDragInfo.hasStarted) return widgetDragInfo.xDelta;
return 0;
};
$ax.drag.GetDragY = function() {
if(widgetDragInfo.hasStarted) return widgetDragInfo.yDelta;
return 0;
};
$ax.drag.GetTotalDragX = function() {
if(widgetDragInfo.hasStarted) return widgetDragInfo.currentX - widgetDragInfo.cursorStartX;
return 0;
};
$ax.drag.GetTotalDragY = function() {
if(widgetDragInfo.hasStarted) return widgetDragInfo.currentY - widgetDragInfo.cursorStartY;
return 0;
};
$ax.drag.GetDragTime = function() {
if(widgetDragInfo.hasStarted) return widgetDragInfo.currentTime - widgetDragInfo.startTime;
return 600000;
};
$ax.drag.LogMovedWidgetForDrag = function (id, dragInfo) {
dragInfo = dragInfo || widgetDragInfo;
if(dragInfo.hasStarted) {
var containerIndex = id.indexOf('_container');
if(containerIndex != -1) id = id.substring(0, containerIndex);
// If state or other non-widget id, this should not be dragged, and should exit out to avoid exceptions.
if(!$obj(id)) return;
var query = $ax('#' + id);
//var x = query.left();
//var y = query.top();
var viewportLocation = query.viewportLocation();
var x = viewportLocation.left;
var y = viewportLocation.top;
var movedWidgets = dragInfo.movedWidgets;
if(!movedWidgets[id]) {
movedWidgets[id] = new Location(x, y);
}
}
};
var Location = function(x, y) {
this.x = x;
this.y = y;
};
$ax.drag.location = Location;
var Rectangle = $ax.drag.Rectangle = function(x, y, width, height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.right = x + width;
this.bottom = y + height;
};
Rectangle.prototype.IntersectsWith = function(rect) {
if(this.Invalid()) return false;
if(rect.length) {
for(var i = 0; i < rect.length; i++) if(!rect[i].Invalid && this.IntersectsWith(rect[i])) return true;
return false;
}
if(rect.Invalid()) return false;
return this.x < rect.right && this.right > rect.x && this.y < rect.bottom && this.bottom > rect.y;
};
Rectangle.prototype.Invalid = function() {
return this.x == -1 && this.y == -1 && this.width == -1 && this.height == -1;
};
Rectangle.prototype.Move = function(x, y) {
return new Rectangle(x, y, this.width, this.height);
};
});

View File

@@ -0,0 +1,579 @@
// ******* Expr MANAGER ******** //
$axure.internal(function($ax) {
var _expr = $ax.expr = {};
var _binOpHandlers = {
'&&': function(left, right) { return _binOpOverride(left, right, function(left) { return $ax.getBool(left) && $ax.getBool(right()); }); },
'||': function(left, right) { return _binOpOverride(left, right, function(left) { return $ax.getBool(left) || $ax.getBool(right()); }); },
'==': function(left, right) { return isEqual(left, right, true); },
'!=': function(left, right) { return !isEqual(left, right, true); },
'>': function(left, right) { return _binOpNum(left, right, function(left, right) { return left > right; }); },
'<': function(left, right) { return _binOpNum(left, right, function(left, right) { return left < right; }); },
'>=': function(left, right) { return _binOpNum(left, right, function(left, right) { return left >= right; }); },
'<=': function(left, right) { return _binOpNum(left, right, function(left, right) { return left <= right; }); }
};
var checkOps = function(left, right) {
return left == undefined || right == undefined;
};
var isEqual = function (left, right, isFunction) {
if (isFunction) {
//if left and right is function, then get the value
//otherwise left and right should be already the value we want
left = left();
right = right();
}
if(checkOps(left, right)) return false;
if(left instanceof Date && right instanceof Date) {
if(left.getMilliseconds() != right.getMilliseconds()) return false;
if(left.getSeconds() != right.getSeconds()) return false;
if(left.getMinutes() != right.getMinutes()) return false;
if(left.getHours() != right.getHours()) return false;
if(left.getDate() != right.getDate()) return false;
if(left.getMonth() != right.getMonth()) return false;
if(left.getYear() != right.getYear()) return false;
return true;
}
if(left instanceof Object && right instanceof Object) {
var prop;
// Go through all of lefts properties and compare them to rights.
for(prop in left) {
if(!left.hasOwnProperty(prop)) continue;
// If left has a property that the right doesn't they are not equal.
if(!right.hasOwnProperty(prop)) return false;
// If any of their properties are not equal, they are not equal.
if(!isEqual(left[prop], right[prop], false)) return false;
}
for(prop in right) {
// final check to make sure right doesn't have some extra properties that make them not equal.
if(left.hasOwnProperty(prop) != right.hasOwnProperty(prop)) return false;
}
return true;
}
return $ax.getBool(left) == $ax.getBool(right);
};
var _binOpOverride = function(left, right, func) {
left = left();
if(left == undefined) return false;
var res = func(left, right);
return res == undefined ? false : res;
};
var _binOpNum = function(left, right, func) {
var left = left();
var right = right();
if(checkOps(left, right)) return false;
return func(left, Number(right));
};
var _exprHandlers = {};
_exprHandlers.array = function(expr, eventInfo) {
var returnVal = [];
for(var i = 0; i < expr.items.length; i++) {
returnVal[returnVal.length] = _evaluateExpr(expr.items[i], eventInfo);
}
return returnVal;
};
_exprHandlers.binaryOp = function(expr, eventInfo) {
var left = function() { return expr.leftExpr && _evaluateExpr(expr.leftExpr, eventInfo); };
var right = function() { return expr.rightExpr && _evaluateExpr(expr.rightExpr, eventInfo); };
if(left == undefined || right == undefined) return false;
return _binOpHandlers[expr.op](left, right);
};
_exprHandlers.block = function(expr, eventInfo) {
var subExprs = expr.subExprs;
for(var i = 0; i < subExprs.length; i++) {
_evaluateExpr(subExprs[i], eventInfo); //ignore the result
}
};
_exprHandlers.booleanLiteral = function(expr) {
return expr.value;
};
_exprHandlers.nullLiteral = function() { return null; };
_exprHandlers.pathLiteral = function(expr, eventInfo) {
if(expr.isThis) return [eventInfo.srcElement];
if(expr.isFocused && window.lastFocusedControl) {
$ax('#' + window.lastFocusedControl).focus();
return [window.lastFocusedControl];
}
if(expr.isTarget) return [eventInfo.targetElement];
return $ax.getElementIdsFromPath(expr.value, eventInfo);
};
_exprHandlers.panelDiagramLiteral = function(expr, eventInfo) {
var elementIds = $ax.getElementIdsFromPath(expr.panelPath, eventInfo);
var elementIdsWithSuffix = [];
var suffix = '_state' + expr.panelIndex;
for(var i = 0; i < elementIds.length; i++) {
elementIdsWithSuffix[i] = $ax.repeater.applySuffixToElementId(elementIds[i], suffix);
}
return String($jobj(elementIdsWithSuffix).data('label'));
};
_exprHandlers.fcall = function(expr, eventInfo) {
var oldTarget = eventInfo.targetElement;
var targets = [];
var fcallArgs = [];
var exprArgs = expr.arguments;
for(var i = 0; i < expr.arguments.length; i++) {
var exprArg = exprArgs[i];
var fcallArg = '';
if(targets.length) {
for(var j = 0; j < targets.length; j++) {
if(exprArg == null) {
fcallArgs[j][i] = null;
continue;
}
eventInfo.targetElement = targets[j];
fcallArg = _evaluateExpr(exprArg, eventInfo);
if(typeof (fcallArg) == 'undefined') return '';
fcallArgs[j][i] = fcallArg;
}
} else {
if(exprArg == null) {
fcallArgs[i] = null;
continue;
}
fcallArg = _evaluateExpr(exprArg, eventInfo);
if(typeof (fcallArg) == 'undefined') return '';
fcallArgs[i] = fcallArg;
}
// We do support null exprArgs...
// TODO: This makes 2 assumptions that may change in the future. 1. The pathLiteral is the always the first arg. 2. there is always only 1 pathLiteral
if(exprArg && exprArg.exprType == 'pathLiteral') {
targets = fcallArg;
// fcallArgs is now an array of an array of args
for(j = 0; j < targets.length; j++) fcallArgs[j] = [[fcallArg[j]]];
}
}
// we want to preserve the target element from outside this function.
eventInfo.targetElement = oldTarget;
var retval = '';
if(targets.length) {
// Go backwards so retval is the first item.
for(i = targets.length - 1; i >= 0; i--) {
var args = fcallArgs[i];
// Add event info to the end
args[args.length] = eventInfo;
retval = _exprFunctions[expr.functionName].apply(this, args);
}
} else fcallArgs[fcallArgs.length] = eventInfo;
return targets.length ? retval : _exprFunctions[expr.functionName].apply(this, fcallArgs);
};
_exprHandlers.globalVariableLiteral = function(expr) {
return expr.variableName;
};
_exprHandlers.keyPressLiteral = function(expr) {
var keyInfo = {};
keyInfo.keyCode = expr.keyCode;
keyInfo.ctrl = expr.ctrl;
keyInfo.alt = expr.alt;
keyInfo.shift = expr.shift;
return keyInfo;
};
_exprHandlers.adaptiveViewLiteral = function(expr) {
return expr.id;
};
_exprHandlers.optionLiteral = function(expr) {
return expr.value;
}
var _substituteSTOs = function(expr, eventInfo) {
//first evaluate the local variables
var scope = {};
for(var varName in expr.localVariables) {
scope[varName] = $ax.expr.evaluateExpr(expr.localVariables[varName], eventInfo);
}
// TODO: [ben] Date and data object (obj with info for url or image) both need to return non-strings.
var i = 0;
var retval;
var retvalString = expr.value.replace(/\[\[(?!\[)(.*?)\]\](?=\]*)/g, function(match) {
var sto = expr.stos[i++];
if(sto.sto == 'error') return match;
try {
var result = $ax.evaluateSTO(sto, scope, eventInfo);
} catch(e) {
return match;
}
if((result instanceof Object) && i == 1 && expr.value.substring(0, 2) == '[[' &&
expr.value.substring(expr.value.length - 2) == ']]') {
// If the result was an object, this was the first result, and the whole thing was this expresion.
retval = result;
}
return ((result instanceof Object) && (result.label || result.text)) || result;
});
// If more than one group returned, the object is not valid
if(i != 1) retval = false;
return retval || retvalString;
};
_exprHandlers.htmlLiteral = function (expr, eventInfo) {
eventInfo.htmlLiteral = true;
var html = _substituteSTOs(expr, eventInfo);
eventInfo.htmlLiteral = false
return html;
};
_exprHandlers.stringLiteral = function(expr, eventInfo) {
return _substituteSTOs(expr, eventInfo);
};
var _exprFunctions = {};
_exprFunctions.SetCheckState = function(elementIds, value) {
var toggle = value == 'toggle';
var boolValue = Boolean(value) && value != 'false';
for(var i = 0; i < elementIds.length; i++) {
var query = $ax('#' + elementIds[i]);
query.selected(toggle ? !query.selected() : boolValue);
}
};
_exprFunctions.SetSelectedOption = function(elementIds, value) {
for(var i = 0; i < elementIds.length; i++) {
var elementId = elementIds[i];
var obj = $jobj($ax.INPUT(elementId));
if(obj.val() == value) return;
obj.val(value);
if($ax.event.HasSelectionChanged($ax.getObjectFromElementId(elementId))) $ax.event.raiseSyntheticEvent(elementId, 'onSelectionChange');
}
};
_exprFunctions.SetGlobalVariableValue = function(varName, value) {
$ax.globalVariableProvider.setVariableValue(varName, value);
};
_exprFunctions.SetWidgetFormText = function(elementIds, value) {
for(var i = 0; i < elementIds.length; i++) {
var elementId = elementIds[i];
var inputId = $ax.repeater.applySuffixToElementId(elementId, '_input');
var obj = $jobj(inputId);
if(obj.val() == value || (value == '' && $ax.placeholderManager.isActive(elementId))) return;
obj.val(value);
$ax.placeholderManager.updatePlaceholder(elementId, !value);
if($ax.event.HasTextChanged($ax.getObjectFromElementId(elementId))) $ax.event.TryFireTextChanged(elementId);
}
};
_exprFunctions.SetFocusedWidgetText = function(elementId, value) {
if(window.lastFocusedControl) {
var elementId = window.lastFocusedControl;
var type = $obj(elementId).type;
if ($ax.public.fn.IsTextBox(type) || $ax.public.fn.IsTextArea(type)) _exprFunctions.SetWidgetFormText([elementId], value);
else _exprFunctions.SetWidgetRichText([elementId], value, true);
}
};
_exprFunctions.GetRtfElementHeight = function(rtfElement) {
if(rtfElement.innerHTML == '') rtfElement.innerHTML = '&nbsp;';
return rtfElement.offsetHeight;
};
_exprFunctions.SetWidgetRichText = function(ids, value, plain) {
// Converts dates, widgetinfo, and the like to strings.
value = _exprFunctions.ToString(value);
//Replace any newlines with line breaks
var finalValue = value.replace(/\r\n/g, '<br>').replace(/\n/g, '<br>');
for(var i = 0; i < ids.length; i++) {
var id = ids[i];
// If calling this on button shape, get the id of the rich text panel inside instead
if($obj(id).type !== $ax.constants.LINK_TYPE) id = $ax.GetTextPanelId(id, true);
var element = window.document.getElementById(id);
$ax.visibility.SetVisible(element, value != '');
$ax.style.transformTextWithVerticalAlignment(id, function() {
var spans = $jobj(id).find('span');
if(plain) {
// Can't set value as text because '<br/>' doesn't actually do a line break
// Can't set vaule as html because it doesn't like '<' and ignores all after it
// Create tags yourself
var lines = value.split(/\r\n|\n/);
//if we are dealing with only one line, just reuse the old one
if(spans.length === 1 && lines.length === 1) {
$(spans[0]).text(value);
return;
}
// Wrap in span and p, style them accordingly.
var span = $('<span></span>');
if(spans.length > 0) {
span.attr('style', $(spans[0]).attr('style'));
span.attr('id', $(spans[0]).attr('id'));
}
if(lines.length == 1) span.text(value);
else {
for(var i = 0; i < lines.length; i++) {
if(i != 0) span.append($('<br />'));
var line = lines[i];
if(line.length == 0) continue;
var subSpan = $('<span />');
subSpan.text(line);
span.append(subSpan);
}
}
var ps = $jobj(id).find('p');
if(ps && ps.length) {
ps[0].innerHTML = $('<div></div>').append(span).html();;
if(ps.length > 1) {
for(var i = 1; i < ps.length; i++) {
$(ps[i]).remove();
}
}
} else {
var p = $('<p></p>');
p.append(span);
element.innerHTML = $('<div></div>').append(p).html();
}
} else element.innerHTML = finalValue;
});
if(!plain) $ax.style.CacheOriginalText(id, true);
}
};
_exprFunctions.GetCheckState = function(ids) {
return $ax('#' + ids[0]).selected();
};
_exprFunctions.GetDisabledState = function (ids) {
return !$ax('#' + ids[0]).enabled();
};
_exprFunctions.GetSelectedOption = function (ids) {
var inputs = $jobj($ax.INPUT(ids[0]));
return inputs.length ? inputs[0].value : '';
};
_exprFunctions.GetNum = function(str) {
//Setting a GlobalVariable to some blank text then setting a widget to the value of that variable would result in 0 not ""
//I have fixed this another way so commenting this should be fine now
//if (!str) return "";
return isNaN(str) ? str : Number(str);
};
_exprFunctions.GetGlobalVariableValue = function(id) {
return $ax.globalVariableProvider.getVariableValue(id);
};
_exprFunctions.GetGlobalVariableLength = function(id) {
return _exprFunctions.GetGlobalVariableValue(id).length;
};
_exprFunctions.GetWidgetText = function(ids) {
if($ax.placeholderManager.isActive(ids[0])) return '';
var input = $ax.INPUT(ids[0]);
return $ax('#' + ($jobj(input).length ? input : ids[0])).text();
};
_exprFunctions.GetFocusedWidgetText = function() {
if(window.lastFocusedControl) {
return $ax('#' + window.lastFocusedControl).text();
} else {
return "";
}
};
_exprFunctions.GetWidgetValueLength = function(ids) {
var id = ids[0];
if(!id) return undefined;
if($ax.placeholderManager.isActive(id)) return 0;
var obj = $jobj($ax.INPUT(id));
if(!obj.length) obj = $jobj(id);
var val = obj[0].value || _exprFunctions.GetWidgetText([id]);
return val.length;
};
_exprFunctions.GetPanelState = function(ids) {
var id = ids[0];
if(!id) return undefined;
var stateId = $ax.visibility.GetPanelState(id);
return stateId && String($jobj(stateId).data('label'));
};
_exprFunctions.GetWidgetVisibility = function(ids) {
var id = ids[0];
if(!id) return undefined;
return $ax.visibility.IsIdVisible(id);
};
// ***************** Validation Functions ***************** //
_exprFunctions.IsValueAlpha = function(val) {
var isAlphaRegex = new RegExp("^[a-z\\s]+$", "gi");
return isAlphaRegex.test(val);
};
_exprFunctions.IsValueNumeric = function(val) {
var isNumericRegex = new RegExp("^[0-9,\\.\\s]+$", "gi");
return isNumericRegex.test(val);
};
_exprFunctions.IsValueAlphaNumeric = function(val) {
var isAlphaNumericRegex = new RegExp("^[0-9a-z\\s]+$", "gi");
return isAlphaNumericRegex.test(val);
};
_exprFunctions.IsValueOneOf = function(val, values) {
for(var i = 0; i < values.length; i++) {
var option = values[i];
if(val == option) return true;
}
//by default, return false
return false;
};
_exprFunctions.IsValueNotAlpha = function(val) {
return !_exprFunctions.IsValueAlpha(val);
};
_exprFunctions.IsValueNotNumeric = function(val) {
return !_exprFunctions.IsValueNumeric(val);
};
_exprFunctions.IsValueNotAlphaNumeric = function(val) {
return !_exprFunctions.IsValueAlphaNumeric(val);
};
_exprFunctions.IsValueNotOneOf = function(val, values) {
return !_exprFunctions.IsValueOneOf(val, values);
};
_exprFunctions.GetKeyPressed = function(eventInfo) {
return eventInfo.keyInfo;
};
_exprFunctions.GetCursorRectangles = function() {
var rects = new Object();
rects.lastRect = new $ax.drag.Rectangle($ax.lastMouseLocation.x, $ax.lastMouseLocation.y, 1, 1);
rects.currentRect = new $ax.drag.Rectangle($ax.mouseLocation.x, $ax.mouseLocation.y, 1, 1);
return rects;
};
_exprFunctions.GetWidgetRectangles = function (elementIds, eventInfo) {
var elementId = elementIds[0];
var rects = new Object();
var jObj = $jobj(elementId);
var invalid = jObj.length == 0;
var parent = jObj;
// Or are in valid if no obj can be found, or if it is not visible.
while(parent.length != 0 && !parent.is('body')) {
if(parent.css('display') == 'none') {
invalid = true;
break;
}
parent = parent.parent();
}
if(invalid) {
rects.lastRect = rects.currentRect = new $ax.drag.Rectangle(-1, -1, -1, -1);
return rects;
}
var axObj = $ax('#' + elementId);
var boundingRect = axObj.viewportBoundingRect();
rects.lastRect = new $ax.drag.Rectangle(
boundingRect.left,
boundingRect.top,
boundingRect.width,
boundingRect.height);
//rects.lastRect = new $ax.drag.Rectangle(
// axObj.left(),
// axObj.top(),
// axObj.width(),
// axObj.height());
rects.currentRect = rects.lastRect;
return rects;
};
_exprFunctions.GetWidget = function(elementId) {
return $ax.getWidgetInfo(elementId[0]);
};
_exprFunctions.GetAdaptiveView = function (eventInfo) {
if (eventInfo && eventInfo.srcElement) {
var id = eventInfo.srcElement;
var diagramObject = $ax.getObjectFromElementId(id);
if (diagramObject.owner.type == 'Axure:Master') {
var viewIdChain = $ax.style.getViewIdChain($ax.adaptive.currentViewId || '', id, diagramObject);
if (viewIdChain.length > 0) return viewIdChain[viewIdChain.length - 1];
else return '19e82109f102476f933582835c373474';
}
}
return $ax.adaptive.currentViewId || '';
};
_exprFunctions.IsEntering = function(movingRects, targetRects) {
return !movingRects.lastRect.IntersectsWith(targetRects.currentRect) && movingRects.currentRect.IntersectsWith(targetRects.currentRect);
};
_exprFunctions.IsLeaving = function(movingRects, targetRects) {
return movingRects.lastRect.IntersectsWith(targetRects.currentRect) && !movingRects.currentRect.IntersectsWith(targetRects.currentRect);
};
var _IsOver = _exprFunctions.IsOver = function(movingRects, targetRects) {
return movingRects.currentRect.IntersectsWith(targetRects.currentRect);
};
_exprFunctions.IsNotOver = function(movingRects, targetRects) {
return !_IsOver(movingRects, targetRects);
};
_exprFunctions.ValueContains = function(inputString, value) {
return inputString.indexOf(value) > -1;
};
_exprFunctions.ValueNotContains = function(inputString, value) {
return !_exprFunctions.ValueContains(inputString, value);
};
_exprFunctions.ToString = function(value) {
if(value.isWidget) {
return value.text;
}
return String(value);
};
var _evaluateExpr = $ax.expr.evaluateExpr = function(expr, eventInfo, toString) {
if(expr === undefined || expr === null) return undefined;
var result = _exprHandlers[expr.exprType](expr, eventInfo);
return toString ? _exprFunctions.ToString(result) : result;
};
});

View File

@@ -0,0 +1,286 @@
// ******* Flyout MANAGER ******** //
$axure.internal(function($ax) {
var _flyoutManager = $ax.flyoutManager = {};
var getFlyoutLabel = function(panelId) {
return panelId + '_flyout';
};
var _unregisterPanel = function(panelId, keepShown) {
$ax.geometry.unregister(getFlyoutLabel(panelId));
if(panelToSrc[panelId]) {
$ax.style.RemoveRolloverOverride(panelToSrc[panelId]);
delete panelToSrc[panelId];
}
if(!keepShown) {
$ax.action.addAnimation(panelId, $ax.action.queueTypes.fade, function() {
$ax('#' + panelId).hide();
});
}
};
_flyoutManager.unregisterPanel = _unregisterPanel;
var genPoint = $ax.geometry.genPoint;
var _updateFlyout = function(panelId) {
var label = getFlyoutLabel(panelId);
if(!$ax.geometry.polygonRegistered(label)) return;
var info = $ax.geometry.getPolygonInfo(label);
var rects = info && info.rects;
var targetWidget = $ax.getWidgetInfo(panelId);
rects.target = $ax.geometry.genRect(targetWidget);
// Src will stay the same, just updating
$ax.flyoutManager.registerFlyout(rects, panelId, panelToSrc[panelId]);
if(!$ax.geometry.checkInsideRegion(label)) _unregisterPanel(panelId);
};
_flyoutManager.updateFlyout = _updateFlyout;
var panelToSrc = {};
var _registerFlyout = function(rects, panelId, srcId) {
var label = _getFlyoutLabel(panelId);
var callback = function(info) {
// If leaving object or already outside it, then unregister, otherwise just return
if(!info.exiting && !info.outside) return;
_unregisterPanel(panelId);
};
var points = [];
var lastSrcId = panelToSrc[panelId];
if(lastSrcId != srcId) {
if(lastSrcId) $ax.style.RemoveRolloverOverride(lastSrcId);
if(srcId) {
$ax.style.AddRolloverOverride(srcId);
panelToSrc[panelId] = srcId;
} else delete panelToSrc[panelId];
}
// rects should be one or two rectangles
if(!rects.src) {
var rect = rects.target;
points.push(genPoint(rect.Left(), rect.Top()));
points.push(genPoint(rect.Right(), rect.Top()));
points.push(genPoint(rect.Right(), rect.Bottom()));
points.push(genPoint(rect.Left(), rect.Bottom()));
} else {
var r0 = rects.src;
var r1 = rects.target;
// Right left of right, left right of left, top below top, bottom above bottom
var rlr = r0.Right() <= r1.Right();
var lrl = r0.Left() >= r1.Left();
var tbt = r0.Top() >= r1.Top();
var bab = r0.Bottom() <= r1.Bottom();
var info = { rlr: rlr, lrl: lrl, tbt: tbt, bab: bab };
if((rlr && lrl) || (tbt && bab)) {
points = getSmallPolygon(r0, r1, info);
} else {
points = getLargePolygon(r0, r1, info);
}
}
$ax.geometry.registerPolygon(label, points, callback, { rects: rects });
};
_flyoutManager.registerFlyout = _registerFlyout;
var _getFlyoutLabel = function(panelId) {
return panelId + '_flyout';
};
var _reregisterAllFlyouts = function() {
for(var panelId in panelToSrc) _reregisterFlyout(panelId);
};
_flyoutManager.reregisterAllFlyouts = _reregisterAllFlyouts;
var _reregisterFlyout = function(panelId) {
var rects = $ax.geometry.getPolygonInfo(getFlyoutLabel(panelId)).rects;
_registerFlyout(rects, panelId, panelToSrc[panelId]);
};
// This is the reduced size polygon connecting r0 to r1 by means of horizontal or vertical lines.
var getSmallPolygon = function(r0, r1, info) {
var points = [];
// NOTE: currently I make the assumption that if horizontal/vertical connecting lines from the src hit the target
// Meaning if horizontal, rlr and lrl are true, and if vertical, tbt and bab are true.
var r0Left = r0.Left();
var r0Right = r0.Right();
var r0Top = r0.Top();
var r0Bottom = r0.Bottom();
var r1Left = r1.Left();
var r1Right = r1.Right();
var r1Top = r1.Top();
var r1Bottom = r1.Bottom();
points.push(genPoint(r1Left, r1Top));
if(!info.tbt) {
points.push(genPoint(r0Left, r1Top));
points.push(genPoint(r0Left, r0Top));
points.push(genPoint(r0Right, r0Top));
points.push(genPoint(r0Right, r1Top));
}
points.push(genPoint(r1Right, r1Top));
if(!info.rlr) {
points.push(genPoint(r1Right, r0Top));
points.push(genPoint(r0Right, r0Top));
points.push(genPoint(r0Right, r0Bottom));
points.push(genPoint(r1Right, r0Bottom));
}
points.push(genPoint(r1Right, r1Bottom));
if(!info.bab) {
points.push(genPoint(r0Right, r1Bottom));
points.push(genPoint(r0Right, r0Bottom));
points.push(genPoint(r0Left, r0Bottom));
points.push(genPoint(r0Left, r1Bottom));
}
points.push(genPoint(r1Left, r1Bottom));
if(!info.lrl) {
points.push(genPoint(r1Left, r0Bottom));
points.push(genPoint(r0Left, r0Bottom));
points.push(genPoint(r0Left, r0Top));
points.push(genPoint(r1Left, r0Top));
}
return points;
};
// This is the original algorithm that connects the most extream corners to make polygon
var getLargePolygon = function(r0, r1, info) {
var points = [];
var r0Left = r0.Left();
var r0Right = r0.Right();
var r0Top = r0.Top();
var r0Bottom = r0.Bottom();
var r1Left = r1.Left();
var r1Right = r1.Right();
var r1Top = r1.Top();
var r1Bottom = r1.Bottom();
// Top lefts
if(info.tbt) {
if(!info.lrl) points.push(genPoint(r0Left, r0Top));
points.push(genPoint(r1Left, r1Top));
} else {
if(info.lrl) points.push(genPoint(r1Left, r1Top));
points.push(genPoint(r0Left, r0Top));
}
// Top rights
if(info.tbt) {
points.push(genPoint(r1Right, r1Top));
if(!info.rlr) points.push(genPoint(r0Right, r0Top));
} else {
points.push(genPoint(r0Right, r0Top));
if(info.rlr) points.push(genPoint(r1Right, r1Top));
}
// Bottom rights
if(info.bab) {
if(!info.rlr) points.push(genPoint(r0Right, r0Bottom));
points.push(genPoint(r1Right, r1Bottom));
} else {
if(info.rlr) points.push(genPoint(r1Right, r1Bottom));
points.push(genPoint(r0Right, r0Bottom));
}
// Bottom Lefts
if(info.bab) {
points.push(genPoint(r1Left, r1Bottom));
if(!info.lrl) points.push(genPoint(r0Left, r0Bottom));
} else {
points.push(genPoint(r0Left, r0Bottom));
if(info.lrl) points.push(genPoint(r1Left, r1Bottom));
}
return points;
};
});
// ******* Placeholder Manager ********* //
$axure.internal(function($ax) {
var _placeholderManager = $ax.placeholderManager = {};
var idToPlaceholderInfo = {};
var _registerPlaceholder = function(elementId, text, password) {
idToPlaceholderInfo[elementId] = { text: text, password: password, active: false };
};
_placeholderManager.registerPlaceholder = _registerPlaceholder;
_placeholderManager.refreshPlaceholder = function (elementId) {
var info = idToPlaceholderInfo[elementId];
if (!info || !info.active) return;
$ax.style.SetWidgetPlaceholder(elementId, true, info.text, info.password);
}
var _updatePlaceholder = function(elementId, active, clearText) {
var inputId = $ax.repeater.applySuffixToElementId(elementId, '_input');
var info = idToPlaceholderInfo[elementId];
if(!info || info.active == active) return;
info.active = active;
if(active) var text = info.text;
else if(!ANDROID) text = clearText ? '' : document.getElementById(inputId).value;
else {
var currentText = document.getElementById(inputId).value;
if(!clearText) text = currentText;
else if(currentText == info.text) text = "";
else {
var lastIndex = currentText.lastIndexOf(info.text);
//here i am assuming the text is always inserted in front
text = currentText.substring(0, lastIndex);
}
}
$ax.style.SetWidgetPlaceholder(elementId, active, text, info.password);
};
_placeholderManager.updatePlaceholder = _updatePlaceholder;
var _isActive = function(elementId) {
var info = idToPlaceholderInfo[elementId];
return Boolean(info && info.active);
};
_placeholderManager.isActive = _isActive;
var _selectRange = function(elementId, start, end) {
$jobj(elementId).each(function() {
if(this.setSelectionRange) {
var validTypes = ["text", "search", "url", "tel", "password"];
if(this.tagName.toLowerCase() != "input" || validTypes.indexOf(this.type) > -1) {
this.focus();
this.setSelectionRange(start, end);
}
} else if(this.createTextRange) {
var range = this.createTextRange();
range.collapse(true);
range.moveEnd('character', end);
range.moveStart('character', start);
range.select();
}
});
};
_placeholderManager.selectRange = _selectRange;
var _moveCaret = function(id, index) {
var inputIndex = id.indexOf('_input');
if(inputIndex == -1) return;
var inputId = id.substring(0, inputIndex);
if(!_isActive(inputId)) return;
_selectRange(id, index, index);
};
_placeholderManager.moveCaret = _moveCaret;
});

View File

@@ -0,0 +1,301 @@
// ******* Region MANAGER ******** //
$axure.internal(function($ax) {
var _geometry = $ax.geometry = {};
var regionMap = {};
var regionList = [];
var _unregister = function(label) {
var regionIndex = regionList.indexOf(label);
if(regionIndex != -1) {
var end = $ax.splice(regionList, regionIndex + 1);
$ax.splice(regionList, regionIndex, regionList.length - regionIndex);
regionList = regionList.concat(end);
}
delete regionMap[label];
};
_geometry.unregister = _unregister;
var clear = function() {
regionMap = {};
regionList = [];
};
var _polygonRegistered = function(label) {
return Boolean(regionMap[label]);
};
_geometry.polygonRegistered = _polygonRegistered;
// Must be counterclockwise, or enter/exit will be wrong
var _registerPolygon = function(label, points, callback, info) {
var regionIndex = regionList.indexOf(label);
if(regionIndex == -1) regionList.push(label);
regionMap[label] = { points: points, callback: callback, info: info };
};
_geometry.registerPolygon = _registerPolygon;
var _getPolygonInfo = function(label) {
if(!_polygonRegistered(label)) return undefined;
return regionMap[label].info;
};
_geometry.getPolygonInfo = _getPolygonInfo;
var _genRect = function(info, roundHalfPixel) {
var x = info.pagex();
var y = info.pagey();
var w = info.width();
var h = info.height();
if(roundHalfPixel) {
if(x % 1 != 0) {
x = Math.floor(x);
w++;
}
if(y % 1 != 0) {
y = Math.floor(y);
h++;
}
}
var r = x + w;
var b = y + h;
var rect = {
X: function() { return x; },
Y: function() { return y; },
Wigth: function() { return w; },
Height: function() { return h; },
Left: function() { return x; },
Right: function() { return r; },
Top: function() { return y; },
Bottom: function() { return b; }
};
return rect;
};
_geometry.genRect = _genRect;
var _genPoint = function(x, y) {
return { x: x, y: y };
};
_geometry.genPoint = _genPoint;
var oldPoint = _genPoint(0, 0);
_geometry.tick = function(x, y, end) {
var lastPoint = oldPoint;
var nextPoint = oldPoint = _genPoint(x, y);
var line = { p1: lastPoint, p2: nextPoint };
if(!regionList.length) return;
for(var i = 0; i < regionList.length; i++) {
var region = regionMap[regionList[i]];
var points = region.points;
if(!region.checked) {
if(!_checkInside(points, $ax.mouseLocation)) {
region.callback({ outside: true });
continue;
}
region.checked = true;
}
for(var j = 0; j < points.length; j++) {
var startSegment = points[j];
var endSegment = points[(j + 1) % points.length];
var intersectInfo = linesIntersect(line, { p1: startSegment, p2: endSegment });
if(intersectInfo) {
region.callback(intersectInfo);
break;
}
}
}
if(end) clear();
};
// Info if the one line touches the other (even barely), false otherwise
// Info includes point, if l1 is entering or exiting l2, and any ties that happened, or parallel info
var linesIntersect = function(l1, l2) {
var retval = {};
var ties = {};
var l1p1 = l1.p1.x < l1.p2.x || (l1.p1.x == l1.p2.x && l1.p1.y < l1.p2.y) ? l1.p1 : l1.p2;
var l1p2 = l1.p1.x < l1.p2.x || (l1.p1.x == l1.p2.x && l1.p1.y < l1.p2.y) ? l1.p2 : l1.p1;
var m1 = (l1p2.y - l1p1.y) / (l1p2.x - l1p1.x);
var l2p1 = l2.p1.x < l2.p2.x || (l2.p1.x == l2.p2.x && l2.p1.y < l2.p2.y) ? l2.p1 : l2.p2;
var l2p2 = l2.p1.x < l2.p2.x || (l2.p1.x == l2.p2.x && l2.p1.y < l2.p2.y) ? l2.p2 : l2.p1;
var m2 = (l2p2.y - l2p1.y) / (l2p2.x - l2p1.x);
var l1Vert = l1.p1.x == l1.p2.x;
var l2Vert = l2.p1.x == l2.p2.x;
if(l1Vert || l2Vert) {
if(l1Vert && l2Vert) {
// If the lines don't follow the same path, return
if(l1p1.x != l2p1.x) return false;
// if they never meet, return
if(l1p2.y < l2p1.y || l1p1.y > l2p2.y) return false;
var firstVert = l1p1.y >= l2p1.y ? l1p1 : l2p1;
var secondVert = l1p2.y <= l2p2.y ? l1p2 : l2p2;
// First is from the perspective of l1
retval.parallel = {
first: l1p1 == l1.p1 ? firstVert : secondVert,
second: l1p2 == l1.p2 ? secondVert : firstVert,
sameDirection: (l1p1 == l1.p1) == (l2p1 == l2.p1)
};
return retval;
}
var x1 = l2Vert ? l1p1.x : l2p1.x;
var x2 = l2Vert ? l1p2.x : l2p2.x;
var xVert = l2Vert ? l2p1.x : l1p1.x;
var y = l2Vert ? l1p1.y + (xVert - x1) * m1 : l2p1.y + (xVert - x1) * m2;
var y1 = l2Vert ? l2p1.y : l1p1.y;
var y2 = l2Vert ? l2p2.y : l1p2.y;
if(xVert >= x1 && xVert <= x2 && y >= y1 && y <= y2) {
retval.point = { x: xVert, y: y };
retval.exiting = l2Vert == (y1 == (l2Vert ? l2.p1.y : l1.p1.y)) == (x1 == (l2Vert ? l1.p1.x : l2.p1.x));
retval.entering = !retval.exiting;
// Calculate ties
if(x1 == xVert) {
ties[l2Vert ? 'l1' : 'l2'] = (x1 == (l2Vert ? l1.p1.x : l2.p1.x)) ? 'start' : 'end';
retval.ties = ties;
} else if(x2 == xVert) {
ties[l2Vert ? 'l1' : 'l2'] = (x2 == (l2Vert ? l1.p2.x : l2.p2.x)) ? 'end' : 'start';
retval.ties = ties;
}
if(y1 == y) {
ties[l2Vert ? 'l2' : 'l1'] = (y1 == (l2Vert ? l2.p1.y : l1.p1.y)) ? 'start' : 'end';
retval.ties = ties;
} else if(y2 == y) {
ties[l2Vert ? 'l2' : 'l1'] = (y2 == (l2Vert ? l2.p2.y : l1.p2.y)) ? 'end' : 'start';
retval.ties = ties;
}
return retval;
}
return false;
}
// If here, no vertical lines
if(m1 == m2) {
// If the lines don't follow the same path, return
if(l1p1.y != (l2p1.y + (l1p1.x - l2p1.x) * m1)) return false;
// if they never meet, return
if(l1p2.x < l2p1.x || l1p1.x > l2p2.x) return false;
var first = l1p1.x >= l2p1.x ? l1p1 : l2p1;
var second = l1p2.x <= l2p2.x ? l1p2 : l2p2;
// First is from the perspective of l1
retval.parallel = {
first: l1p1 == l1.p1 ? first : second,
second: l1p2 == l1.p2 ? second : first,
sameDirection: (l1p1 == l1.p1) == (l2p1 == l2.p1)
};
return retval;
}
var x = (l2p1.y - l2p1.x * m2 - l1p1.y + l1p1.x * m1) / (m1 - m2);
// Check if x is out of bounds
if(x >= l1p1.x && x <= l1p2.x && x >= l2p1.x && x <= l2p2.x) {
var y = l1p1.y + (x - l1p1.x) * m1;
retval.point = { x: x, y: y };
retval.entering = m1 > m2 == (l1p1 == l1.p1) == (l2p1 == l2.p1);
retval.exiting = !retval.entering;
// Calculate ties
if(l1.p1.x == x) {
ties.l1 = 'start';
retval.ties = ties;
} else if(l1.p2.x == x) {
ties.l1 = 'end';
retval.ties = ties;
}
if(l2.p1.x == x) {
ties.l2 = 'start';
retval.ties = ties;
} else if(l2.p2.x == x) {
ties.l2 = 'end';
retval.ties = ties;
}
return retval;
}
return false;
};
var _checkInsideRegion = function(label, point) {
if(!_polygonRegistered(label)) return false;
return _checkInside(regionMap[label].points, point || $ax.mouseLocation);
};
_geometry.checkInsideRegion = _checkInsideRegion;
// Returns true if point is inside the polygon, including ties
var _checkInside = function(polygon, point) {
// Make horizontal line wider than the polygon, with the y of point to test location
var firstX = polygon[0].x;
var secondX = firstX;
var i;
for(i = 1; i < polygon.length; i++) {
var polyX = polygon[i].x;
firstX = Math.min(firstX, polyX);
secondX = Math.max(secondX, polyX);
}
var line = {
p1: _genPoint(--firstX, point.y),
p2: _genPoint(++secondX, point.y)
};
// If entered true, with closest intersection says you are inside the polygon.
var entered = false;
// Closest is the closest intersection to the left of the point
var closest = line.p1.x;
// This is for if intersections hit the same point, to find out which is correct
var cos = -2;
var getCos = function(line) {
var x = line.p2.x - line.p1.x;
var y = line.p2.y - line.p1.y;
return x / Math.sqrt(x * x + y * y);
};
for(i = 0; i < polygon.length; i++) {
var polyLine = { p1: polygon[i], p2: polygon[(i + 1) % polygon.length] };
var intersectInfo = linesIntersect(line, polyLine);
if(!intersectInfo) continue;
if(intersectInfo.parallel) {
// Only really care about this if it actually touches the point
if(intersectInfo.parallel.first.x <= point.x && intersectInfo.parallel.second.x >= point.x) return true;
continue;
}
var intersectionX = intersectInfo.point.x;
if(intersectionX > point.x || intersectionX < closest) continue;
if(intersectionX == point.x) return true;
// If closer than last time, reset cosine.
if(intersectionX != closest) cos = -2;
// For getting cosine, need to possibly reverse the direction of polyLine.
if(intersectInfo.ties) {
// Tie must be on l2, if the ties is end, reverse so cosine indicates how close the angle is to that of 'point' from here.
if(intersectInfo.ties.l2 == 'end') polyLine = { p1: polyLine.p2, p2: polyLine.p1 };
} else {
// It is on both side, so you can take the larger one
if(polyLine.p1.x > polyLine.p2.x) polyLine = { p1: polyLine.p2, p2: polyLine.p1 };
}
var currCos = getCos(polyLine);
if(currCos > cos) {
cos = currCos;
closest = intersectionX;
entered = intersectInfo.entering;
}
}
return entered;
};
_geometry.checkInside = _checkInside;
});

View File

@@ -0,0 +1,7 @@
$axure.internal(function($ax) {
var _globals = $ax.globals = {};
$ax.globals.MaxZIndex = 1000;
$ax.globals.MinZIndex = -1000;
});

View File

@@ -0,0 +1,344 @@

//// ******* Internet Explorer MANAGER ******** //
////this is to handle all the stupid IE Stuff
//$axure.internal(function($ax) {
// if(!IE_10_AND_BELOW) return;
// var _ieColorManager = {};
// if(Number(BROWSER_VERSION) < 9) $ax.ieColorManager = _ieColorManager;
// var _applyIEFixedPosition = function() {
// if(Number(BROWSER_VERSION) >= 7) return;
// $axure(function(diagramObject) { return diagramObject.fixedVertical; }).$()
// .appendTo($('body'))
// .css('position', 'absolute').css('margin-left', 0 + 'px').css('margin-top', 0 + 'px');
// var handleScroll = function() {
// $axure(function(diagramObject) { return diagramObject.fixedVertical; })
// .each(function(diagramObject, elementId) {
// var win = $(window);
// var windowWidth = win.width();
// var windowHeight = win.height();
// var windowScrollLeft = win.scrollLeft();
// var windowScrollTop = win.scrollTop();
// var newLeft = 0;
// var newTop = 0;
// var elementQuery = $('#' + elementId);
// var elementAxQuery = $ax('#' + elementId);
// var width = elementAxQuery.width();
// var height = elementAxQuery.height();
// var horz = diagramObject.fixedHorizontal;
// if(horz == 'left') {
// newLeft = windowScrollLeft + diagramObject.fixedMarginHorizontal;
// } else if(horz == 'center') {
// newLeft = windowScrollLeft + ((windowWidth - width) / 2) + diagramObject.fixedMarginHorizontal;
// } else if(horz == 'right') {
// newLeft = windowScrollLeft + windowWidth - width - diagramObject.fixedMarginHorizontal;
// }
// var vert = diagramObject.fixedVertical;
// if(vert == 'top') {
// newTop = windowScrollTop + diagramObject.fixedMarginVertical;
// } else if(vert == 'middle') {
// newTop = windowScrollTop + ((windowHeight - height) / 2) + diagramObject.fixedMarginVertical;
// } else if(vert == 'bottom') {
// newTop = windowScrollTop + windowHeight - height - diagramObject.fixedMarginVertical;
// }
// elementQuery.css('top', newTop + 'px').css('left', newLeft + 'px');
// });
// };
// $(window).scroll(handleScroll);
// $axure.resize(handleScroll);
// handleScroll();
// };
// var _applyBackground = function() {
// if(Number(BROWSER_VERSION) >= 9) return;
// var styleChain = $ax.adaptive.getAdaptiveIdChain($ax.adaptive.currentViewId);
// var argb = _getArgb($ax.pageData.page, styleChain);
// var hexColor = _getHexColor(argb, false);
// if(hexColor) $('body').css('background-color', hexColor);
// _applyBackgroundToQuery($ax('*'));
// };
// var _applyBackgroundToQuery = function(query) {
// if(Number(BROWSER_VERSION) >= 9) return;
// var styleChain = $ax.adaptive.getAdaptiveIdChain($ax.adaptive.currentViewId);
// query.each(function(obj, elementId) {
// if ($ax.public.fn.IsDynamicPanel(obj.type)) {
// var stateCount = obj.diagrams.length;
// for(var j = 0; j < stateCount; j++) {
// var stateId = $ax.repeater.applySuffixToElementId(elementId, '_state' + j);
// var argb = _getArgb(obj.diagrams[j], styleChain);
// var hexColor = _getHexColor(argb, true);
// if(hexColor) $jobj(stateId).css('background-color', hexColor);
// }
// } else if ($ax.public.fn.IsRepeater(obj.type)) {
// }
// });
// };
// _ieColorManager.applyBackground = _applyBackgroundToQuery;
// var _getArgb = function(diagram, styleChain) {
// var argb = undefined;
// for(var i = 0; i < styleChain.length && !argb; i++) {
// var style = diagram.adaptiveStyles[styleChain[i]];
// argb = style.fill && style.fill.color;
// }
// if(!argb) argb = diagram.style.fill.color;
// return argb;
// };
// var gMult = 256;
// var rMult = gMult * 256;
// var aMult = rMult * 256;
// var _getHexColor = function(argb, allowWhite) {
// var a = Math.floor(argb / aMult);
// argb -= a * aMult;
// var r = Math.floor(argb / rMult);
// argb -= r * rMult;
// var g = Math.floor(argb / gMult);
// var b = argb - g * gMult;
// return _getColorFromArgb(a, r, g, b, allowWhite);
// };
// var _getColorFromArgb = function(a, r, g, b, allowWhite) {
// if(Number(BROWSER_VERSION) >= 9) return undefined;
// //convert the color with alpha to a color with no alpha (assuming white background)
// r = Math.min((r * a) / 255 + 255 - a, 255);
// g = Math.min((g * a) / 255 + 255 - a, 255);
// b = Math.min((b * a) / 255 + 255 - a, 255);
// if(a == 0) return undefined;
// if(!allowWhite && (r == 255 && g == 255 && b == 255)) return undefined;
// var color = '#';
// color += Math.floor(r / 16).toString(16);
// color += Math.floor(r % 16).toString(16);
// color += Math.floor(g / 16).toString(16);
// color += Math.floor(g % 16).toString(16);
// color += Math.floor(b / 16).toString(16);
// color += Math.floor(b % 16).toString(16);
// return color;
// };
// _ieColorManager.getColorFromArgb = _getColorFromArgb;
// var getIEOffset = function(transform, rect) {
// var translatedVertexes = [
// $axure.utils.Vector2D(0, 0), //we dont translate, so the orgin is fixed
// transform.mul($axure.utils.Vector2D(0, rect.height)),
// transform.mul($axure.utils.Vector2D(rect.width, 0)),
// transform.mul($axure.utils.Vector2D(rect.width, rect.height))];
// var minX = 0, minY = 0, maxX = 0, maxY = 0;
// $.each(translatedVertexes, function(index, p) {
// minX = Math.min(minX, p.x);
// minY = Math.min(minY, p.y);
// maxX = Math.max(maxX, p.x);
// maxY = Math.max(maxY, p.y);
// });
// return $axure.utils.Vector2D(
// (maxX - minX - rect.width) / 2,
// (maxY - minY - rect.height) / 2);
// };
// var _filterFromTransform = function(transform) {
// return "progid:DXImageTransform.Microsoft.Matrix(M11=" + transform.m11 +
// ", M12=" + transform.m12 + ", M21=" + transform.m21 +
// ", M22=" + transform.m22 + ", SizingMethod='auto expand')";
// };
// var _applyIERotation = function() {
// if(Number(BROWSER_VERSION) >= 9) return;
// $axure(function(diagramObject) {
// return ((diagramObject.style.rotation && Math.abs(diagramObject.style.rotation) > 0.1)
// || (diagramObject.style.textRotation && Math.abs(diagramObject.style.textRotation) > 0.1))
// && !diagramObject.isContained;
// }).each(function(diagramObject, elementId) {
// var rotation = diagramObject.style.rotation || 0;
// var $element = $('#' + elementId);
// var axElement = $ax('#' + elementId);
// var width = axElement.width();
// var height = axElement.height();
// var originX = width / 2;
// var originY = height / 2;
// var shapeIeOffset;
// $element.children().each(function() {
// var $child = $(this);
// var axChild = $ax('#' + $child.attr('id'));
// var childWidth = axChild.width();
// var childHeight = axChild.height() + $child.position().top;
// var centerX = $child.position().left + (childWidth / 2);
// var centerY = $child.position().top + (childHeight / 2);
// var deltaX = centerX - originX;
// var deltaY = centerY - originY;
// var effectiveRotation = rotation;
// var textObject = $ax.getObjectFromElementId($child.attr('id'));
// if(textObject) {
// if(textObject.style.textRotation) effectiveRotation = textObject.style.textRotation;
// else return;
// }
// var transform = $ax.utils.Matrix2D.identity().rotate(effectiveRotation);
// var filter = _filterFromTransform(transform);
// $child.css('filter', filter)
// .width(childWidth + 1)
// .height(childHeight + 1);
// var p = transform.mul($ax.utils.Vector2D(deltaX, deltaY));
// var ieOffset = getIEOffset(transform, { width: childWidth, height: childHeight });
// if(!textObject) {
// shapeIeOffset = ieOffset;
// } else {
// // This is a close approximation, but not exact
// if(diagramObject.style.verticalAlignment != 'top') ieOffset.y -= shapeIeOffset.y + Math.abs(shapeIeOffset.x);
// }
// $child.css("margin-left", -ieOffset.x - deltaX + p.x).css("margin-top", -ieOffset.y - deltaY + p.y);
// });
// });
// };
// var _fixIEStretchBackground = function() {
// if(Number(BROWSER_VERSION) >= 9) return;
// var pageStyle = $ax.adaptive.getPageStyle();
// if(!pageStyle.imageRepeat || pageStyle.imageRepeat == 'auto') return;
// $('body').css('background-image', 'none');
// var viewId = $ax.adaptive.currentViewId;
// var imageInfo = viewId ? $ax.pageData.viewIdToBackgroundImageInfo && $ax.pageData.viewIdToBackgroundImageInfo[viewId] : $ax.pageData.defaultBackgroundImageInfo;
// if(imageInfo && imageInfo.path) {
// if($('#bg_img').length == 0) $('body').append('<img id="bg_img"/>');
// $('#bg_img').attr('src', imageInfo.path).css('position', 'fixed').css('z-index', '-10000');
// _resizeIEBackground();
// } else $('#bg_img').remove();
// };
// var _resizeIEBackground = function() {
// if(Number(BROWSER_VERSION) >= 9) return;
// //var page = $ax.pageData.page;
// var viewId = $ax.adaptive.currentViewId;
// var pageStyle = $ax.adaptive.getPageStyle();
// if(!$ax.pageData.defaultBackgroundImageInfo && !$ax.pageData.viewIdToBackgroundImageInfo) return;
// var imageInfo = viewId ? $ax.pageData.viewIdToBackgroundImageInfo[viewId] : $ax.pageData.defaultBackgroundImageInfo;
// if(!imageInfo) return;
// var imageWidth = imageInfo.width;
// var imageHeight = imageInfo.height;
// var windowWidth = $(window).width();
// var windowHeight = $(window).height();
// var isCover = pageStyle.imageRepeat == 'cover';
// var wRatio = windowWidth / imageWidth;
// var hRatio = windowHeight / imageHeight;
// var ratio = wRatio;
// if(isCover) {
// if(hRatio > wRatio) ratio = hRatio;
// } else {
// if(hRatio < wRatio) ratio = hRatio;
// }
// var width = imageWidth * ratio;
// var height = imageHeight * ratio;
// var left = '0px';
// if((isCover && width > windowWidth) || (!isCover && width < windowWidth)) {
// if(pageStyle.imageHorizontalAlignment == 'center') {
// left = ((windowWidth - width) / 2) + 'px';
// } else if(pageStyle.imageHorizontalAlignment == 'far') {
// left = (windowWidth - width) + 'px';
// }
// }
// var top = '0px';
// if((isCover && height > windowHeight) || (!isCover && height < windowHeight)) {
// if(pageStyle.imageVerticalAlignment == 'center') {
// top = ((windowHeight - height) / 2) + 'px';
// } else if(pageStyle.imageVerticalAlignment == 'far') {
// top = (windowHeight - height) + 'px';
// }
// }
// $('#bg_img').css('top', top).css('left', left).css('width', width).css('height', height);
// };
// var _fixAllPngs = function() {
// if(!(/MSIE ((5\.5)|6)/.test(window.navigator.userAgent) && window.navigator.platform == "Win32")) return;
// $('img[src$=".png"]').each(function() {
// if(!this.complete) {
// this.onload = function() { $axure.utils.fixPng(this); };
// } else {
// $axure.utils.fixPng(this);
// }
// });
// };
// var _fixInputSize = function() {
// if(Number(BROWSER_VERSION) >= 8 || window.navigator.userAgent.indexOf("Trident/4.0") > -1) return;
// var inputs = $('input').not(':input[type=button], :input[type=submit], :input[type=radio], :input[type=checkbox]');
// inputs.each(function() {
// var $input = $(this);
// var axInput = $ax('#' + $input.attr('id'));
// $input.css('height', (axInput.height() - 4 + 'px')).css('width', (axInput.width() - 2 + 'px'));
// });
// var textAreas = $($ax.constants.TEXT_AREA_TYPE);
// textAreas.each(function() {
// var $textArea = $(this);
// var axText = $ax('#' + $textArea.attr('id'));
// $textArea.css('height', (axText.height() - 6 + 'px')).css('width', (axText.width() - 6 + 'px'));
// });
// };
// var _fixInputBackground = function() {
// var inputs = $('input').not(':input[type=button], :input[type=submit], :input[type=radio], :input[type=checkbox]');
// inputs = inputs.add($($ax.constants.TEXT_AREA_TYPE));
// inputs.each(function() {
// var $input = $(this);
// if($input.css('background-color') == 'transparent') {
// $input.css('background-image', 'url(../../transparent.gif)');
// } else {
// $input.css('background-image', '');
// }
// });
// };
// $(document).ready(function() {
// _fixIEStretchBackground();
// _applyIEFixedPosition();
// $axure.resize(function() {
// _resizeIEBackground();
// });
// $ax.adaptive.bind('viewChanged', function() {
// _fixIEStretchBackground();
// _applyBackground();
// _fixInputBackground();
// });
// _fixAllPngs();
// _applyIERotation();
// _applyBackground();
// _fixInputSize();
// _fixInputBackground();
// });
//});

View File

@@ -0,0 +1,326 @@
$axure.internal(function($ax) {
$(window.document).ready(function () {
//var readyStart = (new Date()).getTime();
//this is because the page id is not formatted as a guid
var pageId = $ax.pageData.page.packageId;
var pageData = {
id: pageId,
pageName: $ax.pageData.page.name,
location: window.location.toString(),
notes: $ax.pageData.page.notes,
widgetNotes: $ax.pageData.page.annotations,
//clipToView: $ax.pageData.clipToView,
defaultAdaptiveView: $ax.pageData.defaultAdaptiveView,
adaptiveViews: $ax.pageData.adaptiveViews,
masterNotes: []
};
var fnPrefix = '';
function pushNextPrefix() {
if (fnPrefix.length == 0) fnPrefix = 'A';
else fnPrefix = fnPrefix[0] == 'Z' ? 'A'.repeat(fnPrefix.length + 1) : String.fromCharCode(fnPrefix.charCodeAt(0) + 1).repeat(fnPrefix.length);
}
function populateNotes(pageForNotes) {
for (var master in pageForNotes.masters) {
//var master = pageForNotes.masters[i];
var masterData = pageForNotes.masters[master];
var hasWidgetNotes = masterData.annotations && masterData.annotations.length > 0;
if ((master.notes && !$.isEmptyObject(masterData.notes)) || hasWidgetNotes) {
if(hasWidgetNotes) pushNextPrefix();
var m = {};
m.pageName = masterData.name;
m.notes = masterData.notes;
m.widgetNotes = masterData.annotations;
pageData.masterNotes.push(m);
if(hasWidgetNotes) populateOwnerToFn(m.widgetNotes);
}
populateNotes(master);
}
}
var ownerToFns = {};
function populateOwnerToFn(widgetNotes) {
if(typeof widgetNotes == 'undefined') return false;
for (var i = 0; i < widgetNotes.length; i++) {
var widgetNote = widgetNotes[i];
widgetNote['fn'] = fnPrefix + widgetNote['fn'];
var fn = widgetNote['fn'];
var ownerId = widgetNote['ownerId'];
if (ownerId !== undefined && ownerId.length > 0) {
var ownerLabels = ownerToFns[ownerId];
if (ownerLabels == undefined) ownerLabels = [];
ownerLabels.push(fn);
ownerToFns[ownerId] = ownerLabels;
}
}
}
populateOwnerToFn(pageData.widgetNotes);
populateNotes($ax.pageData);
pageData.ownerToFns = ownerToFns;
$ax.pageData.notesData = pageData;
//var anns = [];
//$ax('*').each(function (dObj, elementId) {
// pushAnnotation(dObj, elementId);
//});
//function pushAnnotation(dObj, elementId) {
// var ann = dObj.annotation;
// if(ann) {
// ann = $ax.deepCopy(ann);
// ann["id"] = elementId;
// ann["label"] = dObj.label + " (" + dObj.friendlyType + ")";
// anns.push(ann);
// }
// if(dObj.type === 'repeater' && dObj.objects) {
// //if it's repeater, save the id as repeaterId@scriptId
// for(var i = 0, len = dObj.objects.length; i < len; i++) {
// var child = dObj.objects[i];
// var scriptId = $ax.getScriptIdFromPath([child.id], elementId);
// pushAnnotation(child, elementId + '@' + scriptId);
// }
// }
//}
//pageData.widgetNotes = anns;
//only trigger the page.data setting if the window is on the mainframe
var isMainFrame = false;
try {
if(window.name == 'mainFrame' ||
(!CHROME_5_LOCAL && window.parent.$ && window.parent.$('#mainFrame').length > 0)) {
isMainFrame = true;
$ax.messageCenter.addMessageListener(function(message, data) {
if(message == 'finishInit') {
_processTempInit();
}
});
$axure.messageCenter.setState('page.data', pageData);
window.focus();
}
} catch(e) { }
//attach here for chrome local
//$(window).on('load', function() {
// $ax.style.initializeObjectTextAlignment($ax('*'));
//});
if(!isMainFrame) _processTempInit();
});
var touchCount = 0;
var lastTouch = Date.now();
var _registerTouchCount = $ax.registerTouchCount = function (e) {
var now = Date.now();
if (now - lastTouch < 375) {
if (++touchCount === 3) {
$(':input').blur();
$ax.messageCenter.postMessage('tripleClick', true);
e.preventDefault();
};
} else {
touchCount = 1;
}
lastTouch = now;
};
// Block IOS stalling second tap.
// Stop third click from also clicking mobile card
var _clearTouchCount = $ax.clearTouchCount = function (e) {
if (touchCount === 3) {
touchCount = 0;
e.preventDefault();
}
};
var _processTempInit = function() {
//var start = (new Date()).getTime();
//var end = (new Date()).getTime();
//window.alert('elapsed ' + (end - start));
$('iframe').each(function() {
var origSrc = $(this).attr('basesrc');
var $this = $(this);
if(origSrc) {
var newSrcUrl = origSrc.toLowerCase().indexOf('http://') == -1 ? $ax.globalVariableProvider.getLinkUrl(origSrc) : origSrc;
$this.attr('src', newSrcUrl);
}
if(IOS) {
$this.parent().css('overflow', 'auto').css('-webkit-overflow-scrolling', 'touch').css('-ms-overflow-x', 'hidden').css('overflow-x', 'hidden');
}
});
$axure.messageCenter.addMessageListener(function(message, data) {
if(message == 'setGlobalVar') {
$ax.globalVariableProvider.setVariableValue(data.globalVarName, data.globalVarValue, true);
}
});
window.lastFocusedClickable = null;
var _lastFocusedClickableSelector = 'input, a';
var shouldOutline = true;
$ax(function (dObj) { return dObj.tabbable; }).each(function (dObj, elementId) {
if ($ax.public.fn.IsLayer(dObj.type)) $ax.event.layerMapFocus(dObj, elementId);
var focusableId = $ax.event.getFocusableWidgetOrChildId(elementId);
var $focusable = $('#' + focusableId);
$focusable.attr("tabIndex", 0);
if($focusable.is('div') || $focusable.is('img')) {
$focusable.bind($ax.features.eventNames.mouseDownName, function() {
shouldOutline = false;
});
attachFocusAndBlur($focusable);
}
});
$(window.document).bind($ax.features.eventNames.mouseUpName, function() {
shouldOutline = true;
});
attachFocusAndBlur($(_lastFocusedClickableSelector));
function attachFocusAndBlur($query) {
$query.focus(function () {
if(shouldOutline) {
$(this).css('outline', '');
} else {
$(this).css('outline', 'none');
}
window.lastFocusedClickable = this;
}).blur(function () {
if(window.lastFocusedClickable == this) window.lastFocusedClickable = null;
});
}
$(window.document).bind('keyup', function (e) {
switch(e.which) {
case 13:
case 32:
if(window.lastFocusedClickable) $(window.lastFocusedClickable).click();
break;
default: return; // exit this handler for other keys
}
});
//if($ax.document.configuration.hideAddress) {
// $(window).on('load', function() {
// window.setTimeout(function() {
// window.scrollTo(0, 0.9);
// }, 0);
// });
//}
//if($ax.document.configuration.preventScroll) {
// $(window.document).bind('touchmove', function(e) {
// var inScrollable = $ax.legacy.GetScrollable(e.target) != window.document.body;
// if(!inScrollable) {
// e.preventDefault();
// }
// });
// $ax(function(diagramObject) {
// return $ax.public.fn.IsDynamicPanel(diagramObject.type) && diagramObject.scrollbars != 'none';
// }).$().children().bind('touchstart', function() {
// var target = this;
// var top = target.scrollTop;
// if(top <= 0) target.scrollTop = 1;
// if(top + target.offsetHeight >= target.scrollHeight) target.scrollTop = target.scrollHeight - target.offsetHeight - 1;
// });
//}
if(OS_MAC && WEBKIT) {
$ax(function(diagramObject) {
return $ax.public.fn.IsComboBox(diagramObject.type);
}).each(function(obj, id) {
$jobj($ax.INPUT(id)).css('-webkit-appearance', 'menulist-button');
});
}
if($ax.features.supports.mobile) {
$('html').first().on('touchstart', _registerTouchCount);
$('html').first().on('touchend', _clearTouchCount);
// Stop pinch zoom (stopping all gestures for now)
// Gesturestart is only supported in Safari
if (SAFARI) {
document.addEventListener("gesturestart", function (e) {
e.preventDefault();
});
}
}
$ax.annotation.initialize();
$ax.legacy.BringFixedToFront();
$ax.event.initialize();
$ax.style.initialize();
$ax.visibility.initialize();
$ax.repeater.initialize();
$ax.dynamicPanelManager.initialize(); //needs to be called after visibility is initialized
$ax.adaptive.initialize();
$ax.loadDynamicPanelsAndMasters();
$ax.adaptive.loadFinished();
var start = (new Date()).getTime();
$ax.repeater.initRefresh();
var end = (new Date()).getTime();
console.log('loadTime: ' + (end - start) / 1000);
$ax.style.prefetch();
$(window).resize();
//var readyEnd = (new Date()).getTime();
//window.alert('elapsed ' + (readyEnd - readyStart));
};
});
/* extend canvas */
var gv_hasCanvas = false;
(function() {
var _canvas = document.createElement('canvas'), proto, abbrev;
if(gv_hasCanvas = !!(_canvas.getContext && _canvas.getContext('2d')) && typeof (CanvasGradient) !== 'undefined') {
function chain(func) {
return function() {
return func.apply(this, arguments) || this;
};
}
with(proto = CanvasRenderingContext2D.prototype) for(var func in abbrev = {
a: arc,
b: beginPath,
n: clearRect,
c: clip,
p: closePath,
g: createLinearGradient,
f: fill,
j: fillRect,
z: function(s) { this.fillStyle = s; },
l: lineTo,
w: function(w) { this.lineWidth = w; },
m: moveTo,
q: quadraticCurveTo,
h: rect,
r: restore,
o: rotate,
s: save,
x: scale,
y: function(s) { this.strokeStyle = s; },
u: setTransform,
k: stroke,
i: strokeRect,
t: translate
}) proto[func] = chain(abbrev[func]);
CanvasGradient.prototype.a = chain(CanvasGradient.prototype.addColorStop);
}
})();

View File

@@ -0,0 +1,91 @@
$axure.internal(function ($ax) {
if ((IOS && SAFARI) || SHARE_APP) {
var outerHtml = document.documentElement;
outerHtml.id = 'ios-safari';
var html = document.createElement('html');
html.id = 'ios-safari-html';
outerHtml.appendChild(html);
var body = document.body;
html.appendChild(body);
Object.defineProperty(document, 'body', {
get: function () {
return body;
}
});
var fixedBody = document.createElement('body');
fixedBody.id = 'ios-safari-fixed';
outerHtml.appendChild(fixedBody);
var fixedBase = document.createElement('div');
fixedBase.id = 'base-fixed';
fixedBody.appendChild(fixedBase);
var isDevice = false;
var deviceWidth = 0;
var updateHtmlWidth = function (panelWidthOffset, scale, height, scaleN) {
var iosSafHtml = $('#ios-safari-html');
iosSafHtml.css('overflow', '');
iosSafHtml.css('overflow-x', '');
iosSafHtml.css('height', '');
if (isDevice) {
iosSafHtml.width(deviceWidth / scaleN);
iosSafHtml.css('overflow-x', 'hidden');
} else {
var isLandscape = window.orientation != 0 && window.orientation != 180;
var mobileWidth = isLandscape ? window.screen.height : window.screen.width
iosSafHtml.width((mobileWidth - panelWidthOffset) / scaleN);
}
if (scale == 1) {
iosSafHtml.css('overflow-x', 'hidden');
iosSafHtml.css('height', (height / scaleN) + 'px');
} else if (scale == 2) iosSafHtml.css('overflow', 'hidden');
};
updateHtmlWidth(0);
$axure('*').each(function (obj, element) {
if (obj && obj.fixedVertical && obj.fixedKeepInFront) {
var parent = $axure('#' + element).getParents(false, ['item', 'state'])[0];
if (!parent) {
$('#base-fixed').append($('#' + element));
}
}
});
$axure.messageCenter.addMessageListener(function (message, data) {
if (message == "setContentScale") {
updateHtmlWidth(data.panelWidthOffset, data.scale, data.viewportHeight, data.scaleN);
} else if (message == "setDeviceMode") {
isDevice = data.device && !data.scaleToWidth;
if (isDevice) deviceWidth = data.width;
updateHtmlWidth(0);
}
});
$('#ios-safari-html').scroll(function () {
$axure.updateWindowInfo();
});
var scrollStartY;
var maxScrollY
var touchStart;
$axure('*').each(function (obj, element) {
if (obj && obj.scrollbars && obj.scrollbars.toLowerCase() != 'none') {
if (obj.scrollbars == 'horizontalAsNeeded') return;
$('#' + element).on('touchstart', function (e) {
touchStart = e.pageY;
var stateId = $ax.visibility.GetPanelState($('#' + element).attr('id'));
scrollStartY = $('#' + stateId).scrollTop();
maxScrollY = $('#' + stateId)[0].scrollHeight - $('#' + stateId).height();
});
$('#' + element).on('touchmove', function (e) {
if (maxScrollY <= 0) return false;
if (scrollStartY == 0 && e.pageY > touchStart) e.preventDefault();
if (scrollStartY == maxScrollY && e.pageY < touchStart) e.preventDefault();
});
}
});
}
});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,166 @@
//stored on each browser event
var windowEvent;
$axure.internal(function($ax) {
var _legacy = {};
$ax.legacy = _legacy;
var Forms = window.document.getElementsByTagName("FORM");
for(var i = 0; i < Forms.length; i++) {
var Form = Forms[i];
Form.onclick = $ax.legacy.SuppressBubble;
}
$ax.legacy.SuppressBubble = function(event) {
if(IE_10_AND_BELOW) {
window.event.cancelBubble = true;
window.event.returnValue = false;
} else {
if(event) {
event.stopPropagation();
}
}
};
$ax.legacy.BringToFront = function(id, skipFixed) {
_bringToFrontHelper(id);
if(!skipFixed) $ax.legacy.BringFixedToFront();
};
var _bringToFrontHelper = function(id) {
var target = window.document.getElementById(id);
if(target == null) return;
$ax.globals.MaxZIndex = $ax.globals.MaxZIndex + 1;
target.style.zIndex = $ax.globals.MaxZIndex;
};
$ax.legacy.BringFixedToFront = function() {
$ax(function(diagramObject) { return diagramObject.fixedKeepInFront; }).each(function(diagramObject, scriptId) {
_bringToFrontHelper(scriptId);
});
};
$ax.legacy.SendToBack = function(id) {
var target = window.document.getElementById(id);
if(target == null) return;
target.style.zIndex = $ax.globals.MinZIndex = $ax.globals.MinZIndex - 1;
};
$ax.legacy.RefreshScreen = function() {
var oldColor = window.document.body.style.backgroundColor;
var setColor = (oldColor == "rgb(0,0,0)") ? "#FFFFFF" : "#000000";
window.document.body.style.backgroundColor = setColor;
window.document.body.style.backgroundColor = oldColor;
};
$ax.legacy.getAbsoluteLeft = function(currentNode, elementId) {
var oldDisplay = currentNode.css('display');
var displaySet = false;
if(oldDisplay == 'none') {
currentNode.css('display', '');
displaySet = true;
}
var left = currentNode.offset().left;
// Special Layer code
if($ax.getTypeFromElementId(elementId) == 'layer') {
var first = true;
var children = currentNode.children();
for(var i = 0; i < children.length; i++) {
var child = $(children[i]);
var subDisplaySet = false;
if(child.css('display') == 'none') {
child.css('display', '');
subDisplaySet = true;
}
if(first) left = child.offset().left;
else left = Math.min(child.offset().left, left);
first = false;
if(subDisplaySet) child.css('display', 'none');
}
}
if (displaySet) currentNode.css('display', oldDisplay);
return $axure.fn.bodyToWorld(left, true);
};
$ax.legacy.getAbsoluteTop = function(currentNode, elementId) {
var oldDisplay = currentNode.css('display');
var displaySet = false;
if(oldDisplay == 'none') {
currentNode.css('display', '');
displaySet = true;
}
var top = currentNode.offset().top;
// Special Layer code
if ($ax.getTypeFromElementId(elementId) == 'layer') {
var first = true;
var children = currentNode.children();
for (var i = 0; i < children.length; i++) {
var child = $(children[i]);
var subDisplaySet = false;
if (child.css('display') == 'none') {
child.css('display', '');
subDisplaySet = true;
}
if (first) top = child.offset().top;
else top = Math.min(child.offset().top, top);
first = false;
if (subDisplaySet) child.css('display', 'none');
}
}
if(displaySet) currentNode.css('display', oldDisplay);
return top;
};
// ****************** Annotation and Link Functions ****************** //
$ax.legacy.GetAnnotationHtml = function(annJson) {
var retVal = "";
for(var noteName in annJson) {
if(noteName != "label" && noteName != "id") {
retVal += "<div class='annotationName'>" + noteName + "</div>";
retVal += "<div class='annotationValue'>" + linkify(annJson[noteName]) + "</div>";
}
}
return retVal;
function linkify(text) {
var urlRegex = /(\b(((https?|ftp|file):\/\/)|(www\.))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
return text.replace(urlRegex, function (url, b, c) {
var url2 = (c == 'www.') ? 'http://' + url : url;
return '<a href="' + url2 + '" target="_blank" class="noteLink">' + url + '</a>';
});
}
};
$ax.legacy.GetScrollable = function(target) {
var $target = $(target);
var last = $target;
// Start past inital target. Can't scroll to target in itself, must be some ancestor.
var current = last.parent();
while(!current.is('body') && !current.is('html')) {
var elementId = current.attr('id');
var diagramObject = elementId && $ax.getObjectFromElementId(elementId);
if (diagramObject && $ax.public.fn.IsDynamicPanel(diagramObject.type) && diagramObject.scrollbars != 'none') {
//returns the panel diagram div which handles scrolling
return $ax.dynamicPanelManager.getShownState(current.attr('id'))[0];
}
last = current;
current = current.parent();
}
// Need to do this because of ie
if(IE_10_AND_BELOW) return window.document.documentElement;
else return window.document.body;
};
});

View File

@@ -0,0 +1,554 @@
$axure.internal(function($ax) {
$ax.public.fn.matrixMultiply = function(matrix, vector) {
if(!matrix.tx) matrix.tx = 0;
if(!matrix.ty) matrix.ty = 0;
var outX = matrix.m11 * vector.x + matrix.m12 * vector.y + matrix.tx;
var outY = matrix.m21 * vector.x + matrix.m22 * vector.y + matrix.ty;
return { x: outX, y: outY };
}
$ax.public.fn.matrixInverse = function(matrix) {
if(!matrix.tx) matrix.tx = 0;
if(!matrix.ty) matrix.ty = 0;
var determinant = matrix.m11*matrix.m22 - matrix.m12*matrix.m21;
//var threshold = (M11 * M11 + M22 *M22 + M12 *M12+ M21 *M21) / 100000;
//if(determinant.DeltaEquals(0, threshold) && determinant < 0.01) {
// return Invalid;
//}
return {
m11 : matrix.m22/determinant,
m12 : -matrix.m12/determinant,
tx : (matrix.ty*matrix.m12 - matrix.tx*matrix.m22)/determinant,
m21: -matrix.m21 / determinant,
m22: matrix.m11 / determinant,
ty: (matrix.tx * matrix.m21 - matrix.ty * matrix.m11) / determinant
};
}
$ax.public.fn.matrixMultiplyMatrix = function (matrix1, matrix2) {
if (!matrix1.tx) matrix1.tx = 0;
if (!matrix1.ty) matrix1.ty = 0;
if (!matrix2.tx) matrix2.tx = 0;
if (!matrix2.ty) matrix2.ty = 0;
return {
m11: matrix1.m12*matrix2.m21 + matrix1.m11*matrix2.m11,
m12: matrix1.m12*matrix2.m22 + matrix1.m11*matrix2.m12,
tx: matrix1.m12 * matrix2.ty + matrix1.m11 * matrix2.tx + matrix1.tx,
m21: matrix1.m22 * matrix2.m21 + matrix1.m21 * matrix2.m11,
m22: matrix1.m22 * matrix2.m22 + matrix1.m21 * matrix2.m12,
ty: matrix1.m22 * matrix2.ty + matrix1.m21 * matrix2.tx + matrix1.ty,
};
}
$ax.public.fn.transformFromElement = function (element) {
var st = window.getComputedStyle(element, null);
var tr = st.getPropertyValue("-webkit-transform") ||
st.getPropertyValue("-moz-transform") ||
st.getPropertyValue("-ms-transform") ||
st.getPropertyValue("-o-transform") ||
st.getPropertyValue("transform");
if (tr.indexOf('none') < 0) {
var matrix = tr.split('(')[1];
matrix = matrix.split(')')[0];
matrix = matrix.split(',');
for (var l = 0; l < matrix.length; l++) {
matrix[l] = Number(matrix[l]);
}
} else { matrix = [1.0, 0.0, 0.0, 1.0, 0.0, 0.0]; }
return matrix;
// matrix[0] = cosine, matrix[1] = sine.
// Assuming the element is still orthogonal.
}
$ax.public.fn.vectorMinus = function(vector1, vector2) { return { x: vector1.x - vector2.x, y: vector1.y - vector2.y }; }
$ax.public.fn.vectorPlus = function (vector1, vector2) { return { x: vector1.x + vector2.x, y: vector1.y + vector2.y }; }
$ax.public.fn.vectorMidpoint = function (vector1, vector2) { return { x: (vector1.x + vector2.x) / 2.0, y: (vector1.y + vector2.y) / 2.0 }; }
$ax.public.fn.fourCornersToBasis = function (fourCorners) {
return {
widthVector: $ax.public.fn.vectorMinus(fourCorners.widgetTopRight, fourCorners.widgetTopLeft),
heightVector: $ax.public.fn.vectorMinus(fourCorners.widgetBottomLeft, fourCorners.widgetTopLeft)
};
}
$ax.public.fn.matrixString = function(m11, m21, m12, m22, tx, ty) {
return "Matrix(" + m11 + "," + m21 + "," + m12 + "," + m22 + ", " + tx + ", " + ty + ")";
}
//$ax.public.fn.getWidgetBoundingRect = function (widgetId) {
// var emptyRect = { left: 0, top: 0, centerPoint: { x: 0, y: 0 }, width: 0, height: 0 };
// var element = document.getElementById(widgetId);
// if (!element) return emptyRect;
// var object = $obj(widgetId);
// if (object && object.type && $ax.public.fn.IsLayer(object.type)) {
// var layerChildren = _getLayerChildrenDeep(widgetId);
// if (!layerChildren) return emptyRect;
// else return _getBoundingRectForMultipleWidgets(layerChildren);
// }
// return _getBoundingRectForSingleWidget(widgetId);
//};
var _getLayerChildrenDeep = $ax.public.fn.getLayerChildrenDeep = function (layerId, includeLayers, includeHidden) {
var deep = [];
var children = $ax('#' + layerId).getChildren()[0].children;
for (var index = 0; index < children.length; index++) {
var childId = children[index];
if(!includeHidden && !$ax.visibility.IsIdVisible(childId)) continue;
if ($ax.public.fn.IsLayer($obj(childId).type)) {
if (includeLayers) deep.push(childId);
var recursiveChildren = _getLayerChildrenDeep(childId, includeLayers, includeHidden);
for (var j = 0; j < recursiveChildren.length; j++) deep.push(recursiveChildren[j]);
} else deep.push(childId);
}
return deep;
};
//var _getBoundingRectForMultipleWidgets = function (widgetsIdArray, relativeToPage) {
// if (!widgetsIdArray || widgetsIdArray.constructor !== Array) return undefined;
// if (widgetsIdArray.length == 0) return { left: 0, top: 0, centerPoint: { x: 0, y: 0 }, width: 0, height: 0 };
// var widgetRect = _getBoundingRectForSingleWidget(widgetsIdArray[0], relativeToPage, true);
// var boundingRect = { left: widgetRect.left, right: widgetRect.right, top: widgetRect.top, bottom: widgetRect.bottom };
// for (var index = 1; index < widgetsIdArray.length; index++) {
// widgetRect = _getBoundingRectForSingleWidget(widgetsIdArray[index], relativeToPage);
// boundingRect.left = Math.min(boundingRect.left, widgetRect.left);
// boundingRect.top = Math.min(boundingRect.top, widgetRect.top);
// boundingRect.right = Math.max(boundingRect.right, widgetRect.right);
// boundingRect.bottom = Math.max(boundingRect.bottom, widgetRect.bottom);
// }
// boundingRect.centerPoint = { x: (boundingRect.right + boundingRect.left) / 2.0, y: (boundingRect.bottom + boundingRect.top) / 2.0 };
// boundingRect.width = boundingRect.right - boundingRect.left;
// boundingRect.height = boundingRect.bottom - boundingRect.top;
// return boundingRect;
//};
//var _getBoundingRectForSingleWidget = function (widgetId, relativeToPage, justSides) {
// var element = document.getElementById(widgetId);
// var boundingRect, tempBoundingRect, position;
// var displayChanged = _displayHackStart(element);
// if (_isCompoundVectorHtml(element)) {
// //tempBoundingRect = _getCompoundImageBoundingClientSize(widgetId);
// //position = { left: tempBoundingRect.left, top: tempBoundingRect.top };
// position = $(element).position();
// tempBoundingRect = {};
// tempBoundingRect.left = position.left; //= _getCompoundImageBoundingClientSize(widgetId);
// tempBoundingRect.top = position.top;
// tempBoundingRect.width = Number(element.getAttribute('data-width'));
// tempBoundingRect.height = Number(element.getAttribute('data-height'));
// } else {
// var boundingElement = element;
// if($ax.dynamicPanelManager.isIdFitToContent(widgetId)) {
// var stateId = $ax.visibility.GetPanelState(widgetId);
// if(stateId != '') boundingElement = document.getElementById(stateId);
// }
// tempBoundingRect = boundingElement.getBoundingClientRect();
// var jElement = $(element);
// position = jElement.position();
// if(jElement.css('position') == 'fixed') {
// position.left += Number(jElement.css('margin-left').replace("px", ""));
// position.top += Number(jElement.css('margin-top').replace("px", ""));
// }
// }
// var layers = $ax('#' + widgetId).getParents(true, ['layer'])[0];
// var flip = '';
// var mirrorWidth = 0;
// var mirrorHeight = 0;
// for (var i = 0; i < layers.length; i++) {
// //should always be 0,0
// var layerPos = $jobj(layers[i]).position();
// position.left += layerPos.left;
// position.top += layerPos.top;
// var outer = $ax.visibility.applyWidgetContainer(layers[i], true, true);
// if (outer.length) {
// var outerPos = outer.position();
// position.left += outerPos.left;
// position.top += outerPos.top;
// }
// //when a group is flipped we find the unflipped position
// var inner = $jobj(layers[i] + '_container_inner');
// var taggedFlip = inner.data('flip');
// if (inner.length && taggedFlip) {
// //only account for flip if transform is applied
// var matrix = taggedFlip && (inner.css("-webkit-transform") || inner.css("-moz-transform") ||
// inner.css("-ms-transform") || inner.css("-o-transform") || inner.css("transform"));
// if (matrix !== 'none') {
// flip = taggedFlip;
// mirrorWidth = $ax.getNumFromPx(inner.css('width'));
// mirrorHeight = $ax.getNumFromPx(inner.css('height'));
// }
// }
// }
// //Now account for flip
// if (flip == 'x') position.top = mirrorHeight - position.top - element.getBoundingClientRect().height;
// else if (flip == 'y') position.left = mirrorWidth - position.left - element.getBoundingClientRect().width;
// boundingRect = {
// left: position.left,
// right: position.left + tempBoundingRect.width,
// top: position.top,
// bottom: position.top + tempBoundingRect.height
// };
// _displayHackEnd(displayChanged);
// if (justSides) return boundingRect;
// boundingRect.width = boundingRect.right - boundingRect.left;
// boundingRect.height = boundingRect.bottom - boundingRect.top;
// boundingRect.centerPoint = {
// x: boundingRect.width / 2 + boundingRect.left,
// y: boundingRect.height / 2 + boundingRect.top
// };
// return boundingRect;
//};
var _getPointAfterRotate = $ax.public.fn.getPointAfterRotate = function (angleInDegrees, pointToRotate, centerPoint) {
var displacement = $ax.public.fn.vectorMinus(pointToRotate, centerPoint);
var rotationMatrix = $ax.public.fn.rotationMatrix(angleInDegrees);
rotationMatrix.tx = centerPoint.x;
rotationMatrix.ty = centerPoint.y;
return $ax.public.fn.matrixMultiply(rotationMatrix, displacement);
};
$ax.public.fn.getBoundingSizeForRotate = function(width, height, rotation) {
// point to rotate around doesn't matter since we just care about size, if location matter we need more args and location matters.
var origin = { x: 0, y: 0 };
var corner1 = { x: width, y: 0 };
var corner2 = { x: 0, y: height };
var corner3 = { x: width, y: height };
corner1 = _getPointAfterRotate(rotation, corner1, origin);
corner2 = _getPointAfterRotate(rotation, corner2, origin);
corner3 = _getPointAfterRotate(rotation, corner3, origin);
var left = Math.min(0, corner1.x, corner2.x, corner3.x);
var right = Math.max(0, corner1.x, corner2.x, corner3.x);
var top = Math.min(0, corner1.y, corner2.y, corner3.y);
var bottom = Math.max(0, corner1.y, corner2.y, corner3.y);
return { width: right - left, height: bottom - top };
}
$ax.public.fn.getBoundingRectForRotate = function (boundingRect, rotation) {
var centerPoint = boundingRect.centerPoint;
var corner1 = { x: boundingRect.left, y: boundingRect.top };
var corner2 = { x: boundingRect.right, y: boundingRect.top };
var corner3 = { x: boundingRect.right, y: boundingRect.bottom };
var corner4 = { x: boundingRect.left, y: boundingRect.bottom };
corner1 = _getPointAfterRotate(rotation, corner1, centerPoint);
corner2 = _getPointAfterRotate(rotation, corner2, centerPoint);
corner3 = _getPointAfterRotate(rotation, corner3, centerPoint);
corner4 = _getPointAfterRotate(rotation, corner4, centerPoint);
var left = Math.min(corner1.x, corner2.x, corner3.x, corner4.x);
var right = Math.max(corner1.x, corner2.x, corner3.x, corner4.x);
var top = Math.min(corner1.y, corner2.y, corner3.y, corner4.y);
var bottom = Math.max(corner1.y, corner2.y, corner3.y, corner4.y);
return { left: left, top: top, width: right - left, height: bottom - top };
}
//$ax.public.fn.getPositionRelativeToParent = function (elementId) {
// var element = document.getElementById(elementId);
// var list = _displayHackStart(element);
// var position = $(element).position();
// _displayHackEnd(list);
// return position;
//};
//var _displayHackStart = $ax.public.fn.displayHackStart = function (element) {
// // TODO: Options: 1) stop setting display none. Big change for this late in the game. 2) Implement our own bounding.
// // TODO: 3) Current method is look for any parents that are set to none, and and temporarily unblock. Don't like it, but it works.
// var parent = element;
// var displays = [];
// while (parent) {
// if (parent.style.display == 'none') {
// displays.push(parent);
// //use block to overwrites default hidden objects' display
// parent.style.display = 'block';
// }
// parent = parent.parentElement;
// }
// return displays;
//};
//var _displayHackEnd = $ax.public.fn.displayHackEnd = function (displayChangedList) {
// for (var i = 0; i < displayChangedList.length; i++) displayChangedList[i].style.display = 'none';
//};
var _isCompoundVectorHtml = $ax.public.fn.isCompoundVectorHtml = function(hElement) {
return hElement.hasAttribute('compoundmode') && hElement.getAttribute('compoundmode') == "true";
}
$ax.public.fn.removeCompound = function (jobj) { if(_isCompoundVectorHtml(jobj[0])) jobj.removeClass('compound'); }
$ax.public.fn.restoreCompound = function (jobj) { if (_isCompoundVectorHtml(jobj[0])) jobj.addClass('compound'); }
$ax.public.fn.compoundIdFromComponent = function(id) {
var pPos = id.indexOf('p');
var dashPos = id.indexOf('-');
if (pPos < 1) return id;
else if (dashPos < 0) return id.substring(0, pPos);
else return id.substring(0, pPos) + id.substring(dashPos);
}
$ax.public.fn.l2 = function (x, y) { return Math.sqrt(x * x + y * y); }
$ax.public.fn.convertToSingleImage = function (jobj) {
if(!jobj[0]) return;
var widgetId = jobj[0].id;
var object = $obj(widgetId);
if ($ax.public.fn.IsLayer(object.type)) {
var recursiveChildren = _getLayerChildrenDeep(widgetId, true);
for (var j = 0; j < recursiveChildren.length; j++)
$ax.public.fn.convertToSingleImage($jobj(recursiveChildren[j]));
return;
}
//var layer =
if(!_isCompoundVectorHtml(jobj[0])) return;
$('#' + widgetId).removeClass("compound");
$('#' + widgetId + '_img').removeClass("singleImg");
jobj[0].setAttribute('compoundmode', 'false');
var components = object.compoundChildren;
delete object.generateCompound;
for (var i = 0; i < components.length; i++) {
var componentJobj = $jobj($ax.public.fn.getComponentId(widgetId, components[i]));
componentJobj.css('display', 'none');
componentJobj.css('visibility', 'hidden');
}
}
$ax.public.fn.getContainerDimensions = function(query) {
// returns undefined if no containers found.
var containerDimensions;
for (var i = 0; i < query[0].children.length; i++) {
var node = query[0].children[i];
if (node.id.indexOf(query[0].id) >= 0 && node.id.indexOf('container') >= 0) {
containerDimensions = node.style;
}
}
return containerDimensions;
}
$ax.public.fn.rotationMatrix = function (angleInDegrees) {
var angleInRadians = angleInDegrees * (Math.PI / 180);
var cosTheta = Math.cos(angleInRadians);
var sinTheta = Math.sin(angleInRadians);
return { m11: cosTheta, m12: -sinTheta, m21: sinTheta, m22: cosTheta, tx: 0.0, ty: 0.0 };
}
$ax.public.fn.GetFieldFromStyle = function (query, field) {
var raw = query[0].style[field];
if (!raw) raw = query.css(field);
return Number(raw.replace('px', ''));
}
$ax.public.fn.setTransformHowever = function (transformString) {
return {
'-webkit-transform': transformString,
'-moz-transform': transformString,
'-ms-transform': transformString,
'-o-transform': transformString,
'transform': transformString
};
}
$ax.public.fn.getCornersFromComponent = function (id) {
var element = document.getElementById(id);
var matrix = element ? $ax.public.fn.transformFromElement(element) : [1.0, 0.0, 0.0, 1.0, 0.0, 0.0];
var currentMatrix = { m11: matrix[0], m21: matrix[1], m12: matrix[2], m22: matrix[3], tx: matrix[4], ty: matrix[5] };
var dimensions = {};
var axObj = $ax('#' + id);
var viewportLocation = axObj.offsetLocation();
dimensions.left = viewportLocation.left;
dimensions.top = viewportLocation.top;
//dimensions.left = axObj.left(true);
//dimensions.top = axObj.top(true);
var size = axObj.size();
dimensions.width = size.width;
dimensions.height = size.height;
//var transformMatrix1 = { m11: 1, m12: 0, m21: 0, m22: 1, tx: -invariant.x, ty: -invariant.y };
//var transformMatrix2 = { m11: 1, m12: 0, m21: 0, m22: 1, tx: 500, ty: 500 };
var halfWidth = dimensions.width * 0.5;
var halfHeight = dimensions.height * 0.5;
//var preTransformTopLeft = { x: -halfWidth, y: -halfHeight };
//var preTransformBottomLeft = { x: -halfWidth, y: halfHeight };
var preTransformTopRight = { x: halfWidth, y: -halfHeight };
var preTransformBottomRight = { x: halfWidth, y: halfHeight };
return {
//relativeTopLeft: $ax.public.fn.matrixMultiply(currentMatrix, preTransformTopLeft),
//relativeBottomLeft: $ax.public.fn.matrixMultiply(currentMatrix, preTransformBottomLeft),
relativeTopRight: $ax.public.fn.matrixMultiply(currentMatrix, preTransformTopRight),
relativeBottomRight: $ax.public.fn.matrixMultiply(currentMatrix, preTransformBottomRight),
centerPoint: { x: dimensions.left + halfWidth, y: dimensions.top + halfHeight }
//originalDimensions: dimensions,
//transformShift: { x: matrix[4], y: matrix[5] }
}
}
$ax.public.fn.inversePathLengthFunction = function (pathFunction) {
// these are for computing the inverse functions of path integrals.
var makeDivisionNode = function(node1, node2) {
var param = 0.5 * (node1.Param + node2.Param);
var inBetweenNode = {
LowerStop: node1,
HigherStop: node2,
Param: param,
Position: pathFunction(param),
Cumulative: 0.0
};
var lowerDisplacement = $ax.public.fn.vectorMinus(node1.Position, inBetweenNode.Position);
inBetweenNode.LowerInterval = {
Length: $ax.public.fn.l2(lowerDisplacement.x, lowerDisplacement.y),
Node: inBetweenNode,
IsHigher: false
};
var higherDisplacement = $ax.public.fn.vectorMinus(node2.Position, inBetweenNode.Position);
inBetweenNode.HigherInterval = {
Length: $ax.public.fn.l2(higherDisplacement.x, higherDisplacement.y),
Node: inBetweenNode,
IsHigher: true
};
return inBetweenNode;
};
var expandLower = function(node) {
node.LowerChild = makeDivisionNode(node.LowerStop, node);
node.LowerChild.Parent = node;
};
var expandHigher = function(node) {
node.HigherChild = makeDivisionNode(node, node.HigherStop);
node.HigherChild.Parent = node;
};
// for this function, cumulative is a global variable
var cumulative = 0.0;
var labelCumulativeLength = function(node) {
if(!node.LowerChild) {
node.LowerStop.Cumulative = cumulative;
cumulative += node.LowerInterval.Length;
node.Cumulative = cumulative;
} else labelCumulativeLength(node.LowerChild);
if(!node.HigherChild) {
node.Cumulative = cumulative;
cumulative += node.HigherInterval.Length;
node.HigherStop.Cumulative = cumulative;
} else labelCumulativeLength(node.HigherChild);
};
var getIntervalFromPathLength = function(node, length) {
if(length < node.Cumulative) {
return node.LowerChild ? getIntervalFromPathLength(node.LowerChild, length) : node.LowerInterval;
} else return node.HigherChild ? getIntervalFromPathLength(node.HigherChild, length) : node.HigherInterval;
};
var intervalLowerEnd = function(interval) {
return interval.IsHigher ? interval.Node : interval.Node.LowerStop;
};
var intervalHigherEnd = function(interval) {
return interval.IsHigher ? interval.Node.HigherStop : interval.Node;
};
var getParameterFromPathLength = function (node, length) {
var interval = getIntervalFromPathLength(node, length);
var lowerNode = intervalLowerEnd(interval);
var higherNode = intervalHigherEnd(interval);
return lowerNode.Param + (higherNode.Param - lowerNode.Param) * (length - lowerNode.Cumulative) / (higherNode.Cumulative - lowerNode.Cumulative);
};
var insertIntoSortedList = function (longer, shorter, toInsert) {
while (true) {
if (!longer) {
longer = shorter;
shorter = shorter.NextLongest;
continue;
} else if (!shorter) longer.NextLongest = toInsert;
else {
if (longer.Length >= toInsert.Length && shorter.Length <= toInsert.Length) {
longer.NextLongest = toInsert;
toInsert.NextLongest = shorter;
} else {
longer = shorter;
shorter = shorter.NextLongest;
continue;
}
}
break;
}
}
var head = {Param: 0.0, Position: pathFunction(0.0) };
var tail = { Param: 1.0, Position: pathFunction(1.0) };
var root = makeDivisionNode(head, tail);
var currentCurveLength = root.LowerInterval.Length + root.HigherInterval.Length;
var longestInterval;
if (root.LowerInterval.Length < root.HigherInterval.Length) {
longestInterval = root.HigherInterval;
longestInterval.NextLongest = root.LowerInterval;
} else {
longestInterval = root.LowerInterval;
longestInterval.NextLongest = root.HigherInterval;
}
while (longestInterval.Length * 100.0 > currentCurveLength) {
var newNode;
if (longestInterval.IsHigher) {
expandHigher(longestInterval.Node);
newNode = longestInterval.Node.HigherChild;
} else {
expandLower(longestInterval.Node);
newNode = longestInterval.Node.LowerChild;
}
currentCurveLength += (newNode.LowerInterval.Length + newNode.HigherInterval.Length - longestInterval.Length);
insertIntoSortedList(null, longestInterval, newNode.LowerInterval);
insertIntoSortedList(null, longestInterval, newNode.HigherInterval);
longestInterval = longestInterval.NextLongest;
}
labelCumulativeLength(root);
return function(lengthParam) {
return getParameterFromPathLength(root, lengthParam * cumulative);
};
}
});

View File

@@ -0,0 +1,53 @@
// ******* Object Model ******** //
$axure.internal(function($ax) {
var _implementations = {};
var _initializeObject = function(type, obj) {
$.extend(obj, _implementations[type]);
};
$ax.initializeObject = _initializeObject;
var _model = $ax.model = {};
_model.idsInRdoToHideOrLimbo = function(rdoId, scriptIds) {
var rdoScriptId = $ax.repeater.getScriptIdFromElementId(rdoId);
var path = $ax.getPathFromScriptId(rdoScriptId);
if(!scriptIds) scriptIds = [];
var rdo = $ax.getObjectFromElementId(rdoId);
var master = $ax.pageData.masters[rdo.masterId];
var masterChildren = master.diagram.objects;
for(var i = 0; i < masterChildren.length; i++) {
var obj = masterChildren[i];
var objScriptIds = obj.scriptIds;
for(var j = 0; j < objScriptIds.length; j++) {
var scriptId = objScriptIds[j];
// Anything in a layer is already handled by the layer
if($ax.getLayerParentFromElementId(scriptId)) continue;
// Make sure in same rdo
var elementPath = $ax.getPathFromScriptId(scriptId);
// This is because last part of path is for the obj itself.
elementPath.pop();
if(elementPath.length != path.length) continue;
var samePath = true;
for(var k = 0; k < path.length; k++) {
if(elementPath[k] != path[k]) {
samePath = false;
break;
}
}
if(!samePath) continue;
if($ax.public.fn.IsReferenceDiagramObject(obj.type)) _model.idsInRdoToHideOrLimbo(scriptId, scriptIds);
else if(scriptIds.indexOf(scriptId) == -1) scriptIds.push(scriptId);
break;
}
}
return scriptIds;
};
});

View File

@@ -0,0 +1,463 @@
$axure.internal(function($ax) {
var _move = {};
$ax.move = _move;
var widgetMoveInfo = {};
//register and return move info, also create container for rootlayer if needed
$ax.move.PrepareForMove = function (id, x, y, to, options, jobj, rootLayer, skipContainerForRootLayer) {
var fixedInfo = jobj ? {} : $ax.dynamicPanelManager.getFixedInfo(id);
var widget = $jobj(id);
var query = $ax('#' + id);
var isLayer = $ax.getTypeFromElementId(id) == $ax.constants.LAYER_TYPE;
if(!rootLayer) {
rootLayer = _move.getRootLayer(id);
if (rootLayer && !skipContainerForRootLayer) {
$ax.visibility.pushContainer(rootLayer, false);
if (isLayer) widget = $ax.visibility.applyWidgetContainer(id, true);
}
}
if (!jobj) jobj = widget;
var horzProp = 'left';
var vertProp = 'top';
var offsetLocation = to ? query.offsetLocation() : undefined;
var horzX = to ? x - offsetLocation.x : x;
var vertY = to ? y - offsetLocation.y : y;
//var horzX = to ? x - query.locRelativeIgnoreLayer(false) : x;
//var vertY = to ? y - query.locRelativeIgnoreLayer(true) : y;
if (fixedInfo.horizontal == 'right') {
horzProp = 'right';
horzX = to ? $(window).width() - x - $ax.getNumFromPx(jobj.css('right')) - query.width() : -x;
var leftChanges = -horzX;
} else if(fixedInfo.horizontal == 'center') {
horzProp = 'margin-left';
if (to) horzX = x - $(window).width() / 2;
}
if (fixedInfo.vertical == 'bottom') {
vertProp = 'bottom';
vertY = to ? $(window).height() - y - $ax.getNumFromPx(jobj.css('bottom')) - query.height() : -y;
var topChanges = -vertY;
} else if (fixedInfo.vertical == 'middle') {
vertProp = 'margin-top';
if (to) vertY = y - $(window).height() / 2;
}
//todo currently this always save the info, which is not needed for compound vector children and maybe some other cases
//let's optimize it later, only register if registerid is valid..
widgetMoveInfo[id] = {
x: leftChanges === undefined ? horzX : leftChanges,
y: topChanges === undefined ? vertY : topChanges,
options: options
};
return {
horzX: horzX,
vertY: vertY,
horzProp: horzProp,
vertProp: vertProp,
rootLayer: rootLayer,
jobj: jobj
};
};
$ax.move.GetWidgetMoveInfo = function() {
return $.extend({}, widgetMoveInfo);
};
_move.getRootLayer = function (id) {
var isLayer = $ax.getTypeFromElementId(id) == $ax.constants.LAYER_TYPE;
var rootLayer = isLayer ? id : '';
var parentIds = $ax('#' + id).getParents(true, '*')[0];
for(var i = 0; i < parentIds.length; i++) {
var parentId = parentIds[i];
// Keep climbing up layers until you hit a non-layer. At that point you have your root layer
if($ax.public.fn.IsLayer($ax.getTypeFromElementId(parentId))) rootLayer = parentId;
else break;
}
return rootLayer;
};
$ax.move.MoveWidget = function (id, x, y, options, to, animationCompleteCallback, shouldFire, jobj, skipOnMoveEvent) {
var moveInfo = $ax.move.PrepareForMove(id, x, y, to, options, jobj);
$ax.drag.LogMovedWidgetForDrag(id, options.dragInfo);
var object = $obj(id);
if(object && $ax.public.fn.IsLayer(object.type)) {
var childrenIds = $ax.public.fn.getLayerChildrenDeep(id, true);
//don't push container when register moveinfo for child
if(!skipOnMoveEvent) {
for(var i = 0; i < childrenIds.length; i++) $ax.move.PrepareForMove(childrenIds[i], x, y, to, options, null, moveInfo.rootLayer, true);
}
}
//if(!moveInfo) moveInfo = _getMoveInfo(id, x, y, to, options, jobj);
jobj = moveInfo.jobj;
_moveElement(id, options, animationCompleteCallback, shouldFire, jobj, moveInfo);
if(skipOnMoveEvent) return;
$ax.event.raiseSyntheticEvent(id, "onMove");
if(childrenIds) {
for(var i = 0; i < childrenIds.length; i++) $ax.event.raiseSyntheticEvent(childrenIds[i], 'onMove');
}
};
var _moveElement = function (id, options, animationCompleteCallback, shouldFire, jobj, moveInfo){
var cssStyles = {};
if(!$ax.dynamicPanelManager.isPercentWidthPanel($obj(id))) cssStyles[moveInfo.horzProp] = '+=' + moveInfo.horzX;
cssStyles[moveInfo.vertProp] = '+=' + moveInfo.vertY;
$ax.visibility.moveMovedLocation(id, moveInfo.horzX, moveInfo.vertY);
// I don't think root layer is necessary anymore after changes to layer container structure.
// Wait to try removing it until more stable.
var rootLayer = moveInfo.rootLayer;
var query = $addAll(jobj, id);
var completeCount = query.length;
var completeAnimation = function() {
completeCount--;
if(completeCount == 0 && rootLayer) $ax.visibility.popContainer(rootLayer, false);
if(animationCompleteCallback) animationCompleteCallback();
if(shouldFire) $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move);
};
if(options.easing==='none') {
query.animate(cssStyles, { duration: 0, queue: false });
if(rootLayer) $ax.visibility.popContainer(rootLayer, false);
if(animationCompleteCallback) animationCompleteCallback();
//if this widget is inside a layer, we should just remove the layer from the queue
if(shouldFire) $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move);
} else if (options.trajectory === 'straight' || moveInfo.horzX === 0 || moveInfo.vertY === 0) {
query.animate(cssStyles, {
duration: options.duration, easing: options.easing, queue: false, complete: completeAnimation});
} else {
var initialHorzProp = $ax.getNumFromPx(query.css(moveInfo.horzProp));
var initialVertProp = $ax.getNumFromPx(query.css(moveInfo.vertProp));
var state = { parameter: 0 };
var ellipseArcFunctionY = function(param) {
return {
x: initialHorzProp + (1.0 - Math.cos(param * Math.PI * 0.5)) * moveInfo.horzX,
y: initialVertProp + Math.sin(param * Math.PI * 0.5) * moveInfo.vertY
};
};
var ellipseArcFunctionX = function (param) {
return {
x: initialHorzProp + Math.sin(param * Math.PI * 0.5) * moveInfo.horzX,
y: initialVertProp + (1.0 - Math.cos(param * Math.PI * 0.5)) * moveInfo.vertY
};
};
var ellipseArcFunction = (moveInfo.horzX > 0) ^ (moveInfo.vertY > 0) ^ options.trajectory === 'arcClockwise'
? ellipseArcFunctionX : ellipseArcFunctionY;
var inverseFunction = $ax.public.fn.inversePathLengthFunction(ellipseArcFunction);
$(state).animate({ parameter: 1.0 }, {
duration: options.duration, easing: options.easing, queue: false,
step: function (now) {
var newPos = ellipseArcFunction(inverseFunction(now));
var changeFields = {};
changeFields[moveInfo.horzProp] = newPos.x;
changeFields[moveInfo.vertProp] = newPos.y;
query.css(changeFields);
},
complete: completeAnimation});
}
// //moveinfo is used for moving 'with this'
// var moveInfo = new Object();
// moveInfo.x = horzX;
// moveInfo.y = vertY;
// moveInfo.options = options;
// widgetMoveInfo[id] = moveInfo;
};
_move.nopMove = function(id, options) {
var moveInfo = new Object();
moveInfo.x = 0;
moveInfo.y = 0;
moveInfo.options = {};
moveInfo.options.easing = 'none';
moveInfo.options.duration = 0;
widgetMoveInfo[id] = moveInfo;
// Layer move using container now.
var obj = $obj(id);
if($ax.public.fn.IsLayer(obj.type)) if(options.onComplete) options.onComplete();
$ax.event.raiseSyntheticEvent(id, "onMove");
};
//rotationDegree: total degree to rotate
//centerPoint: the center of the circular path
var _noRotateOnlyMove = function (id, moveDelta, rotatableMove, fireAnimationQueue, easing, duration, completionCallback) {
moveDelta.x += rotatableMove.x;
moveDelta.y += rotatableMove.y;
if (moveDelta.x == 0 && moveDelta.y == 0) {
if(fireAnimationQueue) {
$ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.rotate);
$ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move);
}
if (completionCallback) completionCallback();
} else {
$jobj(id).animate({ top: '+=' + moveDelta.y, left: '+=' + moveDelta.x }, {
duration: duration,
easing: easing,
queue: false,
complete: function () {
if(fireAnimationQueue) {
$ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move);
$ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.rotate);
}
if (completionCallback) completionCallback();
}
});
}
}
_move.circularMove = function (id, degreeDelta, centerPoint, moveDelta, rotatableMove, resizeOffset, options, fireAnimationQueue, completionCallback, willDoRotation) {
var elem = $jobj(id);
if(!willDoRotation) elem = $addAll(elem, id);
var moveInfo = $ax.move.PrepareForMove(id, moveDelta.x, moveDelta.y, false, options);
// If not rotating, still need to check moveDelta and may need to handle that.
if (degreeDelta === 0) {
_noRotateOnlyMove(id, moveDelta, rotatableMove, fireAnimationQueue, options.easing, options.duration, completionCallback);
return;
}
var stepFunc = function(newDegree) {
var deg = newDegree - rotation.degree;
var widgetCenter = $ax('#' + id).offsetBoundingRect().centerPoint;
//var widgetCenter = $ax.public.fn.getWidgetBoundingRect(id).centerPoint;
//console.log("widget center of " + id + " x " + widgetCenter.x + " y " + widgetCenter.y);
var widgetNewCenter = $axure.fn.getPointAfterRotate(deg, widgetCenter, centerPoint);
// Start by getting the move not related to rotation, and make sure to update center point to move with it.
var ratio = deg / degreeDelta;
var xdelta = (moveDelta.x + rotatableMove.x) * ratio;
var ydelta = (moveDelta.y + rotatableMove.y) * ratio;
if(resizeOffset) {
var resizeShift = {};
resizeShift.x = resizeOffset.x * ratio;
resizeShift.y = resizeOffset.y * ratio;
$axure.fn.getPointAfterRotate(rotation.degree, resizeShift, { x: 0, y: 0 });
xdelta += resizeShift.x;
ydelta += resizeShift.y;
}
centerPoint.x += xdelta;
centerPoint.y += ydelta;
// Now for the move that is rotatable, it must be rotated
rotatableMove = $axure.fn.getPointAfterRotate(deg, rotatableMove, { x: 0, y: 0 });
// Now add in circular move to the mix.
xdelta += widgetNewCenter.x - widgetCenter.x;
ydelta += widgetNewCenter.y - widgetCenter.y;
$ax.visibility.moveMovedLocation(id, xdelta, ydelta);
if(xdelta < 0) elem.css('left', '-=' + -xdelta);
else if(xdelta > 0) elem.css('left', '+=' + xdelta);
if(ydelta < 0) elem.css('top', '-=' + -ydelta);
else if(ydelta > 0) elem.css('top', '+=' + ydelta);
};
var onComplete = function() {
if(fireAnimationQueue) $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move);
if(completionCallback) completionCallback();
if(moveInfo.rootLayer) $ax.visibility.popContainer(moveInfo.rootLayer, false);
var isPercentWidthPanel = $ax.dynamicPanelManager.isPercentWidthPanel($obj(id));
if(isPercentWidthPanel) {
$ax.dynamicPanelManager.updatePanelPercentWidth(id);
$ax.dynamicPanelManager.updatePanelContentPercentWidth(id);
}
if(elem.css('position') == 'fixed') {
if(!isPercentWidthPanel) elem.css('left', '');
elem.css('top', '');
}
};
var rotation = { degree: 0 };
if(!options.easing || options.easing === 'none' || options.duration <= 0) {
stepFunc(degreeDelta);
onComplete();
} else {
$(rotation).animate({ degree: degreeDelta }, {
duration: options.duration,
easing: options.easing,
queue: false,
step: stepFunc,
complete: onComplete
});
}
};
//rotate a widget by degree, center is 50% 50%
_move.rotate = function (id, degree, easing, duration, to, shouldFire, completionCallback) {
var currentDegree = _move.getRotationDegree(id);
if(to) degree = degree - currentDegree;
if(degree === 0) {
if (shouldFire) $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.rotate);
return;
}
var query = $jobj(id);
var stepFunc = function(now) {
var degreeDelta = now - rotation.degree;
var newDegree = currentDegree + degreeDelta;
query.css($ax.public.fn.setTransformHowever("rotate(" + newDegree + "deg)"));
currentDegree = newDegree;
};
var onComplete = function() {
if(shouldFire) {
$ax.action.fireAnimationFromQueue($ax.public.fn.compoundIdFromComponent(id), $ax.action.queueTypes.rotate);
}
if(completionCallback) completionCallback();
$ax.annotation.adjustIconLocation(id);
};
var rotation = { degree: 0 };
$ax.visibility.setRotatedAngle(id, currentDegree + degree);
//if no animation, setting duration to 1, to prevent RangeError in rotation loops without animation
if(!easing || easing === 'none' || duration <= 0) {
stepFunc(degree);
onComplete();
} else {
$(rotation).animate({ degree: degree }, {
duration: duration,
easing: easing,
queue: false,
step: stepFunc,
complete: onComplete
});
}
};
_move.compoundRotateAround = function (id, degreeDelta, centerPoint, moveDelta, rotatableMove, resizeOffset, easing, duration, fireAnimationQueue, completionCallback) {
if (degreeDelta === 0) {
_noRotateOnlyMove($ax.public.fn.compoundIdFromComponent(id), moveDelta, rotatableMove, fireAnimationQueue, easing, duration, completionCallback, $ax.action.queueTypes.rotate);
return;
}
var elem = $jobj(id);
var rotation = { degree: 0 };
if (!easing || easing === 'none' || duration <= 0) {
duration = 1;
easing = 'linear'; //it doesn't matter anymore here...
}
var originalWidth = $ax.getNumFromPx(elem.css('width'));
var originalHeight = $ax.getNumFromPx(elem.css('height'));
var originalLeft = $ax.getNumFromPx(elem.css('left'));
var originalTop = $ax.getNumFromPx(elem.css('top'));
$(rotation).animate({ degree: degreeDelta }, {
duration: duration,
easing: easing,
queue: false,
step: function (newDegree) {
var transform = $ax.public.fn.transformFromElement(elem[0]);
var originalCenter = { x: originalLeft + 0.5 * originalWidth, y: originalTop + 0.5 * originalHeight};
var componentCenter = { x: originalCenter.x + transform[4], y: originalCenter.y + transform[5] };
var deg = newDegree - rotation.degree;
var ratio = deg / degreeDelta;
var xdelta = (moveDelta.x + rotatableMove.x) * ratio;
var ydelta = (moveDelta.y + rotatableMove.y) * ratio;
if (resizeOffset) {
var resizeShift = {};
resizeShift.x = resizeOffset.x * ratio;
resizeShift.y = resizeOffset.y * ratio;
$axure.fn.getPointAfterRotate(rotation.degree, resizeShift, { x: 0, y: 0 });
xdelta += resizeShift.x;
ydelta += resizeShift.y;
}
var rotationMatrix = $ax.public.fn.rotationMatrix(deg);
var compositionTransform = $ax.public.fn.matrixMultiplyMatrix(rotationMatrix,
{ m11: transform[0], m21: transform[1], m12: transform[2], m22: transform[3] });
//console.log("widget center of " + id + " x " + widgetCenter.x + " y " + widgetCenter.y);
var widgetNewCenter = $axure.fn.getPointAfterRotate(deg, componentCenter, centerPoint);
var newMatrix = $ax.public.fn.matrixString(compositionTransform.m11, compositionTransform.m21, compositionTransform.m12, compositionTransform.m22,
widgetNewCenter.x - originalCenter.x + xdelta, widgetNewCenter.y - originalCenter.y + ydelta);
elem.css($ax.public.fn.setTransformHowever(newMatrix));
},
complete: function () {
if (fireAnimationQueue) {
$ax.action.fireAnimationFromQueue(elem.parent()[0].id, $ax.action.queueTypes.rotate);
}
if(completionCallback) completionCallback();
}
});
};
_move.getRotationDegreeFromElement = function(element) {
if(element == null) return NaN;
var transformString = element.style['transform'] ||
element.style['-o-transform'] ||
element.style['-ms-transform'] ||
element.style['-moz-transform'] ||
element.style['-webkit-transform'];
if(transformString) {
var rotateRegex = /rotate\(([-?0-9]+)deg\)/;
var degreeMatch = rotateRegex.exec(transformString);
if(degreeMatch && degreeMatch[1]) return parseFloat(degreeMatch[1]);
}
if(window.getComputedStyle) {
var st = window.getComputedStyle(element, null);
} else {
console.log('rotation is not supported for ie 8 and below in this version of axure rp');
return 0;
}
var tr = st.getPropertyValue("transform") ||
st.getPropertyValue("-o-transform") ||
st.getPropertyValue("-ms-transform") ||
st.getPropertyValue("-moz-transform") ||
st.getPropertyValue("-webkit-transform");
if(!tr || tr === 'none') return 0;
var values = tr.split('(')[1];
values = values.split(')')[0],
values = values.split(',');
var a = values[0];
var b = values[1];
var radians = Math.atan2(b, a);
if(radians < 0) {
radians += (2 * Math.PI);
}
return radians * (180 / Math.PI);
};
_move.getRotationDegree = function(elementId) {
if($ax.public.fn.IsLayer($obj(elementId).type)) {
return $jobj(elementId).data('layerDegree');
}
return _move.getRotationDegreeFromElement(document.getElementById(elementId));
}
});

View File

@@ -0,0 +1,94 @@
// ******* Recording MANAGER ******** //
$axure.internal(function($ax) {
var _recording = $ax.recording = {};
$ax.recording.recordEvent = function(element, eventInfo, axEventObject, timeStamp) {
var elementHtml = $jobj(element);
var className = elementHtml.attr('class');
var inputValue;
if(className === 'ax_checkbox') {
inputValue = elementHtml.find('#' + element + '_input')[0].checked;
eventInfo.inputType = className;
eventInfo.inputValue = inputValue;
}
if(className === 'ax_text_field') {
inputValue = elementHtml.find('#' + element + '_input').val();
eventInfo.inputType = className;
eventInfo.inputValue = inputValue;
}
var scriptId = $ax.repeater.getScriptIdFromElementId(element);
var diagramObjectPath = $ax.getPathFromScriptId(scriptId);
var form = {
recordingId: $ax.recording.recordingId,
elementID: element,
eventType: axEventObject.description,
'eventInfo': eventInfo,
// eventObject: axEventObject,
'timeStamp': timeStamp,
'path': diagramObjectPath
// ,
// 'trigger': function() {
// $ax.event.handleEvent(element, eventInfo, axEventObject);
// return false;
// }
};
$ax.messageCenter.postMessage('logEvent', form);
};
$ax.recording.maybeRecordEvent = function(element, eventInfo, axEventObject, timeStamp) {
};
$ax.recording.recordingId = "";
$ax.recording.recordingName = "";
$ax.messageCenter.addMessageListener(function(message, data) {
if(message === 'startRecording') {
$ax.recording.maybeRecordEvent = $ax.recording.recordEvent;
$ax.recording.recordingId = data.recordingId;
$ax.recording.recordingName = data.recordingName;
} else if(message === 'stopRecording') {
$ax.recording.maybeRecordEvent = function(element, eventInfo, axEventObject, timeStamp) {
};
}
else if(message === 'playEvent') {
var eventType = makeFirstLetterLower(data.eventType);
var inputElement;
var dObj = data.element === '' ? $ax.pageData.page : $ax.getObjectFromElementId(data.element);
if(!data.axEventObject) {
data.axEventObject = dObj && dObj.interactionMap && dObj.interactionMap[eventType];
}
data.eventInfo.thiswidget = $ax.getWidgetInfo(data.element);
data.eventInfo.item = $ax.getItemInfo(data.element);
if(data.eventInfo.inputType && data.eventInfo.inputType === 'ax_checkbox') {
inputElement = $jobj(data.element + '_input');
inputElement[0].checked = data.eventInfo.inputValue;
}
if(data.eventInfo.inputType && data.eventInfo.inputType === 'ax_text_field') {
inputElement = $jobj(data.element + '_input');
inputElement.val(data.eventInfo.inputValue);
}
$ax.event.handleEvent(data.element, data.eventInfo, data.axEventObject, false, true);
}
});
var makeFirstLetterLower = function(eventName) {
return eventName.substr(0, 1).toLowerCase() + eventName.substr(1);
};
});

View File

@@ -0,0 +1,231 @@

$axure.internal(function($ax) {
var funcs = {};
var weekday = new Array(7);
weekday[0] = "Sunday";
weekday[1] = "Monday";
weekday[2] = "Tuesday";
weekday[3] = "Wednesday";
weekday[4] = "Thursday";
weekday[5] = "Friday";
weekday[6] = "Saturday";
funcs.getDayOfWeek = function() {
return _getDayOfWeek(this.getDay());
};
var _getDayOfWeek = $ax.getDayOfWeek = function(day) {
return weekday[day];
};
var month = new Array(12);
month[0] = "January";
month[1] = "February";
month[2] = "March";
month[3] = "April";
month[4] = "May";
month[5] = "June";
month[6] = "July";
month[7] = "August";
month[8] = "September";
month[9] = "October";
month[10] = "November";
month[11] = "December";
funcs.getMonthName = function() {
return _getMonthName(this.getMonth());
};
var _getMonthName = $ax.getMonthName = function(monthNum) {
return month[monthNum];
};
funcs.getMonth = function() {
return this.getMonth() + 1;
};
funcs.addYears = function(years) {
var retVal = new Date(this.valueOf());
retVal.setFullYear(this.getFullYear() + Number(years));
return retVal;
};
funcs.addMonths = function(months) {
var retVal = new Date(this.valueOf());
retVal.setMonth(this.getMonth() + Number(months));
return retVal;
};
funcs.addDays = function(days) {
var retVal = new Date(this.valueOf());
retVal.setDate(this.getDate() + Number(days));
return retVal;
};
funcs.addHours = function(hours) {
var retVal = new Date(this.valueOf());
retVal.setHours(this.getHours() + Number(hours));
return retVal;
};
funcs.addMinutes = function(minutes) {
var retVal = new Date(this.valueOf());
retVal.setMinutes(this.getMinutes() + Number(minutes));
return retVal;
};
funcs.addSeconds = function(seconds) {
var retVal = new Date(this.valueOf());
retVal.setSeconds(this.getSeconds() + Number(seconds));
return retVal;
};
funcs.addMilliseconds = function(milliseconds) {
var retVal = new Date(this.valueOf());
retVal.setMilliseconds(this.getMilliseconds() + Number(milliseconds));
return retVal;
};
var _stoHandlers = {};
_stoHandlers.literal = function(sto, scope, eventInfo) {
return sto.value;
};
//need angle bracket syntax because var is a reserved word
_stoHandlers['var'] = function(sto, scope, eventInfo) {
// Can't us 'A || B' here, because the first value can be false, true, or empty string and still be valid.
var retVal = scope.hasOwnProperty(sto.name) ? scope[sto.name] : $ax.globalVariableProvider.getVariableValue(sto.name, eventInfo);
// Handle desired type here?
if(retVal && retVal.exprType) {
retVal = $ax.expr.evaluateExpr(retVal, eventInfo);
}
if((sto.desiredType == 'int' || sto.desiredType == 'float')) {
var num = new Number(retVal);
retVal = isNaN(num.valueOf()) ? retVal : num;
}
return retVal;
};
//TODO: Perhaps repeaterId can be detirmined at generation, and stored in the sto info.
_stoHandlers.item = function(sto, scope, eventInfo, prop) {
prop = prop || (eventInfo.data ? 'data' : eventInfo.link ? 'url' : eventInfo.image ? 'img' : 'text');
var id = sto.isTarget || !$ax.repeater.hasData(eventInfo.srcElement, sto.name) ? eventInfo.targetElement : eventInfo.srcElement;
return getData(eventInfo, id, sto.name, prop);
};
var getData = function(eventInfo, id, name, prop) {
var repeaterId = $ax.getParentRepeaterFromScriptId($ax.repeater.getScriptIdFromElementId(id));
var itemId = $ax.repeater.getItemIdFromElementId(id);
return $ax.repeater.getData(eventInfo, repeaterId, itemId, name, prop);
};
_stoHandlers.paren = function(sto, scope, eventInfo) {
return _evaluateSTO(sto.innerSTO, scope, eventInfo);
};
_stoHandlers.fCall = function(sto, scope, eventInfo) {
//TODO: [mas] handle required type
var thisObj = _evaluateSTO(sto.thisSTO, scope, eventInfo);
if(sto.thisSTO.desiredType == 'string' && sto.thisSTO.computedType != 'string') thisObj = thisObj.toString();
var args = [];
for(var i = 0; i < sto.arguments.length; i++) {
args[i] = _evaluateSTO(sto.arguments[i], scope, eventInfo);
}
var fn = (funcs.hasOwnProperty(sto.func) && funcs[sto.func]) || thisObj[sto.func];
return fn.apply(thisObj, args);
};
_stoHandlers.propCall = function(sto, scope, eventInfo) {
//TODO: [mas] handle required type
if((sto.prop == 'url' || sto.prop == 'img') && sto.thisSTO.sto == 'item') return _stoHandlers.item(sto.thisSTO, scope, eventInfo, sto.prop);
var thisObj = _evaluateSTO(sto.thisSTO, scope, eventInfo);
var prop = thisObj[sto.prop] instanceof Function ? thisObj[sto.prop]() : thisObj[sto.prop];
return prop;
};
var _binOps = {};
_binOps['+'] = function(left, right) {
if(left instanceof Date) return addDayToDate(left, right);
if(right instanceof Date) return addDayToDate(right, left);
var num = Number(left) + Number(right);
return isNaN(num) ? (String(left) + String(right)) : num;
};
_binOps['-'] = function(left, right) {
if(left instanceof Date) return addDayToDate(left, -right);
return left - right;
};
_binOps['*'] = function(left, right) { return Number(left) * Number(right); };
_binOps['/'] = function(left, right) { return Number(left) / Number(right); };
_binOps['%'] = function(left, right) { return Number(left) % Number(right); };
_binOps['=='] = function(left, right) { return _getBool(left) == _getBool(right); };
_binOps['!='] = function(left, right) { return _getBool(left) != _getBool(right); };
_binOps['<'] = function(left, right) { return Number(left) < Number(right); };
_binOps['<='] = function(left, right) { return Number(left) <= Number(right); };
_binOps['>'] = function(left, right) { return Number(left) > Number(right); };
_binOps['>='] = function(left, right) { return Number(left) >= Number(right); };
_binOps['&&'] = function(left, right) { return _getBool(left) && _getBool(right); };
_binOps['||'] = function(left, right) { return _getBool(left) || _getBool(right); };
// TODO: Move this to generic place to be used.
var addDayToDate = function(date, days) {
var retVal = new Date(date.valueOf());
retVal.setDate(date.getDate() + days);
return retVal;
};
var _unOps = {};
_unOps['+'] = function(arg) { return +arg; };
_unOps['-'] = function(arg) { return -arg; };
_unOps['!'] = function(arg) { return !_getBool(arg); };
_stoHandlers.binOp = function(sto, scope, eventInfo) {
var left = _evaluateSTO(sto.leftSTO, scope, eventInfo);
var right = _evaluateSTO(sto.rightSTO, scope, eventInfo);
return _binOps[sto.op](left, right);
};
_stoHandlers.unOp = function(sto, scope, eventInfo) {
var input = _evaluateSTO(sto.inputSTO, scope, eventInfo);
return _unOps[sto.op](input);
};
var _getBool = function(val) {
var lowerVal = val.toLowerCase ? val.toLowerCase() : val;
return lowerVal == "false" ? false : lowerVal == "true" ? true : val;
};
$ax.getBool = _getBool;
var _evaluateSTO = function(sto, scope, eventInfo) {
if(sto.sto == 'error') return undefined;
return _tryEscapeRichText(castSto(_stoHandlers[sto.sto](sto, scope, eventInfo), sto), eventInfo);
};
$ax.evaluateSTO = _evaluateSTO;
var castSto = function(val, sto) {
var type = sto.computedType || sto.desiredType;
if(type == 'string') val = String(val);
else if(type == 'date' && !(val instanceof Date)) val = new Date(val);
else if(type == 'int' || type == 'float') val = Number(val);
else if(type == 'bool') val = Boolean(val);
return val;
};
var _tryEscapeRichText = function(text, eventInfo) {
return eventInfo.htmlLiteral ? _escapeRichText(text) : text;
};
var _escapeRichText = function(text) {
if(typeof (text) != 'string') return text;
return text.replace('<', '&lt;');
};
});

View File

@@ -0,0 +1,189 @@
// This is actually for BOTH trees and menus
$axure.internal(function($ax) {
var _tree = $ax.tree = {};
var _menu = $ax.menu = {};
$ax.menu.InitializeSubmenu = function(subMenuId, cellId) {
var $submenudiv = $('#' + subMenuId);
//mouseenter and leave for parent table cell
$('#' + cellId).mouseenter(function(e) {
//show current submenu
// var submenuElement = document.getElementById(subMenuId);
// if($ax.visibility.IsVisible(submenuElement) && submenuElement.style.display !== 'none') return;
$ax.visibility.SetIdVisible(subMenuId, true);
$ax.legacy.BringToFront(subMenuId);
//$submenudiv.find('.menu_item').each(function() {
// $ax.style.updateTextAlignmentForVisibility($ax.GetTextPanelId($(this).attr('id')));
//});
_fireEventForSubmenu(subMenuId, "onShow");
}).mouseleave(function (e) {
var offset = $submenudiv.offset();
var subcontwidth = $submenudiv.width();
var subcontheight = $submenudiv.height();
//If mouse is not within the submenu (added 3 pixel margin to top and left calculations), then close the submenu...
if(e.pageX + 3 < offset.left || e.pageX > offset.left + subcontwidth || e.pageY + 3 < offset.top || e.pageY > offset.top + subcontheight) {
$submenudiv.find('.sub_menu').addBack().each(function () {
// if(!$ax.visibility.IsVisible(this)) return;
$ax.visibility.SetVisible(this, false);
_fireEventForSubmenu(subMenuId, "onHide");
});
$ax.style.SetWidgetHover(cellId, false);
}
});
$submenudiv.css('display', 'none');
//mouseleave for submenu
$submenudiv.mouseleave(function(e) {
//close this menu and all menus below it
$(this).find('.sub_menu').addBack().css({ 'visibility': 'hidden', 'display': 'none' }).each(function () {
// if(!$ax.visibility.IsVisible(this)) return;
_fireEventForSubmenu(this.id, "onHide");
});
$ax.style.SetWidgetHover(cellId, false);
});
};
var _fireEventForSubmenu = function(targetId, eventName) {
var diagramObject = $ax.getObjectFromElementId(targetId);
var event = diagramObject.interactionMap && diagramObject.interactionMap[eventName];
if(event) {
var eventInfo = $ax.getEventInfoFromEvent($ax.getjBrowserEvent(), false, targetId);
$ax.event.handleEvent(targetId, eventInfo, event, false, true);
}
}
function IsNodeVisible(nodeId) {
var current = window.document.getElementById(nodeId);
var parent = current.parentNode;
//move all the parent's children that are below the node and their annotations
while(!$(current).hasClass("treeroot")) {
if(!$ax.visibility.IsVisible(parent)) return false;
current = parent;
parent = parent.parentNode;
}
return true;
}
$ax.tree.ExpandNode = function(nodeId, childContainerId, plusMinusId) {
var container = window.document.getElementById(childContainerId);
if(!container || $ax.visibility.IsVisible(container)) return;
$ax.visibility.SetVisible(container, true);
if(plusMinusId != '') $ax.style.SetWidgetSelected(plusMinusId, true);
var delta = _getExpandCollapseDelta(nodeId, childContainerId);
var isVisible = IsNodeVisible(nodeId);
var current = window.document.getElementById(nodeId);
var parent = current.parentNode;
//move all the parent's children that are below the node and their annotations
while(!$(current).hasClass("treeroot")) {
var after = false;
var i = 0;
for(i = 0; i < parent.childNodes.length; i++) {
var child = parent.childNodes[i];
if(after && child.id && $(child).hasClass("treenode")) {
var elementId = child.id;
child.style.top = $ax.getNumFromPx($(child).css('top')) + delta + 'px';
var ann = window.document.getElementById(elementId + "_ann");
if (ann) ann.style.top = $ax.getNumFromPx($(ann).css('top')) + delta + 'px';
}
if(child == current) after = true;
}
current = parent;
parent = parent.parentNode;
if(!isVisible && $ax.visibility.IsVisible(parent)) break;
}
};
$ax.tree.CollapseNode = function(nodeId, childContainerId, plusMinusId) {
var container = window.document.getElementById(childContainerId);
if(!container || !$ax.visibility.IsVisible(container)) return;
if(plusMinusId != '') $ax.style.SetWidgetSelected(plusMinusId, false);
var delta = _getExpandCollapseDelta(nodeId, childContainerId);
//hide it after getting the delta, otherwise the delta can't be calculated (offsetParent is null)
$ax.visibility.SetVisible(container, false);
var isVisible = IsNodeVisible(nodeId);
var current = window.document.getElementById(nodeId);
var parent = current.parentNode;
//move all the parent's children that are below the node and their annotations
while(!$(current).hasClass("treeroot")) {
var after = false;
var i = 0;
for(i = 0; i < parent.childNodes.length; i++) {
var child = parent.childNodes[i];
if(after && child.id && $(child).hasClass("treenode")) {
var elementId = child.id;
child.style.top = $ax.getNumFromPx($(child).css('top')) - delta + 'px';
var ann = window.document.getElementById(elementId + "_ann");
if (ann) ann.style.top = $ax.getNumFromPx($(ann).css('top')) - delta + 'px';
}
if(child == current) after = true;
}
current = parent;
parent = current.parentNode;
if(!isVisible && $ax.visibility.IsVisible(parent)) break;
}
};
var _getExpandCollapseDelta = function(nodeId, childContainerId) {
return _getChildContainerHeightHelper(childContainerId);
};
var _getChildContainerHeightHelper = function(childContainerId) {
var height = 0;
$('#' + childContainerId).children().each(function() {
if($(this).hasClass("treenode")) {
height += $(this).height();
var subContainer = window.document.getElementById(this.id + '_children');
if(subContainer && $ax.visibility.IsVisible(subContainer)) {
height += _getChildContainerHeightHelper(subContainer.id);
}
}
});
return height;
};
$ax.tree.InitializeTreeNode = function(nodeId, plusminusid, childContainerId, selectText) {
var childContainer = window.document.getElementById(childContainerId);
if(childContainer) {
//relying on the html generator to put this inline so we know to collapse by default
var isCollapsed = childContainer.style.visibility == "hidden";
if(isCollapsed) $ax.visibility.SetVisible(childContainer, false);
if(!isCollapsed && plusminusid != '') $ax.style.SetWidgetSelected(plusminusid, true);
}
if(plusminusid != '') {
$jobj(plusminusid).click(function() {
var visibleSet = $ax.visibility.IsIdVisible(childContainerId);
if(visibleSet) $ax.tree.CollapseNode(nodeId, childContainerId, plusminusid);
else $ax.tree.ExpandNode(nodeId, childContainerId, plusminusid);
$ax.tree.SelectTreeNode(nodeId, true);
return false;
}).css('cursor', 'default');
}
};
var _getButtonShapeId = function(id) {
var obj = $obj(id);
return $ax.public.fn.IsTreeNodeObject(obj.type) ? $ax.getElementIdFromPath([obj.buttonShapeId], { relativeTo: id }) : id;
};
$ax.tree.SelectTreeNode = function(id, selected) {
$ax.style.SetWidgetSelected(_getButtonShapeId(id), selected);
};
});

View File

@@ -0,0 +1,99 @@
// ******* Deep Copy ******** //
$axure.internal(function($ax) {
// TODO: [ben] Ah, infinite loops cause major issues here. Tried saving objects we've already hit, but that didn't seem to work (at least at my first shot).
// TODO: [ben] To continue from above, added a filter to filter out problem keys. Will need a better way of sorting this out eventually.
var _deepCopy = function (original, trackCopies, filter) {
if(trackCopies) {
var index = _getCopyIndex(original);
if(index != -1) return _originalToCopy[index][1];
}
var isArray = original instanceof Array;
var isObject = !(original instanceof Function) && !(original instanceof Date) && (original instanceof Object);
if(!isArray && !isObject) return original;
var copy = isArray ? [] : { };
if(trackCopies) _originalToCopy.push([original, copy]);
isArray ? deepCopyArray(original, trackCopies, copy, filter) : deepCopyObject(original, trackCopies, copy, filter);
return copy;
};
$ax.deepCopy = _deepCopy;
// Hacky way to copy event info. Copying dragInfo causes major issues due to infinite loops
// Hashmap doesn't map objects well. It just toStrings them, making them all the same key. This has to be slow...
var _originalToCopy = [];
var _getCopyIndex = function(original) {
for(var i = 0; i < _originalToCopy.length; i++) if(original === _originalToCopy[i][0]) return i;
return -1;
};
$ax.eventCopy = function(eventInfo) {
var copy = _deepCopy(eventInfo, true, ['dragInfo', 'elementQuery', 'obj']);
// reset the map. TODO: May need to reset elsewhere too, but this is the only way it's used currently
_originalToCopy = [];
return copy;
};
var deepCopyArray = function(original, trackCopies, copy, filter) {
for(var i = 0; i < original.length; i++) {
copy[i] = _deepCopy(original[i], trackCopies, filter);
}
};
var deepCopyObject = function(original, trackCopies, copy, filter) {
for(var key in original) {
if(!original.hasOwnProperty(key)) continue; // Continue if the prop was not put there like a dictionary, but just a native part of the object
if(filter && filter.indexOf[key] != -1) copy[key] = original[key]; // If that key is filtered out, skip recursion on it.
else copy[key] = _deepCopy(original[key], trackCopies, filter);
}
};
// Our implementation of splice because it is broken in IE8...
$ax.splice = function(array, startIndex, count) {
var retval = [];
if(startIndex >= array.length || startIndex < 0 || count == 0) return retval;
if(!count || startIndex + count > array.length) count = array.length - startIndex;
for(var i = 0; i < count; i++) retval[i] = array[startIndex + i];
for(i = startIndex + count; i < array.length; i++) array[i - count] = array[i];
for(i = 0; i < count; i++) array.pop();
return retval;
};
});
// ******* Flow Shape Links ******** //
$axure.internal(function($ax) {
$(window.document).ready(function() {
if (!$ax.document.configuration.linkFlowsToPages && !$ax.document.configuration.linkFlowsToPagesNewWindow) return;
$ax(function (dObj) { return ($ax.public.fn.IsVector(dObj.type) || $ax.public.fn.IsSnapshot(dObj.type)) && dObj.referencePageUrl; }).each(function (dObj, elementId) {
var elementIdQuery = $('#' + elementId);
if($ax.document.configuration.linkFlowsToPages && !$ax.event.HasClick(dObj)) {
elementIdQuery.css("cursor", "pointer");
elementIdQuery.click(function() {
$ax.navigate({
url: dObj.referencePageUrl,
target: "current",
includeVariables: true
});
});
}
if($ax.document.configuration.linkFlowsToPagesNewWindow) {
$('#' + elementId + "_ref").append("<div id='" + elementId + "PagePopup' class='refpageimage'></div>");
$('#' + elementId + "PagePopup").click(function() {
$ax.navigate({
url: dObj.referencePageUrl,
target: "new",
includeVariables: true
});
});
}
});
});
});

View File

@@ -0,0 +1,151 @@
// ******* GLOBAL VARIABLE PROVIDER ******** //
$axure.internal(function($ax) {
var _globalVariableValues = {};
var _globalVariableProvider = {};
$ax.globalVariableProvider = _globalVariableProvider;
var setVariableValue = function(variable, value, suppressBroadcast) {
if(!(value instanceof Object)) value = value.toString();
variable = variable.toLowerCase();
_globalVariableValues[variable] = value;
if(suppressBroadcast !== true) {
var varData = {
globalVarName: variable,
globalVarValue: value.toString()
};
$axure.messageCenter.postMessage('setGlobalVar', varData);
}
//Post global var values only if pageData is loaded (suppresses exception which occurs when page loads)
if($ax.pageData) {
_postGlobalVarVals();
}
};
_globalVariableProvider.setVariableValue = setVariableValue;
var getVariableValue = function(variable, eventInfo, ignoreDefaultsForLinkUrl) {
variable = variable.toLowerCase();
if(_globalVariableValues[variable] !== undefined) {
//If this is for the GetLinkUrl function and
//the current value of the global variable is the same as the default defined in the document, don't return it
if(ignoreDefaultsForLinkUrl == true && $ax.document.globalVariables[variable] == _globalVariableValues[variable]) {
return null;
}
return _globalVariableValues[variable];
}
if($ax.document.globalVariables[variable] !== undefined) return ignoreDefaultsForLinkUrl == true ? null : $ax.document.globalVariables[variable];
switch(variable) {
case "pagename": return $ax.pageData.page.name;
case "now": return eventInfo.now;
case "gendate": return $ax.pageData.generationDate;
case "dragx": return $ax.drag.GetDragX();
case "dragy": return $ax.drag.GetDragY();
case "totaldragx": return $ax.drag.GetTotalDragX();
case "totaldragy": return $ax.drag.GetTotalDragY();
case "dragtime": return $ax.drag.GetDragTime();
case "math": return Math;
case "date": return Date;
case "window": return eventInfo && eventInfo.window;
case "this": return eventInfo && eventInfo.thiswidget && $ax.getWidgetInfo(eventInfo.thiswidget.elementId);
case "item": return (eventInfo && eventInfo.item && eventInfo.item.valid && eventInfo.item) || getVariableValue('targetitem', eventInfo, ignoreDefaultsForLinkUrl);
case "targetitem": return eventInfo && eventInfo.targetElement && $ax.getItemInfo(eventInfo.targetElement);
case "repeater": return eventInfo && eventInfo.repeater;
case "target": return eventInfo && eventInfo.targetElement && $ax.getWidgetInfo(eventInfo.targetElement);
case "cursor": return eventInfo && eventInfo.cursor;
default:
var gen = variable.substr(0, 3) == "gen";
var date = gen ? $ax.pageData.generationDate : new Date();
var prop = gen ? variable.substr(3) : variable;
switch(prop) {
case "day": return date.getDate();
case "month": return date.getMonth() + 1;
case "monthname": return $ax.getMonthName(date.getMonth());
case "dayofweek": return $ax.getDayOfWeek(date.getDay());
case "year": return date.getFullYear();
case "time": return date.toLocaleTimeString();
case "hours": return date.getHours();
case "minutes": return date.getMinutes();
case "seconds": return date.getSeconds();
default: return '';
}
}
};
_globalVariableProvider.getVariableValue = getVariableValue;
var load = function() {
var csum = false;
var query = (window.location.href.split("#")[1] || ''); //hash.substring(1); Firefox decodes this so & in variables breaks
if(query.length > 0) {
var vars = query.split("&");
for(var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
var varName = pair[0];
var varValue = pair[1];
if(varName) {
if(varName == 'CSUM') {
csum = true;
} else setVariableValue(varName, decodeURIComponent(varValue), true);
}
}
if(!csum && query.length > 250) {
window.alert('Axure Warning: The variable values were too long to pass to this page.\n\nIf you are using IE, using Chrome or Firefox will support more data.');
}
}
};
var getLinkUrl = function(baseUrl) {
var toAdd = '';
var definedVariables = _getDefinedVariables();
for(var i = 0; i < definedVariables.length; i++) {
var key = definedVariables[i];
var val = getVariableValue(key, undefined, true);
if(val != null) {
if(toAdd.length > 0) toAdd += '&';
toAdd += key + '=' + encodeURIComponent(val);
}
}
return toAdd.length > 0 ? baseUrl + ($axure.shouldSendVarsToServer() ? '?' : '#') + toAdd + "&CSUM=1" : baseUrl;
};
_globalVariableProvider.getLinkUrl = getLinkUrl;
var _getDefinedVariables = function() {
return $ax.pageData.variables;
};
_globalVariableProvider.getDefinedVariables = _getDefinedVariables;
var _postGlobalVarVals = function() {
var retVal = {};
var definedVariables = _getDefinedVariables();
for(var i = 0; i < definedVariables.length; i++) {
var key = definedVariables[i];
var val = getVariableValue(key);
if(val != null) {
retVal[key] = val;
}
}
$ax.messageCenter.postMessage('globalVariableValues', retVal);
};
$ax.messageCenter.addMessageListener(function(message, data) {
if(message == 'getGlobalVariables') {
_postGlobalVarVals();
} else if(message == 'resetGlobalVariables') {
_globalVariableValues = {};
_postGlobalVarVals();
}
});
load();
});

View File

@@ -0,0 +1,209 @@
// ******* SITEMAP TOOLBAR VIEWER ACTIONS ******** //
$axure.internal(function ($ax) {
var userTriggeredEventNames = ['onClick', 'onDoubleClick', 'onMouseOver', 'onMouseMove', 'onMouseOut', 'onMouseDown', 'onMouseUp',
'onKeyDown', 'onKeyUp', 'onFocus', 'onLostFocus', 'onTextChange', 'onSelectionChange', 'onSelectedChange', 'onSelect', 'onUnselect',
'onSwipeLeft', 'onSwipeRight', 'onSwipeUp', 'onSwipeDown', 'onDragStart', 'onDrag', 'onDragDrop', 'onScroll', 'onContextMenu', 'onMouseHover', 'onLongClick'];
//var _toggleSelectWidgetNoteForRepeater = function (repeaterId, scriptId, select) {
// var itemIds = $ax.getItemIdsForRepeater(repeaterId);
// for(var i = 0; i < itemIds.length; i++) {
// var itemId = itemIds[i];
// var elementId = $ax.repeater.createElementId(scriptId, itemId);
// if(select) $('#' + elementId).addClass('widgetNoteSelected');
// else $('#' + elementId).removeClass('widgetNoteSelected');
// }
//}
$ax.messageCenter.addMessageListener(function (message, data) {
//If annotation toggle message received from sitemap, toggle footnotes
if(message == 'toggleSelectWidgetNote') {
if (!IOS) {
$('.widgetNoteSelected').removeClass('widgetNoteSelected');
}
if(!data.value) return;
//if(lastSelectedWidgetNote == data.id) {
// lastSelectedWidgetNote = null;
// return;
//}
$ax('*').each(function(obj, elementId) {
if (obj.id == data.id) {
if (!IOS) {
$('#' + elementId).addClass('widgetNoteSelected');
}
_scrollToSelectedNote($('#' + elementId), data.view);
}
});
}
});
var _scrollToSelectedNote = function ($elmt, view) {
var isLandscape = IOS ? window.orientation != 0 && window.orientation != 180 : false;
var winWidth = !IOS ? $(window).width() : (isLandscape ? window.screen.height : window.screen.width) - view.panelWidthOffset;
var winHeight = !IOS ? $(window).height() : view.height;
var docLeft = $('html').last().scrollLeft();
var docTop = $('html').last().scrollTop();
var docRight = docLeft + winWidth;
var docBottom = docTop + winHeight;
var scale = $('#base').css('transform');;
scale = (scale == "none") ? 1 : Number(scale.substring(scale.indexOf('(') + 1, scale.indexOf(',')));
var bodyLeft = ($('body').css('left') !== undefined && $('body').css('left') !== "auto") ? Number($('body').css('left').replace('px','')) : 0;
var top = scale * Number($elmt.css('top').replace('px', ''));
var bottom = top + scale * $elmt.height();
var left = scale * Number($elmt.css('left').replace('px', '')) + bodyLeft;
var right = left + scale * $elmt.width();
var doHorizontalMove = left < docLeft || right > docRight;
var doVerticalMove = top < docTop || bottom > docBottom;
var padding = scale * 50;
var newScrollLeft = 0
if (left < docLeft) {
newScrollLeft = left - padding;
} else if (right > docRight) {
newScrollLeft = right + padding - winWidth;
}
var newScrollTop = 0
if (top < docTop) {
newScrollTop = top - padding;
} else if (bottom > docBottom) {
newScrollTop = bottom + padding - winHeight;
}
// Device Frame or Scale to width or Scale to fit (situations where there is no horizontal scroll)
if (view.h || view.scaleVal == 1 || view.scaleVal == 2) {
doHorizontalMove = false;
}
// Has Device Frame or Scale to Width and widget with note is outside of viewable panel right bounds
if ((view.scaleVal == 1 || view.h) && (left > docRight)) {
doVerticalMove = false;
}
// TODO: need to do something for dynamic panel with scroll
if (doHorizontalMove && doVerticalMove) {
$("html, body").animate({ scrollLeft: newScrollLeft, scrollTop: newScrollTop }, 300);
} else if (doHorizontalMove) {
$("html, body").animate({ scrollLeft: newScrollLeft }, 300);
} else if (doVerticalMove) {
$("html, body").animate({ scrollTop: newScrollTop }, 300);
}
}
var highlightEnabled = false;
$ax.messageCenter.addMessageListener(function(message, data) {
if(message == 'highlightInteractive') {
highlightEnabled = data == true;
_applyHighlight($ax('*'));
}
});
var _applyHighlight = $ax.applyHighlight = function(query, ignoreUnset) {
if(ignoreUnset && !highlightEnabled) return;
var pulsateClassName = 'legacyPulsateBorder';
//Determine if the widget has a defined userTriggeredEventName specified in the array above
var _isInteractive = function(diagramObject) {
if(diagramObject && diagramObject.interactionMap) {
for(var index in userTriggeredEventNames) {
if(diagramObject.interactionMap[userTriggeredEventNames[index]]) return true;
}
}
return false;
};
//Traverse through parent layers (if any) of an element and see if any have a defined userTriggeredEventName
var _findMatchInParent = function(id) {
var parents = $ax('#' + id).getParents(true, ['layer'])[0];
for(var i in parents) {
var parentId = parents[i];
var parentObj = $ax.getObjectFromScriptId(parentId);
if(_isInteractive(parentObj)) return true;
}
return false;
};
//Find all widgets with a defined userTriggeredEventName specified in the array above
var $matchingElements = query.filter(function (obj, id) {
//This prevents the top left corner of the page from highlighting with everything else
if($ax.public.fn.IsLayer(obj.type)) return false;
if(_isInteractive(obj)) return true;
else if($ax.public.fn.IsVector(obj.type) && obj.referencePageUrl) return true;
//Last check on the object's parent layer(s), if a layer has a defined userTriggeredEventName
//then we shall highlight each member of that layer TODO This is a design decision and is subject to change
return _findMatchInParent(id);
}).$();
var isHighlighted = $matchingElements.is('.' + pulsateClassName);
//Toggle the pulsate class on the matched elements
if(highlightEnabled && !isHighlighted) {
$matchingElements.addClass(pulsateClassName);
} else if(!highlightEnabled && isHighlighted) {
$matchingElements.removeClass(pulsateClassName);
}
};
$axure.getIdAndRectAtLoc = function (data) {
var element = document.elementFromPoint(data.x, data.y);
if (!element) return undefined;
var jObj = _getElementIdFromTarget(element);
if (jObj.length > 0) {
var id = jObj.attr('id');
var axObj = $ax('#' + id);
var rect = axObj.pageBoundingRect();
return { 'id': id, 'rect': rect };
}
return undefined;
}
$axure.getIdRectAndStyleAtLoc = function(data) {
var element = document.elementFromPoint(data.x, data.y);
if (!element) return undefined;
var jObj = _getElementIdFromTarget(element);
if (jObj.length > 0) {
var id = jObj.attr('id');
return $axure.getRectAndStyleById(id);
}
return undefined;
}
$axure.getRectAndStyleById = function (id) {
var axObj = $ax('#' + id);
var rect = axObj.pageBoundingRect();
var style = $ax.style.computeFullStyle(id, $ax.style.generateState(id), $ax.adaptive.currentViewId);
style.text = axObj.text();
return { 'id': id, 'rect': rect, 'style': style };
}
$axure.isIdVisible = function (id) {
return id ? $ax.visibility.IsIdVisible(id) : false;
}
var _getElementIdFromTarget = function (target) {
var targetId = target.id;
var jTarget = $(target);
while((!targetId || targetId.indexOf('cache') > -1) && jTarget[0].tagName != 'HTML') {
jTarget = jTarget.parent();
targetId = jTarget.attr('id');
}
if(targetId && targetId != 'base') {
var sections = targetId.split('_');
return $('#' + sections[0]);
}
return '';
}
});