action.js 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  1. $axure.internal(function($ax) {
  2. var _actionHandlers = {};
  3. var _action = $ax.action = {};
  4. var animationQueue = {};
  5. var getAnimation = function(id) {
  6. return animationQueue[id] && animationQueue[id][0];
  7. };
  8. var _addAnimation = _action.addAnimation = function(id, func) {
  9. var wasEmpty = !getAnimation(id);
  10. // Add the func to the queue. Create the queue if necessary.
  11. var queue = animationQueue[id];
  12. if(!queue) {
  13. animationQueue[id] = queue = [];
  14. }
  15. queue[queue.length] = func;
  16. // If it was empty, there isn't a callback waiting to be called on this. You have to fire it manually.
  17. if(wasEmpty) func();
  18. };
  19. var _fireAnimationFromQueue = _action.fireAnimationFromQueue = function(id) {
  20. // Remove the function that was just fired
  21. if(animationQueue[id]) $ax.splice(animationQueue[id], 0, 1);
  22. // Fire the next func if there is one
  23. var func = getAnimation(id);
  24. if(func) func();
  25. };
  26. var _refreshing = [];
  27. _action.refreshStart = function(repeaterId) { _refreshing.push(repeaterId); };
  28. _action.refreshEnd = function() { _refreshing.pop(); };
  29. // TODO: [ben] Consider moving this to repeater.js
  30. var _repeatersToRefresh = _action.repeatersToRefresh = [];
  31. var _ignoreAction = function(repeaterId) {
  32. for(var i = 0; i < _refreshing.length; i++) if(_refreshing[i] == repeaterId) return true;
  33. return false;
  34. };
  35. var _addRefresh = function(repeaterId) {
  36. if(_repeatersToRefresh.indexOf(repeaterId) == -1) _repeatersToRefresh.push(repeaterId);
  37. };
  38. var _dispatchAction = $ax.action.dispatchAction = function(eventInfo, actions, currentIndex) {
  39. currentIndex = currentIndex || 0;
  40. //If no actions, you can bubble
  41. if(currentIndex >= actions.length) return;
  42. //actions are responsible for doing their own dispatching
  43. _actionHandlers[actions[currentIndex].action](eventInfo, actions, currentIndex);
  44. };
  45. _actionHandlers.wait = function(eventInfo, actions, index) {
  46. var action = actions[index];
  47. var infoCopy = $ax.eventCopy(eventInfo);
  48. window.setTimeout(function() {
  49. infoCopy.now = new Date();
  50. _dispatchAction(infoCopy, actions, index + 1);
  51. }, action.waitTime);
  52. };
  53. _actionHandlers.expr = function(eventInfo, actions, index) {
  54. var action = actions[index];
  55. $ax.expr.evaluateExpr(action.expr, eventInfo); //this should be a block
  56. _dispatchAction(eventInfo, actions, index + 1);
  57. };
  58. _actionHandlers.setFunction = _actionHandlers.expr;
  59. _actionHandlers.linkWindow = function(eventInfo, actions, index) {
  60. linkActionHelper(eventInfo, actions, index);
  61. };
  62. _actionHandlers.closeCurrent = function(eventInfo, actions, index) {
  63. $ax.closeWindow();
  64. _dispatchAction(eventInfo, actions, index + 1);
  65. };
  66. _actionHandlers.linkFrame = function(eventInfo, actions, index) {
  67. linkActionHelper(eventInfo, actions, index);
  68. };
  69. var linkActionHelper = function(eventInfo, actions, index) {
  70. var action = actions[index];
  71. eventInfo.link = true;
  72. if(action.linkType != 'frame') {
  73. var includeVars = _includeVars(action.target, eventInfo);
  74. if(action.target.targetType == "reloadPage") {
  75. $ax.reload(action.target.includeVariables);
  76. } else if(action.target.targetType == "backUrl") {
  77. $ax.back();
  78. }
  79. var url = action.target.url;
  80. if(!url && action.target.urlLiteral) {
  81. url = $ax.expr.evaluateExpr(action.target.urlLiteral, eventInfo, true);
  82. }
  83. if(url) {
  84. if(action.linkType == "popup") {
  85. $ax.navigate({
  86. url: url,
  87. target: action.linkType,
  88. includeVariables: includeVars,
  89. popupOptions: action.popup
  90. });
  91. } else {
  92. $ax.navigate({
  93. url: url,
  94. target: action.linkType,
  95. includeVariables: includeVars
  96. });
  97. }
  98. }
  99. } else linkFrame(eventInfo, action);
  100. eventInfo.link = false;
  101. _dispatchAction(eventInfo, actions, index + 1);
  102. };
  103. var _includeVars = function(target, eventInfo) {
  104. if(target.includeVariables) return true;
  105. // If it is a url literal, that is a string literal, that has only 1 sto, that is an item that is a page, include vars.
  106. if(target.urlLiteral) {
  107. var literal = target.urlLiteral;
  108. var sto = literal.stos[0];
  109. if(literal.exprType == 'stringLiteral' && literal.value.indexOf('[[') == 0 && literal.value.indexOf(']]' == literal.value.length - 2) && literal.stos.length == 1 && sto.sto == 'item' && eventInfo.item) {
  110. var data = $ax.repeater.getData(eventInfo.item.repeater.elementId, eventInfo.item.index, sto.name, 'data');
  111. if(data && data.type == 'page') return true;
  112. }
  113. }
  114. return false;
  115. };
  116. var linkFrame = function(eventInfo, action) {
  117. for(var i = 0; i < action.framesToTargets.length; i++) {
  118. var framePath = action.framesToTargets[i].framePath;
  119. var target = action.framesToTargets[i].target;
  120. var includeVars = _includeVars(target, eventInfo);
  121. var url = target.url;
  122. if(!url && target.urlLiteral) {
  123. url = $ax.expr.evaluateExpr(target.urlLiteral, eventInfo, true);
  124. }
  125. $ax('#' + $ax.INPUT($ax.getElementIdsFromPath(framePath, eventInfo)[0])).openLink(url, includeVars);
  126. }
  127. };
  128. var _repeatPanelMap = {};
  129. _actionHandlers.setPanelState = function(eventInfo, actions, index) {
  130. var action = actions[index];
  131. for(var i = 0; i < action.panelsToStates.length; i++) {
  132. var panelToState = action.panelsToStates[i];
  133. var stateInfo = panelToState.stateInfo;
  134. var elementIds = $ax.getElementIdsFromPath(panelToState.panelPath, eventInfo);
  135. for(var j = 0; j < elementIds.length; j++) {
  136. var elementId = elementIds[j];
  137. // Need new scope for elementId and info
  138. (function(elementId, stateInfo) {
  139. _addAnimation(elementId, function() {
  140. var stateNumber = stateInfo.stateNumber;
  141. if(stateInfo.setStateType == "value") {
  142. var oldTarget = eventInfo.targetElement;
  143. eventInfo.targetElement = elementId;
  144. var stateName = $ax.expr.evaluateExpr(stateInfo.stateValue, eventInfo);
  145. eventInfo.targetElement = oldTarget;
  146. // Try for state name first
  147. var states = $ax.getObjectFromElementId(elementId).diagrams;
  148. var stateNameFound = false;
  149. for(var k = 0; k < states.length; k++) {
  150. if(states[k].label == stateName) {
  151. stateNumber = k + 1;
  152. stateNameFound = true;
  153. }
  154. }
  155. // Now check for index
  156. if(!stateNameFound) {
  157. stateNumber = Number(stateName);
  158. var panelCount = $('#' + elementId).children().length;
  159. // Make sure number is not NaN, is in range, and is a whole number.
  160. // Wasn't a state name or number, so return
  161. if(isNaN(stateNumber) || stateNumber <= 0 || stateNumber > panelCount || Math.round(stateNumber) != stateNumber) return $ax.action.fireAnimationFromQueue(elementId);
  162. }
  163. } else if(stateInfo.setStateType == 'next' || stateInfo.setStateType == 'previous') {
  164. var info = $ax.deepCopy(stateInfo);
  165. var repeat = info.repeat;
  166. // Only map it, if repeat exists.
  167. if(typeof (repeat) == 'number') _repeatPanelMap[elementId] = info;
  168. return _progessPanelState(elementId, info);
  169. }
  170. delete _repeatPanelMap[elementId];
  171. // If setting to current (to stop repeat) break here
  172. if(stateInfo.setStateType == 'current') return $ax.action.fireAnimationFromQueue(elementId);
  173. $ax('#' + elementId).SetPanelState(stateNumber, stateInfo.options, stateInfo.showWhenSet);
  174. });
  175. })(elementId, stateInfo);
  176. }
  177. }
  178. _dispatchAction(eventInfo, actions, index + 1);
  179. };
  180. var _progessPanelState = function(id, info) {
  181. var direction = info.setStateType;
  182. var loop = info.loop;
  183. var repeat = info.repeat;
  184. var options = info.options;
  185. var hasRepeat = typeof (repeat) == 'number';
  186. var currentStateId = $ax.visibility.GetPanelState(id);
  187. var stateNumber = '';
  188. if(currentStateId != '') {
  189. currentStateId = $ax.repeater.getScriptIdFromElementId(currentStateId);
  190. var currentStateNumber = Number(currentStateId.substr(currentStateId.indexOf('state') + 5));
  191. if(direction == "next") {
  192. stateNumber = currentStateNumber + 2;
  193. if(stateNumber > $('#' + id).children().length) {
  194. if(loop) stateNumber = 1;
  195. else {
  196. delete _repeatPanelMap[id];
  197. return $ax.action.fireAnimationFromQueue(id);
  198. }
  199. }
  200. } else if(direction == "previous") {
  201. stateNumber = currentStateNumber;
  202. if(stateNumber <= 0) {
  203. if(loop) stateNumber = $('#' + id).children().length;
  204. else {
  205. delete _repeatPanelMap[id];
  206. return $ax.action.fireAnimationFromQueue(id);
  207. }
  208. }
  209. }
  210. $ax('#' + id).SetPanelState(stateNumber, options, info.showWhenSet);
  211. if(hasRepeat) {
  212. var animate = options && options.animateIn;
  213. if(animate && animate.easing && animate.easing != 'none' && animate.duration > repeat) repeat = animate.duration;
  214. animate = options && options.animateOut;
  215. if(animate && animate.easing && animate.easing != 'none' && animate.duration > repeat) repeat = animate.duration;
  216. window.setTimeout(function() {
  217. // Either new repeat, or no repeat anymore.
  218. if(_repeatPanelMap[id] != info) return;
  219. _addAnimation(id, function() {
  220. _progessPanelState(id, info);
  221. });
  222. }, repeat);
  223. } else delete _repeatPanelMap[id];
  224. }
  225. };
  226. _actionHandlers.fadeWidget = function(eventInfo, actions, index) {
  227. var action = actions[index];
  228. for(var i = 0; i < action.objectsToFades.length; i++) {
  229. var fadeInfo = action.objectsToFades[i].fadeInfo;
  230. var elementIds = $ax.getElementIdsFromPath(action.objectsToFades[i].objectPath, eventInfo);
  231. for(var j = 0; j < elementIds.length; j++) {
  232. var elementId = elementIds[j];
  233. // Need new scope for elementId and info
  234. (function(elementId, fadeInfo) {
  235. _addAnimation(elementId, function() {
  236. if(fadeInfo.fadeType == "hide") {
  237. $ax('#' + elementId).hide(fadeInfo.options);
  238. } else if(fadeInfo.fadeType == "show") {
  239. $ax('#' + elementId).show(fadeInfo.options, eventInfo);
  240. } else if(fadeInfo.fadeType == "toggle") {
  241. $ax('#' + elementId).toggleVisibility(fadeInfo.options);
  242. }
  243. });
  244. })(elementId, fadeInfo);
  245. }
  246. }
  247. _dispatchAction(eventInfo, actions, index + 1);
  248. };
  249. _actionHandlers.moveWidget = function(eventInfo, actions, index) {
  250. var action = actions[index];
  251. for(var i = 0; i < action.objectsToMoves.length; i++) {
  252. var moveInfo = action.objectsToMoves[i].moveInfo;
  253. var elementIds = $ax.getElementIdsFromPath(action.objectsToMoves[i].objectPath, eventInfo);
  254. for(var j = 0; j < elementIds.length; j++) {
  255. var elementId = elementIds[j];
  256. // Need new scope for elementId and info
  257. (function(elementId, moveInfo) {
  258. var oldTarget = eventInfo.targetElement;
  259. eventInfo.targetElement = elementId;
  260. var xValue = $ax.expr.evaluateExpr(moveInfo.xValue, eventInfo);
  261. var yValue = $ax.expr.evaluateExpr(moveInfo.yValue, eventInfo);
  262. eventInfo.targetElement = oldTarget;
  263. var widgetDragInfo = eventInfo.dragInfo;
  264. _addAnimation(elementId, function() {
  265. if(moveInfo.moveType == "location") {
  266. $ax('#' + elementId).moveTo(xValue, yValue, moveInfo.options);
  267. } else if(moveInfo.moveType == "delta") {
  268. $ax('#' + elementId).moveBy(xValue, yValue, moveInfo.options);
  269. } else if(moveInfo.moveType == "drag") {
  270. $ax('#' + elementId).moveBy(widgetDragInfo.xDelta, widgetDragInfo.yDelta, moveInfo.options);
  271. } else if(moveInfo.moveType == "dragX") {
  272. $ax('#' + elementId).moveBy(widgetDragInfo.xDelta, 0, moveInfo.options);
  273. } else if(moveInfo.moveType == "dragY") {
  274. $ax('#' + elementId).moveBy(0, widgetDragInfo.yDelta, moveInfo.options);
  275. } else if(moveInfo.moveType == "locationBeforeDrag") {
  276. var loc = widgetDragInfo.movedWidgets[elementId];
  277. if(loc) $ax('#' + elementId).moveTo(loc.x, loc.y, moveInfo.options);
  278. else _fireAnimationFromQueue(elementId);
  279. } else if(moveInfo.moveType == "withThis") {
  280. var widgetMoveInfo = $ax.move.GetWidgetMoveInfo();
  281. var srcElementId = $ax.getElementIdsFromEventAndScriptId(eventInfo, eventInfo.srcElement)[0];
  282. var delta = widgetMoveInfo[srcElementId];
  283. $ax('#' + elementId).moveBy(delta.x, delta.y, delta.options);
  284. }
  285. });
  286. })(elementId, moveInfo);
  287. }
  288. }
  289. _dispatchAction(eventInfo, actions, index + 1);
  290. };
  291. _actionHandlers.setWidgetSize = function(eventInfo, actions, index) {
  292. var action = actions[index];
  293. for(var i = 0; i < action.objectsToResize.length; i++) {
  294. var resizeInfo = action.objectsToResize[i].sizeInfo;
  295. var elementIds = $ax.getElementIdsFromPath(action.objectsToResize[i].objectPath, eventInfo);
  296. for(var j = 0; j < elementIds.length; j++) {
  297. var elementId = elementIds[j];
  298. // Need new scope for elementId and info
  299. (function(elementId, resizeInfo) {
  300. var oldTarget = eventInfo.targetElement;
  301. eventInfo.targetElement = elementId;
  302. var width = $ax.expr.evaluateExpr(resizeInfo.width, eventInfo);
  303. var height = $ax.expr.evaluateExpr(resizeInfo.height, eventInfo);
  304. eventInfo.targetElement = oldTarget;
  305. // TODO:[bf] Does this merit it's own file? Is there another file it should be refactored out to? Just refactored out to another function?
  306. _addAnimation(elementId, function() {
  307. var query = $jobj(elementId);
  308. // Get the current width and height
  309. var oldWidth = query.css('width');
  310. oldWidth = Number(oldWidth && oldWidth.substring(0, oldWidth.length - 2));
  311. var oldHeight = query.css('height');
  312. oldHeight = Number(oldHeight && oldHeight.substring(0, oldHeight.length - 2));
  313. // If either one is not a number, use the old value
  314. width = width != "" ? Number(width) : oldWidth;
  315. height = height != "" ? Number(height) : oldHeight;
  316. width = isNaN(width) ? oldWidth : width;
  317. height = isNaN(height) ? oldHeight : height;
  318. // can't be negative
  319. width = Math.max(width, 0);
  320. height = Math.max(height, 0);
  321. if(height == oldHeight && width == oldWidth) {
  322. _fireAnimationFromQueue(elementId);
  323. return;
  324. }
  325. var css = { width: width, height: height };
  326. var obj = $obj(elementId);
  327. if(obj.percentWidth) css = { height: height };
  328. // No longer fitToContent, calculate additional styling that needs to be done.
  329. $ax.dynamicPanelManager.setFitToContentCss(elementId, false, oldWidth, oldHeight);
  330. var easing = resizeInfo.easing || 'none';
  331. var duration = resizeInfo.duration || 0;
  332. var stateCss = $ax.deepCopy(css);
  333. // This will move panel if fixed. The callback will make sure resizing ends there.
  334. if((obj.fixedHorizontal && obj.fixedHorizontal == 'center') || (obj.fixedVertical && obj.fixedVertical == 'middle')) {
  335. var loc = $ax.dynamicPanelManager.getFixedPosition(elementId, oldWidth, oldHeight, width, height);
  336. if(loc) {
  337. if(loc[0] != 0 && !$ax.dynamicPanelManager.isPercentWidthPanel(obj)) css['margin-left'] = '+=' + loc[0];
  338. if(loc[1] != 0) css['margin-top'] = '+=' + loc[1];
  339. }
  340. }
  341. var onComplete = function() {
  342. $ax.flyoutManager.updateFlyout(elementId);
  343. $ax.dynamicPanelManager.fitParentPanel(elementId);
  344. $ax.dynamicPanelManager.updatePanelPercentWidth(elementId);
  345. $ax.dynamicPanelManager.updatePanelContentPercentWidth(elementId);
  346. $ax.event.raiseSyntheticEvent(elementId, 'onResize');
  347. _fireAnimationFromQueue(elementId);
  348. };
  349. // This does the resize animation. Moving is handled elsewhere.
  350. if(easing == 'none') {
  351. query.animate(css, 0);
  352. query.children().animate(stateCss, 0);
  353. onComplete();
  354. } else {
  355. query.children().animate(stateCss, duration, easing);
  356. query.animate(css, duration, easing, onComplete);
  357. }
  358. });
  359. })(elementId, resizeInfo);
  360. }
  361. }
  362. _dispatchAction(eventInfo, actions, index + 1);
  363. };
  364. _actionHandlers.setPanelOrder = function(eventInfo, actions, index) {
  365. var action = actions[index];
  366. for(var i = 0; i < action.panelPaths.length; i++) {
  367. var func = action.panelPaths[i].setOrderInfo.bringToFront ? 'bringToFront' : 'sendToBack';
  368. var elementIds = $ax.getElementIdsFromPath(action.panelPaths[i].panelPath, eventInfo);
  369. for(var j = 0; j < elementIds.length; j++) $ax('#' + elementIds[j])[func]();
  370. }
  371. _dispatchAction(eventInfo, actions, index + 1);
  372. };
  373. _actionHandlers.modifyDataSetEditItems = function(eventInfo, actions, index) {
  374. var action = actions[index];
  375. var add = action.repeatersToAddTo;
  376. var repeaters = add || action.repeatersToRemoveFrom;
  377. var itemId;
  378. for(var i = 0; i < repeaters.length; i++) {
  379. var data = repeaters[i];
  380. // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters
  381. var id = $ax.getElementIdsFromPath(data.path, eventInfo)[0];
  382. if(data.addType == 'this') {
  383. var scriptId = $ax.repeater.getScriptIdFromElementId(eventInfo.srcElement);
  384. itemId = $ax.repeater.getItemIdFromElementId(eventInfo.srcElement);
  385. var repeaterId = $ax.getParentRepeaterFromScriptId(scriptId);
  386. if(add) $ax.repeater.addEditItems(repeaterId, [itemId]);
  387. else $ax.repeater.removeEditItems(repeaterId, [itemId]);
  388. } else if(data.addType == 'all') {
  389. var allItems = $ax.repeater.getAllItemIds(id);
  390. if(add) $ax.repeater.addEditItems(id, allItems);
  391. else $ax.repeater.removeEditItems(id, allItems);
  392. } else {
  393. var oldTarget = eventInfo.targetElement;
  394. var itemIds = $ax.repeater.getAllItemIds(id);
  395. var itemIdsToAdd = [];
  396. for(var j = 0; j < itemIds.length; j++) {
  397. itemId = itemIds[j];
  398. eventInfo.targetElement = $ax.repeater.createElementId(id, itemId);
  399. if($ax.expr.evaluateExpr(data.query, eventInfo) == "true") {
  400. itemIdsToAdd[itemIdsToAdd.length] = String(itemId);
  401. }
  402. eventInfo.targetElement = oldTarget;
  403. }
  404. if(add) $ax.repeater.addEditItems(id, itemIdsToAdd);
  405. else $ax.repeater.removeEditItems(id, itemIdsToAdd);
  406. }
  407. }
  408. _dispatchAction(eventInfo, actions, index + 1);
  409. };
  410. _action.repeaterInfoNames = { addItemsToDataSet: 'dataSetsToAddTo', deleteItemsFromDataSet: 'dataSetItemsToRemove', updateItemsInDataSet: 'dataSetsToUpdate',
  411. addFilterToRepeater: 'repeatersToAddFilter', removeFilterFromRepeater: 'repeatersToRemoveFilter',
  412. addSortToRepeater: 'repeaterToAddSort', removeSortFromRepeater: 'repeaterToRemoveSort',
  413. setRepeaterToPage: 'repeatersToSetPage', setItemsPerRepeaterPage: 'repeatersToSetItemCount'
  414. };
  415. _actionHandlers.addItemsToDataSet = function(eventInfo, actions, index) {
  416. var action = actions[index];
  417. for(var i = 0; i < action.dataSetsToAddTo.length; i++) {
  418. var datasetInfo = action.dataSetsToAddTo[i];
  419. // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters
  420. var id = $ax.getElementIdsFromPath(datasetInfo.path, eventInfo)[0];
  421. if(_ignoreAction(id)) continue;
  422. var dataset = datasetInfo.data;
  423. for(var j = 0; j < dataset.length; j++) $ax.repeater.addItem(id, $ax.deepCopy(dataset[j]), eventInfo);
  424. if(dataset.length) _addRefresh(id);
  425. }
  426. _dispatchAction(eventInfo, actions, index + 1);
  427. };
  428. _actionHandlers.deleteItemsFromDataSet = function(eventInfo, actions, index) {
  429. var action = actions[index];
  430. for(var i = 0; i < action.dataSetItemsToRemove.length; i++) {
  431. // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters
  432. var deleteInfo = action.dataSetItemsToRemove[i];
  433. var id = $ax.getElementIdsFromPath(deleteInfo.path, eventInfo)[0];
  434. if(_ignoreAction(id)) continue;
  435. $ax.repeater.deleteItems(id, eventInfo, deleteInfo.type, deleteInfo.rule);
  436. _addRefresh(id);
  437. }
  438. _dispatchAction(eventInfo, actions, index + 1);
  439. };
  440. _actionHandlers.updateItemsInDataSet = function(eventInfo, actions, index) {
  441. var action = actions[index];
  442. for(var i = 0; i < action.dataSetsToUpdate.length; i++) {
  443. var dataSet = action.dataSetsToUpdate[i];
  444. // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters
  445. var id = $ax.getElementIdsFromPath(dataSet.path, eventInfo)[0];
  446. if(_ignoreAction(id)) continue;
  447. $ax.repeater.updateEditItems(id, dataSet.props, eventInfo, dataSet.type, dataSet.rule);
  448. _addRefresh(id);
  449. }
  450. _dispatchAction(eventInfo, actions, index + 1);
  451. };
  452. _actionHandlers.setRepeaterToDataSet = function(eventInfo, actions, index) {
  453. var action = actions[index];
  454. for(var i = 0; i < action.repeatersToSet.length; i++) {
  455. var setRepeaterInfo = action.repeatersToSet[i];
  456. // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters
  457. var id = $ax.getElementIdsFromPath(setRepeaterInfo.path, eventInfo)[0];
  458. $ax.repeater.setDataSet(id, setRepeaterInfo.localDataSetId);
  459. }
  460. _dispatchAction(eventInfo, actions, index + 1);
  461. };
  462. _actionHandlers.addFilterToRepeater = function(eventInfo, actions, index) {
  463. var action = actions[index];
  464. for(var i = 0; i < action.repeatersToAddFilter.length; i++) {
  465. var addFilterInfo = action.repeatersToAddFilter[i];
  466. // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters
  467. var id = $ax.getElementIdsFromPath(addFilterInfo.path, eventInfo)[0];
  468. if(_ignoreAction(id)) continue;
  469. $ax.repeater.addFilter(id, addFilterInfo.label, addFilterInfo.filter, eventInfo.srcElement);
  470. _addRefresh(id);
  471. }
  472. _dispatchAction(eventInfo, actions, index + 1);
  473. };
  474. _actionHandlers.removeFilterFromRepeater = function(eventInfo, actions, index) {
  475. var action = actions[index];
  476. for(var i = 0; i < action.repeatersToRemoveFilter.length; i++) {
  477. var removeFilterInfo = action.repeatersToRemoveFilter[i];
  478. // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters
  479. var id = $ax.getElementIdsFromPath(removeFilterInfo.path, eventInfo)[0];
  480. if(_ignoreAction(id)) continue;
  481. if(removeFilterInfo.removeAll) $ax.repeater.removeFilter(id);
  482. else if(removeFilterInfo.filterName != '') {
  483. $ax.repeater.removeFilter(id, removeFilterInfo.filterName);
  484. }
  485. _addRefresh(id);
  486. }
  487. _dispatchAction(eventInfo, actions, index + 1);
  488. };
  489. _actionHandlers.addSortToRepeater = function(eventInfo, actions, index) {
  490. var action = actions[index];
  491. for(var i = 0; i < action.repeatersToAddSort.length; i++) {
  492. var addSortInfo = action.repeatersToAddSort[i];
  493. // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters
  494. var id = $ax.getElementIdsFromPath(addSortInfo.path, eventInfo)[0];
  495. if(_ignoreAction(id)) continue;
  496. $ax.repeater.addSort(id, addSortInfo.label, addSortInfo.columnName, addSortInfo.ascending, addSortInfo.toggle, addSortInfo.sortType);
  497. _addRefresh(id);
  498. }
  499. _dispatchAction(eventInfo, actions, index + 1);
  500. };
  501. _actionHandlers.removeSortFromRepeater = function(eventInfo, actions, index) {
  502. var action = actions[index];
  503. for(var i = 0; i < action.repeatersToRemoveSort.length; i++) {
  504. var removeSortInfo = action.repeatersToRemoveSort[i];
  505. // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters
  506. var id = $ax.getElementIdsFromPath(removeSortInfo.path, eventInfo)[0];
  507. if(_ignoreAction(id)) continue;
  508. if(removeSortInfo.removeAll) $ax.repeater.removeSort(id);
  509. else if(removeSortInfo.sortName != '') $ax.repeater.removeSort(id, removeSortInfo.sortName);
  510. _addRefresh(id);
  511. }
  512. _dispatchAction(eventInfo, actions, index + 1);
  513. };
  514. _actionHandlers.setRepeaterToPage = function(eventInfo, actions, index) {
  515. var action = actions[index];
  516. for(var i = 0; i < action.repeatersToSetPage.length; i++) {
  517. var setPageInfo = action.repeatersToSetPage[i];
  518. // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters
  519. var id = $ax.getElementIdsFromPath(setPageInfo.path, eventInfo)[0];
  520. if(_ignoreAction(id)) continue;
  521. var oldTarget = eventInfo.targetElement;
  522. eventInfo.targetElement = id;
  523. $ax.repeater.setRepeaterToPage(id, setPageInfo.pageType, setPageInfo.pageValue, eventInfo);
  524. eventInfo.targetElement = oldTarget;
  525. _addRefresh(id);
  526. }
  527. _dispatchAction(eventInfo, actions, index + 1);
  528. };
  529. _actionHandlers.setItemsPerRepeaterPage = function(eventInfo, actions, index) {
  530. var action = actions[index];
  531. for(var i = 0; i < action.repeatersToSetItemCount.length; i++) {
  532. var setItemCountInfo = action.repeatersToSetItemCount[i];
  533. // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters
  534. var id = $ax.getElementIdsFromPath(setItemCountInfo.path, eventInfo)[0];
  535. if(_ignoreAction(id)) continue;
  536. if(setItemCountInfo.noLimit) $ax.repeater.setNoItemLimit(id);
  537. else $ax.repeater.setItemLimit(id, setItemCountInfo.itemCountValue, eventInfo);
  538. _addRefresh(id);
  539. }
  540. _dispatchAction(eventInfo, actions, index + 1);
  541. };
  542. _actionHandlers.refreshRepeater = function(eventInfo, actions, index) {
  543. // We use this as a psudo action now.
  544. var action = actions[index];
  545. for(var i = 0; i < action.repeatersToRefresh.length; i++) {
  546. _tryRefreshRepeater($ax.getElementIdsFromPath(action.repeatersToRefresh[i], eventInfo)[i], eventInfo);
  547. }
  548. _dispatchAction(eventInfo, actions, index + 1);
  549. };
  550. var _tryRefreshRepeater = function(id, eventInfo) {
  551. var idIndex = _repeatersToRefresh.indexOf(id);
  552. if(idIndex == -1) return;
  553. $ax.splice(_repeatersToRefresh, idIndex, 1);
  554. $ax.repeater.refreshRepeater(id, eventInfo);
  555. };
  556. _action.tryRefreshRepeaters = function(ids, eventInfo) {
  557. for(var i = 0; i < ids.length; i++) _tryRefreshRepeater(ids[i], eventInfo);
  558. };
  559. _actionHandlers.scrollToWidget = function(eventInfo, actions, index) {
  560. var action = actions[index];
  561. var elementIds = $ax.getElementIdsFromPath(action.objectPath, eventInfo);
  562. if(elementIds.length > 0) $ax('#' + elementIds[0]).scroll(action.options);
  563. _dispatchAction(eventInfo, actions, index + 1);
  564. };
  565. _actionHandlers.enableDisableWidgets = function(eventInfo, actions, index) {
  566. var action = actions[index];
  567. for(var i = 0; i < action.pathToInfo.length; i++) {
  568. var elementIds = $ax.getElementIdsFromPath(action.pathToInfo[i].objectPath, eventInfo);
  569. var enable = action.pathToInfo[i].enableDisableInfo.enable;
  570. for(var j = 0; j < elementIds.length; j++) $ax('#' + elementIds[j]).enabled(enable);
  571. }
  572. _dispatchAction(eventInfo, actions, index + 1);
  573. };
  574. _actionHandlers.setImage = function(eventInfo, actions, index) {
  575. var oldTarget = eventInfo.targetElement;
  576. var action = actions[index];
  577. var view = $ax.adaptive.currentViewId;
  578. eventInfo.image = true;
  579. for(var i = 0; i < action.imagesToSet.length; i++) {
  580. var imgInfo = action.imagesToSet[i];
  581. imgInfo = view ? imgInfo.adaptive[view] : imgInfo.base;
  582. var elementIds = $ax.getElementIdsFromPath(action.imagesToSet[i].objectPath, eventInfo);
  583. for(var j = 0; j < elementIds.length; j++) {
  584. var elementId = elementIds[j];
  585. eventInfo.targetElement = elementId;
  586. var evaluatedImgs = _evaluateImages(imgInfo, eventInfo);
  587. var img = evaluatedImgs.normal;
  588. if($ax.style.IsWidgetDisabled(elementId)) {
  589. if(imgInfo.disabled) img = evaluatedImgs.disabled;
  590. } else if($ax.style.IsWidgetSelected(elementId)) {
  591. if(imgInfo.selected) img = evaluatedImgs.selected;
  592. } else if($ax.event.mouseDownObjectId == elementId && imgInfo.mouseDown) img = evaluatedImgs.mouseDown;
  593. else if($ax.event.mouseOverIds.indexOf(elementId) != -1 && imgInfo.mouseOver) {
  594. img = evaluatedImgs.mouseOver;
  595. //Update mouseOverObjectId
  596. var currIndex = $ax.event.mouseOverIds.indexOf($ax.event.mouseOverObjectId);
  597. var imgIndex = $ax.event.mouseOverIds.indexOf(elementId);
  598. if(currIndex < imgIndex) $ax.event.mouseOverObjectId = elementId;
  599. }
  600. // $('#' + $ax.repeater.applySuffixToElementId(elementId, '_img')).attr('src', img);
  601. $jobj($ax.style.GetImageIdFromShape(elementId)).attr('src', img);
  602. //Set up overrides
  603. $ax.style.mapElementIdToImageOverrides(elementId, evaluatedImgs);
  604. $ax.style.updateElementIdImageStyle(elementId);
  605. }
  606. }
  607. eventInfo.targetElement = oldTarget;
  608. eventInfo.image = false;
  609. _dispatchAction(eventInfo, actions, index + 1);
  610. };
  611. var _evaluateImages = function(imgInfo, eventInfo) {
  612. var retVal = {};
  613. for(var state in imgInfo) {
  614. if(!imgInfo.hasOwnProperty(state)) continue;
  615. var img = imgInfo[state].path || $ax.expr.evaluateExpr(imgInfo[state].literal, eventInfo);
  616. if(!img) img = $axure.utils.getTransparentGifPath();
  617. retVal[state] = img;
  618. }
  619. return retVal;
  620. };
  621. $ax.clearRepeaterImageOverrides = function(repeaterId) {
  622. var childIds = $ax.getChildElementIdsForRepeater(repeaterId);
  623. for(var i = childIds; i < childIds.length; i++) $ax.style.deleteElementIdToImageOverride(childIds[i]);
  624. };
  625. _actionHandlers.setFocusOnWidget = function(eventInfo, actions, index) {
  626. var action = actions[index];
  627. if(action.objectPaths.length > 0) {
  628. var elementIds = $ax.getElementIdsFromPath(action.objectPaths[0], eventInfo);
  629. if(elementIds.length > 0) {
  630. $ax('#' + elementIds[0]).focus();
  631. }
  632. }
  633. _dispatchAction(eventInfo, actions, index + 1);
  634. };
  635. _actionHandlers.expandCollapseTree = function(eventInfo, actions, index) {
  636. var action = actions[index];
  637. for(var i = 0; i < action.pathToInfo.length; i++) {
  638. var pair = action.pathToInfo[i];
  639. var elementIds = $ax.getElementIdsFromPath(pair.treeNodePath, eventInfo);
  640. for(var j = 0; j < elementIds.length; j++) $ax('#' + elementIds[j]).expanded(pair.expandCollapseInfo.expand);
  641. }
  642. _dispatchAction(eventInfo, actions, index + 1);
  643. };
  644. _actionHandlers.other = function(eventInfo, actions, index) {
  645. var action = actions[index];
  646. $ax.navigate({
  647. url: $axure.utils.getOtherPath() + "#other=" + encodeURI(action.otherDescription),
  648. target: "popup",
  649. includeVariables: false,
  650. popupOptions: action.popup
  651. });
  652. _dispatchAction(eventInfo, actions, index + 1);
  653. };
  654. _actionHandlers.raiseEvent = function(eventInfo, actions, index) {
  655. var action = actions[index];
  656. //look for the nearest element id
  657. if(eventInfo.srcElement) {
  658. var objId = eventInfo.srcElement;
  659. var obj = $ax.getObjectFromElementId(objId);
  660. var rdoId = $ax.getRdoParentFromElementId(objId);
  661. var rdo = $ax.getObjectFromElementId(rdoId);
  662. // Check if rdo should be this
  663. var oldIsMasterEvent = eventInfo.isMasterEvent;
  664. if(obj.type == 'referenceDiagramObject' && eventInfo.isMasterEvent) {
  665. rdoId = objId;
  666. rdo = obj;
  667. // It is now an rdo event
  668. eventInfo.isMasterEvent = false;
  669. }
  670. for(var i = 0; i < action.raisedEvents.length; i++) {
  671. var raisedEvent = action.raisedEvents[i];
  672. var oldRaisedId = eventInfo.raisedId;
  673. var event = rdo.interactionMap && rdo.interactionMap && rdo.interactionMap.raised[raisedEvent];
  674. // raised event will optimize away if it doesn't do anything. Whole interaction map may be optimized away as well.
  675. if(event) {
  676. var oldSrc = eventInfo.srcElement;
  677. eventInfo.srcElement = rdoId;
  678. eventInfo.raisedId = rdoId;
  679. $ax.event.handleEvent(rdoId, eventInfo, event, false, true);
  680. eventInfo.raisedId = oldRaisedId;
  681. eventInfo.srcElement = oldSrc;
  682. }
  683. }
  684. eventInfo.isMasterEvent = oldIsMasterEvent;
  685. }
  686. _dispatchAction(eventInfo, actions, index + 1);
  687. };
  688. });