axQuery.std.js 88 KB

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