axQuery.std.js 87 KB

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