You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1834 lines
83 KiB

3 years ago
  1. // ******* AxQuery Plugins ******** //
  2. $axure.internal(function($ax) {
  3. $ax.constants = {};
  4. $ax.constants.TABLE_TYPE = 'table';
  5. $ax.constants.MENU_OBJECT_TYPE = 'menuObject';
  6. $ax.constants.MASTER_TYPE = 'master';
  7. $ax.constants.PAGE_TYPE = 'page';
  8. $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE = 'referenceDiagramObject';
  9. $ax.constants.REPEATER_TYPE = 'repeater';
  10. $ax.constants.DYNAMIC_PANEL_TYPE = 'dynamicPanel';
  11. $ax.constants.LAYER_TYPE = 'layer';
  12. $ax.constants.TEXT_BOX_TYPE = 'textBox';
  13. $ax.constants.TEXT_AREA_TYPE = 'textArea';
  14. $ax.constants.LIST_BOX_TYPE = 'listBox';
  15. $ax.constants.COMBO_BOX_TYPE = 'comboBox';
  16. $ax.constants.CHECK_BOX_TYPE = 'checkbox';
  17. $ax.constants.RADIO_BUTTON_TYPE = 'radioButton';
  18. $ax.constants.BUTTON_TYPE = 'button'; //html button
  19. $ax.constants.IMAGE_MAP_REGION_TYPE = 'imageMapRegion';
  20. $ax.constants.IMAGE_BOX_TYPE = 'imageBox';
  21. $ax.constants.VECTOR_SHAPE_TYPE = 'vectorShape';
  22. $ax.constants.SNAPSHOT_TYPE = 'screenshot';
  23. $ax.constants.TREE_NODE_OBJECT_TYPE = 'treeNodeObject';
  24. $ax.constants.TABLE_CELL_TYPE = 'tableCell';
  25. $ax.constants.VERTICAL_LINE_TYPE = 'verticalLine';
  26. $ax.constants.HORIZONTAL_LINE_TYPE = 'horizontalLine';
  27. $ax.constants.INLINE_FRAME_TYPE = 'inlineFrame';
  28. $ax.constants.CONNECTOR_TYPE = 'connector';
  29. $ax.constants.ALL_TYPE = '*';
  30. $ax.constants.TEXT_TYPE = 'richTextPanel';
  31. $ax.constants.LINK_TYPE = 'hyperlink';
  32. // TODO: Need solid passo f this. Constants should be able to bemade local, may need some public lists or something.
  33. // public.fn function should take not arg and use this. May need some $ax.IsType fuctions that will take a type arg and be static
  34. $ax.public.fn.IsTable = function (type) { return type == $ax.constants.TABLE_TYPE; }
  35. $ax.public.fn.IsMenuObject = function (type) { return type == $ax.constants.MENU_OBJECT_TYPE; }
  36. $ax.public.fn.IsMaster = function (type) { return type == $ax.constants.MASTER_TYPE; }
  37. $ax.public.fn.IsPage = function (type) { return type == $ax.constants.PAGE_TYPE; }
  38. $ax.public.fn.IsReferenceDiagramObject = function (type) { return type == $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE; }
  39. $ax.public.fn.IsRepeater = function (type) { return type == $ax.constants.REPEATER_TYPE; }
  40. $ax.public.fn.IsDynamicPanel = $ax.IsDynamicPanel = function (type) { return type == $ax.constants.DYNAMIC_PANEL_TYPE; }
  41. $ax.public.fn.IsLayer = $ax.IsLayer = function (type) { return type == $ax.constants.LAYER_TYPE; }
  42. $ax.public.fn.IsTextBox = function (type) { return type == $ax.constants.TEXT_BOX_TYPE; }
  43. $ax.public.fn.IsTextArea = function (type) { return type == $ax.constants.TEXT_AREA_TYPE; }
  44. $ax.public.fn.IsListBox = function (type) { return type == $ax.constants.LIST_BOX_TYPE; }
  45. $ax.public.fn.IsComboBox = function (type) { return type == $ax.constants.COMBO_BOX_TYPE; }
  46. $ax.public.fn.IsCheckBox = function (type) { return type == $ax.constants.CHECK_BOX_TYPE; }
  47. $ax.public.fn.IsRadioButton = function (type) { return type == $ax.constants.RADIO_BUTTON_TYPE; }
  48. $ax.public.fn.IsButton = function (type) { return type == $ax.constants.BUTTON_TYPE; }
  49. $ax.public.fn.IsIamgeMapRegion = function (type) { return type == $ax.constants.IMAGE_MAP_REGION_TYPE; }
  50. $ax.public.fn.IsImageBox = function (type) { return type == $ax.constants.IMAGE_BOX_TYPE; }
  51. $ax.public.fn.IsVector = function (type) { return type == $ax.constants.VECTOR_SHAPE_TYPE; }
  52. $ax.public.fn.IsSnapshot = function (type) { return type == $ax.constants.SNAPSHOT_TYPE; }
  53. $ax.public.fn.IsTreeNodeObject = function (type) { return type == $ax.constants.TREE_NODE_OBJECT_TYPE; }
  54. $ax.public.fn.IsTableCell = function (type) { return type == $ax.constants.TABLE_CELL_TYPE; }
  55. $ax.public.fn.IsInlineFrame = function (type) { return type == $ax.constants.INLINE_FRAME_TYPE; }
  56. $ax.public.fn.IsConnector = function (type) { return type == $ax.constants.CONNECTOR_TYPE; }
  57. $ax.public.fn.IsContainer = function (type) { return type== $ax.constants.VECTOR_SHAPE_TYPE || type == $ax.constants.TABLE_TYPE || type == $ax.constants.MENU_OBJECT_TYPE || type == $ax.constants.TREE_NODE_OBJECT_TYPE; }
  58. var PLAIN_TEXT_TYPES = [$ax.constants.TEXT_BOX_TYPE, $ax.constants.TEXT_AREA_TYPE, $ax.constants.LIST_BOX_TYPE,
  59. $ax.constants.COMBO_BOX_TYPE, $ax.constants.CHECK_BOX_TYPE, $ax.constants.RADIO_BUTTON_TYPE, $ax.constants.BUTTON_TYPE];
  60. $ax.public.fn.IsResizable = function (type) { return $.inArray(type, RESIZABLE_TYPES) !== -1; }
  61. var RESIZABLE_TYPES = [
  62. $ax.constants.BUTTON_TYPE, $ax.constants.DYNAMIC_PANEL_TYPE, $ax.constants.IMAGE_BOX_TYPE, $ax.constants.IMAGE_MAP_REGION_TYPE,
  63. $ax.constants.INLINE_FRAME_TYPE, $ax.constants.LAYER_TYPE, $ax.constants.LIST_BOX_TYPE, $ax.constants.COMBO_BOX_TYPE,
  64. $ax.constants.VECTOR_SHAPE_TYPE, $ax.constants.TEXT_AREA_TYPE, $ax.constants.TEXT_BOX_TYPE, $ax.constants.SNAPSHOT_TYPE
  65. ];
  66. $ax.public.fn.IsSelectionButton = function(type) {
  67. return type == $ax.constants.RADIO_BUTTON_TYPE || type == $ax.constants.CHECK_BOX_TYPE;
  68. };
  69. $ax.public.fn.SupportsRichText = function() {
  70. var obj = $obj(this.getElementIds()[0]);
  71. // Catch root tree nodes as they are not supported.
  72. if(obj.type == $ax.constants.TREE_NODE_OBJECT_TYPE) return obj.friendlyType == 'Tree Node';
  73. // Do the same for tree node icons maybe?
  74. return $.inArray(obj.type, SUPPORTS_RICH_TEXT_TYPES) != -1;
  75. }
  76. var SUPPORTS_RICH_TEXT_TYPES = [$ax.constants.CHECK_BOX_TYPE, $ax.constants.RADIO_BUTTON_TYPE,
  77. $ax.constants.IMAGE_BOX_TYPE, $ax.constants.VECTOR_SHAPE_TYPE, $ax.constants.TABLE_CELL_TYPE, $ax.constants.CONNECTOR_TYPE];
  78. var _addJQueryFunction = function(name) {
  79. $ax.public.fn[name] = function() {
  80. var val = $.fn[name].apply(this.jQuery(), arguments);
  81. return arguments[0] ? this : val;
  82. };
  83. };
  84. var _jQueryFunctionsToAdd = ['text', 'val', 'css'];
  85. for (var jqueryFunctionIndex = 0; jqueryFunctionIndex < _jQueryFunctionsToAdd.length; jqueryFunctionIndex++) _addJQueryFunction(_jQueryFunctionsToAdd[jqueryFunctionIndex]);
  86. // var _addJQueryEventFunction = function(name) {
  87. // $ax.public.fn[name] = function() {
  88. // $.fn[name].apply(this.jQuery(), arguments);
  89. // return this;
  90. // };
  91. // };
  92. // var _addJQueryEventFunction = function(name) {
  93. // $ax.public.fn[name] = (function(nn) {
  94. // return function() {
  95. // $.fn[nn].apply(this.jQuery(), arguments);
  96. // return this;
  97. // };
  98. // })(name);
  99. // };
  100. var _addJQueryEventFunction = function(name) {
  101. $ax.public.fn[name] = function() {
  102. //With Martin - No idea why this is necessary. We tried encapsulating the function thinking it was related to closure (above),
  103. //but that didn't fix the problem. If we don't add this Repeaters will give "Uncaught TypeError: Object #<Object> has no method 'apply'"
  104. //here (but Indeterminately, often on larger/slower Repeaters) because it is Undefined. However it seems the catch is never hit
  105. //if we surround the statement with the try/catch. Perhaps the try/catch block creates a scope or closure.
  106. try {
  107. $.fn[name].apply(this.jQuery(), arguments);
  108. } catch(e) {
  109. console.log("Couldn't find the event: " + name);
  110. }
  111. return this;
  112. };
  113. };
  114. var _jQueryEventFunctionsToAdd = ['click', 'mouseenter', 'mouseleave', 'bind'];
  115. for(var jqueryEventIndex = 0; jqueryEventIndex < _jQueryEventFunctionsToAdd.length; jqueryEventIndex++) _addJQueryEventFunction(_jQueryEventFunctionsToAdd[jqueryEventIndex]);
  116. $ax.public.fn.openLink = function(url, includeVariables) {
  117. this.jQuery().each(function() {
  118. if(!($(this).is('iframe'))) {
  119. return;
  120. }
  121. var objIframe = $(this).get(0);
  122. $ax.navigate({
  123. url: url,
  124. target: "frame",
  125. includeVariables: includeVariables,
  126. frame: objIframe
  127. });
  128. });
  129. return this;
  130. };
  131. $ax.public.fn.SetPanelState = function(stateNumber, options, showWhenSet) {
  132. var animateInInfo = _getAnimateInfo(options && options.animateIn, 500);
  133. var animateOutInfo = _getAnimateInfo(options && options.animateOut, 500);
  134. var elementIds = this.getElementIds();
  135. for(var index = 0; index < elementIds.length; index++) {
  136. var elementId = elementIds[index];
  137. if ($ax.public.fn.IsDynamicPanel($ax.getTypeFromElementId(elementId))) {
  138. var stateName = $ax.visibility.GetPanelStateId(elementId, Number(stateNumber) - 1);
  139. var wasVisible = $ax.visibility.IsIdVisible(elementId);
  140. // If compressing because you are fit to content and the change of state may change size, must be before the change.
  141. if(options.compress && $ax.dynamicPanelManager.isIdFitToContent(elementId) && wasVisible) {
  142. $ax.dynamicPanelManager.compressDelta(elementId, $ax.visibility.GetPanelState(elementId), stateName, options.vertical, options.compressEasing, options.compressDuration);
  143. }
  144. $ax.visibility.SetPanelState(elementId, stateName, animateOutInfo.easingType, animateOutInfo.direction, animateOutInfo.duration,
  145. animateInInfo.easingType, animateInInfo.direction, animateInInfo.duration, showWhenSet);
  146. // If compressing because of a show, must be after state is set.
  147. if(options.compress && !wasVisible && showWhenSet) {
  148. $ax.dynamicPanelManager.compressToggle(elementId, options.vertical, true, options.compressEasing, options.compressDuration);
  149. }
  150. }
  151. }
  152. return this;
  153. };
  154. $ax.public.fn.show = function(options, eventInfo) {
  155. var elementIds = this.getElementIds();
  156. for(var index = 0; index < elementIds.length; index++) {
  157. var elementId = elementIds[index];
  158. var lightboxId = $ax.repeater.applySuffixToElementId(elementId, '_lightbox');
  159. var lightbox = $jobj(lightboxId);
  160. if(options && options.showType == 'lightbox') {
  161. $ax.flyoutManager.unregisterPanel(elementId, true);
  162. // Add lightbox if there isn't one
  163. if(lightbox.length == 0) {
  164. lightbox = $('<div></div>');
  165. lightbox.attr('id', lightboxId);
  166. var color = 'rgb(' + options.lightbox.r + ',' + options.lightbox.g + ',' + options.lightbox.b + ')';
  167. lightbox.css({
  168. position: 'fixed',
  169. left: '0px',
  170. top: '0px',
  171. width: '10000px',
  172. height: '10000px',
  173. 'background-color': color,
  174. opacity: options.lightbox.a / 255
  175. });
  176. var parents = $ax('#' + elementId).getParents(true, ['dynamicPanel'])[0];
  177. var fixedParentPanelId = undefined;
  178. for(var j = 0; j < parents.length; j++) {
  179. var parentId = parents[j];
  180. if($jobj(parentId).css('z-index') != 'auto' || $ax.features.supports.mobile) {
  181. fixedParentPanelId = parents[j];
  182. break;
  183. }
  184. }
  185. if(!fixedParentPanelId) $('#base').append(lightbox);
  186. else $jobj(fixedParentPanelId).append(lightbox);
  187. var wasVisible = $ax.visibility.IsIdVisible(elementId);
  188. (function(lightbox, query) {
  189. $ax.event.attachClick(lightbox, function() {
  190. $ax.action.addAnimation(elementId, $ax.action.queueTypes.fade, function() {
  191. if(!wasVisible) query.hide();
  192. else $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.fade);
  193. lightbox.remove();
  194. });
  195. });
  196. })(lightbox, this);
  197. }
  198. $ax.legacy.BringToFront(lightboxId, true);
  199. $ax.legacy.BringToFront(elementId, true);
  200. } else if(options && options.showType == 'flyout') {
  201. // Remove lightbox if there is one
  202. lightbox.remove();
  203. var src = eventInfo.thiswidget;
  204. var target = $ax.getWidgetInfo(elementId);
  205. var rects = {};
  206. if(src.valid) rects.src = $ax.geometry.genRect(src, true);
  207. if(target.valid) rects.target = $ax.geometry.genRect(target, true);
  208. $ax.flyoutManager.registerFlyout(rects, elementId, eventInfo.srcElement);
  209. //$ax.style.AddRolloverOverride(elementId);
  210. $ax.legacy.BringToFront(elementId);
  211. } else {
  212. // Remove lightbox, unregister flyout
  213. lightbox.remove();
  214. $ax.flyoutManager.unregisterPanel(elementId, true);
  215. }
  216. _setVisibility(elementId, true, options);
  217. }
  218. return this;
  219. };
  220. var _getAnimateInfo = function (options, defaultDuration, useHide) {
  221. var durationOption, easingOption, animationOption;
  222. if(options) {
  223. if (useHide) {
  224. durationOption = options.durationHide;
  225. easingOption = options.easingHide;
  226. animationOption = options.animationHide;
  227. } else {
  228. durationOption = options.duration;
  229. easingOption = options.easing;
  230. animationOption = options.animation;
  231. }
  232. if (animationOption == 'none') animationOption = 'swing';
  233. } else {
  234. durationOption = defaultDuration;
  235. easingOption = 'none',
  236. animationOption = 'swing';
  237. }
  238. var animateInfo = { duration: durationOption };
  239. switch (easingOption) {
  240. case 'fade':
  241. animateInfo.easingType = 'fade';
  242. animateInfo.direction = '';
  243. break;
  244. case 'slideLeft':
  245. animateInfo.easingType = animationOption;
  246. animateInfo.direction = 'left';
  247. break;
  248. case 'slideRight':
  249. animateInfo.easingType = animationOption;
  250. animateInfo.direction = 'right';
  251. break;
  252. case 'slideUp':
  253. animateInfo.easingType = animationOption;
  254. animateInfo.direction = 'up';
  255. break;
  256. case 'slideDown':
  257. animateInfo.easingType = animationOption;
  258. animateInfo.direction = 'down';
  259. break;
  260. case 'flipLeft':
  261. animateInfo.easingType = 'flip';
  262. animateInfo.direction = 'left';
  263. break;
  264. case 'flipRight':
  265. animateInfo.easingType = 'flip';
  266. animateInfo.direction = 'right';
  267. break;
  268. case 'flipUp':
  269. animateInfo.easingType = 'flip';
  270. animateInfo.direction = 'up';
  271. break;
  272. case 'flipDown':
  273. animateInfo.easingType = 'flip';
  274. animateInfo.direction = 'down';
  275. break;
  276. default:
  277. animateInfo.easingType = 'none';
  278. animateInfo.direction = '';
  279. }
  280. return animateInfo;
  281. };
  282. $ax.public.fn.hide = function(options) {
  283. var elementIds = this.getElementIds();
  284. for(var index = 0; index < elementIds.length; index++) {
  285. var elementId = elementIds[index];
  286. // var wasShown = $ax.visibility.IsIdVisible(elementId);
  287. _setVisibility(elementId, false, options, true);
  288. }
  289. return this;
  290. };
  291. $ax.public.fn.toggleVisibility = function(options) {
  292. var elementIds = this.getElementIds();
  293. for (var index = 0; index < elementIds.length; index++) {
  294. var elementId = elementIds[index];
  295. var show = !$ax.visibility.IsIdVisible(elementId);
  296. _setVisibility(elementId, show, options, !show);
  297. }
  298. return this;
  299. };
  300. var _setVisibility = function (elementId, value, options, useHide) {
  301. var animateInfo = _getAnimateInfo(options, 0, useHide);
  302. var wasShown = $ax.visibility.IsIdVisible(elementId);
  303. var compress = options && options.showType == 'compress' && wasShown != value;
  304. if (compress) $ax.dynamicPanelManager.compressToggle(elementId, options.vertical, value, options.compressEasing, options.compressDuration);
  305. var onComplete = function () {
  306. $ax.dynamicPanelManager.fitParentPanel(elementId);
  307. };
  308. $ax.visibility.SetWidgetVisibility(elementId, {
  309. value: value,
  310. easing: animateInfo.easingType,
  311. direction: animateInfo.direction,
  312. duration: animateInfo.duration,
  313. animation: animateInfo.animation,
  314. fire: true,
  315. onComplete: onComplete
  316. });
  317. if(options && options.bringToFront) $ax.legacy.BringToFront(elementId);
  318. };
  319. $ax.public.fn.setOpacity = function(opacity, easing, duration) {
  320. if(!easing || ! duration) {
  321. easing = 'none';
  322. duration = 0;
  323. }
  324. var elementIds = this.getElementIds();
  325. for(var index = 0; index < elementIds.length; index++) {
  326. var elementId = elementIds[index];
  327. var onComplete = function() {
  328. $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.fade);
  329. };
  330. var query = $jobj(elementId);
  331. if(duration == 0 || easing == 'none') {
  332. query.css('opacity', opacity);
  333. onComplete();
  334. } else query.animate({ opacity: opacity }, { duration: duration, easing: easing, queue: false, complete: onComplete });
  335. }
  336. }
  337. //move one widget. I didn't combine moveto and moveby, since this is in .public, and separate them maybe more clear for the user
  338. var _move = function (elementId, x, y, options, moveTo) {
  339. if(!options.easing) options.easing = 'none';
  340. if(!options.duration) options.duration = 500;
  341. var obj = $obj(elementId);
  342. // Layer move using container now.
  343. if($ax.public.fn.IsLayer(obj.type)) {
  344. $ax.move.MoveWidget(elementId, x, y, options, moveTo,
  345. function () {
  346. if(options.onComplete) options.onComplete();
  347. $ax.dynamicPanelManager.fitParentPanel(elementId);
  348. }, false);
  349. } else {
  350. var xDelta = x;
  351. var yDelta = y;
  352. if (moveTo) {
  353. var jobj = $jobj(elementId);
  354. var left = $ax.getNumFromPx(jobj.css('left'));
  355. var top = $ax.getNumFromPx(jobj.css('top'));
  356. xDelta = x - left;
  357. yDelta = y - top;
  358. }
  359. $ax.move.MoveWidget(elementId, xDelta, yDelta, options, false,
  360. function () { $ax.dynamicPanelManager.fitParentPanel(elementId); }, true);
  361. }
  362. };
  363. $ax.public.fn.moveTo = function (x, y, options) {
  364. var elementIds = this.getElementIds();
  365. for(var index = 0; index < elementIds.length; index++) {
  366. _move(elementIds[index], x, y, options, true);
  367. }
  368. return this;
  369. };
  370. $ax.public.fn.moveBy = function (x, y, options) {
  371. var elementIds = this.getElementIds();
  372. if(x == 0 && y == 0) {
  373. for(var i = 0; i < elementIds.length; i++) {
  374. var elementId = elementIds[i];
  375. $ax.move.nopMove(elementId, options);
  376. //$ax.event.raiseSyntheticEvent(elementId, "onMove");
  377. $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.move);
  378. //if($axure.fn.IsLayer($obj(elementId).type)) {
  379. // var childrenIds = $ax.public.fn.getLayerChildrenDeep(elementId, true);
  380. // for(var j = 0; j < childrenIds.length; j++) $ax.event.raiseSyntheticEvent(childrenIds[j], 'onMove');
  381. //}
  382. }
  383. return this;
  384. }
  385. for(var index = 0; index < elementIds.length; index++) {
  386. _move(elementIds[index], x, y, options, false);
  387. }
  388. return this;
  389. };
  390. $ax.public.fn.circularMoveAndRotate = function(degreeChange, options, centerPointLeft, centerPointTop, doRotation, moveDelta, resizeOffset, rotatableMove, moveComplete) {
  391. if(!rotatableMove) rotatableMove = { x: 0, y: 0 };
  392. var elementIds = this.getElementIds();
  393. for(var index = 0; index < elementIds.length; index++) {
  394. var elementId = elementIds[index];
  395. var onComplete = function () {
  396. $ax.dynamicPanelManager.fitParentPanel(elementId);
  397. if (moveComplete) moveComplete();
  398. }
  399. $ax.move.circularMove(elementId, degreeChange, { x: centerPointLeft, y: centerPointTop }, moveDelta, rotatableMove, resizeOffset, options, true, onComplete, doRotation);
  400. if(doRotation) $ax.move.rotate(elementId, degreeChange, options.easing, options.duration, false, true, function () { $ax.dynamicPanelManager.fitParentPanel(elementId); });
  401. else $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.rotate);
  402. }
  403. };
  404. $ax.public.fn.rotate = function (degree, easing, duration, to, axShouldFire) {
  405. var elementIds = this.getElementIds();
  406. // this function will no longer handle compound vectors.
  407. for(var index = 0; index < elementIds.length; index++) {
  408. var elementId = elementIds[index];
  409. degree = parseFloat(degree);
  410. $ax.move.rotate(elementId, degree, easing, duration, to, axShouldFire, function () { $ax.dynamicPanelManager.fitParentPanel(elementId); });
  411. }
  412. };
  413. $ax.public.fn.resize = function(newLocationAndSizeCss, resizeInfo, axShouldFire, moves, onCompletedFunc) {
  414. var elementIds = this.getElementIds();
  415. if(!elementIds) return;
  416. var completeAndFire = function(moved, id) {
  417. if(axShouldFire) {
  418. $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.resize);
  419. if(moves) $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move);
  420. }
  421. if(onCompletedFunc) onCompletedFunc();
  422. };
  423. for(var index = 0; index < elementIds.length; index++) {
  424. var elementId = elementIds[index];
  425. var obj = $obj(elementId);
  426. if(!$ax.public.fn.IsResizable(obj.type)) {
  427. //$ax.dynamicPanelManager.fitParentPanel(elementId);
  428. completeAndFire(moves, elementId);
  429. continue;
  430. }
  431. var oldSize = $ax('#' + elementId).size();
  432. var oldWidth = oldSize.width;
  433. var oldHeight = oldSize.height;
  434. var query = $jobj(elementId);
  435. var isDynamicPanel = $ax.public.fn.IsDynamicPanel(obj.type);
  436. if(isDynamicPanel) {
  437. // No longer fitToContent, calculate additional styling that needs to be done.
  438. $ax.dynamicPanelManager.setFitToContentCss(elementId, false, oldWidth, oldHeight);
  439. if (query.css('position') == 'fixed' && ((obj.fixedHorizontal && obj.fixedHorizontal == 'center') || (obj.fixedVertical && obj.fixedVertical == 'middle'))) {
  440. moves = true;
  441. var loc = $ax.dynamicPanelManager.getFixedPosition(elementId, oldWidth, oldHeight, newLocationAndSizeCss.width, newLocationAndSizeCss.height);
  442. if(loc) {
  443. if (loc[0] != 0 && !$ax.dynamicPanelManager.isPercentWidthPanel(obj)) newLocationAndSizeCss['margin-left'] = '+=' + (Number(newLocationAndSizeCss['margin-left'].substr(2)) + loc[0]);
  444. if (loc[1] != 0) newLocationAndSizeCss['margin-top'] = '+=' + (Number(newLocationAndSizeCss['margin-top'].substr(2)) + loc[1]);
  445. }
  446. }
  447. var onComplete = function() {
  448. $ax.flyoutManager.updateFlyout(elementId);
  449. $ax.dynamicPanelManager.fitParentPanel(elementId);
  450. $ax.dynamicPanelManager.updatePanelPercentWidth(elementId);
  451. $ax.dynamicPanelManager.updatePanelContentPercentWidth(elementId);
  452. completeAndFire(moves, elementId);
  453. $ax.event.raiseSyntheticEvent(elementId, 'onResize');
  454. };
  455. } else {
  456. ////if contains text
  457. //var textChildren = query.children('div.text');
  458. //if(textChildren && textChildren.length != 0) {
  459. // var textDivId = textChildren.attr('id');
  460. // var padding = $ax.style.getPadding(textDivId);
  461. // var leftPadding = padding.paddingLeft;
  462. // var rightPadding = padding.paddingRight;
  463. // //var textObj = $ax('#' + textDivId);
  464. // //var leftPadding = textObj.left(true);
  465. // //var rightPadding = oldWidth - leftPadding - textObj.width();
  466. // //greater or equal to 1px
  467. // var newTextWidth = Math.max(newLocationAndSizeCss.width - leftPadding - rightPadding, 1);
  468. // var textChildCss = { width: newTextWidth };
  469. // var textStepFunction = function() {
  470. // //change the width of the text div may effect the height
  471. // //var currentTextHeight = Number($(textChildren.children('p')[0]).css('height').replace('px', ''));
  472. // //textChildren.css('height', currentTextHeight);
  473. // //var display = $ax.public.fn.displayHackStart(document.getElementById(textDivId));
  474. // var trap = _displayWidget(textDivId);
  475. // $ax.style.setTextAlignment([textDivId]);
  476. // trap();
  477. // //$ax.public.fn.displayHackEnd(display);
  478. // };
  479. //}
  480. //get all the other children that matters
  481. onComplete = function() {
  482. $ax.dynamicPanelManager.fitParentPanel(elementId);
  483. completeAndFire(moves, elementId);
  484. $ax.annotation.adjustIconLocation(elementId);
  485. $ax.event.raiseSyntheticEvent(elementId, 'onResize');
  486. };
  487. }
  488. var children = query.children().not('div.text');
  489. while(children && children.length && $(children[0]).attr('id').indexOf('container') != -1) {
  490. children = children.children().not('div.text');
  491. }
  492. if(children && children.length !== 0) {
  493. var childAnimationArray = [];
  494. var isConnector = $ax.public.fn.IsConnector(obj.type);
  495. children.each(function (i, child) {
  496. var childCss = {
  497. width: newLocationAndSizeCss.width,
  498. height: newLocationAndSizeCss.height
  499. };
  500. //$ax.size() use outerWidth/Height(false), which include padding and borders(no margins)
  501. var childSizingObj = $ax('#' + child.id).size();
  502. var differentSizedImage = childSizingObj.width - oldWidth != 0 || childSizingObj.height - oldHeight != 0;
  503. if ((differentSizedImage || isConnector) && child.tagName == 'IMG') {
  504. //oldwidth is zero for connectors
  505. var widthOffset = oldWidth ? (childSizingObj.width - oldWidth) * newLocationAndSizeCss.width / oldWidth : childSizingObj.width;
  506. var heightOffset = oldHeight ? (childSizingObj.height - oldHeight) * newLocationAndSizeCss.height / oldHeight : childSizingObj.height;
  507. childCss.width += widthOffset;
  508. childCss.height += heightOffset;
  509. }
  510. //there are elements like inputs, come with a padding and border, so need to use outerwidth for starting point, due to jquery 1.7 css() on width/height bugs
  511. if($(child).css('position') === 'absolute') {
  512. if(child.offsetLeft) {
  513. childSizingObj.left = child.offsetLeft;
  514. childCss.left = oldWidth ? child.offsetLeft * newLocationAndSizeCss.width / oldWidth : child.offsetLeft; //- transformedShift.x;
  515. }
  516. if(child.offsetTop) {
  517. childSizingObj.top = child.offsetTop;
  518. childCss.top = oldHeight ? child.offsetTop * newLocationAndSizeCss.height / oldHeight : child.offsetTop; //- transformedShift.y;
  519. }
  520. }
  521. childAnimationArray.push({ obj: child, sizingObj: childSizingObj, sizingCss: childCss });
  522. });
  523. }
  524. if (newLocationAndSizeCss.left || newLocationAndSizeCss.top) {
  525. //var movedLeft = newLocationAndSizeCss.left;
  526. //var movedTop = newLocationAndSizeCss.top;
  527. //$ax.visibility.setMovedLocation(elementId, movedLeft, movedTop);
  528. var movedLeft = newLocationAndSizeCss.deltaX;
  529. var movedTop = newLocationAndSizeCss.deltaY;
  530. $ax.visibility.moveMovedLocation(elementId, movedLeft, movedTop);
  531. }
  532. if (newLocationAndSizeCss.width || newLocationAndSizeCss.height) {
  533. var resizedWidth = newLocationAndSizeCss.width;
  534. var resizedHeight = newLocationAndSizeCss.height;
  535. $ax.visibility.setResizedSize(elementId, resizedWidth, resizedHeight);
  536. }
  537. if (!resizeInfo.easing || resizeInfo.easing == 'none') {
  538. if (childAnimationArray) {
  539. $(childAnimationArray).each(function (i, animationObj) {
  540. if(animationObj.resizeMatrixFunction) {
  541. $(animationObj.obj).css($ax.public.fn.setTransformHowever(animationObj.resizeMatrixFunction(animationObj.width, animationObj.height)));
  542. } else {
  543. //var sizingCss = animationObj.sizingCss;
  544. //if (sizingCss.left || sizingCss.top) {
  545. // var movedLeft = sizingCss.left;
  546. // var movedTop = sizingCss.top;
  547. // $ax.visibility.setMovedLocation(animationObj.obj.id, movedLeft, movedTop);
  548. //}
  549. //if (sizingCss.width || sizingCss.height) {
  550. // var resizedWidth = sizingCss.width;
  551. // var resizedHeight = sizingCss.height;
  552. // $ax.visibility.setResizedSize(animationObj.obj.id, resizedWidth, resizedHeight);
  553. //}
  554. $(animationObj.obj).animate(animationObj.sizingCss, { queue: false, duration: 0 });
  555. }
  556. });
  557. }
  558. //if(childCss) children.animate(childCss, 0);
  559. //if(sketchyImage && sketchyImageCss) $(sketchyImage).animate(sketchyImageCss, 0);
  560. //if(textChildCss) {
  561. // textChildren.animate(textChildCss, {
  562. // duration: 0,
  563. // step: textStepFunction
  564. // });
  565. //}
  566. query.animate(newLocationAndSizeCss, { queue: false, duration: 0, complete: onComplete });
  567. } else {
  568. if(childAnimationArray) {
  569. $(childAnimationArray).each(function (i, animationObj) {
  570. if(animationObj.resizeMatrixFunction) {
  571. $(animationObj.sizingObj).animate(animationObj.sizingCss, {
  572. queue: false,
  573. duration: resizeInfo.duration,
  574. easing: resizeInfo.easing,
  575. step: function (now) {
  576. var widthRatio = (animationObj.width - 1.0) * now + 1.0;
  577. var heightRatio = (animationObj.height - 1.0) * now + 1.0;
  578. $(animationObj.obj).css($ax.public.fn.setTransformHowever(animationObj.resizeMatrixFunction(widthRatio, heightRatio)));
  579. }
  580. });
  581. } else {
  582. $(animationObj.sizingObj).animate(animationObj.sizingCss, {
  583. queue: false,
  584. duration: resizeInfo.duration,
  585. easing: resizeInfo.easing,
  586. step: function (now, tween) {
  587. $(animationObj.obj).css(tween.prop, now);
  588. }
  589. });
  590. }
  591. });
  592. }
  593. //if(textChildCss) {
  594. // textChildren.animate(textChildCss, {
  595. // queue: false,
  596. // duration: resizeInfo.duration,
  597. // easing: resizeInfo.easing,
  598. // step: textStepFunction
  599. // });
  600. //}
  601. if(isDynamicPanel) {
  602. query.animate(newLocationAndSizeCss, { queue: false, duration: resizeInfo.duration, easing: resizeInfo.easing, complete: onComplete });
  603. } else {
  604. var locObj = {
  605. left: $ax.public.fn.GetFieldFromStyle(query, 'left'), top: $ax.public.fn.GetFieldFromStyle(query, 'top'),
  606. width: $ax.public.fn.GetFieldFromStyle(query, 'width'), height: $ax.public.fn.GetFieldFromStyle(query, 'height'),
  607. };
  608. $(locObj).animate(newLocationAndSizeCss, {
  609. queue: false,
  610. duration: resizeInfo.duration,
  611. easing: resizeInfo.easing,
  612. step: function (now, tween) {
  613. query.css(tween.prop, now);
  614. },
  615. complete: onComplete
  616. });
  617. }
  618. }
  619. }
  620. };
  621. $ax.public.fn.bringToFront = function() {
  622. var elementIds = this.getElementIds();
  623. for(var index = 0; index < elementIds.length; index++) { $ax.legacy.BringToFront(elementIds[index]); }
  624. return this;
  625. };
  626. $ax.public.fn.sendToBack = function() {
  627. var elementIds = this.getElementIds();
  628. for(var index = 0; index < elementIds.length; index++) { $ax.legacy.SendToBack(elementIds[index]); }
  629. return this;
  630. };
  631. $ax.public.fn.text = function() {
  632. if(arguments[0] == undefined) {
  633. var firstId = this.getElementIds()[0];
  634. if(!firstId) { return undefined; }
  635. return getWidgetText(firstId);
  636. } else {
  637. var elementIds = this.getElementIds();
  638. for(var index = 0; index < elementIds.length; index++) {
  639. var currentItem = elementIds[index];
  640. var widgetType = $ax.getTypeFromElementId(currentItem);
  641. if($ax.public.fn.IsTextBox(widgetType) || $ax.public.fn.IsTextArea(widgetType)) { //For non rtf
  642. SetWidgetFormText(currentItem, arguments[0]);
  643. } else {
  644. var idRtf = '#' + currentItem;
  645. if($(idRtf).length == 0) idRtf = '#u' + (Number(currentItem.substring(1)) + 1);
  646. if($(idRtf).length != 0) {
  647. //If the richtext div already has some text in it,
  648. //preserve only the first style and get rid of the rest
  649. //If no pre-existing p-span tags, don't do anything
  650. if($(idRtf).find('p').find('span').length > 0) {
  651. $(idRtf).find('p:not(:first)').remove();
  652. $(idRtf).find('p').find('span:not(:first)').remove();
  653. //Replace new-lines with NEWLINE token, then html encode the string,
  654. //finally replace NEWLINE token with linebreak
  655. var textWithLineBreaks = arguments[0].replace(/\n/g, '--NEWLINE--');
  656. var textHtml = $('<div/>').text(textWithLineBreaks).html();
  657. $(idRtf).find('span').html(textHtml.replace(/--NEWLINE--/g, '<br>'));
  658. }
  659. }
  660. }
  661. }
  662. return this;
  663. }
  664. };
  665. var getWidgetText = function(id) {
  666. var idQuery = $jobj(id);
  667. var inputQuery = $jobj($ax.INPUT(id));
  668. if(inputQuery.length) idQuery = inputQuery;
  669. if (idQuery.is('input') && ($ax.public.fn.IsCheckBox(idQuery.attr('type')) || idQuery.attr('type') == 'radio')) {
  670. idQuery = idQuery.parent().find('label').find('div');
  671. }
  672. if(idQuery.is('div')) {
  673. var $rtfObj = idQuery.hasClass('text') ? idQuery : idQuery.find('.text');
  674. if($rtfObj.length == 0) return '';
  675. var textOut = '';
  676. $rtfObj.children('p,ul,ol').each(function(index) {
  677. if(index != 0) textOut += '\n';
  678. //var htmlContent = $(this).html();
  679. //if(isSoloBr(htmlContent)) return; // It has a solo br, then it was just put in for a newline, and paragraph already added the new line.
  680. if (isSoloBr($(this).children())) return;
  681. var htmlContent = $(this).html();
  682. //Replace line breaks (set in SetWidgetRichText) with newlines and nbsp's with regular spaces.
  683. htmlContent = htmlContent.replace(/<br[^>]*>/ig, '\n').replace(/&nbsp;/ig, ' ');
  684. textOut += $(htmlContent).text();
  685. //textOut += htmlContent.replace(/<[^>]*>/g, '');
  686. });
  687. return textOut;
  688. } else {
  689. var val = idQuery.val();
  690. return val == undefined ? '' : val;
  691. }
  692. };
  693. var isSoloBr = function($html) {
  694. //html = $(html);
  695. // Html needs one and only one span
  696. var spanChildren = $html.length == 1 && $html.is('span') ? $html.children() : false;
  697. // Span children needs exactly one br and no text in the span
  698. return spanChildren && spanChildren.length == 1 && spanChildren.is('br') && spanChildren.text().trim() == '';
  699. };
  700. $ax.public.fn.setRichTextHtml = function() {
  701. if(arguments[0] == undefined) {
  702. //No getter function, so just return undefined
  703. return undefined;
  704. } else {
  705. var elementIds = this.getElementIds();
  706. for(var index = 0; index < elementIds.length; index++) {
  707. var currentItem = elementIds[index];
  708. var widgetType = $ax.getTypeFromElementId(currentItem);
  709. if ($ax.public.fn.IsTextBox(widgetType) || $ax.public.fn.IsTextArea(widgetType)) { //Do nothing for non rtf
  710. continue;
  711. } else {
  712. //TODO -- [mas] fix this!
  713. var idRtf = '#' + currentItem;
  714. if($(idRtf).length == 0) idRtf = '#u' + (parseInt(currentItem.substring(1)) + 1);
  715. if($(idRtf).length != 0) SetWidgetRichText(idRtf, arguments[0]);
  716. }
  717. }
  718. return this;
  719. }
  720. };
  721. $ax.public.fn.value = function() {
  722. if(arguments[0] == undefined) {
  723. var firstId = this.getElementIds()[0];
  724. if(!firstId) {
  725. return undefined;
  726. }
  727. var widgetType = $ax.getTypeFromElementId(firstId);
  728. if ($ax.public.fn.IsComboBox(widgetType) || $ax.public.fn.IsListBox(widgetType)) { //for select lists and drop lists
  729. return $('#' + firstId + ' :selected').text();
  730. } else if ($ax.public.fn.IsCheckBox(widgetType) || $ax.public.fn.IsRadioButton(widgetType)) { //for radio/checkboxes
  731. return $('#' + firstId + '_input').is(':selected');
  732. } else if ($ax.public.fn.IsTextBox(widgetType)) { //for text box
  733. return $('#' + firstId + '_input').val();
  734. } else { //for text based form elements
  735. return this.jQuery().first().val();
  736. }
  737. } else {
  738. var elementIds = this.getElementIds();
  739. for(var index = 0; index < elementIds.length; index++) {
  740. var widgetType = $ax.getTypeFromElementId(elementIds[index]);
  741. var elementIdQuery = $('#' + elementIds[index]);
  742. if ($ax.public.fn.IsCheckBox(widgetType) || $ax.public.fn.IsRadioButton(widgetType)) { //for radio/checkboxes
  743. if(arguments[0] == true) {
  744. elementIdQuery.prop('selected', true);
  745. } else if(arguments[0] == false) {
  746. elementIdQuery.prop('selected', false);
  747. }
  748. } else { //For select lists, drop lists, text based form elements
  749. elementIdQuery.val(arguments[0]);
  750. }
  751. }
  752. return this;
  753. }
  754. };
  755. $ax.public.fn.checked = function() {
  756. if(arguments[0] == undefined) {
  757. return this.selected();
  758. } else {
  759. this.selected(arguments[0]);
  760. return this;
  761. }
  762. };
  763. //var _getRelativeLeft = function (id, parent) {
  764. // var currentNode = window.document.getElementById(id).offsetParent;
  765. // var left = $ax('#' + id).left(true);
  766. // while (currentNode != null && currentNode.tagName != "BODY" && currentNode != parent) {
  767. // left += currentNode.offsetLeft;
  768. // currentNode = currentNode.offsetParent;
  769. // }
  770. // return left;
  771. //};
  772. //var _getRelativeTop = function(id, parent) {
  773. // var currentNode = window.document.getElementById(id).offsetParent;
  774. // var top = $ax('#' + id).top(true);
  775. // while(currentNode != null && currentNode.tagName != "BODY" && currentNode != parent) {
  776. // top += currentNode.offsetTop;
  777. // currentNode = currentNode.offsetParent;
  778. // }
  779. // return top;
  780. //};
  781. var _scrollHelper = function(id, scrollX, scrollY, easing, duration) {
  782. var target = window.document.getElementById(id);
  783. var scrollable = $ax.legacy.GetScrollable(target);
  784. var $scrollable = $(scrollable);
  785. var viewportLocation;
  786. if ($scrollable.is('body')) viewportLocation = $ax('#' + id).viewportLocation();
  787. else viewportLocation = $ax('#' + id).pageBoundingRect(true, $scrollable.attr('id')).location;
  788. var targetLeft = viewportLocation.left;
  789. var targetTop = viewportLocation.top;
  790. //var targetLeft = _getRelativeLeft(id, scrollable);
  791. //var targetTop = _getRelativeTop(id, scrollable);
  792. if(!scrollX) targetLeft = scrollable.scrollLeft;
  793. if(!scrollY) targetTop = scrollable.scrollTop;
  794. if($scrollable.is('body')) {
  795. $scrollable = $('html,body');
  796. }
  797. if(easing == 'none') {
  798. if(scrollY) $scrollable.scrollTop(targetTop);
  799. if(scrollX) $scrollable.scrollLeft(targetLeft);
  800. } else {
  801. if(!scrollX) {
  802. $scrollable.animate({ scrollTop: targetTop }, duration, easing);
  803. } else if(!scrollY) {
  804. $scrollable.animate({ scrollLeft: targetLeft }, duration, easing);
  805. } else {
  806. $scrollable.animate({ scrollTop: targetTop, scrollLeft: targetLeft }, duration, easing);
  807. }
  808. }
  809. };
  810. $ax.public.fn.scroll = function(scrollOption) {
  811. var easing = 'none';
  812. var duration = 500;
  813. if(scrollOption && scrollOption.easing) {
  814. easing = scrollOption.easing;
  815. if(scrollOption.duration) {
  816. duration = scrollOption.duration;
  817. }
  818. }
  819. var scrollX = true;
  820. var scrollY = true;
  821. // TODO: check this without vertical option -- might scroll outside of device frame
  822. if(scrollOption.direction == 'vertical') {
  823. scrollX = false;
  824. } else if(scrollOption.direction == 'horizontal') {
  825. scrollY = false;
  826. }
  827. var elementIds = this.getElementIds();
  828. for(var index = 0; index < elementIds.length; index++) {
  829. // if($ax.getTypeFromElementId(elementIds[index]) == IMAGE_MAP_REGION_TYPE) {
  830. _scrollHelper(elementIds[index], scrollX, scrollY, easing, duration);
  831. // }
  832. }
  833. return this;
  834. };
  835. $ax.public.fn.enabled = function() {
  836. if(arguments[0] == undefined) {
  837. var firstId = this.getElementIds()[0];
  838. if(!firstId) return undefined;
  839. var widgetType = $ax.getTypeFromElementId(firstId);
  840. if ($ax.public.fn.IsImageBox(widgetType) || $ax.public.fn.IsVector(widgetType)
  841. || $ax.public.fn.IsLayer(widgetType)) return !$ax.style.IsWidgetDisabled(firstId);
  842. else return this.jQuery().children(':disabled').length <= 0;
  843. } else {
  844. var elementIds = this.getElementIds();
  845. for(var index = 0; index < elementIds.length; index++) {
  846. var elementId = elementIds[index];
  847. var widgetType = $ax.getTypeFromElementId(elementId);
  848. var enabled = arguments[0];
  849. if ($ax.public.fn.IsImageBox(widgetType) || $ax.public.fn.IsVector(widgetType)
  850. || $ax.public.fn.IsTextBox(widgetType) || $ax.public.fn.IsTextArea(widgetType)
  851. || $ax.public.fn.IsComboBox(widgetType) || $ax.public.fn.IsListBox(widgetType)
  852. || $ax.public.fn.IsCheckBox(widgetType) || $ax.public.fn.IsRadioButton(widgetType)
  853. ) $ax.style.SetWidgetEnabled(elementId, enabled);
  854. if ($ax.public.fn.IsDynamicPanel(widgetType) || $ax.public.fn.IsLayer(widgetType)) {
  855. $ax.style.SetWidgetEnabled(elementId, enabled);
  856. var children = this.getChildren(false, true)[index].children;
  857. for(var i = 0; i < children.length; i++) {
  858. $axure('#' + children[i]).enabled(enabled);
  859. }
  860. }
  861. var obj = $obj(elementId);
  862. var images = obj.images;
  863. if(PLAIN_TEXT_TYPES.indexOf(widgetType) != -1 && images) {
  864. var img = $jobj($ax.repeater.applySuffixToElementId(elementId, '_image_sketch'));
  865. var key = (enabled ? 'normal~' : 'disabled~') + ($ax.adaptive.currentViewId || '');
  866. img.attr('src', images[key]);
  867. }
  868. var jobj = $jobj(elementId);
  869. var input = $jobj($ax.INPUT(elementId));
  870. if(input.length) jobj = input;
  871. //if (OS_MAC && WEBKIT && $ax.public.fn.IsComboBox(widgetType)) jobj.css('color', enabled ? '' : 'grayText');
  872. if(enabled) jobj.prop('disabled', false);
  873. else jobj.prop('disabled', true);
  874. }
  875. return this;
  876. }
  877. };
  878. $ax.public.fn.visible = function() {
  879. var ids = this.getElementIds();
  880. for(var index = 0; index < ids.length; index++) $ax.visibility.SetIdVisible(ids[index], arguments[0]);
  881. return this;
  882. };
  883. $ax.public.fn.selected = function() {
  884. if(arguments[0] == undefined) {
  885. var firstId = this.getElementIds()[0];
  886. if(!firstId) return undefined;
  887. var widgetType = $ax.getTypeFromElementId(firstId);
  888. if ($ax.public.fn.IsTreeNodeObject(widgetType)) {
  889. var treeNodeButtonShapeId = '';
  890. var allElementIds = $ax.getAllElementIds();
  891. for(var i = 0; i < allElementIds.length; i++) {
  892. var elementId = allElementIds[i];
  893. var currObj = $ax.getObjectFromElementId(elementId);
  894. if ($ax.public.fn.IsVector(currObj.type) && currObj.parent && currObj.parent.scriptIds && currObj.parent.scriptIds[0] == firstId) {
  895. treeNodeButtonShapeId = elementId;
  896. break;
  897. }
  898. }
  899. if(treeNodeButtonShapeId == '') return undefined;
  900. return $ax.style.IsWidgetSelected(treeNodeButtonShapeId);
  901. } else if ($ax.public.fn.IsImageBox(widgetType) || $ax.public.fn.IsVector(widgetType) || $ax.public.fn.IsTableCell(widgetType) || $ax.public.fn.IsDynamicPanel(widgetType) || $ax.public.fn.IsLayer(widgetType)
  902. || $ax.public.fn.IsTextArea(widgetType) || $ax.public.fn.IsTextBox(widgetType) || $ax.public.fn.IsListBox(widgetType) || $ax.public.fn.IsComboBox(widgetType)) {
  903. return $ax.style.IsWidgetSelected(firstId);
  904. } else if ($ax.public.fn.IsCheckBox(widgetType) || $ax.public.fn.IsRadioButton(widgetType)) {
  905. return $jobj($ax.INPUT(firstId)).prop('checked');
  906. }
  907. return this;
  908. }
  909. var elementIds = this.getElementIds();
  910. var func = typeof (arguments[0]) === 'function' ? arguments[0] : null;
  911. var enabled = arguments[0]; // If this is a function it will be overridden with the return value;
  912. for(var index = 0; index < elementIds.length; index++) {
  913. var elementId = elementIds[index];
  914. if(func) {
  915. enabled = func($axure('#' + elementId));
  916. }
  917. var widgetType = $ax.getTypeFromElementId(elementId);
  918. if ($ax.public.fn.IsTreeNodeObject(widgetType)) { //for tree node
  919. var treeRootId = $('#' + elementIds[index]).parents('.treeroot').attr('id');
  920. var treeNodeButtonShapeId = '';
  921. var childElementIds = $jobj(elementId).children();
  922. for(var i = 0; i < childElementIds.length; i++) {
  923. var elementId = childElementIds[i].id;
  924. var currObj = $ax.getObjectFromElementId(elementId);
  925. if (currObj && currObj.type == $ax.constants.VECTOR_SHAPE_TYPE && currObj.parent &&
  926. currObj.parent.scriptIds && currObj.parent.scriptIds[0] == elementIds[index]) {
  927. treeNodeButtonShapeId = elementId;
  928. break;
  929. }
  930. }
  931. if(treeNodeButtonShapeId == '') continue;
  932. $ax.tree.SelectTreeNode(elementId, enabled);
  933. } else if ($ax.public.fn.IsImageBox(widgetType) || $ax.public.fn.IsVector(widgetType) || $ax.public.fn.IsTableCell(widgetType) || $ax.public.fn.IsDynamicPanel(widgetType) || $ax.public.fn.IsLayer(widgetType)
  934. || $ax.public.fn.IsTextArea(widgetType) || $ax.public.fn.IsTextBox(widgetType) || $ax.public.fn.IsListBox(widgetType) || $ax.public.fn.IsComboBox(widgetType)) {
  935. $ax.style.SetWidgetSelected(elementIds[index], enabled);
  936. } else if ($ax.public.fn.IsCheckBox(widgetType) || $ax.public.fn.IsRadioButton(widgetType)) {
  937. var query = $jobj($ax.INPUT(elementId));
  938. var curr = query.prop('checked');
  939. //NOTE: won't fire onselect nore onunselect event if states didn't changes
  940. if(curr != enabled) {
  941. query.prop('checked', enabled);
  942. $ax.style.SetWidgetSelected(elementIds[index], enabled, true);
  943. }
  944. }
  945. }
  946. return this;
  947. };
  948. $ax.public.fn.focus = function() {
  949. var firstId = this.getElementIds()[0];
  950. var focusableId = $ax.event.getFocusableWidgetOrChildId(firstId);
  951. // This will scroll but not focus
  952. $('#' + focusableId).triggerHandler("focus");
  953. // This will focus but does not call our custom scroll so will not animate scroll
  954. $('#' + focusableId).focus();
  955. return this;
  956. };
  957. $ax.public.fn.expanded = function() {
  958. if(arguments[0] == undefined) {
  959. var firstId = this.getElementIds()[0];
  960. return firstId && !$ax.public.fn.IsTreeNodeObject($ax.getTypeFromElementId(firstId)) && $ax.visibility.IsIdVisible(firstId + '_children');
  961. } else {
  962. var elementIds = this.getElementIds();
  963. for(var index = 0; index < elementIds.length; index++) {
  964. if ($ax.public.fn.IsTreeNodeObject($ax.getTypeFromElementId(elementIds[index]))) {
  965. var treeNodeId = elementIds[index];
  966. var childContainerId = treeNodeId + '_children';
  967. var scriptId = $ax.repeater.getScriptIdFromElementId(treeNodeId);
  968. var itemId = $ax.repeater.getItemIdFromElementId(treeNodeId);
  969. var plusMinusId = 'u' + (parseInt(scriptId.substring(1)) + 1);
  970. if(itemId) plusMinusId = $ax.repeater.createElementId(plusMinusId, itemId);
  971. if($('#' + childContainerId).length == 0 || !$jobj(plusMinusId).children().first().is('img'))
  972. plusMinusId = '';
  973. if(arguments[0] == true) {
  974. $ax.tree.ExpandNode(treeNodeId, childContainerId, plusMinusId);
  975. } else if(arguments[0] == false) {
  976. $ax.tree.CollapseNode(treeNodeId, childContainerId, plusMinusId);
  977. }
  978. }
  979. }
  980. return this;
  981. }
  982. };
  983. var _populateBoundingRect = function (boundingRect) {
  984. boundingRect.right = boundingRect.left + boundingRect.width;
  985. boundingRect.bottom = boundingRect.top + boundingRect.height;
  986. boundingRect.x = boundingRect.left;
  987. boundingRect.y = boundingRect.top;
  988. boundingRect.location = {
  989. x: boundingRect.left,
  990. y: boundingRect.top,
  991. left: boundingRect.left,
  992. top: boundingRect.top
  993. };
  994. boundingRect.size = {
  995. width: boundingRect.width,
  996. height: boundingRect.height
  997. };
  998. boundingRect.centerPoint = {
  999. x: boundingRect.width / 2 + boundingRect.left,
  1000. y: boundingRect.height / 2 + boundingRect.top
  1001. };
  1002. return boundingRect;
  1003. }
  1004. //boundingrect relative to its offset parent
  1005. //var _getBoundingRectForSingleWidget = function (elementId) {
  1006. // var element = document.getElementById(elementId);
  1007. // var tempBoundingRect, position;
  1008. // var state = $ax.style.generateState(elementId);
  1009. // var style = $ax.style.computeFullStyle(elementId, state, $ax.adaptive.currentViewId);
  1010. // position = { left: style.location.x, top: style.location.y };
  1011. // tempBoundingRect = { left: style.location.x, top: style.location.y, width: style.size.width, height: style.size.height };
  1012. // if ($ax.public.fn.isCompoundVectorHtml(element)) {
  1013. // tempBoundingRect.width = Number(element.getAttribute('data-width'));
  1014. // tempBoundingRect.height = Number(element.getAttribute('data-height'));
  1015. // } else {
  1016. // var boundingElement = element;
  1017. // if ($ax.dynamicPanelManager.isIdFitToContent(elementId)) {
  1018. // var stateId = $ax.visibility.GetPanelState(elementId);
  1019. // if (stateId != '') boundingElement = document.getElementById(stateId);
  1020. // tempBoundingRect = boundingElement.getBoundingClientRect();
  1021. // }
  1022. // //From getLoc
  1023. // //var fixed = _fixedOffset(id, vert);
  1024. // //if (fixed.valid) loc = !vert && fixed.fullWidth ? 0 : fixed.offset;
  1025. // var jElement = $(element);
  1026. // if (jElement.css('position') == 'fixed') {
  1027. // position = jElement.position();
  1028. // position.left += Number(jElement.css('margin-left').replace("px", ""));
  1029. // position.top += Number(jElement.css('margin-top').replace("px", ""));
  1030. // }
  1031. // }
  1032. // var boundingRect = {
  1033. // left: position.left,
  1034. // top: position.top,
  1035. // width: tempBoundingRect.width,
  1036. // height: tempBoundingRect.height
  1037. // };
  1038. // return _populateBoundingRect(boundingRect);
  1039. //};
  1040. //var _getBoundingRectForMultipleWidgets = function (widgetsIdArray) {
  1041. // if (!widgetsIdArray || widgetsIdArray.constructor !== Array) return undefined;
  1042. // if (widgetsIdArray.length == 0) return { left: 0, top: 0, centerPoint: { x: 0, y: 0 }, width: 0, height: 0 };
  1043. // var widgetRect = _getBoundingRectForSingleWidget(widgetsIdArray[0]);
  1044. // var boundingRect = { left: widgetRect.left, right: widgetRect.right, top: widgetRect.top, bottom: widgetRect.bottom };
  1045. // for (var index = 1; index < widgetsIdArray.length; index++) {
  1046. // widgetRect = _getBoundingRectForSingleWidget(widgetsIdArray[index]);
  1047. // boundingRect.left = Math.min(boundingRect.left, widgetRect.left);
  1048. // boundingRect.top = Math.min(boundingRect.top, widgetRect.top);
  1049. // boundingRect.right = Math.max(boundingRect.right, widgetRect.right);
  1050. // boundingRect.bottom = Math.max(boundingRect.bottom, widgetRect.bottom);
  1051. // }
  1052. // boundingRect.centerPoint = { x: (boundingRect.right + boundingRect.left) / 2.0, y: (boundingRect.bottom + boundingRect.top) / 2.0 };
  1053. // boundingRect.width = boundingRect.right - boundingRect.left;
  1054. // boundingRect.height = boundingRect.bottom - boundingRect.top;
  1055. // return _populateBoundingRect(boundingRect);
  1056. //};
  1057. //var _getLayerChildrenDeep = $ax.public.fn.getLayerChildrenDeep = function (layerId, includeLayers, includeHidden) {
  1058. // var deep = [];
  1059. // var children = $ax('#' + layerId).getChildren()[0].children;
  1060. // for (var index = 0; index < children.length; index++) {
  1061. // var childId = children[index];
  1062. // if (!includeHidden && !$ax.visibility.IsIdVisible(childId)) continue;
  1063. // if ($ax.public.fn.IsLayer($obj(childId).type)) {
  1064. // if (includeLayers) deep.push(childId);
  1065. // var recursiveChildren = _getLayerChildrenDeep(childId, includeLayers, includeHidden);
  1066. // for (var j = 0; j < recursiveChildren.length; j++) deep.push(recursiveChildren[j]);
  1067. // } else deep.push(childId);
  1068. // }
  1069. // return deep;
  1070. //};
  1071. var _boundingRectForIds = function(childIds) {
  1072. // Default size
  1073. var childrenBoundingRect = { left: childIds.length > 0 ? 9999999 : 0, top: childIds.length > 0 ? 9999999 : 0, right: 0, bottom: 0 };
  1074. for (var i = 0; i < childIds.length; i++) {
  1075. var childId = childIds[i];
  1076. var childObj = $obj(childId);
  1077. if (!childObj) continue;
  1078. // Ignore fixed and hidden
  1079. if ($ax.visibility.limboIds[childId] ||
  1080. !$ax.visibility.IsIdVisible(childId) ||
  1081. $ax.public.fn.IsDynamicPanel(childObj.type) && childObj.fixedHorizontal) continue;
  1082. var boundingRect = $ax('#' + childId).offsetBoundingRect();
  1083. // Ignore empty groups
  1084. if ($ax.public.fn.IsLayer(childObj.type) && boundingRect.width == 0 && boundingRect.height == 0) continue;
  1085. childrenBoundingRect.left = Math.min(childrenBoundingRect.left, boundingRect.left);
  1086. childrenBoundingRect.top = Math.min(childrenBoundingRect.top, boundingRect.top);
  1087. childrenBoundingRect.right = Math.max(childrenBoundingRect.right, boundingRect.right);
  1088. childrenBoundingRect.bottom = Math.max(childrenBoundingRect.bottom, boundingRect.bottom);
  1089. }
  1090. childrenBoundingRect.width = childrenBoundingRect.right - childrenBoundingRect.left;
  1091. childrenBoundingRect.height = childrenBoundingRect.bottom - childrenBoundingRect.top;
  1092. return _populateBoundingRect(childrenBoundingRect);
  1093. }
  1094. $ax.public.fn.getPageSize = function() {
  1095. var containerQuery = $('#base');
  1096. var children = containerQuery.children();
  1097. var childIds = [];
  1098. for (var i = 0; i < children.length; i++) {
  1099. var child = $(children[i]);
  1100. var childId = child.attr('id');
  1101. childIds.push(childId);
  1102. }
  1103. return _boundingRectForIds(childIds);
  1104. }
  1105. $ax.public.fn.childrenBoundingRect = function () {
  1106. var childIds = this.getChildren()[0].children;
  1107. return _boundingRectForIds(childIds);
  1108. };
  1109. var _fixedLocation = function (elementId, size) {
  1110. var axObj = $obj(elementId);
  1111. if (!axObj || !axObj.fixedVertical) return { valid: false };
  1112. var win = ((SAFARI && IOS) || SHARE_APP) ? $('#ios-safari-html') : $(window);
  1113. var windowWidth = win.width();
  1114. var windowHeight = win.height();
  1115. //getting the scroll forces layout. consider caching these values.
  1116. var windowScrollLeft = win.scrollLeft();
  1117. var windowScrollTop = win.scrollTop();
  1118. var newLeft = 0;
  1119. var newTop = 0;
  1120. var width = size.width;
  1121. var height = size.height;
  1122. var horz = axObj.fixedHorizontal;
  1123. if(horz == 'left') {
  1124. newLeft = windowScrollLeft + (axObj.percentWidth ? 0 : $ax.getNumFromPx($jobj(elementId).css('left')));
  1125. } else if(horz == 'center') {
  1126. newLeft = windowScrollLeft + ((windowWidth - width) / 2) + axObj.fixedMarginHorizontal;
  1127. } else if(horz == 'right') {
  1128. newLeft = windowScrollLeft + windowWidth - width - axObj.fixedMarginHorizontal;
  1129. }
  1130. var vert = axObj.fixedVertical;
  1131. if(vert == 'top') {
  1132. newTop = windowScrollTop + $ax.getNumFromPx($jobj(elementId).css('top'));
  1133. } else if(vert == 'middle') {
  1134. newTop = windowScrollTop + ((windowHeight - height) / 2) + axObj.fixedMarginVertical;
  1135. } else if(vert == 'bottom') {
  1136. newTop = windowScrollTop + windowHeight - height - axObj.fixedMarginVertical;
  1137. }
  1138. //probably need to make this relative to the page for hit testing
  1139. return { valid: true, top: newTop, left: axObj.isPercentWidthPanel ? 0 : newLeft };
  1140. };
  1141. //relative to the parent
  1142. $ax.public.fn.offsetBoundingRect = function (ignoreRotation) {
  1143. var elementId = this.getElementIds()[0];
  1144. if (!elementId) return undefined;
  1145. //element is null if RDO
  1146. //data- values are for layers (legacy compound)
  1147. var element = document.getElementById(elementId);
  1148. var position, size, rotation;
  1149. var trap;
  1150. var state;
  1151. var style;
  1152. var movedLoc = $ax.visibility.getMovedLocation(elementId);
  1153. var resizedSize = $ax.visibility.getResizedSize(elementId);
  1154. if (movedLoc) {
  1155. position = movedLoc;
  1156. } else if(element && element.getAttribute('data-left')) {
  1157. position = {
  1158. left: Number(element.getAttribute('data-left')),
  1159. top: Number(element.getAttribute('data-top'))
  1160. };
  1161. } else if($obj(elementId)) {
  1162. state = $ax.style.generateState(elementId);
  1163. style = $ax.style.computeFullStyle(elementId, state, $ax.adaptive.currentViewId);
  1164. position = { left: style.location.x, top: style.location.y };
  1165. var oShadow = style.outerShadow;
  1166. if (oShadow.on) {
  1167. if (oShadow.offsetX < 0) {
  1168. position.left += oShadow.offsetX;
  1169. position.left -= oShadow.blurRadius;
  1170. }
  1171. if (oShadow.offsetY < 0) {
  1172. position.top += oShadow.offsetY;
  1173. position.top -= oShadow.blurRadius;
  1174. }
  1175. }
  1176. var parents = this.getParents(true, '*')[0];
  1177. //if(parents.length > 0) {
  1178. // var parentId = parents[0];
  1179. // var type = $ax.getTypeFromElementId(parentId);
  1180. // if ($axure.fn.IsReferenceDiagramObject(type)) {
  1181. // var rdoLoc = $ax('#' + parentId).offsetLocation();
  1182. // position.left += rdoLoc.x;
  1183. // position.top += rdoLoc.y;
  1184. // }
  1185. //}
  1186. for(var i = 0; i < parents.length; i++) {
  1187. var parentId = parents[i];
  1188. var type = $ax.getTypeFromElementId(parentId);
  1189. if ($axure.fn.IsReferenceDiagramObject(type)) {
  1190. var rdoLoc = $ax('#' + parentId).offsetLocation();
  1191. position.left += rdoLoc.x;
  1192. position.top += rdoLoc.y;
  1193. break;
  1194. } else if (!$axure.fn.IsLayer(type)) break;
  1195. }
  1196. } else {
  1197. if (!trap) trap = _displayWidget($ax.repeater.removeSuffixFromElementId(elementId));
  1198. var jObjPosition = $(element).position();
  1199. position = { left: jObjPosition.left, top: jObjPosition.top };
  1200. }
  1201. if (resizedSize) {
  1202. size = resizedSize;
  1203. } else if (element && element.getAttribute('data-width')) {
  1204. size = {
  1205. width: Number(element.getAttribute('data-width')),
  1206. height: Number(element.getAttribute('data-height'))
  1207. };
  1208. } else if($obj(elementId)) {
  1209. state = state || $ax.style.generateState(elementId);
  1210. style = style || $ax.style.computeFullStyle(elementId, state, $ax.adaptive.currentViewId);
  1211. size = { width: style.size.width, height: style.size.height };
  1212. var oShadow = style.outerShadow;
  1213. if (oShadow.on) {
  1214. if (oShadow.offsetX < 0) size.width -= oShadow.offsetX;
  1215. else size.width += oShadow.offsetX;
  1216. if (oShadow.offsetY < 0) size.height -= oShadow.offsetY;
  1217. else size.height += oShadow.offsetY;
  1218. size.width += oShadow.blurRadius;
  1219. size.height += oShadow.blurRadius;
  1220. }
  1221. } else {
  1222. if(!trap) trap = _displayWidget($ax.repeater.removeSuffixFromElementId(elementId));
  1223. var jObj = $(element);
  1224. size = { width: jObj.outerWidth(), height: jObj.outerHeight() };
  1225. }
  1226. var fixed = _fixedLocation(elementId, size);
  1227. if(fixed.valid) {
  1228. position.left = fixed.left;
  1229. position.top = fixed.top;
  1230. }
  1231. var boundingRect = {
  1232. left: position.left,
  1233. top: position.top,
  1234. width: size.width,
  1235. height: size.height,
  1236. isFixed: fixed.valid
  1237. };
  1238. if(!ignoreRotation) {
  1239. var rotatedAngle = $ax.visibility.getRotatedAngle(elementId);
  1240. if(rotatedAngle) {
  1241. rotation = rotatedAngle;
  1242. } else if(element && element.getAttribute('data-rotation')) {
  1243. rotation = Number(element.getAttribute('data-rotation'));
  1244. } else if($obj(elementId)) {
  1245. state = state || $ax.style.generateState(elementId);
  1246. style = style || $ax.style.computeFullStyle(elementId, state, $ax.adaptive.currentViewId);
  1247. rotation = style.rotation;
  1248. } else {
  1249. if (!trap) trap = _displayWidget($ax.repeater.removeSuffixFromElementId(elementId));
  1250. rotation = $ax.move.getRotationDegreeFromElement(element);
  1251. }
  1252. if(rotation && rotation != 0)
  1253. boundingRect = $ax.public.fn.getBoundingRectForRotate(_populateBoundingRect(boundingRect), rotation);
  1254. }
  1255. if (trap) trap();
  1256. return _populateBoundingRect(boundingRect);
  1257. };
  1258. //relative to the page
  1259. $ax.public.fn.pageBoundingRect = function (ignoreRotation, scrollableId) {
  1260. var boundingRect = this.offsetBoundingRect(ignoreRotation);
  1261. if(!boundingRect) return undefined;
  1262. if(boundingRect.isFixed) return _populateBoundingRect(boundingRect);
  1263. var loc = boundingRect.location;
  1264. //var parents = [];
  1265. //var parObj = id.indexOf('text') != -1 ? axObj : axObj.parent; // When working with text id, parent widget is the ax obj we are dealing with, so that should be the first parent
  1266. //while ($ax.public.fn.IsContainer(parObj.type)) {
  1267. // parents.push($ax.getScriptIdFromPath([parObj.id], strippedId));
  1268. // parObj = parObj.parent;
  1269. //}
  1270. //var otherParents = $ax('#' + id).getParents(true, ['item', 'repeater', 'dynamicPanel', 'layer'])[0];
  1271. //for (var i = 0; i < otherParents.length; i++) {
  1272. // parents.push(otherParents[i]);
  1273. //}
  1274. var elementId = this.getElementIds()[0];
  1275. // var strippedId = $ax.repeater.removeSuffixFromElementId(id);
  1276. // var parObj = id.indexOf('text') != -1 ? axObj : axObj.parent; // When working with text id, parent widget is the ax obj we are dealing with, so that should be the first parent
  1277. var parentIds = [];
  1278. var parObj = $obj(elementId).parent;
  1279. while ($ax.public.fn.IsContainer(parObj.type)) {
  1280. parentIds.push($ax.getScriptIdFromPath([parObj.id], this.id));
  1281. parObj = parObj.parent;
  1282. }
  1283. var otherParents = $ax('#' + elementId).getParents(true, ['item', 'repeater', 'dynamicPanel'])[0];
  1284. for (var i = 0; i < otherParents.length; i++) {
  1285. parentIds.push(otherParents[i]);
  1286. }
  1287. var parentScrollableId = scrollableId ? scrollableId.split('_')[0] : scrollableId;
  1288. for (var i = 0; i < parentIds.length; i++) {
  1289. //var parentId = $ax.visibility.getWidgetFromContainer(parents[0]);
  1290. //var parent = $ax.visibility.applyWidgetContainer(parentId, true);
  1291. //if(parent.length) {
  1292. //var parentId = parentIds[i];
  1293. //var fixed = _fixedOffset(parentId, vert);
  1294. //if (fixed.valid) {
  1295. // loc += fixed.offset;
  1296. // break;
  1297. //} else loc += $ax.getNumFromPx(parent.css(prop));
  1298. //}
  1299. var parentId = parentIds[i];
  1300. if (parentId == parentScrollableId) break;
  1301. var parentLoc = $ax('#' + parentId).offsetLocation();
  1302. loc = {
  1303. x: loc.x + parentLoc.x,
  1304. y: loc.y + parentLoc.y,
  1305. left: loc.left + parentLoc.left,
  1306. top: loc.top + parentLoc.top,
  1307. }
  1308. var axObj = $obj(parentId);
  1309. if(axObj && axObj.fixedVertical) {
  1310. boundingRect.isFixed = true;
  1311. break;
  1312. }
  1313. }
  1314. boundingRect.left = loc.x;
  1315. boundingRect.top = loc.y;
  1316. return _populateBoundingRect(boundingRect);
  1317. };
  1318. $ax.public.fn.viewportBoundingRect = function (scrollableId) {
  1319. var boundingRect = this.pageBoundingRect(true, scrollableId);
  1320. if (!boundingRect) return undefined;
  1321. if(!boundingRect.isFixed) boundingRect.left = _bodyToWorld(boundingRect.left, false);
  1322. return _populateBoundingRect(boundingRect);
  1323. }
  1324. $ax.public.fn.size = function () {
  1325. var boundingRect = this.offsetBoundingRect(true);
  1326. return boundingRect ? boundingRect.size : undefined;
  1327. //var firstId = this.getElementIds()[0];
  1328. //if(!firstId) return undefined;
  1329. //var object = $ax.getObjectFromElementIdDisregardHex(firstId);
  1330. //if(object && (object.type == 'layer' || object.generateCompound)) {
  1331. // var boundingRect = $ax.public.fn.getWidgetBoundingRect(firstId);
  1332. // return { width: boundingRect.width, height: boundingRect.height };
  1333. //}
  1334. //var firstIdObject = $jobj(firstId);
  1335. //var trap = _displayWidget($ax.repeater.removeSuffixFromElementId(firstId));
  1336. //var size = { width: firstIdObject.outerWidth(), height: firstIdObject.outerHeight() };
  1337. //trap();
  1338. //return size;
  1339. };
  1340. $ax.public.fn.width = function () {
  1341. var boundingRect = this.offsetBoundingRect(true);
  1342. return boundingRect ? boundingRect.width : undefined;
  1343. //var firstId = this.getElementIds()[0];
  1344. //if(!firstId) return undefined;
  1345. //var object = $ax.getObjectFromElementIdDisregardHex(firstId);
  1346. //if (object && (object.type == 'layer' || object.generateCompound)) {
  1347. // var boundingRect = $ax.public.fn.getWidgetBoundingRect(firstId);
  1348. // return boundingRect.width;
  1349. //}
  1350. //var firstIdObject = $jobj(firstId);
  1351. //return firstIdObject.outerWidth();
  1352. };
  1353. $ax.public.fn.height = function () {
  1354. var boundingRect = this.offsetBoundingRect(true);
  1355. return boundingRect ? boundingRect.height : undefined;
  1356. //var firstId = this.getElementIds()[0];
  1357. //if(!firstId) return undefined;
  1358. //var object = $ax.getObjectFromElementIdDisregardHex(firstId);
  1359. //if (object && (object.type == 'layer' || object.generateCompound)) {
  1360. // var boundingRect = $ax.public.fn.getWidgetBoundingRect(firstId);
  1361. // return boundingRect.height;
  1362. //}
  1363. //var firstIdObject = $jobj(firstId);
  1364. //return firstIdObject.outerHeight();
  1365. };
  1366. //this should replace locRelativeIgnoreLayer
  1367. $ax.public.fn.offsetLocation = function () {
  1368. var boundingRect = this.offsetBoundingRect(true);
  1369. return boundingRect ? boundingRect.location : undefined;
  1370. };
  1371. //$ax.public.fn.offsetLeft = function () {
  1372. // var boundingRect = this.offsetBoundingRect();
  1373. // return boundingRect ? boundingRect.left : undefined;
  1374. //};
  1375. //$ax.public.fn.offsetTop = function () {
  1376. // var boundingRect = this.offsetBoundingRect();
  1377. // return boundingRect ? boundingRect.top : undefined;
  1378. //};
  1379. $ax.public.fn.viewportLocation = function (scrollableId) {
  1380. var boundingRect = this.viewportBoundingRect(scrollableId);
  1381. return boundingRect ? boundingRect.location : undefined;
  1382. };
  1383. //$ax.public.fn.pageLeft = function () {
  1384. // var boundingRect = this.pageBoundingRect();
  1385. // return boundingRect ? boundingRect.left : undefined;
  1386. //};
  1387. //$ax.public.fn.pageTop = function () {
  1388. // var boundingRect = this.pageBoundingRect();
  1389. // return boundingRect ? boundingRect.top : undefined;
  1390. //};
  1391. //This is getting its position in the Editor
  1392. //It was needed because the widget would be contained so getting the position from jQuery would not be accurate
  1393. //This can use the editor values
  1394. //$ax.public.fn.locRelativeIgnoreLayer = function (vert) {
  1395. // var elementId = this.getElementIds()[0];
  1396. // if(!elementId) return undefined;
  1397. // var parents = this.getParents(true, '*')[0];
  1398. // for(var i = 0; i < parents.length; i++) {
  1399. // var type = $ax.getTypeFromElementId(parents[i]);
  1400. // if(!$axure.fn.IsLayer(type) && !$axure.fn.IsReferenceDiagramObject(type)) {
  1401. // var func = vert ? _getRelativeTop : _getRelativeLeft;
  1402. // return func(elementId, $jobj(parents[i])[0]);
  1403. // }
  1404. // }
  1405. // var axThis = $ax('#' + elementId);
  1406. // return vert ? axThis.top() : _bodyToWorld(axThis.left(), true);
  1407. //};
  1408. var _bodyToWorld = $axure.fn.bodyToWorld = function(x, from) {
  1409. var body = $('body');
  1410. if (body.css('position') != 'relative') return x;
  1411. var offset = $ax.getNumFromPx(body.css('left')) + Math.max(0, ($(window).width() - body.width()) / 2);
  1412. if(from) offset *= -1;
  1413. return x + offset;
  1414. }
  1415. $ax.public.fn.left = function (relative) {
  1416. return relative ? this.offsetLocation().left : this.viewportLocation().left;
  1417. //var firstId = this.getElementIds()[0];
  1418. //if(!firstId) return undefined;
  1419. //var left = _getLoc(firstId, false, false, relative);
  1420. //// If you are absolute, unless your are a pinned panel...
  1421. //if(relative || $obj(firstId) && $obj(firstId).fixedVertical) return left;
  1422. //// ... or you are in one...
  1423. //var parentPanels = $ax('#' + firstId).getParents(true, 'dynamicPanel')[0];
  1424. //for(var i = 0; i < parentPanels.length; i++) if ($obj(parentPanels[i]).fixedVertical) return left;
  1425. //// ... you must convert from body to world coordinates
  1426. //return _bodyToWorld(left);
  1427. };
  1428. $ax.public.fn.top = function(relative) {
  1429. return relative ? this.offsetLocation().top : this.viewportLocation().top;
  1430. //var firstId = this.getElementIds()[0];
  1431. //return firstId && _getLoc(firstId, true, false, relative);
  1432. };
  1433. //var _getLoc = function(id, vert, high, relative) {
  1434. // var mathFunc = high ? 'max' : 'min';
  1435. // var prop = vert ? 'top' : 'left';
  1436. // var dim = vert ? 'height' : 'width';
  1437. // var obj = $jobj(id);
  1438. // var strippedId = $ax.repeater.removeSuffixFromElementId(id);
  1439. // var axObj = $obj(strippedId);
  1440. // var oldDisplay = obj.css('display');
  1441. // var displaySet = false;
  1442. // if(oldDisplay == 'none') {
  1443. // obj.css('display', '');
  1444. // displaySet = true;
  1445. // }
  1446. // var loc = Math.NaN;
  1447. // var rdo = axObj.type == $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE;
  1448. // if (!rdo) loc = $ax.getNumFromPx(obj.css(prop));
  1449. // var fixed = _fixedOffset(id, vert);
  1450. // if(fixed.valid) loc = !vert && fixed.fullWidth ? 0 : fixed.offset;
  1451. // else if (!relative) {
  1452. // var parents = [];
  1453. // var parObj = id.indexOf('text') != -1 ? axObj : axObj.parent; // When working with text id, parent widget is the ax obj we are dealing with, so that should be the first parent
  1454. // while($ax.public.fn.IsContainer(parObj.type)) {
  1455. // parents.push($ax.getScriptIdFromPath([parObj.id], strippedId));
  1456. // parObj = parObj.parent;
  1457. // }
  1458. // var otherParents = $ax('#' + id).getParents(true, ['item', 'repeater', 'dynamicPanel', 'layer'])[0];
  1459. // for(var i = 0; i < otherParents.length; i++) {
  1460. // parents.push(otherParents[i]);
  1461. // }
  1462. // for(var i = 0; i < parents.length; i++) {
  1463. // var parentId = $ax.visibility.getWidgetFromContainer(parents[i]);
  1464. // var parent = $ax.visibility.applyWidgetContainer(parentId, true);
  1465. // // Layer may not have container, and will be at 0,0 otherwise.
  1466. // if (!parent.length) continue;
  1467. // fixed = _fixedOffset(parentId, vert);
  1468. // if(fixed.valid) {
  1469. // loc += fixed.offset;
  1470. // break; // If fixed ignore any parents if there are any, they don't matter.
  1471. // } else loc += $ax.getNumFromPx(parent.css(prop));
  1472. // }
  1473. // }
  1474. // if (high) loc += obj[dim]();
  1475. // // Special Layer code
  1476. // if (axObj.type == 'layer') {
  1477. // // If layer has a container, then use that. Otherwise must deal with children. Children can move in container after created, but ignoring for now.
  1478. // var container = $ax.visibility.applyWidgetContainer(id, true, true);
  1479. // if(container.length) loc += $ax.getNumFromPx(container.css(prop));
  1480. // else loc += (_getChildLoc(axObj.objs, vert, high, dim, true, id) || 0);
  1481. // }
  1482. // if(displaySet) obj.css('display', oldDisplay);
  1483. // return loc;
  1484. //};
  1485. //var _getChildLoc = function (children, vert, high, dim, root, path, itemId) {
  1486. // if (typeof (path) == 'string') {
  1487. // itemId = $ax.repeater.getItemIdFromElementId(path);
  1488. // path = $ax.getPathFromScriptId(path);
  1489. // path.pop(); // Remove object id, only want rdo path.
  1490. // }
  1491. // var mathFunc = high ? 'max' : 'min';
  1492. // var childLoc = NaN;
  1493. // for (var i = 0; i < children.length; i++) {
  1494. // var childObj = children[i];
  1495. // var childId = $ax.getElementIdFromPath([childObj.id], { relativeTo: path });
  1496. // if (!childId) continue;
  1497. // childId = $ax.repeater.createElementId(childId, itemId);
  1498. // if($ax.public.fn.IsReferenceDiagramObject(childObj.type)) {
  1499. // path.push(childObj.id);
  1500. // var childProp = _getChildLoc($ax.pageData.masters[$obj(childId).masterId].diagram.objects, vert, high, dim, false, path, itemId);
  1501. // path.pop();
  1502. // if(isNaN(childProp)) continue;
  1503. // } else if($ax.public.fn.IsLayer(childObj.type)) {
  1504. // childProp = _getChildLoc(childObj.objs, vert, high, dim, false, path, itemId);
  1505. // } else {
  1506. // if(!$ax.visibility.IsIdVisible(childId)) continue;
  1507. // childProp = $ax('#' + childId).locRelativeIgnoreLayer(vert);
  1508. // if(high) childProp += $jobj(childId)[dim]();
  1509. // }
  1510. // if(isNaN(childLoc)) childLoc = childProp;
  1511. // else if(!isNaN(childProp)) childLoc = Math[mathFunc](childLoc, childProp);
  1512. // }
  1513. // return root && isNaN(childLoc) ? 0 : childLoc;
  1514. //};
  1515. //var _fixedOffset = function (id, vert) {
  1516. // var axObj = $obj(id);
  1517. // //I think this is only for pinned panels? So why are we coming through here for rtps?
  1518. // if(!axObj) return { valid: false };
  1519. // var dim = vert ? 'height' : 'width';
  1520. // var alignment = axObj['fixed' + (vert ? 'Vertical' : 'Horizontal')];
  1521. // if(!alignment) return { valid: false };
  1522. // var loc = 0;
  1523. // // TODO: This returns 0 for width/height it or any parent is display none. Similar issue when using axquery width/height
  1524. // // TODO: Look into replacing this with axquery width/height and fixing that to use this hack. Potentially want to make js generic trapper.
  1525. // var trap = _displayWidget(id);
  1526. // var query = $jobj(id);
  1527. // var objSize = query[dim]();
  1528. // trap();
  1529. // if(alignment == 'center' || alignment == 'middle') {
  1530. // loc = $ax.getNumFromPx(query.css('margin-' + (vert ? 'top' : 'left')));
  1531. // loc += ($(window)[dim]()) / 2;
  1532. // } else if(alignment == 'bottom' || alignment == 'right') {
  1533. // loc = $ax.getNumFromPx(query.css(vert ? 'bottom' : 'right'));
  1534. // loc = $(window)[dim]() - objSize - loc; // subract loc because margin here moves farther left/up as it gets bigger.
  1535. // } else {
  1536. // loc = $ax.getNumFromPx(query.css(vert ? 'top' : 'left'));
  1537. // }
  1538. // var scrollKey = 'scroll' + (vert ? 'Top' : 'Left');
  1539. // return { offset: $(window)[scrollKey]() + loc, valid: true, fullWidth: axObj.percentWidth == 1 };
  1540. //};
  1541. var _displayWidget = function(id) {
  1542. var parents = $ax('#' + id).getParents(true, '*')[0];
  1543. parents.push(id); // also need to show self
  1544. var displayed = [];
  1545. for(var i = 0; i < parents.length; i++) {
  1546. var currId = parents[i];
  1547. var currObj = $jobj(currId);
  1548. if(currObj.css('display') == 'none') {
  1549. currObj.css('display', 'block');
  1550. displayed.push(currId);
  1551. }
  1552. }
  1553. return function() {
  1554. for(var i = 0; i < displayed.length; i++) {
  1555. $jobj(displayed[i]).css('display', 'none');
  1556. }
  1557. };
  1558. }
  1559. });