doc.js 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948
  1. $axure.internal(function($ax) {
  2. var _pageData;
  3. var _initializePageFragment = function(pageFragment, objIdToObject) {
  4. var objectArrayHelper = function(objects, parent, packageId, owner) {
  5. for(var i = 0; i < objects.length; i++) {
  6. diagramObjectHelper(objects[i], parent, packageId, owner);
  7. }
  8. };
  9. var diagramObjectHelper = function(diagramObject, parent, packageId, owner) {
  10. $ax.initializeObject('diagramObject', diagramObject);
  11. objIdToObject[packageId + '~' + diagramObject.id] = diagramObject;
  12. diagramObject.parent = parent;
  13. diagramObject.owner = owner;
  14. diagramObject.scriptIds = [];
  15. if(diagramObject.diagrams) { //dynamic panel
  16. for(var i = 0; i < diagramObject.diagrams.length; i++) {
  17. var diagram = diagramObject.diagrams[i];
  18. objectArrayHelper(diagram.objects, diagram, packageId, owner);
  19. }
  20. } else if($ax.public.fn.IsLayer(diagramObject.type)) {
  21. var layerObjs = diagramObject.objs;
  22. objectArrayHelper(layerObjs, parent, packageId, owner);
  23. } else if($ax.public.fn.IsReferenceDiagramObject(diagramObject.type) && diagramObject.objects) {
  24. // if the rdo object has children, it means it's overridden
  25. // use rdo as owner in this case
  26. objectArrayHelper(diagramObject.objects, diagramObject, diagramObject.id, diagramObject);
  27. } else if(diagramObject.objects) objectArrayHelper(diagramObject.objects, diagramObject, packageId, owner);
  28. };
  29. objectArrayHelper(pageFragment.diagram.objects, pageFragment.diagram, pageFragment.packageId, pageFragment);
  30. };
  31. var _initalizeStylesheet = function(stylesheet) {
  32. var stylesById = {};
  33. var customStyles = stylesheet.customStyles;
  34. for(var key in customStyles) {
  35. var style = customStyles[key];
  36. stylesById[style.id] = style;
  37. }
  38. var duplicateStyles = stylesheet.duplicateStyles;
  39. for(var duplicateKey in duplicateStyles) {
  40. stylesById[duplicateKey] = stylesById[duplicateStyles[duplicateKey]];
  41. }
  42. stylesheet.stylesById = stylesById;
  43. };
  44. var _initializeDocumentData = function() {
  45. _initalizeStylesheet($ax.document.stylesheet);
  46. };
  47. var _initializePageData;
  48. // ******* Dictionaries ******** //
  49. (function() {
  50. var scriptIdToParentLayer = {};
  51. var elementIdToObject = {};
  52. var scriptIdToObject = {};
  53. var scriptIdToRepeaterId = {};
  54. var repeaterIdToScriptIds = {};
  55. var repeaterIdToItemIds = {};
  56. var scriptIdToPath = {};
  57. var _scriptIds = [];
  58. var elementIdToText = {};
  59. var radioGroupToSelectedElementId = {};
  60. _initializePageData = function() {
  61. if(!_pageData || !_pageData.page || !_pageData.page.diagram) return;
  62. var objIdToObject = {};
  63. _initializePageFragment(_pageData.page, objIdToObject);
  64. for(var masterId in _pageData.masters) {
  65. var master = _pageData.masters[masterId];
  66. _initializePageFragment(master, objIdToObject);
  67. }
  68. var _pathsToScriptIds = [];
  69. _pathToScriptIdHelper(_pageData.objectPaths, [], _pathsToScriptIds, scriptIdToPath);
  70. for(var i = 0; i < _pathsToScriptIds.length; i++) {
  71. var path = _pathsToScriptIds[i].idPath;
  72. var scriptId = _pathsToScriptIds[i].scriptId;
  73. // first try to find overridden objects from the rdo, they have rdo id in the first part of its key
  74. // otherwise use a common master object
  75. var packageId = _pageData.page.packageId;
  76. var parentRdoId;
  77. if(path.length > 1) {
  78. for(var j = 0; j < path.length - 1; j++) {
  79. var rdoId = path[j];
  80. var rdo = objIdToObject[packageId + '~' + rdoId];
  81. packageId = rdo.masterId;
  82. parentRdoId = rdo.id;
  83. }
  84. }
  85. var diagramObject = (parentRdoId && objIdToObject[parentRdoId + '~' + path[path.length - 1]]) || objIdToObject[packageId + '~' + path[path.length - 1]];
  86. diagramObject.scriptIds[diagramObject.scriptIds.length] = scriptId;
  87. scriptIdToObject[scriptId] = diagramObject;
  88. _scriptIds[_scriptIds.length] = scriptId;
  89. }
  90. // Now map scriptIds to repeaters and layers
  91. var mapScriptIdToRepeaterId = function(scriptId, repeaterId) {
  92. scriptIdToRepeaterId[scriptId] = repeaterId;
  93. var scriptIds = repeaterIdToScriptIds[repeaterId];
  94. if(scriptIds) scriptIds[scriptIds.length] = scriptId;
  95. else repeaterIdToScriptIds[repeaterId] = [scriptId];
  96. };
  97. var mapScriptIdToLayerId = function(obj, layerId, path) {
  98. var pathCopy = $ax.deepCopy(path);
  99. pathCopy[path.length] = obj.id;
  100. var scriptId = $ax.getScriptIdFromPath(pathCopy);
  101. scriptIdToParentLayer[scriptId] = layerId;
  102. }
  103. var mapIdsToRepeaterAndLayer = function(path, objs, repeaterId) {
  104. var pathCopy = $ax.deepCopy(path);
  105. for(var i = 0; i < objs.length; i++) {
  106. var obj = objs[i];
  107. pathCopy[path.length] = obj.id;
  108. var scriptId = $ax.getScriptIdFromPath(pathCopy);
  109. // Rdo have no element on page and are not mapped to the repeater
  110. if(repeaterId) mapScriptIdToRepeaterId(scriptId, repeaterId);
  111. if($ax.public.fn.IsDynamicPanel(obj.type)) {
  112. for(var j = 0; j < obj.diagrams.length; j++) mapIdsToRepeaterAndLayer(path, obj.diagrams[j].objects, repeaterId);
  113. } else if($ax.public.fn.IsReferenceDiagramObject(obj.type)) {
  114. mapIdsToRepeaterAndLayer(pathCopy, $ax.pageData.masters[obj.masterId].diagram.objects, repeaterId);
  115. } else if($ax.public.fn.IsRepeater(obj.type)) {
  116. mapScriptIdToRepeaterId(scriptId, scriptId);
  117. mapIdsToRepeaterAndLayer(path, obj.objects, scriptId);
  118. } else if($ax.public.fn.IsLayer(obj.type)) {
  119. var layerObjs = obj.objs;
  120. for(var j = 0; j < layerObjs.length; j++) {
  121. mapScriptIdToLayerId(layerObjs[j], scriptId, path);
  122. }
  123. mapIdsToRepeaterAndLayer(path, layerObjs, repeaterId);
  124. } else if(obj.objects && obj.objects.length) {
  125. if(repeaterId) {
  126. for(var j = 0; j < obj.objects.length; j++) {
  127. mapIdsToRepeaterAndLayer(path, obj.objects, repeaterId);
  128. }
  129. }
  130. }
  131. }
  132. };
  133. mapIdsToRepeaterAndLayer([], $ax.pageData.page.diagram.objects);
  134. };
  135. $ax.getPathFromScriptId = function(scriptId) {
  136. var reversedPath = [];
  137. var path = scriptIdToPath[scriptId];
  138. while(path && path.uniqueId) {
  139. reversedPath[reversedPath.length] = path.uniqueId;
  140. path = path.parent;
  141. }
  142. return reversedPath.reverse();
  143. };
  144. var _getScriptIdFromFullPath = function(path) {
  145. var current = $ax.pageData.objectPaths;
  146. for(var i = 0; i < path.length; i++) {
  147. current = current[path[i]];
  148. if(!current) return current;
  149. }
  150. return current && current.scriptId;
  151. };
  152. var _getScriptIdFromPath = function(path, relativeTo, includeLimbo) {
  153. var relativePath = [];
  154. var includeMasterInPath = false;
  155. if(relativeTo) {
  156. var relativeToScriptId;
  157. if(relativeTo.srcElement) { //this is eventInfo
  158. relativeToScriptId = $ax.repeater.getScriptIdFromElementId(relativeTo.srcElement);
  159. includeMasterInPath = relativeTo.isMasterEvent;
  160. } else if(typeof relativeTo === 'string') { //this is an element id
  161. relativeToScriptId = relativeTo;
  162. if($ax.public.fn.IsReferenceDiagramObject($obj(relativeToScriptId).type)) includeMasterInPath = true;
  163. }
  164. if(relativeToScriptId) {
  165. relativePath = $ax.getPathFromScriptId(relativeToScriptId);
  166. if(!includeMasterInPath) relativePath = relativePath.slice(0, relativePath.length - 1);
  167. } else if(relativeTo instanceof Array) { //this is a path
  168. relativePath = relativeTo;
  169. }
  170. }
  171. var fullPath = relativePath.concat(path);
  172. var scriptId = _getScriptIdFromFullPath(fullPath);
  173. return (includeLimbo || !$ax.visibility.isScriptIdLimbo(scriptId)) && scriptId;
  174. };
  175. $ax.getScriptIdFromPath = _getScriptIdFromPath;
  176. var _getElementIdsFromPath = function(path, eventInfo) {
  177. var scriptId = _getScriptIdFromPath(path, eventInfo);
  178. if(!scriptId) return [];
  179. // Don't need placed check hear. If unplaced, scriptId will be undefined and exit out before here.
  180. return $ax.getElementIdsFromEventAndScriptId(eventInfo, scriptId);
  181. };
  182. $ax.getElementIdsFromPath = _getElementIdsFromPath;
  183. var _getElementIdFromPath = function(path, params, includeLimbo) {
  184. var scriptId = _getScriptIdFromPath(path, params.relativeTo, includeLimbo);
  185. if(!scriptId) return scriptId;
  186. var itemNum = params.itemNum;
  187. if(params.relativeTo && typeof params.relativeTo === 'string') {
  188. if($jobj(params.relativeTo)) itemNum = $ax.repeater.getItemIdFromElementId(params.relativeTo);
  189. }
  190. return $ax.repeater.createElementId(scriptId, itemNum);
  191. };
  192. $ax.getElementIdFromPath = _getElementIdFromPath;
  193. var _getElementsIdFromEventAndScriptId = function(eventInfo, scriptId) {
  194. var itemId = eventInfo && $ax.repeater.getItemIdFromElementId(eventInfo.srcElement);
  195. var target = false;
  196. // Try to get itemId from target if you can't get it from source.
  197. if(!itemId) {
  198. itemId = eventInfo && eventInfo.targetElement && $ax.repeater.getItemIdFromElementId(eventInfo.targetElement);
  199. if(itemId) target = true;
  200. }
  201. var parentRepeater = $ax.getParentRepeaterFromScriptId(scriptId);
  202. if(parentRepeater && scriptId != parentRepeater) {
  203. if(itemId && (!eventInfo || parentRepeater == $ax.getParentRepeaterFromScriptId($ax.repeater.getScriptIdFromElementId(target ? eventInfo.targetElement : eventInfo.srcElement)))) {
  204. return [$ax.repeater.createElementId(scriptId, itemId)];
  205. }
  206. var elementIds = [];
  207. var itemIds = $ax.getItemIdsForRepeater(parentRepeater);
  208. if(!itemIds) return [];
  209. for(var i = 0; i < itemIds.length; i++) elementIds[i] = $ax.repeater.createElementId(scriptId, itemIds[i]);
  210. return elementIds;
  211. }
  212. return [scriptId];
  213. };
  214. $ax.getElementIdsFromEventAndScriptId = _getElementsIdFromEventAndScriptId;
  215. var _getSrcElementIdFromEvent = function(event) {
  216. var currentQuery = $(event.srcElement || event.target);
  217. while(currentQuery && currentQuery.length && (!$obj(currentQuery.attr('id')) || $jobj(currentQuery.attr('id')).hasClass('text'))) {
  218. currentQuery = currentQuery.parent();
  219. };
  220. return currentQuery.attr('id');
  221. };
  222. $ax.getSrcElementIdFromEvent = _getSrcElementIdFromEvent;
  223. var _getEventInfoFromEvent = function(event, skipShowDescriptions, elementId) {
  224. var eventInfo = {};
  225. eventInfo.srcElement = elementId;
  226. eventInfo.now = new Date();
  227. if(event != null) {
  228. //elementId can be empty string, so can't simple use "or" assignment here.
  229. eventInfo.srcElement = elementId || elementId == '' ? elementId : _getSrcElementIdFromEvent(event);
  230. eventInfo.which = event.which;
  231. // When getting locations in mobile, need to extract the touch object to get the mouse location attributes
  232. var mouseEvent = (event.originalEvent && event.originalEvent.changedTouches && event.originalEvent.changedTouches[0]) || event.originalEvent;
  233. if(mouseEvent && !mouseEvent.type) mouseEvent.type = event.type;
  234. if(skipShowDescriptions) eventInfo.skipShowDescriptions = true;
  235. // Always update mouse location if possible
  236. $ax.event.updateMouseLocation(mouseEvent);
  237. }
  238. // Always set event info about cursor
  239. var _cursor = eventInfo.cursor = {};
  240. _cursor.x = $ax.mouseLocation.x;
  241. _cursor.y = $ax.mouseLocation.y;
  242. var body = $('body');
  243. if(body.css('position') == 'relative') {
  244. _cursor.x -= ($ax.getNumFromPx(body.css('left')) + Math.max(0, ($(window).width() - body.width()) / 2));
  245. }
  246. eventInfo.pageX = _cursor.x + 'px';
  247. eventInfo.pageY = _cursor.y + 'px';
  248. // Do Keyboard Info
  249. eventInfo.keyInfo = $ax.event.keyState();
  250. eventInfo.window = $ax.getWindowInfo();
  251. eventInfo.thiswidget = _getWidgetInfo(eventInfo.srcElement);
  252. eventInfo.item = _getItemInfo(eventInfo.srcElement);
  253. eventInfo.dragInfo = $ax.drag.GetWidgetDragInfo();
  254. return eventInfo;
  255. };
  256. $ax.getEventInfoFromEvent = _getEventInfoFromEvent;
  257. $ax.getBasicEventInfo = function() {
  258. var eventInfo = {};
  259. eventInfo.now = new Date();
  260. eventInfo.window = $ax.getWindowInfo();
  261. eventInfo.cursor = { x: 0, y: 0};
  262. return eventInfo;
  263. };
  264. //var _getWindowInfo = function() {
  265. // var win = {};
  266. // win.width = $(window).width();
  267. // win.height = $(window).height();
  268. // win.scrollx = $(window).scrollLeft();
  269. // win.scrolly = $(window).scrollTop();
  270. // return win;
  271. //};
  272. //$ax.getWindowInfo = _getWindowInfo;
  273. var repeaterInfoCache = [];
  274. $ax.cacheRepeaterInfo = function(repeaterId, repeaterInfo) {
  275. repeaterInfoCache[repeaterId] = repeaterInfo;
  276. }
  277. $ax.removeCachedRepeaterInfo = function(repeaterId) {
  278. repeaterInfoCache[repeaterId] = undefined;
  279. }
  280. var _getItemInfo = function(elementId) {
  281. if(!elementId) return { valid: false };
  282. elementId = _getParentElement(elementId);
  283. var index = $ax.repeater.getItemIdFromElementId(elementId);
  284. if(!index) return { valid: false };
  285. var item = { valid: true };
  286. var scriptId = $ax.repeater.getScriptIdFromElementId(elementId);
  287. var repeaterId = $ax.getParentRepeaterFromScriptId(scriptId);
  288. item.repeater = repeaterInfoCache[repeaterId] ? repeaterInfoCache[repeaterId] : _getWidgetInfo(repeaterId);
  289. $ax.repeater.setDisplayProps(item, repeaterId, index);
  290. item.ismarked = $ax.repeater.isEditItem(repeaterId, index);
  291. item.isvisible = Boolean($jobj(elementId).length);
  292. return item;
  293. };
  294. $ax.getItemInfo = _getItemInfo;
  295. var _getWidgetInfo = function(elementId) {
  296. if(!elementId) return { valid: false };
  297. elementId = _getParentElement(elementId);
  298. //var elementAxQuery = $ax('#' + elementId);
  299. var elementQuery = $jobj(elementId);
  300. var obj = $obj(elementId);
  301. var widget = { valid: true, isWidget: true, obj: obj, elementQuery: elementQuery, isLayer: $ax.public.fn.IsLayer(obj.type) };
  302. widget.elementId = elementId;
  303. widget.name = widget.label = (elementQuery.data('label') ? elementQuery.data('label') : '');
  304. //widget.text = $ax('#' + elementId).text();
  305. if (widget.isLayer) {
  306. widget.opacity = function() {
  307. var layerOpacity = elementQuery.attr('layer-opacity');
  308. if (layerOpacity) return Number(layerOpacity) * 100;
  309. return Number(elementQuery.css('opacity')) * 100;
  310. }
  311. } else {
  312. widget.opacity = Number(elementQuery.css('opacity')) * 100;
  313. }
  314. //widget.rotation = $ax.move.getRotationDegree(widget.elementId);
  315. var scriptId = $ax.repeater.getScriptIdFromElementId(elementId);
  316. var repeaterId = $ax.getParentRepeaterFromScriptId(scriptId);
  317. if(repeaterId) widget.repeater = $ax.public.fn.IsRepeater(obj.type) ? widget : _getWidgetInfo(repeaterId);
  318. // Right now only dynamic panel can scroll
  319. if($ax.public.fn.IsDynamicPanel(obj.type)) {
  320. var stateId = $ax.visibility.GetPanelState(elementId);
  321. //can be empty when refreshing repeater and applying filter
  322. if(stateId) {
  323. var stateQuery = $('#' + stateId);
  324. widget.scrollx = stateQuery.scrollLeft();
  325. widget.scrolly = stateQuery.scrollTop();
  326. //widget.stateQuery = stateQuery;
  327. }
  328. } else {
  329. widget.scrollx = 0;
  330. widget.scrolly = 0;
  331. }
  332. // repeater only props
  333. if($ax.public.fn.IsRepeater(obj.type)) {
  334. widget.visibleitemcount = repeaterIdToItemIds[scriptId] ? repeaterIdToItemIds[scriptId].length : $ax.repeater.getVisibleDataCount(scriptId);
  335. widget.itemcount = $ax.repeater.getFilteredDataCount(scriptId);
  336. widget.datacount = $ax.repeater.getDataCount(scriptId);
  337. widget.pagecount = $ax.repeater.getPageCount(scriptId);
  338. widget.pageindex = $ax.repeater.getPageIndex(scriptId);
  339. }
  340. // Get widget info funcs
  341. //widget.elementAxQuery = function () {
  342. // return this.elementAxQueryProp || (this.elementAxQueryProp = $ax('#' + this.elementId));
  343. //}
  344. //widget.isFitToContent = function () {
  345. // if (this.isFitToContentProp === undefined) {
  346. // if (!this.stateQuery) this.isFitToContentProp = false;
  347. // else this.isFitToContentProp = $ax.dynamicPanelManager.isIdFitToContent(this.elementId);
  348. // }
  349. // return this.isFitToContentProp;
  350. //}
  351. widget.x = function () { return this.getProp('x'); }
  352. widget.y = function () { return this.getProp('y'); }
  353. widget.pagex = function () { return this.getProp('pagex'); }
  354. widget.pagey = function () { return this.getProp('pagey'); }
  355. widget.width = function () { return this.getProp('width'); }
  356. widget.height = function () { return this.getProp('height'); }
  357. widget.left = function () { return this.x(); }
  358. widget.top = function () { return this.y(); }
  359. widget.right = function () { return this.x() + this.width(); }
  360. widget.bottom = function () { return this.y() + this.height(); }
  361. widget.rotation = function () { return this.getProp('rotation'); }
  362. widget.text = function () { return this.getProp('text'); }
  363. //height and width change aren't cached as they're only valid during an event
  364. widget.heightchange = function () {
  365. //if this is during a set state
  366. var panelSizeChange = $ax.dynamicPanelManager.getPanelSizeChange(elementId);
  367. if ($ax.public.fn.IsDynamicPanel(obj.type) && panelSizeChange) {
  368. return panelSizeChange.height;
  369. }
  370. var oldHeight = $ax.visibility.getResizingRect(this.elementId).height;
  371. return oldHeight ? this.height() - oldHeight : 0;
  372. }
  373. widget.widthchange = function () {
  374. //if this is during a set state
  375. var panelSizeChange = $ax.dynamicPanelManager.getPanelSizeChange(elementId);
  376. if ($ax.public.fn.IsDynamicPanel(obj.type) && panelSizeChange) {
  377. return panelSizeChange.width;
  378. }
  379. var oldWidth = $ax.visibility.getResizingRect(this.elementId).width;
  380. return oldWidth ? this.width() - oldWidth : 0;
  381. }
  382. widget.getProp = function (prop) {
  383. var propName = prop + 'Prop';
  384. if (typeof (this[propName]) != 'undefined') return this[propName];
  385. return this[propName] = this.cacheProp(prop);
  386. };
  387. widget.cacheProp = function (prop) {
  388. if (prop == 'x' || prop == 'y' || prop == 'width' || prop == 'height') {
  389. // Lets ignore outer shadow size (see RP-1816)
  390. var boundingRect = $ax('#' + this.elementId).offsetBoundingRect(true, true);
  391. this.xProp = boundingRect.left;
  392. this.yProp = boundingRect.top;
  393. this.widthProp = boundingRect.width;
  394. this.heightProp = boundingRect.height;
  395. }
  396. if(prop == 'pagex' || prop == 'pagey') {
  397. var viewportLocation = $ax('#' + this.elementId).viewportLocation();
  398. this.pagexProp = viewportLocation.left;
  399. this.pageyProp = viewportLocation.top;
  400. }
  401. if(prop == 'rotation') {
  402. this.rotationProp = $ax.move.getRotationDegree(this.elementId);
  403. }
  404. if (prop == 'text') {
  405. this.textProp = $ax('#' + this.elementId).text();
  406. }
  407. return this[prop + 'Prop'];
  408. //// I'm keeping the returned undefineds the same as before, but really I could probably return undefined right away if elementQuery is empty
  409. //if (this.isLayer) {
  410. // if (prop == 'pagex' || prop == 'pagey') {
  411. // if (this.elementQuery.length > 0) {
  412. // if (prop == 'pagex') return this.elementAxQuery().left();
  413. // else return this.elementAxQuery().top();
  414. // }
  415. // return undefined; // Otherwise, it is undefined as there is no element
  416. // }
  417. // var boundingRect = $ax.public.fn.getWidgetBoundingRect(this.elementId);
  418. // this.xProp = boundingRect.left;
  419. // this.yProp = boundingRect.top;
  420. // this.widthProp = boundingRect.width;
  421. // this.heightProp = boundingRect.height;
  422. // return this[prop + 'Prop'];
  423. //}
  424. //if (this.elementQuery.length <= 0) return prop == 'x' || prop == 'y' ? 0 : undefined;
  425. //switch (prop) {
  426. // case 'x': return this.elementAxQuery().locRelativeIgnoreLayer(false);
  427. // case 'y': return this.elementAxQuery().locRelativeIgnoreLayer(true);
  428. // case 'pagex': return this.elementAxQuery().left();
  429. // case 'pagey': return this.elementAxQuery().top();
  430. //}
  431. //var val = this.elementAxQuery()[prop]();
  432. //if (this.isFitToContent()) val = this.stateQuery[prop]();
  433. //return val;
  434. };
  435. //widget.leftfixed = function() { this.getFixed('left'); }
  436. //widget.topfixed = function() { this.getFixed('top'); }
  437. //widget.rightfixed = function() { this.getFixed('right'); }
  438. //widget.bottomfixed = function() { this.getFixed('bottom'); }
  439. //widget.isFixed = function() {
  440. // if(this.isFixedProp === undefined) this.isFixedProp = this.elementQuery.css('position') == 'fixed)';
  441. // return this.isFixedProp;
  442. //}
  443. //widget.getFixed = function (prop) {
  444. // var fixed = prop + 'fixedProp';
  445. // if(!this.isFixed()) widget[fixed] = widget[prop]();
  446. // if(widget[fixed] === undefined) {
  447. // if(prop == 'left' || prop == 'right') {
  448. // if(this.windowScrollX === undefined) this.windowScrollX = $(window).scrollLeft();
  449. // var windowScroll = this.windowScrollX;
  450. // } else {
  451. // if(this.windowScrollY === undefined) this.windowScrollY = $(window).scrollTop();
  452. // windowScroll = this.windowScrollY;
  453. // }
  454. // widget[fixed] = widget[prop]() - windowScroll;
  455. // }
  456. // return widget[fixed];
  457. //}
  458. return widget;
  459. };
  460. $ax.getWidgetInfo = _getWidgetInfo;
  461. $ax.GetTextPanelId = function (id, create) {
  462. if(!$ax('#' + id).SupportsRichText()) return '';
  463. var buttonShape = $ax.GetButtonShape(id);
  464. var panelDiv = buttonShape.find('.text')[0];
  465. if(!panelDiv) {
  466. if(!create) return "";
  467. var adaptiveId = $ax.adaptive.currentViewId;
  468. var newId = id + "_text";
  469. //var newDiv = $('<div id="' + newId + '" class="text" style="visibility: inherit; position: absolute"></div>');
  470. var newDiv = $('<div id="' + newId + '" class="text' + (adaptiveId ? (' ' + adaptiveId) : '') + '" style="visibility: inherit; position: absolute"><p><span></span></p></div>');
  471. buttonShape.append(newDiv);
  472. $ax.style.setAdaptiveStyle(id, $ax.style.computeAllOverrides(id, undefined, $ax.style.generateState(id), adaptiveId));
  473. panelDiv = newDiv[0];
  474. }
  475. return panelDiv.id;
  476. }
  477. $ax.GetParentIdFromLink = function(id) {
  478. return $ax.GetShapeIdFromText($jobj(id).parentsUntil('.text').parent().attr('id'));
  479. };
  480. $ax.GetButtonShapeId = function(id) {
  481. var obj = $obj(id);
  482. switch(obj.type) {
  483. case $ax.constants.TREE_NODE_OBJECT_TYPE:
  484. return obj.buttonShapeId ? $ax.getElementIdFromPath([obj.buttonShapeId], { relativeTo: id }) : "";
  485. case $ax.constants.LINK_TYPE:
  486. return "";
  487. default:
  488. return id;
  489. }
  490. };
  491. $ax.GetButtonShape = function(id) {
  492. return $jobj($ax.GetButtonShapeId(id));
  493. };
  494. $ax.GetShapeIdFromText = function(id) {
  495. if(!id) return undefined; // this is to prevent an infinite loop.
  496. var current = document.getElementById(id);
  497. if(!current) return undefined;
  498. current = current.parentElement;
  499. while(current && current.tagName != 'BODY') {
  500. var currentId = current.id;
  501. if(currentId && currentId != 'base') return $ax.visibility.getWidgetFromContainer(currentId);
  502. current = current.parentElement;
  503. }
  504. return undefined;
  505. };
  506. $ax.GetImageIdFromShape = function(id) {
  507. var image = $ax.GetButtonShape(id).find('img[id$=img]');
  508. if(!image.length) image = $jobj(id).find('img[id$=image_sketch]');
  509. return image.attr('id');
  510. };
  511. $ax.GetSvgIdFromShape = function (id) {
  512. var image = $ax.GetButtonShape(id).find('object[id$=img]');
  513. if(!image.length) image = $jobj(id).find('object[id$=image_sketch]');
  514. return image.attr('id');
  515. };
  516. var _getParentElement = $ax.getParentElement = function(elementId) {
  517. var obj = $obj(elementId);
  518. while(obj.isContained) {
  519. var path = $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(elementId));
  520. var itemId = $ax.repeater.getItemIdFromElementId(elementId);
  521. path[path.length - 1] = obj.parent.id;
  522. elementId = $ax.getElementIdFromPath(path, { itemNum: itemId });
  523. obj = $obj(elementId);
  524. }
  525. return elementId;
  526. };
  527. $ax.addItemIdToRepeater = function(itemId, repeaterId) {
  528. var itemIds = repeaterIdToItemIds[repeaterId];
  529. if(itemIds) itemIds[itemIds.length] = itemId;
  530. else repeaterIdToItemIds[repeaterId] = [itemId];
  531. var scriptIds = repeaterIdToScriptIds[repeaterId];
  532. for(var i = 0; i < scriptIds.length; i++) elementIdToObject[$ax.repeater.createElementId(scriptIds[i], itemId)] = $ax.getObjectFromScriptId(scriptIds[i]);
  533. };
  534. $ax.getAllElementIds = function() {
  535. var elementIds = [];
  536. for(var i = 0; i < _scriptIds.length; i++) {
  537. var scriptId = _scriptIds[i];
  538. var repeaterId = scriptIdToRepeaterId[scriptId];
  539. if(repeaterId && repeaterId != scriptId) {
  540. var itemIds = repeaterIdToItemIds[repeaterId] || [];
  541. for(var j = 0; j < itemIds.length; j++) elementIds[elementIds.length] = $ax.repeater.createElementId(scriptId, itemIds[j]);
  542. } else elementIds[elementIds.length] = scriptId;
  543. }
  544. return elementIds;
  545. };
  546. $ax.getAllScriptIds = function() {
  547. return _scriptIds;
  548. };
  549. $ax.getObjectFromElementId = function(elementId) {
  550. return $ax.getObjectFromScriptId($ax.repeater.getScriptIdFromElementId(elementId));
  551. };
  552. $ax.getObjectFromScriptId = function(scriptId) {
  553. return scriptIdToObject[scriptId];
  554. };
  555. $ax.getParentRepeaterFromElementId = function(elementId) {
  556. return $ax.getParentRepeaterFromScriptId($ax.repeater.getScriptIdFromElementId(elementId));
  557. };
  558. $ax.getParentRepeaterFromElementIdExcludeSelf = function (elementId) {
  559. var repeaterId = $ax.getParentRepeaterFromElementId(elementId);
  560. return repeaterId != elementId ? repeaterId : undefined;
  561. };
  562. $ax.getParentRepeaterFromScriptId = function(scriptId) {
  563. return scriptIdToRepeaterId[scriptId];
  564. };
  565. var _getChildScriptIdsForRepeater = function(repeaterId) {
  566. return repeaterIdToScriptIds[repeaterId];
  567. };
  568. var _getItemIdsForRepeater = function(repeaterId) {
  569. return repeaterIdToItemIds[repeaterId] || [];
  570. };
  571. $ax.getItemIdsForRepeater = _getItemIdsForRepeater;
  572. var _clearItemIdsForRepeater = function(repeaterId) {
  573. repeaterIdToItemIds[repeaterId] = [];
  574. };
  575. $ax.clearItemsForRepeater = _clearItemIdsForRepeater;
  576. $ax.getChildElementIdsForRepeater = function(repeaterId) {
  577. var scriptIds = _getChildScriptIdsForRepeater(repeaterId);
  578. var itemIds = _getItemIdsForRepeater(repeaterId);
  579. var retVal = [];
  580. if(!itemIds || !scriptIds) return retVal;
  581. for(var i = 0; i < scriptIds.length; i++) {
  582. for(var j = 0; j < itemIds.length; j++) {
  583. retVal[retVal.length] = $ax.repeater.createElementId(scriptIds[i], itemIds[j]);
  584. }
  585. }
  586. return retVal;
  587. };
  588. $ax.getRdoParentFromElementId = function(elementId) {
  589. var scriptId = $ax.repeater.getScriptIdFromElementId(elementId);
  590. var rdoId = scriptIdToPath[scriptId].parent.scriptId;
  591. if($ax.getParentRepeaterFromScriptId(rdoId)) rdoId = $ax.repeater.createElementId(rdoId, $ax.repeater.getItemIdFromElementId(elementId));
  592. return rdoId;
  593. };
  594. $ax.getLayerParentFromElementId = function (elementId) {
  595. var itemId = $ax.repeater.getItemIdFromElementId(elementId);
  596. var scriptId = scriptIdToParentLayer[$ax.repeater.getScriptIdFromElementId(elementId)];
  597. return $ax.getParentRepeaterFromElementId(scriptId) ? $ax.repeater.createElementId(scriptId, itemId) : scriptId;
  598. }
  599. $ax.updateElementText = function(elementId, text) {
  600. elementIdToText[elementId] = text;
  601. };
  602. $ax.hasElementTextChanged = function(elementId, text) {
  603. return elementIdToText[elementId] != text;
  604. };
  605. $ax.updateRadioButtonSelected = function(group, elementId) {
  606. var old = radioGroupToSelectedElementId[group];
  607. radioGroupToSelectedElementId[group] = elementId;
  608. return old;
  609. };
  610. $ax.hasRadioButtonSelectedChanged = function(group, elementId) {
  611. return radioGroupToSelectedElementId[group] != elementId;
  612. };
  613. })();
  614. //Recursively populates fullPathArray with:
  615. // [ { idPath, scriptId }, ... ]
  616. //for every scriptId in the object
  617. //also populates an object of scriptId -> path
  618. var _pathToScriptIdHelper = function(currentPath, currentChain, fullPathArray, scriptIdToPath) {
  619. for(var key in currentPath) {
  620. if(key != "scriptId") {
  621. var nextPath = currentPath[key];
  622. _pathToScriptIdHelper(nextPath, currentChain.concat(key), fullPathArray, scriptIdToPath);
  623. nextPath.parent = currentPath;
  624. nextPath.uniqueId = key;
  625. } else {
  626. fullPathArray[fullPathArray.length] = { idPath: currentChain, scriptId: currentPath.scriptId };
  627. scriptIdToPath[currentPath.scriptId] = currentPath;
  628. }
  629. }
  630. };
  631. $ax.public.loadCurrentPage = $ax.loadCurrentPage = function(pageData) {
  632. $ax.pageData = _pageData = pageData;
  633. _initializePageData();
  634. };
  635. $ax.public.loadDocument = $ax.loadDocument = function(document) {
  636. $ax.document = document;
  637. _initializeDocumentData();
  638. };
  639. /**
  640. Navigates to a page
  641. */
  642. $ax.public.navigate = $ax.navigate = function(to) { //url, includeVariables, type) {
  643. var targetUrl;
  644. if(typeof (to) === 'object') {
  645. targetUrl = !to.includeVariables ? to.url : $ax.globalVariableProvider.getLinkUrl(to.url, to.useGlobalVarNameInUrl);
  646. if(to.target == "new") {
  647. window.open(targetUrl, "");
  648. } else if(to.target == "popup") {
  649. var features = _getPopupFeatures(to.popupOptions);
  650. window.open(targetUrl, "", features);
  651. } else {
  652. var targetLocation = window.location;
  653. if(to.target == "current") {
  654. } else if(to.target == "parent") {
  655. if(!top.opener) return;
  656. targetLocation = top.opener.window.location;
  657. } else if(to.target == "parentFrame") {
  658. targetLocation = parent.location;
  659. } else if(to.target == "frame") {
  660. // targetLocation = to.frame.contentWindow.location;
  661. $(to.frame).attr('src', targetUrl || 'about:blank');
  662. return;
  663. }
  664. if (!_needsReload(targetLocation, to.url)) {
  665. targetLocation.href = targetUrl || 'about:blank';
  666. } else {
  667. targetLocation.href = $axure.utils.getReloadPath() + "?" + encodeURI(targetUrl);
  668. }
  669. }
  670. } else {
  671. $ax.navigate({
  672. url: to,
  673. target: "current",
  674. includeVariables: arguments[1]
  675. });
  676. }
  677. };
  678. var _needsReload = function(oldLocation, newBaseUrl) {
  679. var reload = false;
  680. try {
  681. var oldUrl = oldLocation.href;
  682. var oldBaseUrl = oldUrl.split("?")[0];
  683. var lastslash = oldBaseUrl.lastIndexOf("/");
  684. if(lastslash > 0) {
  685. oldBaseUrl = oldBaseUrl.substring(lastslash + 1, oldBaseUrl.length);
  686. if(oldBaseUrl == encodeURI(newBaseUrl)) {
  687. reload = true;
  688. }
  689. }
  690. } catch(e) {
  691. }
  692. return reload;
  693. };
  694. var _getPopupFeatures = function(options) {
  695. var defaultOptions = {
  696. toolbar: true,
  697. scrollbars: true,
  698. location: true,
  699. status: true,
  700. menubar: true,
  701. directories: true,
  702. resizable: true,
  703. centerwindow: true,
  704. left: -1,
  705. top: -1,
  706. height: -1,
  707. width: -1
  708. };
  709. var selectedOptions = $.extend({}, defaultOptions, options);
  710. var optionsList = [];
  711. optionsList.push('toolbar=' + (selectedOptions.toolbar ? 'yes' : 'no'));
  712. optionsList.push('scrollbars=' + (selectedOptions.scrollbars ? 'yes' : 'no'));
  713. optionsList.push('location=' + (selectedOptions.location ? 'yes' : 'no'));
  714. optionsList.push('status=' + (selectedOptions.status ? 'yes' : 'no'));
  715. optionsList.push('menubar=' + (selectedOptions.menubar ? 'yes' : 'no'));
  716. optionsList.push('directories=' + (selectedOptions.directories ? 'yes' : 'no'));
  717. optionsList.push('resizable=' + (selectedOptions.resizable ? 'yes' : 'no'));
  718. if(selectedOptions.centerwindow == false) {
  719. if(selectedOptions.left > -1) {
  720. optionsList.push('left=' + selectedOptions.left);
  721. }
  722. if(selectedOptions.top > -1) {
  723. optionsList.push('top=' + selectedOptions.top);
  724. }
  725. }
  726. var height = 0;
  727. var width = 0;
  728. if(selectedOptions.height > 0) {
  729. optionsList.push('height=' + selectedOptions.height);
  730. height = selectedOptions.height;
  731. }
  732. if(selectedOptions.width > 0) {
  733. optionsList.push('width=' + selectedOptions.width);
  734. width = selectedOptions.width;
  735. }
  736. var features = optionsList.join(',');
  737. if(selectedOptions.centerwindow) {
  738. var winl = (window.screen.width - width) / 2;
  739. var wint = (window.screen.height - height) / 2;
  740. features = features + ',left=' + winl + ',top=' + wint;
  741. }
  742. return features;
  743. };
  744. /**
  745. Closes a window
  746. */
  747. $ax.public.closeWindow = $ax.closeWindow = function() {
  748. parent.window.close();
  749. };
  750. /**
  751. Goes back
  752. */
  753. $ax.public.back = $ax.back = function() {
  754. window.history.go(-1);
  755. };
  756. /**
  757. Reloads the current page.
  758. # includeVariables: true if it should re-include the variables when the page is reloaded
  759. */
  760. $ax.public.reload = $ax.reload = function(includeVariables) {
  761. var targetUrl = (includeVariables === false)
  762. ? $axure.utils.getReloadPath() + "?" + encodeURI($ax.pageData.url)
  763. : $axure.utils.getReloadPath() + "?" + encodeURI($ax.globalVariableProvider.getLinkUrl($ax.pageData.url));
  764. window.location.href = targetUrl;
  765. };
  766. /**
  767. Sets a variable.
  768. # name: The name of the global variable to set
  769. # value: The value that should be set
  770. */
  771. $ax.public.setGlobalVariable = $ax.setGlobalVariable = function(name, value) {
  772. if(!name || !value) {
  773. return;
  774. }
  775. $ax.globalVariableProvider.setVariableValue(name, value);
  776. };
  777. /**
  778. Gets the value of a global variable
  779. # name: The name of the global variable value to get
  780. */
  781. $ax.public.getGlobalVariable = $ax.getGlobalVariable = function(name) {
  782. $ax.globalVariableProvider.getVariableValue(name);
  783. };
  784. $ax.getObjectFromElementIdDisregardHex = function (elementId) {
  785. var elementIdInput = elementId.charAt(0) == '#' ? elementId.substring(1) : elementId;
  786. return this.getObjectFromElementId(elementIdInput);
  787. }
  788. $ax.getTypeFromElementId = function(elementId) {
  789. var obj = this.getObjectFromElementIdDisregardHex(elementId);
  790. return obj && obj.type;
  791. };
  792. $ax.getNumFromPx = function(pxNum) {
  793. return Number(pxNum.replace('px', ''));
  794. }
  795. });