expr.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. // ******* Expr MANAGER ******** //
  2. $axure.internal(function($ax) {
  3. var _expr = $ax.expr = {};
  4. var _binOpHandlers = {
  5. '&&': function(left, right) { return _binOpOverride(left, right, function(left) { return $ax.getBool(left) && $ax.getBool(right()); }); },
  6. '||': function(left, right) { return _binOpOverride(left, right, function(left) { return $ax.getBool(left) || $ax.getBool(right()); }); },
  7. '==': function(left, right) { return isEqual(left, right, true); },
  8. '!=': function(left, right) { return !isEqual(left, right, true); },
  9. '>': function(left, right) { return _binOpNum(left, right, function(left, right) { return left > right; }); },
  10. '<': function(left, right) { return _binOpNum(left, right, function(left, right) { return left < right; }); },
  11. '>=': function(left, right) { return _binOpNum(left, right, function(left, right) { return left >= right; }); },
  12. '<=': function(left, right) { return _binOpNum(left, right, function(left, right) { return left <= right; }); }
  13. };
  14. var checkOps = function(left, right) {
  15. return left == undefined || right == undefined;
  16. };
  17. var isEqual = function (left, right, isFunction) {
  18. if (isFunction) {
  19. //if left and right is function, then get the value
  20. //otherwise left and right should be already the value we want
  21. left = left();
  22. right = right();
  23. }
  24. if(checkOps(left, right)) return false;
  25. if(left instanceof Date && right instanceof Date) {
  26. if(left.getMilliseconds() != right.getMilliseconds()) return false;
  27. if(left.getSeconds() != right.getSeconds()) return false;
  28. if(left.getMinutes() != right.getMinutes()) return false;
  29. if(left.getHours() != right.getHours()) return false;
  30. if(left.getDate() != right.getDate()) return false;
  31. if(left.getMonth() != right.getMonth()) return false;
  32. if(left.getYear() != right.getYear()) return false;
  33. return true;
  34. }
  35. if(left instanceof Object && right instanceof Object) {
  36. var prop;
  37. // Go through all of lefts properties and compare them to rights.
  38. for(prop in left) {
  39. if(!left.hasOwnProperty(prop)) continue;
  40. // If left has a property that the right doesn't they are not equal.
  41. if(!right.hasOwnProperty(prop)) return false;
  42. // If any of their properties are not equal, they are not equal.
  43. if(!isEqual(left[prop], right[prop], false)) return false;
  44. }
  45. for(prop in right) {
  46. // final check to make sure right doesn't have some extra properties that make them not equal.
  47. if(left.hasOwnProperty(prop) != right.hasOwnProperty(prop)) return false;
  48. }
  49. return true;
  50. }
  51. return $ax.getBool(left) == $ax.getBool(right);
  52. };
  53. var _binOpOverride = function(left, right, func) {
  54. left = left();
  55. if(left == undefined) return false;
  56. var res = func(left, right);
  57. return res == undefined ? false : res;
  58. };
  59. var _binOpNum = function(left, right, func) {
  60. var left = left();
  61. var right = right();
  62. if(checkOps(left, right)) return false;
  63. return func(left, Number(right));
  64. };
  65. var _exprHandlers = {};
  66. _exprHandlers.array = function(expr, eventInfo) {
  67. var returnVal = [];
  68. for(var i = 0; i < expr.items.length; i++) {
  69. returnVal[returnVal.length] = _evaluateExpr(expr.items[i], eventInfo);
  70. }
  71. return returnVal;
  72. };
  73. _exprHandlers.binaryOp = function(expr, eventInfo) {
  74. var left = function() { return expr.leftExpr && _evaluateExpr(expr.leftExpr, eventInfo); };
  75. var right = function() { return expr.rightExpr && _evaluateExpr(expr.rightExpr, eventInfo); };
  76. if(left == undefined || right == undefined) return false;
  77. return _binOpHandlers[expr.op](left, right);
  78. };
  79. _exprHandlers.block = function(expr, eventInfo) {
  80. var subExprs = expr.subExprs;
  81. for(var i = 0; i < subExprs.length; i++) {
  82. _evaluateExpr(subExprs[i], eventInfo); //ignore the result
  83. }
  84. };
  85. _exprHandlers.booleanLiteral = function(expr) {
  86. return expr.value;
  87. };
  88. _exprHandlers.nullLiteral = function() { return null; };
  89. _exprHandlers.pathLiteral = function(expr, eventInfo) {
  90. if(expr.isThis) return [eventInfo.srcElement];
  91. if(expr.isFocused && window.lastFocusedControl) {
  92. $ax('#' + window.lastFocusedControl).focus();
  93. return [window.lastFocusedControl];
  94. }
  95. if(expr.isTarget) return [eventInfo.targetElement];
  96. return $ax.getElementIdsFromPath(expr.value, eventInfo);
  97. };
  98. _exprHandlers.panelDiagramLiteral = function(expr, eventInfo) {
  99. var elementIds = $ax.getElementIdsFromPath(expr.panelPath, eventInfo);
  100. var elementIdsWithSuffix = [];
  101. var suffix = '_state' + expr.panelIndex;
  102. for(var i = 0; i < elementIds.length; i++) {
  103. elementIdsWithSuffix[i] = $ax.repeater.applySuffixToElementId(elementIds[i], suffix);
  104. }
  105. return String($jobj(elementIdsWithSuffix).data('label'));
  106. };
  107. _exprHandlers.fcall = function(expr, eventInfo) {
  108. var oldTarget = eventInfo.targetElement;
  109. var targets = [];
  110. var fcallArgs = [];
  111. var exprArgs = expr.arguments;
  112. for(var i = 0; i < expr.arguments.length; i++) {
  113. var exprArg = exprArgs[i];
  114. var fcallArg = '';
  115. if(targets.length) {
  116. for(var j = 0; j < targets.length; j++) {
  117. if(exprArg == null) {
  118. fcallArgs[j][i] = null;
  119. continue;
  120. }
  121. eventInfo.targetElement = targets[j];
  122. fcallArg = _evaluateExpr(exprArg, eventInfo);
  123. if(typeof (fcallArg) == 'undefined') return '';
  124. fcallArgs[j][i] = fcallArg;
  125. }
  126. } else {
  127. if(exprArg == null) {
  128. fcallArgs[i] = null;
  129. continue;
  130. }
  131. fcallArg = _evaluateExpr(exprArg, eventInfo);
  132. if(typeof (fcallArg) == 'undefined') return '';
  133. fcallArgs[i] = fcallArg;
  134. }
  135. // We do support null exprArgs...
  136. // TODO: This makes 2 assumptions that may change in the future. 1. The pathLiteral is the always the first arg. 2. there is always only 1 pathLiteral
  137. if(exprArg && exprArg.exprType == 'pathLiteral') {
  138. targets = fcallArg;
  139. // fcallArgs is now an array of an array of args
  140. for(j = 0; j < targets.length; j++) fcallArgs[j] = [[fcallArg[j]]];
  141. }
  142. }
  143. // we want to preserve the target element from outside this function.
  144. eventInfo.targetElement = oldTarget;
  145. var retval = '';
  146. if(targets.length) {
  147. // Go backwards so retval is the first item.
  148. for(i = targets.length - 1; i >= 0; i--) {
  149. var args = fcallArgs[i];
  150. // Add event info to the end
  151. args[args.length] = eventInfo;
  152. retval = _exprFunctions[expr.functionName].apply(this, args);
  153. }
  154. } else fcallArgs[fcallArgs.length] = eventInfo;
  155. return targets.length ? retval : _exprFunctions[expr.functionName].apply(this, fcallArgs);
  156. };
  157. _exprHandlers.globalVariableLiteral = function(expr) {
  158. return expr.variableName;
  159. };
  160. _exprHandlers.keyPressLiteral = function(expr) {
  161. var keyInfo = {};
  162. keyInfo.keyCode = expr.keyCode;
  163. keyInfo.ctrl = expr.ctrl;
  164. keyInfo.alt = expr.alt;
  165. keyInfo.shift = expr.shift;
  166. return keyInfo;
  167. };
  168. _exprHandlers.adaptiveViewLiteral = function(expr) {
  169. return expr.id;
  170. };
  171. _exprHandlers.optionLiteral = function(expr) {
  172. return expr.value;
  173. }
  174. var _substituteSTOs = function(expr, eventInfo) {
  175. //first evaluate the local variables
  176. var scope = {};
  177. for(var varName in expr.localVariables) {
  178. scope[varName] = $ax.expr.evaluateExpr(expr.localVariables[varName], eventInfo);
  179. }
  180. // TODO: [ben] Date and data object (obj with info for url or image) both need to return non-strings.
  181. var i = 0;
  182. var retval;
  183. var retvalString = expr.value.replace(/\[\[(?!\[)(.*?)\]\](?=\]*)/g, function(match) {
  184. var sto = expr.stos[i++];
  185. if(sto.sto == 'error') return match;
  186. try {
  187. var result = $ax.evaluateSTO(sto, scope, eventInfo);
  188. } catch(e) {
  189. return match;
  190. }
  191. if((result instanceof Object) && i == 1 && expr.value.substring(0, 2) == '[[' &&
  192. expr.value.substring(expr.value.length - 2) == ']]') {
  193. // If the result was an object, this was the first result, and the whole thing was this expresion.
  194. retval = result;
  195. }
  196. return ((result instanceof Object) && (result.label || result.text)) || result;
  197. });
  198. // If more than one group returned, the object is not valid
  199. if(i != 1) retval = false;
  200. return retval || retvalString;
  201. };
  202. _exprHandlers.htmlLiteral = function (expr, eventInfo) {
  203. eventInfo.htmlLiteral = true;
  204. var html = _substituteSTOs(expr, eventInfo);
  205. eventInfo.htmlLiteral = false
  206. return html;
  207. };
  208. _exprHandlers.stringLiteral = function(expr, eventInfo) {
  209. return _substituteSTOs(expr, eventInfo);
  210. };
  211. var _exprFunctions = {};
  212. _exprFunctions.ToLowerCase = function (value) {
  213. let str = _exprFunctions.ToString(value);
  214. return str.toLowerCase();
  215. };
  216. _exprFunctions.SetErrorState = function (elementIds, value) {
  217. var toggle = value == 'toggle';
  218. var boolValue = Boolean(value) && value != 'false';
  219. for(var i = 0; i < elementIds.length; i++) {
  220. var query = $ax('#' + elementIds[i]);
  221. query.error(toggle ? !query.error() : boolValue);
  222. }
  223. };
  224. _exprFunctions.SetCheckState = function(elementIds, value) {
  225. var toggle = value == 'toggle';
  226. var boolValue = Boolean(value) && value != 'false';
  227. for(var i = 0; i < elementIds.length; i++) {
  228. var query = $ax('#' + elementIds[i]);
  229. query.selected(toggle ? !query.selected() : boolValue);
  230. }
  231. };
  232. _exprFunctions.SetSelectedOption = function(elementIds, value) {
  233. for(var i = 0; i < elementIds.length; i++) {
  234. var elementId = elementIds[i];
  235. var obj = $jobj($ax.INPUT(elementId));
  236. if(obj.val() == value) return;
  237. obj.val(value);
  238. if($ax.event.HasSelectionChanged($ax.getObjectFromElementId(elementId))) $ax.event.raiseSyntheticEvent(elementId, 'onSelectionChange');
  239. }
  240. };
  241. _exprFunctions.SetGlobalVariableValue = function(varName, value) {
  242. $ax.globalVariableProvider.setVariableValue(varName, value);
  243. };
  244. _exprFunctions.SetWidgetFormText = function(elementIds, value) {
  245. for(var i = 0; i < elementIds.length; i++) {
  246. var elementId = elementIds[i];
  247. var inputId = $ax.repeater.applySuffixToElementId(elementId, '_input');
  248. var obj = $jobj(inputId);
  249. if(obj.val() == value || (value == '' && $ax.placeholderManager.isActive(elementId))) return;
  250. obj.val(value);
  251. $ax.placeholderManager.updatePlaceholder(elementId, !value);
  252. if($ax.event.HasTextChanged($ax.getObjectFromElementId(elementId))) $ax.event.TryFireTextChanged(elementId);
  253. }
  254. };
  255. _exprFunctions.SetFocusedWidgetText = function(elementId, value) {
  256. if(window.lastFocusedControl) {
  257. var elementId = window.lastFocusedControl;
  258. var type = $obj(elementId).type;
  259. if ($ax.public.fn.IsTextBox(type) || $ax.public.fn.IsTextArea(type)) _exprFunctions.SetWidgetFormText([elementId], value);
  260. else _exprFunctions.SetWidgetRichText([elementId], value, true);
  261. }
  262. };
  263. _exprFunctions.GetRtfElementHeight = function(rtfElement) {
  264. if(rtfElement.innerHTML == '') rtfElement.innerHTML = '&nbsp;';
  265. return rtfElement.offsetHeight;
  266. };
  267. _exprFunctions.SetWidgetRichText = function(ids, value, plain) {
  268. // Converts dates, widgetinfo, and the like to strings.
  269. value = _exprFunctions.ToString(value);
  270. //Replace any newlines with line breaks
  271. var finalValue = value.replace(/\r\n/g, '<br>').replace(/\n/g, '<br>');
  272. for(var i = 0; i < ids.length; i++) {
  273. var id = ids[i];
  274. // If calling this on button shape, get the id of the rich text panel inside instead
  275. if($obj(id).type !== $ax.constants.LINK_TYPE) id = $ax.GetTextPanelId(id, true);
  276. var element = window.document.getElementById(id);
  277. $ax.visibility.SetVisible(element, value != '');
  278. $ax.style.transformTextWithVerticalAlignment(id, function() {
  279. var spans = $jobj(id).find('span');
  280. if(plain) {
  281. // Can't set value as text because '<br/>' doesn't actually do a line break
  282. // Can't set vaule as html because it doesn't like '<' and ignores all after it
  283. // Create tags yourself
  284. var lines = value.split(/\r\n|\n/);
  285. //if we are dealing with only one line, just reuse the old one
  286. if(spans.length === 1 && lines.length === 1) {
  287. $(spans[0]).text(value);
  288. return;
  289. }
  290. // Wrap in span and p, style them accordingly.
  291. var span = $('<span></span>');
  292. if(spans.length > 0) {
  293. span.attr('style', $(spans[0]).attr('style'));
  294. span.attr('id', $(spans[0]).attr('id'));
  295. }
  296. if(lines.length == 1) span.text(value);
  297. else {
  298. for(var i = 0; i < lines.length; i++) {
  299. if(i != 0) span.append($('<br />'));
  300. var line = lines[i];
  301. if(line.length == 0) continue;
  302. var subSpan = $('<span />');
  303. subSpan.text(line);
  304. span.append(subSpan);
  305. }
  306. }
  307. var ps = $jobj(id).find('p');
  308. if(ps && ps.length) {
  309. ps[0].innerHTML = $('<div></div>').append(span).html();;
  310. if(ps.length > 1) {
  311. for(var i = 1; i < ps.length; i++) {
  312. $(ps[i]).remove();
  313. }
  314. }
  315. } else {
  316. var p = $('<p></p>');
  317. p.append(span);
  318. element.innerHTML = $('<div></div>').append(p).html();
  319. }
  320. } else element.innerHTML = finalValue;
  321. });
  322. if(!plain) $ax.style.CacheOriginalText(id, true);
  323. autofitWidget(ids[i]);
  324. }
  325. };
  326. var _displayHackStart = function (element) {
  327. var parent = element;
  328. var displays = [];
  329. while (parent) {
  330. if (parent.style.display == 'none') {
  331. displays.push(parent);
  332. //use block to overwrites default hidden objects' display
  333. parent.style.display = 'block';
  334. }
  335. parent = parent.parentElement;
  336. }
  337. return displays;
  338. };
  339. var _displayHackEnd = function (displayChangedList) {
  340. for (var i = 0; i < displayChangedList.length; i++) displayChangedList[i].style.display = 'none';
  341. };
  342. var _autoFitIds = $ax.expr.autoFitIds = {};
  343. _setAutoFitId = $ax.expr.setAutoFitId = function (scriptId, css) {
  344. _autoFitIds[scriptId] = css;
  345. };
  346. $ax.expr.clearAutoFittedIds = function (elementIds) {
  347. for (var i = 0; i < elementIds.length; i++) {
  348. var id = elementIds[i];
  349. delete _autoFitIds[id];
  350. }
  351. };
  352. $ax.expr.updateAutoFitted = function () {
  353. for (var id in _autoFitIds) {
  354. autofitWidget(id);
  355. }
  356. }
  357. var autofitWidget = function (id) {
  358. var obj = $obj(id);
  359. if (obj.autoFitHeight || obj.autoFitWidth) {
  360. var display = _displayHackStart(document.getElementById(id));
  361. var query = $ax('#' + id);
  362. var size = query.size();
  363. var css = {
  364. width: size.width,
  365. height: size.height
  366. };
  367. var textId = $ax.GetTextPanelId(id, true);
  368. var style = $ax.style.computeFullStyle(id, $ax.style.generateState(id), $ax.adaptive.currentViewId);
  369. if (obj.autoFitHeight) {
  370. var newHeight = $('#' + textId).height();
  371. if (style.paddingTop) newHeight += Number(style.paddingTop);
  372. if (style.paddingBottom) newHeight += Number(style.paddingBottom);
  373. if (newHeight - size.height != 0) {
  374. css.height = newHeight;
  375. }
  376. };
  377. if (obj.autoFitWidth) {
  378. var pars = $jobj(id).find('p');
  379. var newWidth = 0;
  380. for (var j = 0; j < pars.length; ++j) {
  381. var spans = $(pars[j]).children('span');
  382. var w = 0;
  383. for (var i = 0; i < spans.length; ++i) {
  384. w += $(spans[i]).width();
  385. }
  386. if (w > newWidth) newWidth = w;
  387. }
  388. if (style.paddingLeft) newWidth += Number(style.paddingLeft);
  389. if (style.paddingRight) newWidth += Number(style.paddingRight);
  390. if (newWidth - size.width != 0) {
  391. css.width = newWidth;
  392. }
  393. };
  394. const deltaWidth = css.width - size.width;
  395. const deltaHeight = css.height - size.height;
  396. if (deltaWidth !== 0 || deltaHeight !== 0) {
  397. query.resize(css, {});
  398. const hAlign = style.horizontalAlignment;
  399. const vAlign = style.verticalAlignment;
  400. let dx = 0;
  401. let dy = 0;
  402. if (hAlign === "right") {
  403. dx = -deltaWidth;
  404. } else if (hAlign === "center") {
  405. dx = -deltaWidth / 2;
  406. }
  407. if (vAlign === "bottom") {
  408. dy = -deltaHeight;
  409. } else if (vAlign === "middle") {
  410. dy = -deltaHeight / 2;
  411. }
  412. if (dx !== 0 || dy !== 0) {
  413. $ax.move.MoveWidget(id, dx, dy, { easing: 'none', duration: 0 }, false, null, true);
  414. }
  415. }
  416. _displayHackEnd(display);
  417. _setAutoFitId(id, css);
  418. }
  419. }
  420. _exprFunctions.GetCheckState = function(ids) {
  421. return $ax('#' + ids[0]).selected();
  422. };
  423. _exprFunctions.GetDisabledState = function (ids) {
  424. return !$ax('#' + ids[0]).enabled();
  425. };
  426. _exprFunctions.GetSelectedOption = function (ids) {
  427. var inputs = $jobj($ax.INPUT(ids[0]));
  428. return inputs.length ? inputs[0].value : '';
  429. };
  430. _exprFunctions.GetErrorState = function (ids) {
  431. return $ax('#' + ids[0]).error();
  432. };
  433. _exprFunctions.GetNum = function(str) {
  434. //Setting a GlobalVariable to some blank text then setting a widget to the value of that variable would result in 0 not ""
  435. //I have fixed this another way so commenting this should be fine now
  436. //if (!str) return "";
  437. return isNaN(str) ? str : Number(str);
  438. };
  439. _exprFunctions.GetGlobalVariableValue = function(id) {
  440. return $ax.globalVariableProvider.getVariableValue(id);
  441. };
  442. _exprFunctions.GetGlobalVariableLength = function(id) {
  443. return _exprFunctions.GetGlobalVariableValue(id).length;
  444. };
  445. _exprFunctions.GetWidgetText = function(ids) {
  446. if($ax.placeholderManager.isActive(ids[0])) return '';
  447. var input = $ax.INPUT(ids[0]);
  448. return $ax('#' + ($jobj(input).length ? input : ids[0])).text();
  449. };
  450. _exprFunctions.GetFocusedWidgetText = function() {
  451. if(window.lastFocusedControl) {
  452. return $ax('#' + window.lastFocusedControl).text();
  453. } else {
  454. return "";
  455. }
  456. };
  457. _exprFunctions.GetWidgetValueLength = function(ids) {
  458. var id = ids[0];
  459. if(!id) return undefined;
  460. if($ax.placeholderManager.isActive(id)) return 0;
  461. var obj = $jobj($ax.INPUT(id));
  462. if(!obj.length) obj = $jobj(id);
  463. var val = obj[0].value || _exprFunctions.GetWidgetText([id]);
  464. return val.length;
  465. };
  466. _exprFunctions.GetPanelState = function(ids) {
  467. var id = ids[0];
  468. if(!id) return undefined;
  469. var stateId = $ax.visibility.GetPanelState(id);
  470. return stateId && String($jobj(stateId).data('label'));
  471. };
  472. _exprFunctions.GetWidgetVisibility = function(ids) {
  473. var id = ids[0];
  474. if(!id) return undefined;
  475. return $ax.visibility.IsIdVisible(id);
  476. };
  477. // ***************** Validation Functions ***************** //
  478. _exprFunctions.IsValueAlpha = function(val) {
  479. var isAlphaRegex = new RegExp("^[a-z\\s]+$", "gi");
  480. return isAlphaRegex.test(val);
  481. };
  482. _exprFunctions.IsValueNumeric = function(val) {
  483. var isNumericRegex = new RegExp("^[0-9,\\.\\s]+$", "gi");
  484. return isNumericRegex.test(val);
  485. };
  486. _exprFunctions.IsValueAlphaNumeric = function(val) {
  487. var isAlphaNumericRegex = new RegExp("^[0-9a-z\\s]+$", "gi");
  488. return isAlphaNumericRegex.test(val);
  489. };
  490. _exprFunctions.IsValueOneOf = function(val, values) {
  491. for(var i = 0; i < values.length; i++) {
  492. var option = values[i];
  493. if(val == option) return true;
  494. }
  495. //by default, return false
  496. return false;
  497. };
  498. _exprFunctions.IsValueNotAlpha = function(val) {
  499. return !_exprFunctions.IsValueAlpha(val);
  500. };
  501. _exprFunctions.IsValueNotNumeric = function(val) {
  502. return !_exprFunctions.IsValueNumeric(val);
  503. };
  504. _exprFunctions.IsValueNotAlphaNumeric = function(val) {
  505. return !_exprFunctions.IsValueAlphaNumeric(val);
  506. };
  507. _exprFunctions.IsValueNotOneOf = function(val, values) {
  508. return !_exprFunctions.IsValueOneOf(val, values);
  509. };
  510. _exprFunctions.GetKeyPressed = function(eventInfo) {
  511. return eventInfo.keyInfo;
  512. };
  513. _exprFunctions.GetCursorRectangles = function() {
  514. var rects = new Object();
  515. rects.lastRect = new $ax.drag.Rectangle($ax.lastMouseLocation.x, $ax.lastMouseLocation.y, 1, 1);
  516. rects.currentRect = new $ax.drag.Rectangle($ax.mouseLocation.x, $ax.mouseLocation.y, 1, 1);
  517. return rects;
  518. };
  519. _exprFunctions.GetWidgetRectangles = function (elementIds, eventInfo) {
  520. var elementId = elementIds[0];
  521. var rects = new Object();
  522. var jObj = $jobj(elementId);
  523. var invalid = jObj.length == 0;
  524. var parent = jObj;
  525. // Or are in valid if no obj can be found, or if it is not visible.
  526. while(parent.length != 0 && !parent.is('body')) {
  527. if(parent.css('display') == 'none') {
  528. invalid = true;
  529. break;
  530. }
  531. parent = parent.parent();
  532. }
  533. if(invalid) {
  534. rects.lastRect = rects.currentRect = new $ax.drag.Rectangle(-1, -1, -1, -1);
  535. return rects;
  536. }
  537. var axObj = $ax('#' + elementId);
  538. var boundingRect = axObj.viewportBoundingRect();
  539. rects.lastRect = new $ax.drag.Rectangle(
  540. boundingRect.left,
  541. boundingRect.top,
  542. boundingRect.width,
  543. boundingRect.height);
  544. //rects.lastRect = new $ax.drag.Rectangle(
  545. // axObj.left(),
  546. // axObj.top(),
  547. // axObj.width(),
  548. // axObj.height());
  549. rects.currentRect = rects.lastRect;
  550. return rects;
  551. };
  552. _exprFunctions.GetWidget = function(elementId) {
  553. return $ax.getWidgetInfo(elementId[0]);
  554. };
  555. _exprFunctions.GetAdaptiveView = function (eventInfo) {
  556. if (eventInfo && eventInfo.srcElement) {
  557. var id = eventInfo.srcElement;
  558. var diagramObject = $ax.getObjectFromElementId(id);
  559. if (diagramObject.owner.type == 'Axure:Master' || diagramObject.owner.type == 'referenceDiagramObject') {
  560. var viewIdChain = $ax.style.getViewIdChain($ax.adaptive.currentViewId || '', id, diagramObject);
  561. if (viewIdChain.length > 0) return viewIdChain[viewIdChain.length - 1];
  562. else return '19e82109f102476f933582835c373474';
  563. }
  564. }
  565. return $ax.adaptive.currentViewId || '';
  566. };
  567. _exprFunctions.IsEntering = function(movingRects, targetRects) {
  568. return !movingRects.lastRect.IntersectsWith(targetRects.currentRect) && movingRects.currentRect.IntersectsWith(targetRects.currentRect);
  569. };
  570. _exprFunctions.IsLeaving = function(movingRects, targetRects) {
  571. return movingRects.lastRect.IntersectsWith(targetRects.currentRect) && !movingRects.currentRect.IntersectsWith(targetRects.currentRect);
  572. };
  573. var _IsOver = _exprFunctions.IsOver = function(movingRects, targetRects) {
  574. return movingRects.currentRect.IntersectsWith(targetRects.currentRect);
  575. };
  576. _exprFunctions.IsNotOver = function(movingRects, targetRects) {
  577. return !_IsOver(movingRects, targetRects);
  578. };
  579. _exprFunctions.ValueContains = function(inputString, value) {
  580. return inputString.indexOf(value) > -1;
  581. };
  582. _exprFunctions.ValueNotContains = function(inputString, value) {
  583. return !_exprFunctions.ValueContains(inputString, value);
  584. };
  585. _exprFunctions.ToString = function(value) {
  586. if(value.isWidget) {
  587. return value.text;
  588. }
  589. return String(value);
  590. };
  591. var _evaluateExpr = $ax.expr.evaluateExpr = function(expr, eventInfo, toString) {
  592. if(expr === undefined || expr === null) return undefined;
  593. var result = _exprHandlers[expr.exprType](expr, eventInfo);
  594. return toString ? _exprFunctions.ToString(result) : result;
  595. };
  596. });