axQuery.std.js 75 KB

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