style.js 121 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560
  1. $axure.internal(function($ax) {
  2. var _style = {};
  3. $ax.style = _style;
  4. var _disabledWidgets = {};
  5. var _selectedWidgets = {};
  6. var _errorWidgets = {};
  7. var _hintWidgets = {};
  8. // A table to cache the outerHTML of the _rtf elements before the rollover state is applied.
  9. var _originalTextCache = {};
  10. // A table to exclude the normal style from adaptive overrides
  11. var _shapesWithSetRichText = {};
  12. // just a listing of shape ids
  13. var _adaptiveStyledWidgets = {};
  14. var _setLinkStyle = function(id, styleName) {
  15. var parentId = $ax.GetParentIdFromLink(id);
  16. var style = _computeAllOverrides(id, parentId, styleName, $ax.adaptive.currentViewId);
  17. var textId = $ax.GetTextPanelId(parentId);
  18. if(!_originalTextCache[textId]) {
  19. $ax.style.CacheOriginalText(textId);
  20. }
  21. if($.isEmptyObject(style)) return;
  22. var textCache = _originalTextCache[textId].styleCache;
  23. _transformTextWithVerticalAlignment(textId, function() {
  24. var cssProps = _getCssStyleProperties(style);
  25. $('#' + id).find('*').addBack().each(function(index, element) {
  26. element.setAttribute('style', textCache[element.id]);
  27. _applyCssProps(element, cssProps);
  28. });
  29. });
  30. };
  31. var _resetLinkStyle = function(id) {
  32. var textId = $ax.GetTextPanelId($ax.GetParentIdFromLink(id));
  33. var textCache = _originalTextCache[textId].styleCache;
  34. _transformTextWithVerticalAlignment(textId, function() {
  35. $('#' + id).find('*').addBack().each(function(index, element) {
  36. element.style.cssText = textCache[element.id];
  37. });
  38. });
  39. if($ax.event.mouseDownObjectId) {
  40. $ax.style.SetWidgetMouseDown($ax.event.mouseDownObjectId, true);
  41. } else if($ax.event.mouseOverObjectId) {
  42. $ax.style.SetWidgetHover($ax.event.mouseOverObjectId, true);
  43. }
  44. };
  45. $ax.style.SetLinkHover = function(id) {
  46. _setLinkStyle(id, MOUSE_OVER);
  47. };
  48. $ax.style.SetLinkNotHover = function(id) {
  49. _resetLinkStyle(id);
  50. };
  51. $ax.style.SetLinkMouseDown = function(id) {
  52. _setLinkStyle(id, MOUSE_DOWN);
  53. };
  54. $ax.style.SetLinkNotMouseDown = function(id) {
  55. _resetLinkStyle(id);
  56. var style = _computeAllOverrides(id, $ax.event.mouseOverObjectId, MOUSE_OVER, $ax.adaptive.currentViewId);
  57. if(!$.isEmptyObject(style)) $ax.style.SetLinkHover(id);
  58. //we dont do anything here because the widget not mouse down has taken over here
  59. };
  60. var _widgetHasState = function(id, state) {
  61. if($ax.style.getElementImageOverride(id, state)) return true;
  62. var diagramObject = $ax.getObjectFromElementId(id);
  63. //var adaptiveIdChain = $ax.adaptive.getAdaptiveIdChain($ax.adaptive.currentViewId);
  64. var adaptiveIdChain = $ax.style.getViewIdChain($ax.adaptive.currentViewId, id, diagramObject);
  65. for(var i = 0; i < adaptiveIdChain.length; i++) {
  66. var viewId = adaptiveIdChain[i];
  67. var adaptiveStyle = diagramObject.adaptiveStyles[viewId];
  68. if(adaptiveStyle && adaptiveStyle.stateStyles && adaptiveStyle.stateStyles[state]) return true;
  69. }
  70. if(diagramObject.style.stateStyles) {
  71. var stateStyle = diagramObject.style.stateStyles[state];
  72. if(!stateStyle) return false;
  73. return !$.isEmptyObject(stateStyle);
  74. }
  75. return false;
  76. };
  77. $ax.style.SetWidgetHover = function(id, value) {
  78. if(!_widgetHasState(id, MOUSE_OVER)) return;
  79. var valToSet = value || _isRolloverOverride(id);
  80. const state = _generateFullState(id, undefined, undefined, undefined, undefined, valToSet);
  81. _applyImageAndTextJson(id, state);
  82. _updateElementIdImageStyle(id, state);
  83. };
  84. var _rolloverOverrides = [];
  85. var _isRolloverOverride = function(id) {
  86. return _rolloverOverrides.indexOf(id) != -1;
  87. };
  88. $ax.style.AddRolloverOverride = function(id) {
  89. if(_isRolloverOverride(id)) return;
  90. _rolloverOverrides[_rolloverOverrides.length] = id;
  91. if($ax.event.mouseOverIds.indexOf(id) == -1) $ax.style.SetWidgetHover(id, true);
  92. };
  93. $ax.style.RemoveRolloverOverride = function(id) {
  94. var index = _rolloverOverrides.indexOf(id);
  95. if(index == -1) return;
  96. $ax.splice(_rolloverOverrides, index, 1);
  97. if($ax.event.mouseOverIds.indexOf(id) == -1) $ax.style.SetWidgetHover(id, false);
  98. };
  99. $ax.style.ObjHasMouseDown = function (id) {
  100. return _widgetHasState(id, MOUSE_DOWN);
  101. };
  102. // checkMouseOver is used for applying style effects to everything in a group
  103. $ax.style.SetWidgetMouseDown = function(id, value, checkMouseOver) {
  104. if($ax.style.IsWidgetDisabled(id)) return;
  105. if(!_widgetHasState(id, MOUSE_DOWN)) return;
  106. const state = _generateFullState(id, undefined, undefined, undefined, undefined, !checkMouseOver ? true : undefined, value);
  107. _applyImageAndTextJson(id, state);
  108. _updateElementIdImageStyle(id, state);
  109. };
  110. var _generateFullState = function (id, forceFocused, forceSelected, forceDisabled, forceError, forceMouseOver, forceMouseDown) {
  111. let state = $ax.style.ShowingHint(id) ? HINT : '';
  112. if (forceError === true || forceError !== false && _style.IsWidgetError(id)) {
  113. state = _compoundStates(state, ERROR);
  114. }
  115. if (forceSelected === true || forceSelected !== false && _style.IsWidgetSelected(id)) {
  116. state = _compoundStates(state, SELECTED);
  117. }
  118. if (forceDisabled === true || forceDisabled !== false && _isWidgetDisabled(id)) {
  119. return _compoundStates(DISABLED, state);
  120. }
  121. if (forceFocused === true || forceFocused !== false && _hasAnyFocusedClass(id)) {
  122. return _compoundStates(state, FOCUSED);
  123. }
  124. if (forceMouseDown === true || forceMouseDown !== false && $ax.event.mouseDownObjectId == id) {
  125. state = _compoundStates(state, MOUSE_DOWN);
  126. }
  127. if (forceMouseOver === true || forceMouseOver !== false &&
  128. ($ax.event.mouseOverIds.indexOf(id) !== -1 && _widgetHasState(id, MOUSE_OVER) || _isRolloverOverride(id))) {
  129. return _compoundStates(state, MOUSE_OVER);
  130. }
  131. return state.length > 0 ? state : NORMAL;
  132. };
  133. var _compoundStates = function (current, baseState) {
  134. if (current.length < 1) return baseState;
  135. if (baseState.length < 1) return current;
  136. const capital = current.charAt(0).toUpperCase() + current.slice(1);
  137. return baseState + capital;
  138. };
  139. $ax.style.updateImage = function (id) {
  140. const state = $ax.style.generateState(id);
  141. const imageUrl = $ax.adaptive.getImageForStateAndView(id, state);
  142. if (imageUrl) _applyImage(id, imageUrl, state);
  143. $ax.style.updateElementIdImageStyle(id, state);
  144. }
  145. $ax.style.SetWidgetFocused = function (id, value) {
  146. if (_isWidgetDisabled(id)) return;
  147. if (!_widgetHasState(id, FOCUSED)) return;
  148. const state = _generateFullState(id, value);
  149. _applyImageAndTextJson(id, state);
  150. _updateElementIdImageStyle(id, state);
  151. }
  152. $ax.style.SetWidgetSelected = function(id, value, alwaysApply) {
  153. if(_isWidgetDisabled(id)) return;
  154. //NOTE: not firing select events if state didn't change
  155. const raiseSelectedEvents = $ax.style.IsWidgetSelected(id) != value;
  156. if(value) {
  157. var group = $('#' + id).attr('selectiongroup');
  158. if(group) {
  159. $("[selectiongroup='" + group + "']").each(function() {
  160. var otherId = this.id;
  161. if(otherId == id) return;
  162. if ($ax.visibility.isScriptIdLimbo($ax.repeater.getScriptIdFromElementId(otherId))) return;
  163. $ax.style.SetWidgetSelected(otherId, false, alwaysApply);
  164. });
  165. }
  166. }
  167. var obj = $obj(id);
  168. if(obj) {
  169. // Lets remove 'selected' css class independently of object type (dynamic panel, layer or simple rectangle). See RP-1559
  170. if (!value) $jobj(id).removeClass(SELECTED);
  171. var actionId = id;
  172. if ($ax.public.fn.IsDynamicPanel(obj.type) || $ax.public.fn.IsLayerOrRdo(obj.type)) {
  173. var children = $axure('#' + id).getChildren()[0].children;
  174. var skipIds = new Set();
  175. for(var i = 0; i < children.length; i++) {
  176. var childId = children[i];
  177. // only set one member of selection group in children selected since subsequent calls
  178. // will unselect the previous one anyway
  179. if(value) {
  180. if(skipIds.has(childId)) continue;
  181. var group = $('#' + childId).attr('selectiongroup');
  182. if(group) for (var item of $("[selectiongroup='" + group + "']")) skipIds.add(item.id);
  183. }
  184. // Special case for trees
  185. var childObj = $jobj(childId);
  186. if(childObj.hasClass('treeroot')) {
  187. var treenodes = childObj.find('.treenode');
  188. for(var j = 0; j < treenodes.length; j++) {
  189. $axure('#' + treenodes[j].id).selected(value);
  190. }
  191. } else $axure('#' + childId).selected(value);
  192. }
  193. } else {
  194. const widgetHasSelectedState = _widgetHasState(id, SELECTED);
  195. while(obj.isContained && !widgetHasSelectedState) obj = obj.parent;
  196. var itemId = $ax.repeater.getItemIdFromElementId(id);
  197. var path = $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(id));
  198. path[path.length - 1] = obj.id;
  199. actionId = $ax.getElementIdFromPath(path, { itemNum: itemId });
  200. if(alwaysApply || widgetHasSelectedState) {
  201. const state = _generateFullState(actionId, undefined, value);
  202. _applyImageAndTextJson(actionId, state);
  203. _updateElementIdImageStyle(actionId, state);
  204. }
  205. //added actionId and this hacky logic because we set style state on child, but interaction on parent
  206. //then the id saved in _selectedWidgets would be depended on widgetHasSelectedState... more see case 1818143
  207. while(obj.isContained && !$ax.getObjectFromElementId(id).interactionMap) obj = obj.parent;
  208. path = $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(id));
  209. path[path.length - 1] = obj.id;
  210. actionId = $ax.getElementIdFromPath(path, { itemNum: itemId });
  211. }
  212. }
  213. // ApplyImageAndTextJson(id, value ? 'selected' : 'normal');
  214. _selectedWidgets[id] = value;
  215. if(raiseSelectedEvents) $ax.event.raiseSelectedEvents(actionId, value);
  216. };
  217. $ax.style.IsWidgetSelected = function(id) {
  218. return Boolean(_selectedWidgets[id] || _hasAnySelectedClass(id));
  219. };
  220. $ax.style.SetWidgetEnabled = function(id, value) {
  221. _disabledWidgets[id] = !value;
  222. $('#' + id).find('a').css('cursor', value ? 'pointer' : 'default');
  223. if(!_widgetHasState(id, DISABLED)) return;
  224. if(!value) {
  225. const state = _generateFullState(id, undefined, undefined, true);
  226. _applyImageAndTextJson(id, state);
  227. _updateElementIdImageStyle(id, state);
  228. } else $ax.style.SetWidgetSelected(id, $ax.style.IsWidgetSelected(id), true);
  229. };
  230. $ax.style.IsWidgetError = function (id) {
  231. return Boolean(_errorWidgets[id] || _hasAnyErrorClass(id));
  232. };
  233. $ax.style.SetWidgetError = function (id, value) {
  234. if(_isWidgetDisabled(id)) return;
  235. var raiseErrorEvents = $ax.style.IsWidgetError(id) != value;
  236. _errorWidgets[id] = value;
  237. if(raiseErrorEvents) $ax.event.raiseErrorEvents(id, value);
  238. if(!_widgetHasState(id, ERROR) && !_hasAnyErrorClass(id)) return;
  239. const state = _generateFullState(id, undefined, undefined, undefined, value);
  240. _applyImageAndTextJson(id, state);
  241. _updateElementIdImageStyle(id, state);
  242. }
  243. $ax.style.ShowingHint = function(id) {
  244. return _hintWidgets[id] === true;
  245. };
  246. $ax.style.SetWidgetPlaceholder = function(id, active, text, password) {
  247. _hintWidgets[id] = active && text && text.length > 0;
  248. const state = _generateState(id);
  249. const inputId = $ax.repeater.applySuffixToElementId(id, '_input');
  250. const obj = $jobj(inputId);
  251. if(!active) {
  252. try { //ie8 and below error
  253. if(password) document.getElementById(inputId).type = 'password';
  254. } catch(e) { }
  255. } else {
  256. try { //ie8 and below error
  257. if(password && text) document.getElementById(inputId).type = 'text';
  258. } catch(e) { }
  259. }
  260. obj.val(text);
  261. const style = _computeAllOverrides(id, undefined, state, $ax.adaptive.currentViewId);
  262. if(!$.isEmptyObject(style)) _applyTextStyle(inputId, style);
  263. _updateStateClasses(
  264. [
  265. id,
  266. $ax.repeater.applySuffixToElementId(id, '_div'),
  267. inputId
  268. ], state, false
  269. );
  270. };
  271. var _isWidgetDisabled = $ax.style.IsWidgetDisabled = function(id) {
  272. return Boolean(_disabledWidgets[id]);
  273. };
  274. var _elementIdsToImageOverrides = {};
  275. $ax.style.mapElementIdToImageOverrides = function (elementId, override) {
  276. for(var key in override) _addImageOverride(elementId, key, override[key]);
  277. };
  278. var _addImageOverride = function (elementId, state, val) {
  279. if (!_elementIdsToImageOverrides[elementId]) _elementIdsToImageOverrides[elementId] = {};
  280. _elementIdsToImageOverrides[elementId][state] = val;
  281. }
  282. $ax.style.deleteElementIdToImageOverride = function(elementId) {
  283. delete _elementIdsToImageOverrides[elementId];
  284. };
  285. $ax.style.getElementImageOverride = function(elementId, state) {
  286. var url = _elementIdsToImageOverrides[elementId] && _elementIdsToImageOverrides[elementId][state];
  287. return url;
  288. };
  289. $ax.style.elementHasAnyImageOverride = function(elementId) {
  290. return Boolean(_elementIdsToImageOverrides[elementId]);
  291. };
  292. // these camel case state names match up to generated
  293. // javascript properties such as keys for compound state images
  294. var NORMAL = 'normal';
  295. var MOUSE_OVER = 'mouseOver';
  296. var MOUSE_DOWN = 'mouseDown';
  297. var SELECTED = 'selected';
  298. var DISABLED = 'disabled';
  299. var ERROR = 'error';
  300. var HINT = 'hint';
  301. var FOCUSED = 'focused';
  302. var SELECTED_ERROR = 'selectedError';
  303. var SELECTED_HINT = 'selectedHint';
  304. var SELECTED_ERROR_HINT = 'selectedErrorHint';
  305. var ERROR_HINT = 'errorHint';
  306. var MOUSE_OVER_MOUSE_DOWN = 'mouseOverMouseDown';
  307. var MOUSE_OVER_SELECTED = 'mouseOverSelected';
  308. var MOUSE_OVER_ERROR = 'mouseOverError';
  309. var MOUSE_OVER_HINT = 'mouseOverHint';
  310. var MOUSE_OVER_SELECTED_ERROR = 'mouseOverSelectedError';
  311. var MOUSE_OVER_SELECTED_HINT = 'mouseOverSelectedHint';
  312. var MOUSE_OVER_SELECTED_ERROR_HINT = 'mouseOverSelectedErrorHint';
  313. var MOUSE_OVER_ERROR_HINT = 'mouseOverErrorHint';
  314. var MOUSE_DOWN_SELECTED = 'mouseDownSelected';
  315. var MOUSE_DOWN_ERROR = 'mouseDownError';
  316. var MOUSE_DOWN_HINT = 'mouseDownHint';
  317. var MOUSE_DOWN_SELECTED_ERROR = 'mouseDownSelectedError';
  318. var MOUSE_DOWN_SELECTED_HINT = 'mouseDownSelectedHint';
  319. var MOUSE_DOWN_SELECTED_ERROR_HINT = 'mouseDownSelectedErrorHint';
  320. var MOUSE_DOWN_ERROR_HINT = 'mouseDownErrorHint';
  321. var MOUSE_OVER_MOUSE_DOWN_SELECTED = 'mouseOverMouseDownSelected';
  322. var MOUSE_OVER_MOUSE_DOWN_ERROR = 'mouseOverMouseDownError';
  323. var MOUSE_OVER_MOUSE_DOWN_HINT = 'MouseOverMouseDownHint';
  324. var MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR = 'mouseOverMouseDownSelectedError';
  325. var MOUSE_OVER_MOUSE_DOWN_SELECTED_HINT = 'mouseOverMouseDownSelectedHint';
  326. var MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR_HINT = 'mouseOverMouseDownSelectedErrorHint';
  327. var MOUSE_OVER_MOUSE_DOWN_ERROR_HINT = 'mouseOverMouseDownErrorHint';
  328. var FOCUSED_SELECTED = 'focusedSelected';
  329. var FOCUSED_ERROR = 'focusedError';
  330. var FOCUSED_HINT = 'focusedHint';
  331. var FOCUSED_SELECTED_ERROR = 'focusedSelectedError';
  332. var FOCUSED_SELECTED_HINT = 'focusedSelectedHint';
  333. var FOCUSED_SELECTED_ERROR_HINT = 'focusedSelectedErrorHint';
  334. var FOCUSED_ERROR_HINT = 'focusedErrorHint';
  335. var HINT_DISABLED = 'hintDisabled';
  336. var SELECTED_DISABLED = 'selectedDisabled';
  337. var ERROR_DISABLED = 'errorDisabled';
  338. var SELECTED_HINT_DISABLED = 'selectedHintDisabled';
  339. var ERROR_HINT_DISABLED = 'errorHintDisabled';
  340. var SELECTED_ERROR_DISABLED = 'selectedErrorDisabled';
  341. var SELECTED_ERROR_HINT_DISABLED = 'selectedErrorHintDisabled';
  342. // Compound states are applied with multiple classes
  343. // #u0.mouseOver.mouseDown.Selected.Error in .css
  344. // class="mouseOver mouseDown selected error" in .html
  345. var ALL_STATES_WITH_CSS_CLASS = [
  346. MOUSE_OVER,
  347. MOUSE_DOWN,
  348. SELECTED,
  349. DISABLED,
  350. ERROR,
  351. HINT,
  352. FOCUSED
  353. ];
  354. var _stateHasFocused = function (state) {
  355. return state == FOCUSED
  356. || state == FOCUSED_SELECTED
  357. || state == FOCUSED_ERROR
  358. || state == FOCUSED_HINT
  359. || state == FOCUSED_SELECTED_ERROR
  360. || state == FOCUSED_SELECTED_HINT
  361. || state == FOCUSED_SELECTED_ERROR_HINT
  362. || state == FOCUSED_ERROR_HINT;
  363. };
  364. var _hasAnyFocusedClass = _style.HasAnyFocusedClass = function (id) {
  365. const jobj = $('#' + id);
  366. return jobj.hasClass(FOCUSED);
  367. };
  368. var _stateHasHint = function (state) {
  369. return state == HINT
  370. || state == SELECTED_HINT
  371. || state == SELECTED_ERROR_HINT
  372. || state == ERROR_HINT
  373. || state == MOUSE_OVER_HINT
  374. || state == MOUSE_OVER_SELECTED_HINT
  375. || state == MOUSE_OVER_SELECTED_ERROR_HINT
  376. || state == MOUSE_OVER_ERROR_HINT
  377. || state == MOUSE_DOWN_HINT
  378. || state == MOUSE_DOWN_SELECTED_HINT
  379. || state == MOUSE_DOWN_SELECTED_ERROR_HINT
  380. || state == MOUSE_DOWN_ERROR_HINT
  381. || state == MOUSE_OVER_MOUSE_DOWN_HINT
  382. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_HINT
  383. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR_HINT
  384. || state == MOUSE_OVER_MOUSE_DOWN_ERROR_HINT
  385. || state == FOCUSED_HINT
  386. || state == FOCUSED_SELECTED_HINT
  387. || state == FOCUSED_SELECTED_ERROR_HINT
  388. || state == FOCUSED_ERROR_HINT
  389. || state == HINT_DISABLED
  390. || state == SELECTED_HINT_DISABLED
  391. || state == ERROR_HINT_DISABLED
  392. || state == SELECTED_ERROR_HINT_DISABLED;
  393. };
  394. var _stateHasError = function (state) {
  395. return state == ERROR
  396. || state == SELECTED_ERROR
  397. || state == SELECTED_ERROR_HINT
  398. || state == ERROR_HINT
  399. || state == MOUSE_OVER_ERROR
  400. || state == MOUSE_OVER_SELECTED_ERROR
  401. || state == MOUSE_OVER_SELECTED_ERROR_HINT
  402. || state == MOUSE_OVER_ERROR_HINT
  403. || state == MOUSE_DOWN_ERROR
  404. || state == MOUSE_DOWN_SELECTED_ERROR
  405. || state == MOUSE_DOWN_SELECTED_ERROR_HINT
  406. || state == MOUSE_DOWN_ERROR_HINT
  407. || state == MOUSE_OVER_MOUSE_DOWN_ERROR
  408. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR
  409. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR_HINT
  410. || state == MOUSE_OVER_MOUSE_DOWN_ERROR_HINT
  411. || state == FOCUSED_ERROR
  412. || state == FOCUSED_SELECTED_ERROR
  413. || state == FOCUSED_SELECTED_ERROR_HINT
  414. || state == FOCUSED_ERROR_HINT
  415. || state == ERROR_DISABLED
  416. || state == ERROR_HINT_DISABLED
  417. || state == SELECTED_ERROR_DISABLED
  418. || state == SELECTED_ERROR_HINT_DISABLED;
  419. };
  420. var _hasAnyErrorClass = _style.HasAnyErrorClass = function (id) {
  421. const jobj = $('#' + id);
  422. return jobj.hasClass(ERROR);
  423. };
  424. var _stateHasDisabled = _style.StateHasDisabled = function (state) {
  425. return state == DISABLED
  426. || state == HINT_DISABLED
  427. || state == SELECTED_DISABLED
  428. || state == ERROR_DISABLED
  429. || state == SELECTED_HINT_DISABLED
  430. || state == ERROR_HINT_DISABLED
  431. || state == SELECTED_ERROR_DISABLED
  432. || state == SELECTED_ERROR_HINT_DISABLED;
  433. };
  434. var _hasAnyDisabledClass = _style.HasAnyDisabledClass = function (id) {
  435. const jobj = $('#' + id);
  436. return jobj.hasClass(DISABLED);
  437. };
  438. var _stateHasSelected = _style.StateHasSelected = function (state) {
  439. return state == SELECTED
  440. || state == SELECTED_ERROR
  441. || state == SELECTED_HINT
  442. || state == SELECTED_ERROR_HINT
  443. || state == MOUSE_OVER_SELECTED
  444. || state == MOUSE_OVER_SELECTED_ERROR
  445. || state == MOUSE_OVER_SELECTED_HINT
  446. || state == MOUSE_OVER_SELECTED_ERROR_HINT
  447. || state == MOUSE_DOWN_SELECTED
  448. || state == MOUSE_DOWN_SELECTED_ERROR
  449. || state == MOUSE_DOWN_SELECTED_HINT
  450. || state == MOUSE_DOWN_SELECTED_ERROR_HINT
  451. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED
  452. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR
  453. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_HINT
  454. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR_HINT
  455. || state == FOCUSED_SELECTED
  456. || state == FOCUSED_SELECTED_ERROR
  457. || state == FOCUSED_SELECTED_HINT
  458. || state == FOCUSED_SELECTED_ERROR_HINT
  459. || state == SELECTED_DISABLED
  460. || state == SELECTED_HINT_DISABLED
  461. || state == SELECTED_ERROR_DISABLED
  462. || state == SELECTED_ERROR_HINT_DISABLED;
  463. };
  464. var _hasAnySelectedClass = _style.HasAnySelectedClass = function (id) {
  465. const jobj = $('#' + id);
  466. return jobj.hasClass(SELECTED);
  467. };
  468. var _removeAnySelectedClass = _style.RemoveAnySelectedClass = function (id) {
  469. const jobj = $('#' + id);
  470. jobj.removeClass(SELECTED);
  471. };
  472. var _stateHasMouseOver = function (state) {
  473. return state == MOUSE_OVER
  474. || state == MOUSE_OVER_MOUSE_DOWN
  475. || state == MOUSE_OVER_SELECTED
  476. || state == MOUSE_OVER_ERROR
  477. || state == MOUSE_OVER_HINT
  478. || state == MOUSE_OVER_SELECTED_ERROR
  479. || state == MOUSE_OVER_SELECTED_HINT
  480. || state == MOUSE_OVER_SELECTED_ERROR_HINT
  481. || state == MOUSE_OVER_ERROR_HINT
  482. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED
  483. || state == MOUSE_OVER_MOUSE_DOWN_ERROR
  484. || state == MOUSE_OVER_MOUSE_DOWN_HINT
  485. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR
  486. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_HINT
  487. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR_HINT
  488. || state == MOUSE_OVER_MOUSE_DOWN_ERROR_HINT;
  489. };
  490. var _stateHasMouseDown = function (state) {
  491. return state == MOUSE_DOWN
  492. || state == MOUSE_OVER_MOUSE_DOWN
  493. || state == MOUSE_DOWN_SELECTED
  494. || state == MOUSE_DOWN_ERROR
  495. || state == MOUSE_DOWN_HINT
  496. || state == MOUSE_DOWN_SELECTED_ERROR
  497. || state == MOUSE_DOWN_SELECTED_HINT
  498. || state == MOUSE_DOWN_SELECTED_ERROR_HINT
  499. || state == MOUSE_DOWN_ERROR_HINT
  500. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED
  501. || state == MOUSE_OVER_MOUSE_DOWN_ERROR
  502. || state == MOUSE_OVER_MOUSE_DOWN_HINT
  503. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR
  504. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_HINT
  505. || state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR_HINT
  506. || state == MOUSE_OVER_MOUSE_DOWN_ERROR_HINT;
  507. };
  508. var _generateState = _style.generateState = function (id) {
  509. return _generateFullState(id);
  510. };
  511. // we need this for when we are looking for the correct image to apply
  512. // it tells us what image override to try to apply if it exists
  513. var _highestPriorityBaseState = _style.highestPriorityBaseState = function (state) {
  514. if (state == SELECTED_ERROR) return ERROR;
  515. if (state == SELECTED_HINT) return HINT;
  516. if (state == SELECTED_ERROR_HINT) return HINT;
  517. if (state == ERROR_HINT) return HINT;
  518. if (state == MOUSE_OVER_MOUSE_DOWN) return MOUSE_DOWN;
  519. if (state == MOUSE_OVER_SELECTED) return SELECTED;
  520. if (state == MOUSE_OVER_ERROR) return ERROR;
  521. if (state == MOUSE_OVER_HINT) return HINT;
  522. if (state == MOUSE_OVER_SELECTED_ERROR) return ERROR;
  523. if (state == MOUSE_OVER_SELECTED_HINT) return HINT;
  524. if (state == MOUSE_OVER_SELECTED_ERROR_HINT) return HINT;
  525. if (state == MOUSE_OVER_ERROR_HINT) return HINT;
  526. if (state == MOUSE_DOWN_SELECTED) return SELECTED;
  527. if (state == MOUSE_DOWN_ERROR) return ERROR;
  528. if (state == MOUSE_DOWN_HINT) return HINT;
  529. if (state == MOUSE_DOWN_SELECTED_ERROR) return ERROR;
  530. if (state == MOUSE_DOWN_SELECTED_HINT) return HINT;
  531. if (state == MOUSE_DOWN_SELECTED_ERROR_HINT) return HINT;
  532. if (state == MOUSE_DOWN_ERROR_HINT) return HINT;
  533. if (state == MOUSE_OVER_MOUSE_DOWN_SELECTED) return SELECTED;
  534. if (state == MOUSE_OVER_MOUSE_DOWN_ERROR) return ERROR;
  535. if (state == MOUSE_OVER_MOUSE_DOWN_HINT) return HINT;
  536. if (state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR) return ERROR;
  537. if (state == MOUSE_OVER_MOUSE_DOWN_SELECTED_HINT) return HINT;
  538. if (state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR_HINT) return HINT;
  539. if (state == MOUSE_OVER_MOUSE_DOWN_ERROR_HINT) return HINT;
  540. if (state == FOCUSED_SELECTED) return SELECTED;
  541. if (state == FOCUSED_ERROR) return ERROR;
  542. if (state == FOCUSED_HINT) return HINT;
  543. if (state == FOCUSED_SELECTED_ERROR) return ERROR;
  544. if (state == FOCUSED_SELECTED_HINT) return HINT;
  545. if (state == FOCUSED_SELECTED_ERROR_HINT) return HINT;
  546. if (state == FOCUSED_ERROR_HINT) return HINT;
  547. if (state == HINT_DISABLED) return DISABLED;
  548. if (state == SELECTED_DISABLED) return DISABLED;
  549. if (state == ERROR_DISABLED) return DISABLED;
  550. if (state == SELECTED_HINT_DISABLED) return DISABLED;
  551. if (state == ERROR_HINT_DISABLED) return DISABLED;
  552. if (state == SELECTED_ERROR_DISABLED) return DISABLED;
  553. if (state == SELECTED_ERROR_HINT_DISABLED) return DISABLED;
  554. return state;
  555. };
  556. // we need this for when we are looking for the correct image to apply
  557. var _decomposeState = _style.decomposeState = function(state) {
  558. if(state == NORMAL) return false;
  559. if(state == SELECTED_ERROR) return SELECTED;
  560. if(state == SELECTED_HINT) return SELECTED;
  561. if(state == SELECTED_ERROR_HINT) return SELECTED_ERROR;
  562. if(state == ERROR_HINT) return ERROR;
  563. if(state == MOUSE_OVER_MOUSE_DOWN) return MOUSE_OVER;
  564. if(state == MOUSE_OVER_SELECTED) return MOUSE_OVER;
  565. if(state == MOUSE_OVER_ERROR) return MOUSE_OVER;
  566. if(state == MOUSE_OVER_HINT) return MOUSE_OVER;
  567. if(state == MOUSE_OVER_SELECTED_ERROR) return MOUSE_OVER_SELECTED;
  568. if(state == MOUSE_OVER_SELECTED_HINT) return MOUSE_OVER_SELECTED;
  569. if(state == MOUSE_OVER_SELECTED_ERROR_HINT) return MOUSE_OVER_SELECTED_ERROR;
  570. if(state == MOUSE_OVER_ERROR_HINT) return MOUSE_OVER_ERROR;
  571. if(state == MOUSE_DOWN_SELECTED) return MOUSE_DOWN;
  572. if(state == MOUSE_DOWN_ERROR) return MOUSE_DOWN;
  573. if(state == MOUSE_DOWN_HINT) return MOUSE_DOWN;
  574. if(state == MOUSE_DOWN_SELECTED_ERROR) return MOUSE_DOWN_SELECTED;
  575. if(state == MOUSE_DOWN_SELECTED_HINT) return MOUSE_DOWN_SELECTED;
  576. if(state == MOUSE_DOWN_SELECTED_ERROR_HINT) return MOUSE_DOWN_SELECTED_ERROR;
  577. if(state == MOUSE_DOWN_ERROR_HINT) return MOUSE_DOWN_ERROR;
  578. if(state == MOUSE_OVER_MOUSE_DOWN_SELECTED) return MOUSE_OVER_MOUSE_DOWN;
  579. if(state == MOUSE_OVER_MOUSE_DOWN_ERROR) return MOUSE_OVER_MOUSE_DOWN;
  580. if(state == MOUSE_OVER_MOUSE_DOWN_HINT) return MOUSE_OVER_MOUSE_DOWN;
  581. if(state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR) return MOUSE_OVER_MOUSE_DOWN_SELECTED;
  582. if(state == MOUSE_OVER_MOUSE_DOWN_SELECTED_HINT) return MOUSE_OVER_MOUSE_DOWN_SELECTED;
  583. if(state == MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR_HINT) return MOUSE_OVER_MOUSE_DOWN_SELECTED_ERROR;
  584. if(state == MOUSE_OVER_MOUSE_DOWN_ERROR_HINT) return MOUSE_OVER_MOUSE_DOWN_ERROR;
  585. if(state == FOCUSED_SELECTED) return FOCUSED;
  586. if(state == FOCUSED_ERROR) return FOCUSED;
  587. if(state == FOCUSED_HINT) return FOCUSED;
  588. if(state == FOCUSED_SELECTED_ERROR) return FOCUSED_SELECTED;
  589. if(state == FOCUSED_SELECTED_HINT) return FOCUSED_SELECTED;
  590. if(state == FOCUSED_SELECTED_ERROR_HINT) return FOCUSED_SELECTED_ERROR;
  591. if(state == FOCUSED_ERROR_HINT) return FOCUSED_ERROR;
  592. if (state == HINT_DISABLED) return HINT;
  593. if (state == SELECTED_DISABLED) return SELECTED;
  594. if (state == ERROR_DISABLED) return ERROR;
  595. if (state == SELECTED_HINT_DISABLED) return SELECTED_HINT;
  596. if (state == ERROR_HINT_DISABLED) return ERROR_HINT;
  597. if (state == SELECTED_ERROR_DISABLED) return SELECTED_ERROR;
  598. if (state == SELECTED_ERROR_HINT_DISABLED) return SELECTED_ERROR_HINT;
  599. return NORMAL;
  600. };
  601. var _updateElementIdImageStyle = _style.updateElementIdImageStyle = function(elementId, state) {
  602. if(!_style.elementHasAnyImageOverride(elementId)) return;
  603. if(!state) state = _generateState(elementId);
  604. var style = _computeFullStyle(elementId, state, $ax.adaptive.currentViewId);
  605. var query = $jobj($ax.repeater.applySuffixToElementId(elementId, '_img'));
  606. style.size.width = query.width();
  607. style.size.height = query.height();
  608. var borderId = $ax.repeater.applySuffixToElementId(elementId, '_border');
  609. var borderQuery = $jobj(borderId);
  610. if(!borderQuery.length) {
  611. borderQuery = $('<div></div>');
  612. borderQuery.attr('id', borderId);
  613. query.after(borderQuery);
  614. }
  615. borderQuery.attr('style', '');
  616. //borderQuery.css('position', 'absolute');
  617. query.attr('style', '');
  618. var borderQueryCss = { 'position': 'absolute' };
  619. var queryCss = {}
  620. var borderWidth = Number(style.borderWidth);
  621. var hasBorderWidth = borderWidth > 0;
  622. if(hasBorderWidth) {
  623. //borderQuery.css('border-style', 'solid');
  624. //borderQuery.css('border-width', borderWidth + 'px'); // If images start being able to turn off borders on specific sides, need to update this.
  625. //borderQuery.css('width', style.size.width - borderWidth * 2);
  626. //borderQuery.css('height', style.size.height - borderWidth * 2);
  627. //borderQuery.css({
  628. // 'border-style': 'solid',
  629. // 'border-width': borderWidth + 'px',
  630. // 'width': style.size.width - borderWidth * 2,
  631. // 'height': style.size.height - borderWidth * 2
  632. //});
  633. borderQueryCss['border-style'] = 'solid';
  634. borderQueryCss['border-width'] = borderWidth + 'px'; // If images start being able to turn off borders on specific sides, need to update this.
  635. borderQueryCss['width'] = style.size.width - borderWidth * 2;
  636. borderQueryCss['height'] = style.size.height - borderWidth * 2;
  637. }
  638. var linePattern = style.linePattern;
  639. if(hasBorderWidth && linePattern) borderQueryCss['border-style'] = linePattern;
  640. var borderFill = style.borderFill;
  641. if(hasBorderWidth && borderFill) {
  642. var color = borderFill.fillType == 'solid' ? borderFill.color :
  643. borderFill.fillType == 'linearGradient' ? borderFill.colors[0].color : 0;
  644. var alpha = Math.floor(color / 256 / 256 / 256);
  645. color -= alpha * 256 * 256 * 256;
  646. alpha = alpha / 255;
  647. var red = Math.floor(color / 256 / 256);
  648. color -= red * 256 * 256;
  649. var green = Math.floor(color / 256);
  650. var blue = color - green * 256;
  651. borderQueryCss['border-color'] = _rgbaToFunc(red, green, blue, alpha);
  652. }
  653. var cornerRadiusTopLeft = style.cornerRadius;
  654. if(cornerRadiusTopLeft) {
  655. queryCss['border-radius'] = cornerRadiusTopLeft + 'px';
  656. borderQueryCss['border-radius'] = cornerRadiusTopLeft + 'px';
  657. }
  658. var outerShadow = style.outerShadow;
  659. if(outerShadow && outerShadow.on) {
  660. var arg = '';
  661. arg += outerShadow.offsetX + 'px' + ' ' + outerShadow.offsetY + 'px' + ' ';
  662. var rgba = outerShadow.color;
  663. arg += outerShadow.blurRadius + 'px' + ' 0px ' + _rgbaToFunc(rgba.r, rgba.g, rgba.b, rgba.a);
  664. //query.css('-moz-box-shadow', arg);
  665. //query.css('-wibkit-box-shadow', arg);
  666. //query.css('box-shadow', arg);
  667. //query.css('left', '0px');
  668. //query.css('top', '0px');
  669. //query.css({
  670. // '-moz-box-shadow': arg,
  671. // '-webkit-box-shadow': arg,
  672. // 'box-shadow': arg,
  673. // 'left': '0px',
  674. // 'top': '0px'
  675. //});
  676. queryCss['-moz-box-shadow'] = arg;
  677. queryCss['-wibkit-box-shadow'] = arg;
  678. queryCss['box-shadow'] = arg;
  679. queryCss['left'] = '0px';
  680. queryCss['top'] = '0px';
  681. }
  682. queryCss['width'] = style.size.width;
  683. queryCss['height'] = style.size.height;
  684. borderQuery.css(borderQueryCss);
  685. query.css(queryCss);
  686. //query.css({ width: style.size.width, height: style.size.height });
  687. };
  688. var _rgbaToFunc = function(red, green, blue, alpha) {
  689. return 'rgba(' + red + ',' + green + ',' + blue + ',' + alpha + ')';
  690. };
  691. var _enableStateTransitions = function () {
  692. $('body').removeClass('notransition');
  693. }
  694. $ax.style.enableStateTransitions = _enableStateTransitions;
  695. var _disableStateTransitions = function () {
  696. $('body').addClass('notransition');
  697. }
  698. $ax.style.disableStateTransitions = _disableStateTransitions;
  699. var _idToAppliedStyles = {};
  700. $ax.style.isLastAppliedStyle = function (id, className) {
  701. if (_idToAppliedStyles[id] && _idToAppliedStyles[id][_idToAppliedStyles[id].length - 1] === className) return true;
  702. return false;
  703. }
  704. $ax.style.setApplyStyleTag = function (className, cssRule) {
  705. var head = document.getElementsByTagName('head')[0];
  706. var styleTag = head.querySelector('#' + className);
  707. if (!styleTag) {
  708. styleTag = document.createElement('style');
  709. styleTag.type = 'text/css';
  710. styleTag.id = className;
  711. styleTag.innerHTML = cssRule;
  712. }
  713. head.appendChild(styleTag);
  714. }
  715. $ax.style.applyWidgetStyle = function (id, className, style, image, clearPrevious) {
  716. if (!clearPrevious && $ax.style.isLastAppliedStyle(id, className)) return;
  717. _enableStateTransitions();
  718. if (clearPrevious && _idToAppliedStyles[id] && _idToAppliedStyles[id].classList) {
  719. for (var i = 0; i < _idToAppliedStyles[id].classList.length; i++) {
  720. var classNameToRemove = _idToAppliedStyles[id].classList[i];
  721. $jobj(id).removeClass(classNameToRemove);
  722. $jobj($ax.repeater.applySuffixToElementId(id, '_div')).removeClass(classNameToRemove);
  723. $jobj($ax.repeater.applySuffixToElementId(id, '_text')).removeClass(classNameToRemove);
  724. $jobj($ax.repeater.applySuffixToElementId(id, '_input')).removeClass(classNameToRemove);
  725. }
  726. _idToAppliedStyles[id] = {
  727. classList: [],
  728. style: {},
  729. };
  730. }
  731. if (_idToAppliedStyles[id] && _idToAppliedStyles[id].classList && _idToAppliedStyles[id].style) {
  732. var index = _idToAppliedStyles[id].classList.indexOf(className);
  733. if (index > -1) _idToAppliedStyles[id].classList.splice(index, 1);
  734. _idToAppliedStyles[id].classList.push(className);
  735. _idToAppliedStyles[id].style = $.extend({}, _idToAppliedStyles[id].style, style);
  736. } else {
  737. _idToAppliedStyles[id] = {
  738. classList: [className],
  739. style: style,
  740. };
  741. }
  742. $jobj(id).removeClass(className);
  743. $jobj($ax.repeater.applySuffixToElementId(id, '_div')).removeClass(className);
  744. $jobj($ax.repeater.applySuffixToElementId(id, '_text')).removeClass(className);
  745. $jobj($ax.repeater.applySuffixToElementId(id, '_input')).removeClass(className);
  746. $jobj(id).addClass(className);
  747. $jobj($ax.repeater.applySuffixToElementId(id, '_div')).addClass(className);
  748. $jobj($ax.repeater.applySuffixToElementId(id, '_text')).addClass(className);
  749. $jobj($ax.repeater.applySuffixToElementId(id, '_input')).addClass(className);
  750. if ($ax.public.fn.IsImageBox($obj(id).type)) {
  751. if (image) {
  752. _applyImage(id, image, "interaction");
  753. }
  754. } else {
  755. _applySvg(id, "interaction", $.extend(_computeFullStyle(id, "interaction", $ax.adaptive.currentViewId), _idToAppliedStyles[id].style));
  756. }
  757. }
  758. $axure.messageCenter.addMessageListener(function (message, data) {
  759. if (message == "switchAdaptiveView") {
  760. var ids = Object.keys(_idToAppliedStyles);
  761. for (var i = 0; i < ids.length; i++) {
  762. var id = ids[i];
  763. for (var j = 0; j < _idToAppliedStyles[id].length; j++) {
  764. var className = _idToAppliedStyles[id][j];
  765. $jobj(id).removeClass(className);
  766. $jobj($ax.repeater.applySuffixToElementId(id, '_div')).removeClass(className);
  767. $jobj($ax.repeater.applySuffixToElementId(id, '_text')).removeClass(className);
  768. $jobj($ax.repeater.applySuffixToElementId(id, '_input')).removeClass(className);
  769. }
  770. }
  771. _idToAppliedStyles = {};
  772. }
  773. });
  774. var _applySvg = function (id, event, style) {
  775. let overridedStyle = style;
  776. if (!overridedStyle) {
  777. overridedStyle = _computeFullStyle(id, event, $ax.adaptive.currentViewId);
  778. if (_idToAppliedStyles[id] && _idToAppliedStyles[id].style) {
  779. $.extend(overridedStyle, _idToAppliedStyles[id].style);
  780. }
  781. }
  782. const originalBorderWidth = _computeFullStyle(id, "normal", $ax.adaptive.currentViewId).borderWidth;
  783. const transition = "transition:" + $jobj(id).css('transition') + ", d 0s" + ";";
  784. if(!$.isEmptyObject(overridedStyle)) {
  785. //TODO
  786. //Background Image
  787. //Maybe change SVG gen to use filter for Inner shadows instead of image
  788. //Radial Gradients
  789. //Correct Dash Array and Offset
  790. //compound is currently generating more image files than needed - audit other places
  791. //Line ends on compound
  792. //Image widgets than gen as SVG due to props
  793. function applyStyleOverrides(svgId, overridedStyle) {
  794. //if(!contentDoc) return;
  795. var svgns = 'http://www.w3.org/2000/svg';
  796. //var svgTag = contentDoc.getElementsByTagName("svg")[0];
  797. var svgTag = document.getElementById(svgId);
  798. var style = svgTag.getElementsByTagName("style")[0];
  799. var viewBox = svgTag.getAttribute("viewBox");
  800. var viewBoxValues = viewBox && viewBox.split(" ");
  801. var viewBoxX = parseFloat(viewBoxValues && viewBoxValues[0]) || 0;
  802. var viewBoxY = parseFloat(viewBoxValues && viewBoxValues[1]) || 0;
  803. if(!style) {
  804. style = document.createElementNS(svgns, "style");
  805. svgTag.appendChild(style);
  806. }
  807. var styleHtml = "";
  808. setFill();
  809. setBorder();
  810. setOuterShadow();
  811. setInnerShadow();
  812. setBackgroundImage();
  813. style.innerHTML = styleHtml;
  814. function setBackgroundImage() {
  815. if (overridedStyle.image) {
  816. var defsTag = svgTag.getElementsByTagName("defs")[0];
  817. if (!defsTag) {
  818. defsTag = document.createElementNS(svgns, "defs");
  819. svgTag.appendChild(defsTag);
  820. }
  821. var bgPatternId = "#" + svgId + "_bgp";
  822. var pattern = defsTag.querySelector(bgPatternId);
  823. var image = pattern.querySelector("image");
  824. if (!image) {
  825. image = document.createElementNS(svgns, "image");
  826. image.setAttribute("preserveAspectRatio", "none");
  827. pattern.appendChild(image);
  828. var fillElement = svgTag.querySelector(".fill");
  829. var backgroundElement = fillElement.cloneNode();
  830. backgroundElement.setAttribute("class", "background-image");
  831. backgroundElement.setAttribute("fill", "url(" + bgPatternId + ")");
  832. fillElement.after(backgroundElement);
  833. }
  834. image.setAttribute("href", overridedStyle.image.path);
  835. var patternRect = {
  836. x: 0,
  837. y: 0,
  838. width: overridedStyle.size.width,
  839. height: overridedStyle.size.height,
  840. };
  841. var imageRect = {
  842. x: 0,
  843. y: 0,
  844. width: overridedStyle.image.width,
  845. height: overridedStyle.image.height,
  846. };
  847. var alignment = pattern.getAttribute("alignment").split(" ");
  848. var horizontalAlignment = alignment[0];
  849. var verticalAlignment = alignment[1];
  850. var repeat = pattern.getAttribute("imagerepeat");
  851. if (repeat === "Repeat" || repeat === "RepeatX" || repeat === "RepeatY" || repeat === "None") {
  852. if (horizontalAlignment == 2) imageRect.x = patternRect.width - imageRect.width;
  853. if (horizontalAlignment == 1) imageRect.x = (patternRect.width - imageRect.width) / 2;
  854. if (verticalAlignment == 2) imageRect.y = patternRect.height - imageRect.height;
  855. if (verticalAlignment == 1) imageRect.y = (patternRect.height - imageRect.height) / 2;
  856. }
  857. if (repeat === "Repeat" || repeat === "RepeatX") {
  858. patternRect.width = imageRect.width;
  859. }
  860. if (repeat === "Repeat" || repeat === "RepeatY") {
  861. patternRect.height = imageRect.height;
  862. }
  863. if (repeat === "None") {
  864. if (imageRect.height > patternRect.height) patternRect.height = imageRect.height;
  865. if (patternRect.width > patternRect.width) patternRect.hidth = imageRect.width;
  866. }
  867. if (repeat === "StretchCover") {
  868. var wRatio = patternRect.width / imageRect.width;
  869. var hRatio = patternRect.height / imageRect.height;
  870. var ratio = wRatio;
  871. if (hRatio > wRatio) ratio = hRatio;
  872. var newWidth = imageRect.width * ratio;
  873. var newHeight = imageRect.height * ratio;
  874. var left = 0;
  875. if (newWidth > patternRect.width) {
  876. if (horizontalAlignment == 1) left = (patternRect.width - newWidth) / 2;
  877. else if (horizontalAlignment == 2) left = patternRect.width - newWidth;
  878. }
  879. var top = 0;
  880. if(newHeight > patternRect.height) {
  881. if (verticalAlignment == 1) top = (patternRect.height - newHeight) / 2;
  882. else if (verticalAlignment == 2) top = patternRect.height - newHeight;
  883. }
  884. patternRect = imageRect = { x: patternRect.x + left, y: patternRect.y + top, width: newWidth, height: newHeight };
  885. } else if (repeat === "StretchContain") {
  886. var ratio = imageRect.width / imageRect.height;
  887. var newWidth = patternRect.width;
  888. var newHeight = patternRect.width / ratio;
  889. if (newHeight > patternRect.height) {
  890. newWidth = patternRect.height * ratio;
  891. newHeight = patternRect.height;
  892. }
  893. var newRect = { x: 0, y: 0, width: newWidth, height: newHeight };
  894. if (newWidth < patternRect.width) {
  895. if (horizontalAlignment == 1) newRect.x = (patternRect.width - newWidth) / 2;
  896. else if (horizontalAlignment == 2) newRect.x = patternRect.width - newWidth;
  897. }
  898. if (newHeight < patternRect.height) {
  899. if (verticalAlignment == 1) newRect.Y = (patternRect.height - newHeight) / 2;
  900. else if (verticalAlignment == 2) newRect.Y = patternRect.height - newHeight;
  901. }
  902. imageRect = newRect;
  903. } else if (repeat === "Stretch") {
  904. imageRect = patternRect;
  905. }
  906. image.setAttribute("width", imageRect.width);
  907. image.setAttribute("height", imageRect.height);
  908. pattern.setAttribute("patternTransform", "translate(" + imageRect.x + " " + imageRect.y + ")");
  909. pattern.setAttribute("width", patternRect.width);
  910. pattern.setAttribute("height", patternRect.height);
  911. } else {
  912. styleHtml += "#" + svgId + " .background-image { fill: rgba(0,0,0,0); } "
  913. }
  914. }
  915. function setFill() {
  916. var fillStyle = "";
  917. if (overridedStyle.fill) {
  918. var styleFill = overridedStyle.fill;
  919. if (styleFill.fillType == "solid") {
  920. var fillColor = _getColorFromFill(styleFill);
  921. fillStyle += "fill:" + fillColor + "; ";
  922. } else if (styleFill.fillType == "linearGradient") {
  923. var gradientId = "id" + Math.random().toString(16).slice(2);
  924. if (insertLinearGradient(gradientId, styleFill, "fill")) {
  925. fillStyle += "fill: url(#" + gradientId + "); ";
  926. }
  927. } else if (styleFill.fillType == "radialGradient") {
  928. var gradientId = "id" + Math.random().toString(16).slice(2);
  929. if (insertRadialGradient(gradientId, styleFill, "fill")) {
  930. fillStyle += "fill: url(#" + gradientId + "); ";
  931. }
  932. }
  933. fillStyle += transition;
  934. }
  935. styleHtml += "#" + svgId + " .fill { " + fillStyle + " } "
  936. }
  937. function setBorder() {
  938. var borderStyle = "";
  939. var arrowHeadStyle = "";
  940. if (overridedStyle.borderFill) {
  941. var styleFill = overridedStyle.borderFill;
  942. if (styleFill.fillType == "solid") {
  943. var borderColor = _getColorFromFill(styleFill);
  944. borderStyle += "stroke:" + borderColor + "; ";
  945. arrowHeadStyle += "stroke:" + borderColor + "; fill:" + borderColor + "; ";
  946. } else if (styleFill.fillType == "linearGradient") {
  947. var gradientId = "id" + Math.random().toString(16).slice(2);
  948. if (insertLinearGradient(gradientId, styleFill, "stroke")) {
  949. borderStyle += "stroke: url(#" + gradientId + "); ";
  950. arrowHeadStyle += "stroke: url(#" + gradientId + "); fill: url(#" + gradientId + "); ";
  951. } else {
  952. var arrowhead = svgTag.querySelector(".arrowhead");
  953. if (arrowhead) {
  954. var fill = window.getComputedStyle(svgTag.querySelector(".stroke")).stroke;
  955. arrowhead.setAttribute("fill", fill);
  956. arrowhead.setAttribute("stroke", fill);
  957. }
  958. }
  959. } else if (styleFill.fillType == "radialGradient") {
  960. var gradientId = "id" + Math.random().toString(16).slice(2);
  961. if (insertRadialGradient(gradientId, styleFill, "stroke")) {
  962. borderStyle += "stroke: url(#" + gradientId + "); ";
  963. arrowHeadStyle += "stroke: url(#" + gradientId + "); fill: url(#" + gradientId + "); ";
  964. } else {
  965. var arrowhead = svgTag.querySelector(".arrowhead");
  966. if (arrowhead) {
  967. var fill = window.getComputedStyle(svgTag.querySelector(".stroke")).stroke;
  968. arrowhead.setAttribute("fill", fill);
  969. arrowhead.setAttribute("stroke", fill);
  970. }
  971. }
  972. }
  973. }
  974. if (overridedStyle.linePattern == "none") {
  975. borderStyle += "stroke-width: 0; stroke-dasharray: 0; ";
  976. arrowHeadStyle = "fill: none";
  977. } else {
  978. if (overridedStyle.borderWidth) {
  979. var closedAndClipped = true;
  980. var newBorderWidth = overridedStyle.borderWidth;
  981. var strokes = svgTag.getElementsByClassName("stroke");
  982. var fills = svgTag.getElementsByClassName("fill");
  983. if (obj.friendlyType === "Rectangle") {
  984. var size = overridedStyle.size;
  985. size = { width: Math.round(size.width), height: Math.round(size.height) };
  986. var hasBorderTop = overridedStyle.borderVisibility.includes("top");
  987. var hasBorderRight = overridedStyle.borderVisibility.includes("right");
  988. var hasBorderBottom = overridedStyle.borderVisibility.includes("bottom");
  989. var hasBorderLeft = overridedStyle.borderVisibility.includes("left");
  990. var cornerRadius = Math.min(overridedStyle.cornerRadius, Math.min(size.width, size.height));
  991. var hasCornerRadius = cornerRadius > 0;
  992. var hasCornerTopRight = hasCornerRadius && overridedStyle.cornerVisibility.includes("top") && hasBorderTop == hasBorderRight;
  993. var hasCornerBottomRight = hasCornerRadius && overridedStyle.cornerVisibility.includes("right") && hasBorderBottom == hasBorderRight;
  994. var hasCornerBottomLeft = hasCornerRadius && overridedStyle.cornerVisibility.includes("bottom") && hasBorderBottom == hasBorderLeft;
  995. var hasCornerTopLeft = hasCornerRadius && overridedStyle.cornerVisibility.includes("left") && hasBorderTop == hasBorderLeft;
  996. var arcK = 0.44;
  997. var halfWidth = newBorderWidth / 2;
  998. var left = hasBorderLeft ? halfWidth : 0;
  999. var top = hasBorderTop ? halfWidth : 0;
  1000. var right = size.width - (hasBorderRight ? halfWidth : 0);
  1001. var bottom = size.height - (hasBorderBottom ? halfWidth : 0);
  1002. var arc = (cornerRadius - halfWidth) * arcK + halfWidth;
  1003. var segments = [];
  1004. function fillTop(start) {
  1005. if (hasBorderTop) {
  1006. if (start && hasCornerTopLeft) segments.push("M " + cornerRadius + " " + top);
  1007. else if (start || !hasBorderLeft) segments.push("M " + left + " " + top);
  1008. if (hasCornerTopRight) {
  1009. segments.push("L " + (size.width - cornerRadius) + " " + top);
  1010. segments.push("C " + (size.width - arc) + " " + top + " " + right + " " + arc + " " + right + " " + cornerRadius);
  1011. } else segments.push("L " + right + " " + top);
  1012. }
  1013. return fillRight;
  1014. }
  1015. function fillRight(start) {
  1016. if (hasBorderRight) {
  1017. if (start && hasCornerTopRight) segments.push("M " + right + " " + cornerRadius);
  1018. else if (start || !hasBorderTop) segments.push("M " + right + " " + top);
  1019. if (hasCornerBottomRight) {
  1020. segments.push("L " + right + " " + (size.height - cornerRadius));
  1021. segments.push("C " + right + " " + (size.height - arc) + " " + (size.width - arc) + " " + bottom + " " + (size.width - cornerRadius) + " " + bottom);
  1022. } else segments.push("L " + right + " " + bottom);
  1023. }
  1024. return fillBottom;
  1025. }
  1026. function fillBottom(start) {
  1027. if (hasBorderBottom) {
  1028. if (start && hasCornerBottomRight) segments.push("M " + right + " " + (size.height - cornerRadius));
  1029. else if (start || !hasBorderRight) segments.push("M " + right + " " + bottom);
  1030. if (hasCornerBottomLeft) {
  1031. segments.push("L " + cornerRadius + " " + bottom);
  1032. segments.push("C " + arc + " " + bottom + " " + left + " " + (size.height - arc) + " " + left + " " + (size.height - cornerRadius));
  1033. } else segments.push("L " + left + " " + bottom);
  1034. }
  1035. return fillLeft;
  1036. }
  1037. function fillLeft(start) {
  1038. if (hasBorderLeft) {
  1039. if (start && hasCornerBottomLeft) segments.push("M " + left + " " + (size.height - cornerRadius));
  1040. else if (start || !hasBorderBottom) segments.push("M " + left + " " + bottom);
  1041. if (hasCornerTopLeft) {
  1042. segments.push("L " + left + " " + cornerRadius);
  1043. segments.push("C " + left + " " + arc + " " + arc + " " + top + " " + cornerRadius + " " + top);
  1044. } else segments.push("L " + left + " " + top);
  1045. }
  1046. return fillTop;
  1047. }
  1048. if (!hasBorderTop) fillRight(true)(false)(false)(false);
  1049. else if (!hasBorderRight) fillBottom(true)(false)(false)(false);
  1050. else if (!hasBorderBottom) fillLeft(true)(false)(false)(false);
  1051. else if (!hasBorderLeft) fillTop(true)(false)(false)(false);
  1052. else {
  1053. fillTop(true)(false)(false)(false);
  1054. segments.push("Z");
  1055. }
  1056. var d = segments.join(" ");
  1057. for(var path of [...strokes]) {
  1058. path.setAttribute("d", d);
  1059. path.setAttribute("mask", "");
  1060. }
  1061. segments = [];
  1062. hasBorderTop = hasBorderRight = hasBorderBottom = hasBorderLeft = true;
  1063. left = 0;
  1064. top = 0;
  1065. right = size.width;
  1066. bottom = size.height;
  1067. arc = cornerRadius * arcK;
  1068. fillTop(true)(false)(false)(false);
  1069. segments.push("Z");
  1070. d = segments.join(" ");
  1071. for(var path of [ ...fills]) {
  1072. path.setAttribute("d", d);
  1073. path.setAttribute("mask", "");
  1074. }
  1075. } else {
  1076. for (var path of strokes) {
  1077. closedAndClipped = path.getAttribute("mask") && path.getAttribute("d").includes(" Z");
  1078. currentBorderWidth = parseFloat(path.getAttribute("stroke-width"));
  1079. newBorderWidth = closedAndClipped ? overridedStyle.borderWidth * 2 : overridedStyle.borderWidth;
  1080. path.setAttribute("stroke-width", newBorderWidth);
  1081. }
  1082. }
  1083. borderStyle += "stroke-width:" + newBorderWidth + "; ";
  1084. if (!closedAndClipped) {
  1085. arrowHeadStyle += "stroke-width: " + (newBorderWidth - originalBorderWidth) + "; ";
  1086. }
  1087. if (overridedStyle.linePatternArray) {
  1088. var linePattern = overridedStyle.linePatternArray.map(x => x * overridedStyle.borderWidth);
  1089. borderStyle += "stroke-dasharray:" + linePattern.join(",") + "; ";
  1090. }
  1091. }
  1092. }
  1093. if (borderStyle.length > 0) {
  1094. borderStyle += transition;
  1095. }
  1096. if (arrowHeadStyle.length > 0) {
  1097. arrowHeadStyle += transition;
  1098. }
  1099. styleHtml += "#" + svgId + " .stroke { " + borderStyle + " } ";
  1100. styleHtml += "#" + svgId + " .arrowhead { " + arrowHeadStyle + " } ";
  1101. if($ax.public.fn.IsCheckBox(obj.type)) {
  1102. var checkWidth = 3 * obj.buttonSize / 14;
  1103. styleHtml += "#" + svgId + " .stroke.btn_check { stroke-width: " + checkWidth + "; } ";
  1104. }
  1105. }
  1106. function setOuterShadow() {
  1107. if (overridedStyle.outerShadow && overridedStyle.outerShadow.on) {
  1108. var dropShadowStyle = "#" + svgId + " { filter: drop-shadow(" +
  1109. overridedStyle.outerShadow.offsetX + "px " +
  1110. overridedStyle.outerShadow.offsetY + "px " +
  1111. overridedStyle.outerShadow.blurRadius + "px " +
  1112. _getCssColor(overridedStyle.outerShadow.color) + "); " +
  1113. transition + "} ";
  1114. styleHtml += dropShadowStyle;
  1115. } else {
  1116. var dropShadowStyle = "#" + svgId + " { " + transition + " } ";
  1117. styleHtml += dropShadowStyle
  1118. }
  1119. }
  1120. function setInnerShadow() {
  1121. if (overridedStyle.innerShadow && overridedStyle.innerShadow.on) {
  1122. var filterTag = svgTag.querySelector("filter");
  1123. var innerShadowFilterId = filterTag && filterTag.getAttribute("id");
  1124. if (innerShadowFilterId) {
  1125. var feOffset = filterTag.querySelector("#offset");
  1126. feOffset.setAttribute("dx", overridedStyle.innerShadow.offsetX);
  1127. feOffset.setAttribute("dy", overridedStyle.innerShadow.offsetY);
  1128. var feBlur = filterTag.querySelector("#blur");
  1129. feBlur.setAttribute("stdDeviation", overridedStyle.innerShadow.blurRadius / 2);
  1130. var feMorphology = filterTag.querySelector("#morphology");
  1131. feMorphology.setAttribute("radius", +overridedStyle.borderWidth + overridedStyle.innerShadow.spread);
  1132. var feFlood = filterTag.querySelector("#color");
  1133. feFlood.setAttribute("flood-color", _getCssColor(overridedStyle.innerShadow.color));
  1134. } else {
  1135. var defsTag = svgTag.getElementsByTagName("defs")[0];
  1136. if (!defsTag) {
  1137. defsTag = document.createElementNS(svgns, "defs");
  1138. svgTag.appendChild(defsTag);
  1139. }
  1140. filterTag = document.createElementNS(svgns, "filter");
  1141. innerShadowFilterId = svgId + "innerShadowFilter";
  1142. filterTag.setAttribute("x", "-50%");
  1143. filterTag.setAttribute("y", "-50%");
  1144. filterTag.setAttribute("width", "200%");
  1145. filterTag.setAttribute("height", "200%");
  1146. filterTag.setAttribute("filterUnits", "objectBoundingBox");
  1147. filterTag.setAttribute("id", innerShadowFilterId);
  1148. var feOffset = document.createElementNS(svgns, "feOffset");
  1149. feOffset.setAttribute("dx", overridedStyle.innerShadow.offsetX);
  1150. feOffset.setAttribute("dy", overridedStyle.innerShadow.offsetY);
  1151. feOffset.setAttribute("in", "SourceGraphic");
  1152. feOffset.setAttribute("result", "offset");
  1153. feOffset.setAttribute("id", "offset");
  1154. filterTag.appendChild(feOffset);
  1155. var feMorphology = document.createElementNS(svgns, "feMorphology");
  1156. feMorphology.setAttribute("radius", +overridedStyle.borderWidth + overridedStyle.innerShadow.spread);
  1157. feMorphology.setAttribute("operator", "erode");
  1158. feMorphology.setAttribute("in", "offset");
  1159. feMorphology.setAttribute("result", "morphology");
  1160. feMorphology.setAttribute("id", "morphology");
  1161. filterTag.appendChild(feMorphology);
  1162. var feBlur = document.createElementNS(svgns, "feGaussianBlur");
  1163. feBlur.setAttribute("stdDeviation", overridedStyle.innerShadow.blurRadius / 2);
  1164. feBlur.setAttribute("in", "morphology");
  1165. feBlur.setAttribute("result", "blur");
  1166. feBlur.setAttribute("id", "blur");
  1167. filterTag.appendChild(feBlur);
  1168. var feComposite1 = document.createElementNS(svgns, "feComposite");
  1169. feComposite1.setAttribute("in2", "blur");
  1170. feComposite1.setAttribute("operator", "out");
  1171. feComposite1.setAttribute("in", "SourceGraphic");
  1172. feComposite1.setAttribute("result", "inverse");
  1173. feComposite1.setAttribute("id", "inverse");
  1174. filterTag.appendChild(feComposite1);
  1175. var feFlood = document.createElementNS(svgns, "feFlood");
  1176. feFlood.setAttribute("flood-color", _getCssColor(overridedStyle.innerShadow.color));
  1177. feFlood.setAttribute("in", "inverse");
  1178. feFlood.setAttribute("result", "color");
  1179. feFlood.setAttribute("id", "color");
  1180. filterTag.appendChild(feFlood);
  1181. var feComposite2 = document.createElementNS(svgns, "feComposite");
  1182. feComposite2.setAttribute("in2", "inverse");
  1183. feComposite2.setAttribute("operator", "in");
  1184. feComposite2.setAttribute("in", "color");
  1185. feComposite2.setAttribute("result", "shadow");
  1186. feComposite2.setAttribute("id", "shadow");
  1187. filterTag.appendChild(feComposite2);
  1188. var feComposite3 = document.createElementNS(svgns, "feComposite");
  1189. feComposite3.setAttribute("in2", "SourceGraphic");
  1190. feComposite3.setAttribute("operator", "over");
  1191. feComposite3.setAttribute("in", "shadow");
  1192. filterTag.appendChild(feComposite3);
  1193. defsTag.appendChild(filterTag);
  1194. }
  1195. var innerShadowCss = "#" + svgId + " .fill, " + "#" + svgId + " .background-image { filter:url('#" + innerShadowFilterId + "');} ";
  1196. styleHtml += innerShadowCss;
  1197. }
  1198. }
  1199. //if the current gradient has the same number of stops
  1200. //add the css for each stop to animate it
  1201. //otherwise create a new gradient and apply it
  1202. function insertLinearGradient(gradientId, styleFill, propName) {
  1203. var defsTag = svgTag.getElementsByTagName("defs")[0];
  1204. if (!defsTag) {
  1205. defsTag = document.createElementNS(svgns, "defs");
  1206. svgTag.appendChild(defsTag);
  1207. }
  1208. var stops = styleFill.stops;
  1209. //clean up old non-default gradients
  1210. defsTag.querySelectorAll(".temp_" + propName).forEach(e => e.remove());
  1211. var currentFill = propName == "fill" ? window.getComputedStyle(svgTag.querySelector(".fill")).fill : window.getComputedStyle(svgTag.querySelector(".stroke")).stroke;
  1212. if (currentFill.indexOf("url") > -1) {
  1213. var currentGradId = currentFill.substring(currentFill.indexOf('#') + 1, currentFill.indexOf('")'));
  1214. var currentGrad = document.getElementById(currentGradId);
  1215. if (currentGrad && currentGrad.tagName === "linearGradient") {
  1216. var currentStops = currentGrad.querySelectorAll("stop");
  1217. if (currentStops.length == stops.length) {
  1218. for (var i = 0, length = stops.length; i < length; i++) {
  1219. styleHtml += "#" + currentGradId + " stop:nth-of-type(" + (i + 1) + ") { stop-color:" + _getColorFromArgbColorProp(stops[i].color) + " } ";
  1220. }
  1221. styleHtml += "#" + currentGradId + " stop { " + transition + " } ";
  1222. currentGrad.setAttribute("x1", viewBoxX + styleFill.startPoint.x * overridedStyle.size.width);
  1223. currentGrad.setAttribute("y1", viewBoxY + styleFill.startPoint.y * overridedStyle.size.height);
  1224. currentGrad.setAttribute("x2", viewBoxX + styleFill.endPoint.x * overridedStyle.size.width);
  1225. currentGrad.setAttribute("y2", viewBoxY + styleFill.endPoint.y * overridedStyle.size.height);
  1226. return false;
  1227. }
  1228. }
  1229. }
  1230. var gradient = document.createElementNS(svgns, "linearGradient");
  1231. for (var i = 0, length = stops.length; i < length; i++) {
  1232. var stop = document.createElementNS(svgns, "stop");
  1233. stop.setAttribute("offset", stops[i].offset);
  1234. stop.setAttribute("stop-color", _getColorFromArgbColorProp(stops[i].color));
  1235. gradient.appendChild(stop);
  1236. }
  1237. gradient.id = gradientId;
  1238. gradient.classList.add("temp_" + propName);
  1239. gradient.setAttribute("gradientUnits", "userSpaceOnUse");
  1240. gradient.setAttribute("x1", viewBoxX + styleFill.startPoint.x * overridedStyle.size.width);
  1241. gradient.setAttribute("y1", viewBoxY + styleFill.startPoint.y * overridedStyle.size.height);
  1242. gradient.setAttribute("x2", viewBoxX + styleFill.endPoint.x * overridedStyle.size.width);
  1243. gradient.setAttribute("y2", viewBoxY + styleFill.endPoint.y * overridedStyle.size.height);
  1244. defsTag.appendChild(gradient);
  1245. return true;
  1246. }
  1247. function insertRadialGradient(gradientId, styleFill, propName) {
  1248. var defsTag = svgTag.getElementsByTagName("defs")[0];
  1249. if (!defsTag) {
  1250. defsTag = document.createElementNS(svgns, "defs");
  1251. svgTag.appendChild(defsTag);
  1252. }
  1253. var stops = styleFill.stops;
  1254. var center = { x: overridedStyle.size.width * styleFill.center.x, y: overridedStyle.size.height * styleFill.center.y };
  1255. var axis1 = { x: overridedStyle.size.width * styleFill.axis1.x, y: overridedStyle.size.height * styleFill.axis1.y };
  1256. var axis2 = { x: overridedStyle.size.width * styleFill.axis2.x, y: overridedStyle.size.height * styleFill.axis2.y };
  1257. var length1 = Math.sqrt((axis1.x - center.x) * (axis1.x - center.x) + (axis1.y - center.y) * (axis1.y - center.y));
  1258. var length2 = Math.sqrt((axis2.x - center.x) * (axis2.x - center.x) + (axis2.y - center.y) * (axis2.y - center.y));
  1259. var radius, xScale, yScale;
  1260. if (length1 < length2) {
  1261. xScale = length1 / length2;
  1262. yScale = 1;
  1263. radius = length2;
  1264. } else {
  1265. yScale = length2 / length1;
  1266. xScale = 1;
  1267. radius = length1;
  1268. }
  1269. var tx = viewBoxX + center.x;
  1270. var ty = viewBoxY + center.y;
  1271. var scaleMat = $ax.public.fn.matrixMultiplyMatrix({ m11: xScale, m12: 0, m21: 0, m22: yScale, tx: tx, ty: ty }, { m11: 1, m12: 0, m21: 0, m22: 1, tx: -tx, ty: -ty });
  1272. var sinAngle = (axis1.y - center.y) / length1;
  1273. var cosAngle = (axis1.x - center.x) / length1;
  1274. var rotateAroundMat = $ax.public.fn.matrixMultiplyMatrix({ m11: cosAngle, m22: cosAngle, m12: -sinAngle, m21: sinAngle, tx: tx, ty: ty }, { m11: 1, m12: 0, m21: 0, m22: 1, tx: -tx, ty: -ty });
  1275. var transformMat = $ax.public.fn.matrixMultiplyMatrix(rotateAroundMat, scaleMat);
  1276. var transformMatAttr = "matrix(" + transformMat.m11 + " " + transformMat.m21 + " " + transformMat.m12 + " " + transformMat.m22 + " " + transformMat.tx + " " + transformMat.ty + ")";
  1277. //clean up old non-default gradients
  1278. defsTag.querySelectorAll(".temp_" + propName).forEach(e => e.remove());
  1279. var currentFill = propName == "fill" ? window.getComputedStyle(svgTag.querySelector(".fill")).fill : window.getComputedStyle(svgTag.querySelector(".stroke")).stroke;
  1280. if (currentFill.indexOf("url") > -1) {
  1281. var currentGradId = currentFill.substring(currentFill.indexOf('#') + 1, currentFill.indexOf('")'));
  1282. var currentGrad = document.getElementById(currentGradId);
  1283. if (currentGrad && currentGrad.tagName === "radialGradient") {
  1284. var currentStops = currentGrad.querySelectorAll("stop");
  1285. if (currentStops.length == stops.length) {
  1286. for (var i = 0, length = stops.length; i < length; i++) {
  1287. styleHtml += "#" + currentGradId + " stop:nth-of-type(" + (i + 1) + ") { stop-color:" + _getColorFromArgbColorProp(stops[i].color) + " } ";
  1288. }
  1289. styleHtml += "#" + currentGradId + " stop { " + transition + " } ";
  1290. currentGrad.setAttribute("cx", viewBoxX + center.x);
  1291. currentGrad.setAttribute("cy", viewBoxY + center.y);
  1292. currentGrad.setAttribute("r", radius);
  1293. currentGrad.setAttribute("gradientTransform", transformMatAttr);
  1294. currentGrad.setAttribute("gradientUnits", "userSpaceOnUse");
  1295. return false;
  1296. }
  1297. }
  1298. }
  1299. var gradient = document.createElementNS(svgns, "radialGradient");
  1300. for (var i = 0, length = stops.length; i < length; i++) {
  1301. var stop = document.createElementNS(svgns, "stop");
  1302. stop.setAttribute("offset", stops[i].offset);
  1303. stop.setAttribute("stop-color", _getColorFromArgbColorProp(stops[i].color));
  1304. gradient.appendChild(stop);
  1305. }
  1306. gradient.id = gradientId;
  1307. gradient.classList.add("temp_" + propName);
  1308. gradient.setAttribute("cx", viewBoxX + center.x);
  1309. gradient.setAttribute("cy", viewBoxY + center.y);
  1310. gradient.setAttribute("r", radius);
  1311. gradient.setAttribute("gradientTransform", transformMatAttr);
  1312. gradient.setAttribute("gradientUnits", "userSpaceOnUse");
  1313. defsTag.appendChild(gradient);
  1314. return true;
  1315. }
  1316. }
  1317. var obj = $obj(id);
  1318. if(obj.generateCompound) {
  1319. for(var i = 0; i < obj.compoundChildren.length; i++) {
  1320. var componentId = obj.compoundChildren[i];
  1321. var childId = $ax.public.fn.getComponentId(id, componentId) + "_img";
  1322. //const container = document.getElementById(childId);
  1323. // const contentDoc = container.contentDocument;
  1324. // if(!contentDoc || contentDoc.URL == "about:blank") container.onload = () => applyStyleOverrides(container.contentDocument, overridedStyle);
  1325. // else applyStyleOverrides(contentDoc, overridedStyle);
  1326. applyStyleOverrides(childId, overridedStyle);
  1327. }
  1328. } else {
  1329. const svgContainerId = id + "_img";
  1330. const container = document.getElementById(svgContainerId);
  1331. if (!container || container.tagName.toLowerCase() != "svg") return;
  1332. //if($ax.public.fn.IsRadioButton(obj.type) || $ax.public.fn.IsCheckBox(obj.type)) {
  1333. // let imageKey = event + "~";
  1334. // const viewStr = parent.document.querySelector(".currentAdaptiveView").getAttribute("val");
  1335. // if(viewStr && viewStr !== "default") imageKey += viewStr;
  1336. // const data = obj.images[imageKey];
  1337. // if (data && container.data && !container.data.includes(data)) container.data = data;
  1338. //}
  1339. //const contentDoc = container.contentDocument;
  1340. //if(!contentDoc || contentDoc.URL == "about:blank") container.onload = () => applyStyleOverrides(container.contentDocument, overridedStyle);
  1341. //else applyStyleOverrides(contentDoc, overridedStyle);
  1342. applyStyleOverrides(svgContainerId, overridedStyle);
  1343. }
  1344. }
  1345. //else {
  1346. // function resetOverrides(svgContainerId) {
  1347. // var svgFills = document.getElementById(svgContainerId).contentDocument.querySelectorAll(".fill");
  1348. // svgFills.forEach((svgFill) => {
  1349. // svgFill.setAttribute("style", "");
  1350. // });
  1351. // var svgBorders = document.getElementById(svgContainerId).contentDocument.querySelectorAll(".stroke");
  1352. // svgBorders.forEach((svgBorder) => {
  1353. // svgBorder.setAttribute("style", "");
  1354. // svgBorder.setAttribute("stroke-dasharray", "");
  1355. // });
  1356. // }
  1357. // var object = $obj(id);
  1358. // if(object.generateCompound) {
  1359. // for(var i = 0; i < object.compoundChildren.length; i++) {
  1360. // var componentId = object.compoundChildren[i];
  1361. // var childId = $ax.public.fn.getComponentId(id, componentId) + "_img";
  1362. // resetOverrides(childId, overridedStyle);
  1363. // }
  1364. // } else {
  1365. // const svgContainerId = id + "_img";
  1366. // resetOverrides(svgContainerId, overridedStyle);
  1367. // }
  1368. //}
  1369. }
  1370. var _applyImageAndTextJson = function (id, event) {
  1371. _enableStateTransitions();
  1372. const textId = $ax.GetTextPanelId(id);
  1373. if(textId) _resetTextJson(id, textId);
  1374. if($ax.public.fn.IsImageBox($obj(id).type)) {
  1375. const imageUrl = $ax.adaptive.getImageForStateAndView(id, event);
  1376. if(imageUrl) {
  1377. _applyImage(id, imageUrl, event);
  1378. }
  1379. } else _applySvg(id, event);
  1380. if (textId) {
  1381. const overridedStyle = _computeAllOverrides(id, undefined, event, $ax.adaptive.currentViewId);
  1382. var borderElement = document.getElementById(id + '_div');
  1383. if($(borderElement).hasClass("bgImg")) borderElement = undefined;
  1384. var textElement = document.getElementById(textId);
  1385. if (!$.isEmptyObject(overridedStyle)) {
  1386. var diagramObject = $ax.getObjectFromElementId(id);
  1387. var fullStyle = _computeFullStyle(id, event, $ax.adaptive.currentViewId, overridedStyle);
  1388. var padding = { top: 0, right: 0, bottom: 0, left: 0 };
  1389. if (fullStyle.paddingTop) padding.top = +fullStyle.paddingTop;
  1390. if (fullStyle.paddingBottom) padding.bottom = +fullStyle.paddingBottom;
  1391. if (fullStyle.paddingLeft) padding.left = +fullStyle.paddingLeft;
  1392. if (fullStyle.paddingRight) padding.right = +fullStyle.paddingRight;
  1393. var newSize = _applyTextStyle(textId, overridedStyle, padding);
  1394. if (borderElement && textElement && (diagramObject.autoFitHeight || diagramObject.autoFitWidth)) {
  1395. if (diagramObject.autoFitHeight) {
  1396. var height = newSize.height;
  1397. borderElement.style.height = height + 'px';
  1398. textElement.style.top = 0;
  1399. }
  1400. if (diagramObject.autoFitWidth) {
  1401. var width = newSize.width;
  1402. borderElement.style.width = width + 'px';
  1403. textElement.style.left = 0;
  1404. }
  1405. }
  1406. } else if (borderElement && textElement) {
  1407. var parentElement = document.getElementById(id);
  1408. if (parentElement) {
  1409. borderElement.style.height = parentElement.style.height;
  1410. borderElement.style.width = parentElement.style.width;
  1411. }
  1412. textElement.style.top = '';
  1413. textElement.style.left = '';
  1414. }
  1415. }
  1416. _updateStateClasses(
  1417. [
  1418. id,
  1419. $ax.repeater.applySuffixToElementId(id, '_div'),
  1420. $ax.repeater.applySuffixToElementId(id, '_input')
  1421. ], event, false
  1422. );
  1423. };
  1424. let _updateStateClasses = function(ids, event, addMouseOverOnMouseDown) {
  1425. for(let i = 0; i < ids.length; i++) {
  1426. _updateStateClassesHelper(ids[i], event, addMouseOverOnMouseDown);
  1427. }
  1428. };
  1429. let _updateStateClassesHelper = function(id, event, addMouseOverOnMouseDown) {
  1430. const jobj = $jobj(id);
  1431. const isMouseDownEvent = _stateHasMouseDown(event);
  1432. for (let i = 0; i < ALL_STATES_WITH_CSS_CLASS.length; i++) jobj.removeClass(ALL_STATES_WITH_CSS_CLASS[i]);
  1433. if (addMouseOverOnMouseDown && isMouseDownEvent || _stateHasMouseOver(event)) jobj.addClass(MOUSE_OVER);
  1434. if (isMouseDownEvent) jobj.addClass(MOUSE_DOWN);
  1435. if (_stateHasFocused(event)) jobj.addClass(FOCUSED);
  1436. if (_stateHasSelected(event)) jobj.addClass(SELECTED);
  1437. if (_stateHasError(event)) jobj.addClass(ERROR);
  1438. if (_stateHasDisabled(event)) jobj.addClass(DISABLED);
  1439. if (_stateHasHint(event)) jobj.addClass(HINT);
  1440. };
  1441. /* -------------------
  1442. here's the algorithm in a nutshell:
  1443. [DOWN] -- refers to navigation down the view inheritance heirarchy (default to most specific)
  1444. [UP] -- navigate up the heirarchy
  1445. ComputeAllOverrides (object):
  1446. All view styles [DOWN]
  1447. If hyperlink
  1448. - DO ComputeStateStyle for parent object
  1449. - if (MouseOver || MouseDown)
  1450. - linkMouseOver Style
  1451. - if (MouseDown)
  1452. - linkMouseDown style
  1453. - ComputeStateStyleForViewChain (parent, STATE)
  1454. if (MouseDown) DO ComputeStateStyleForViewChain for object, mouseOver
  1455. DO ComputeStateStyleForViewChain for object, style
  1456. ComputeStateStyleForViewChain (object, STATE)
  1457. FIRST STATE state style [UP] the chain OR default object STATE style
  1458. ------------------- */
  1459. var FONT_PROPS = {
  1460. 'typeface': true,
  1461. 'fontName': true,
  1462. 'fontWeight': true,
  1463. 'fontStyle': true,
  1464. 'fontStretch': true,
  1465. 'fontSize': true,
  1466. 'underline': true,
  1467. 'foreGroundFill': true,
  1468. 'horizontalAlignment': true,
  1469. 'letterCase': true,
  1470. 'strikethrough': true
  1471. };
  1472. var _getViewIdChain = $ax.style.getViewIdChain = function(currentViewId, id, diagramObject) {
  1473. var viewIdChain;
  1474. if (diagramObject.owner.type == 'Axure:Master' || diagramObject.owner.type == 'referenceDiagramObject') {
  1475. //set viewIdChain to the chain from the parent RDO
  1476. var parentRdoId;
  1477. if (diagramObject.owner.type == 'referenceDiagramObject') parentRdoId = diagramObject.owner.scriptIds[0];
  1478. if (!parentRdoId) parentRdoId = $ax('#' + id).getParents(true, ['rdo'])[0][0];
  1479. var rdoState = $ax.style.generateState(parentRdoId);
  1480. var rdoStyle = $ax.style.computeFullStyle(parentRdoId, rdoState, currentViewId);
  1481. var viewOverride = rdoStyle.viewOverride;
  1482. viewIdChain = $ax.adaptive.getMasterAdaptiveIdChain(diagramObject.owner.type == 'referenceDiagramObject' ? diagramObject.owner.masterId : diagramObject.owner.packageId, viewOverride);
  1483. } else {
  1484. viewIdChain = $ax.adaptive.getAdaptiveIdChain(currentViewId);
  1485. }
  1486. return viewIdChain;
  1487. }
  1488. var _computeAllOverrides = $ax.style.computeAllOverrides = function(id, parentId, state, currentViewId) {
  1489. var computedStyle = {};
  1490. if(parentId) computedStyle = _computeAllOverrides(parentId, null, state, currentViewId);
  1491. var diagramObject = $ax.getObjectFromElementId(id);
  1492. var viewIdChain = _getViewIdChain(currentViewId, id, diagramObject);
  1493. var excludeFont = _shapesWithSetRichText[id];
  1494. for(var i = 0; i < viewIdChain.length; i++) {
  1495. var viewId = viewIdChain[i];
  1496. var style = diagramObject.adaptiveStyles[viewId];
  1497. if(style) {
  1498. // we want to exclude the normal font style for shapes where the rich text has been set with an interaction
  1499. // so we copy the style so we don't modify the original, then delete all the font props.
  1500. if(excludeFont) {
  1501. style = $ax.deepCopy(style);
  1502. for(var prop in FONT_PROPS) delete style[prop];
  1503. }
  1504. if(style) {
  1505. var customStyle = style.baseStyle && $ax.document.stylesheet.stylesById[style.baseStyle];
  1506. //make sure not to extend the customStyle this can mutate it for future use
  1507. $.extend(computedStyle, customStyle);
  1508. }
  1509. $.extend(computedStyle, style);
  1510. }
  1511. }
  1512. // order matters so higher priority styles override lower priority
  1513. $.extend(computedStyle, _computeStateStyleForViewChain(diagramObject, NORMAL, viewIdChain, true));
  1514. if (_stateHasMouseOver(state)) {
  1515. $.extend(computedStyle, _computeStateStyleForViewChain(diagramObject, MOUSE_OVER, viewIdChain, true));
  1516. }
  1517. if (_stateHasMouseDown(state)) {
  1518. $.extend(computedStyle, _computeStateStyleForViewChain(diagramObject, MOUSE_DOWN, viewIdChain, true));
  1519. }
  1520. if (_stateHasFocused(state)) {
  1521. $.extend(computedStyle, _computeStateStyleForViewChain(diagramObject, FOCUSED, viewIdChain, true));
  1522. }
  1523. if (_stateHasSelected(state)) {
  1524. $.extend(computedStyle, _computeStateStyleForViewChain(diagramObject, SELECTED, viewIdChain, true));
  1525. }
  1526. if (_stateHasError(state)) {
  1527. $.extend(computedStyle, _computeStateStyleForViewChain(diagramObject, ERROR, viewIdChain, true));
  1528. }
  1529. if (_stateHasHint(state)) {
  1530. $.extend(computedStyle, _computeStateStyleForViewChain(diagramObject, HINT, viewIdChain, true));
  1531. }
  1532. if (_stateHasDisabled(state)) {
  1533. $.extend(computedStyle, _computeStateStyleForViewChain(diagramObject, DISABLED, viewIdChain, true));
  1534. }
  1535. return _removeUnsupportedProperties(computedStyle, diagramObject);
  1536. };
  1537. var _computeStateStyleForViewChain = function(diagramObject, state, viewIdChain, excludeNormal) {
  1538. var styleObject = diagramObject;
  1539. while(styleObject.isContained) styleObject = styleObject.parent;
  1540. var adaptiveStyles = styleObject.adaptiveStyles;
  1541. for(var i = viewIdChain.length - 1; i >= 0; i--) {
  1542. var viewId = viewIdChain[i];
  1543. var viewStyle = adaptiveStyles[viewId];
  1544. var stateStyle = viewStyle && _getFullStateStyle(viewStyle, state, excludeNormal);
  1545. if (stateStyle) return $.extend({}, stateStyle);
  1546. else if (viewStyle && viewStyle.stateStyles) return {}; //stateStyles are overriden but states could be null
  1547. }
  1548. // we dont want to actually include the object style because those are not overrides, hence the true for "excludeNormal" and not passing the val through
  1549. var stateStyleFromDefault = _getFullStateStyle(styleObject.style, state, true);
  1550. return $.extend({}, stateStyleFromDefault);
  1551. };
  1552. // returns the full effective style for an object in a state state and view
  1553. var _computeFullStyle = $ax.style.computeFullStyle = function(id, state, currentViewId, overrides) {
  1554. var obj = $obj(id);
  1555. if (!overrides) overrides = _computeAllOverrides(id, undefined, state, currentViewId);
  1556. // get style for current state
  1557. var dynamicPanelStyle = _getCurrentPanelDiagramStyle(id);
  1558. // todo: account for image box
  1559. var objStyle = obj.style;
  1560. var customStyle = objStyle.baseStyle && $ax.document.stylesheet.stylesById[objStyle.baseStyle];
  1561. var returnVal = $.extend({}, $ax.document.stylesheet.defaultStyle, customStyle, objStyle, dynamicPanelStyle, overrides);
  1562. return _removeUnsupportedProperties(returnVal, obj);
  1563. };
  1564. var _getCurrentPanelDiagramStyle = function (id) {
  1565. var diagramObj = $ax.visibility.GetCurrentPanelDiagram(id);
  1566. if (diagramObj) {
  1567. return diagramObj.style;
  1568. }
  1569. return {};
  1570. };
  1571. var _removeUnsupportedProperties = function(style, object) {
  1572. // for now all we need to do is remove padding from checkboxes and radio buttons
  1573. //if ($ax.public.fn.IsRadioButton(object.type) || $ax.public.fn.IsCheckBox(object.type)) {
  1574. // style.paddingTop = 0;
  1575. // style.paddingLeft = 0;
  1576. // style.paddingRight = 0;
  1577. // style.paddingBottom = 0;
  1578. //}
  1579. //if ($ax.public.fn.IsTextBox(object.type) || $ax.public.fn.IsTextArea(object.type) || $ax.public.fn.IsButton(object.type)
  1580. // || $ax.public.fn.IsListBox(object.type) || $ax.public.fn.IsComboBox(object.type)) {
  1581. // if (object.images && style.fill) delete style['fill'];
  1582. //}
  1583. return style;
  1584. };
  1585. var _getFullStateStyle = function(style, state, excludeNormal) {
  1586. //'normal' is needed because now DiagramObjects get their image from the Style and unapplying a rollover needs the image
  1587. var stateStyle = state == NORMAL && !excludeNormal ? style : style && style.stateStyles && style.stateStyles[state];
  1588. if(stateStyle) {
  1589. var customStyle = stateStyle.baseStyle && $ax.document.stylesheet.stylesById[stateStyle.baseStyle];
  1590. //make sure not to extend the customStyle this can mutate it for future use
  1591. return $.extend({}, customStyle, stateStyle);
  1592. }
  1593. return undefined;
  1594. };
  1595. // commented this out for now... we actually will probably need it for ie
  1596. var _applyOpacityFromStyle = $ax.style.applyOpacityFromStyle = function(id, style) {
  1597. return;
  1598. var opacity = style.opacity || '';
  1599. $jobj(id).children().css('opacity', opacity);
  1600. };
  1601. var _initialize = function() {
  1602. //$ax.style.initializeObjectTextAlignment($ax('*'));
  1603. };
  1604. $ax.style.initialize = _initialize;
  1605. //var _initTextAlignment = function(elementId) {
  1606. // var textId = $ax.GetTextPanelId(elementId);
  1607. // if(textId) {
  1608. // _storeIdToAlignProps(textId);
  1609. // // now handle vertical alignment
  1610. // if(_getObjVisible(textId)) {
  1611. // //_setTextAlignment(textId, _idToAlignProps[textId], false);
  1612. // _setTextAlignment(textId);
  1613. // }
  1614. // }
  1615. //};
  1616. //$ax.style.initializeObjectTextAlignment = function(query) {
  1617. // query.filter(function(diagramObject) {
  1618. // return $ax.public.fn.IsVector(diagramObject.type) || $ax.public.fn.IsImageBox(diagramObject.type);
  1619. // }).each(function(diagramObject, elementId) {
  1620. // if($jobj(elementId).length == 0) return;
  1621. // _initTextAlignment(elementId);
  1622. // });
  1623. //};
  1624. //$ax.style.initializeObjectTextAlignment = function (query) {
  1625. // var textIds = [];
  1626. // query.filter(function(diagramObject) {
  1627. // return $ax.public.fn.IsVector(diagramObject.type) || $ax.public.fn.IsImageBox(diagramObject.type);
  1628. // }).each(function(diagramObject, elementId) {
  1629. // if($jobj(elementId).length == 0) return;
  1630. // var textId = $ax.GetTextPanelId(elementId);
  1631. // if(textId) {
  1632. // _storeIdToAlignProps(textId);
  1633. // textIds.push(textId);
  1634. // }
  1635. // });
  1636. // $ax.style.setTextAlignment(textIds);
  1637. //};
  1638. //var _getPadding = $ax.style.getPadding = function (textId) {
  1639. // var shapeId = $ax.GetShapeIdFromText(textId);
  1640. // var shapeObj = $obj(shapeId);
  1641. // var state = _generateState(shapeId);
  1642. // var style = _computeFullStyle(shapeId, state, $ax.adaptive.currentViewId);
  1643. // var vAlign = style.verticalAlignment || 'middle';
  1644. // var paddingLeft = Number(style.paddingLeft) || 0;
  1645. // paddingLeft += (Number(shapeObj && shapeObj.extraLeft) || 0);
  1646. // var paddingTop = style.paddingTop || 0;
  1647. // var paddingRight = style.paddingRight || 0;
  1648. // var paddingBottom = style.paddingBottom || 0;
  1649. // return { vAlign: vAlign, paddingLeft: paddingLeft, paddingTop: paddingTop, paddingRight: paddingRight, paddingBottom: paddingBottom };
  1650. //}
  1651. //var _storeIdToAlignProps = function(textId) {
  1652. // _idToAlignProps[textId] = _getPadding(textId);
  1653. //};
  1654. var _applyImage = $ax.style.applyImage = function (id, imgUrl, state) {
  1655. var object = $obj(id);
  1656. if (object.generateCompound) {
  1657. for (var i = 0; i < object.compoundChildren.length; i++) {
  1658. var componentId = object.compoundChildren[i];
  1659. var childId = $ax.public.fn.getComponentId(id, componentId);
  1660. var childImgQuery = $jobj(childId + '_img');
  1661. //childImgQuery.attr('src', imgUrl[componentId]);
  1662. childImgQuery.attr('data', imgUrl[componentId]);
  1663. _updateStateClasses(
  1664. [
  1665. childId + '_img',
  1666. childId
  1667. ], state, false
  1668. );
  1669. }
  1670. } else {
  1671. var imgQuery = $jobj($ax.GetImageIdFromShape(id));
  1672. //it is hard to tell if setting the image or the class first causing less flashing when adding shadows.
  1673. imgQuery.attr('src', imgUrl);
  1674. var svgQuery = $jobj($ax.GetSvgIdFromShape(id));
  1675. svgQuery.attr('data', imgUrl);
  1676. _updateStateClasses(
  1677. [
  1678. id,
  1679. $ax.GetImageIdFromShape(id)
  1680. ], state, false
  1681. );
  1682. if (imgQuery.parents('a.basiclink').length > 0) imgQuery.css('border', 'none');
  1683. }
  1684. };
  1685. $ax.public.fn.getComponentId = function (id, componentId) {
  1686. var idParts = id.split('-');
  1687. idParts[0] = idParts[0] + componentId;
  1688. return idParts.join('-');
  1689. }
  1690. var _resetTextJson = function(id, textid) {
  1691. // reset the opacity
  1692. $jobj(id).children().css('opacity', '');
  1693. var cacheObject = _originalTextCache[textid];
  1694. if(cacheObject) {
  1695. _transformTextWithVerticalAlignment(textid, function() {
  1696. var styleCache = cacheObject.styleCache;
  1697. var textQuery = $('#' + textid);
  1698. textQuery.find('*').each(function(index, element) {
  1699. element.style.cssText = styleCache[element.id];
  1700. });
  1701. });
  1702. }
  1703. };
  1704. // Preserves the alingment for the element textid after executing transformFn
  1705. //var _getRtfElementHeight = function(rtfElement) {
  1706. // if(rtfElement.innerHTML == '') rtfElement.innerHTML = '&nbsp;';
  1707. // // To handle render text as image
  1708. // //var images = $(rtfElement).children('img');
  1709. // //if(images.length) return images.height();
  1710. // return rtfElement.offsetHeight;
  1711. //};
  1712. // why microsoft decided to default to round to even is beyond me...
  1713. //var _roundToEven = function(number) {
  1714. // var numString = number.toString();
  1715. // var parts = numString.split('.');
  1716. // if(parts.length == 1) return number;
  1717. // if(parts[1].length == 1 && parts[1] == '5') {
  1718. // var wholePart = Number(parts[0]);
  1719. // return wholePart % 2 == 0 ? wholePart : wholePart + 1;
  1720. // } else return Math.round(number);
  1721. //};
  1722. //var _suspendTextAlignment = 0;
  1723. //var _suspendedTextIds = [];
  1724. //$ax.style.startSuspendTextAlignment = function() {
  1725. // _suspendTextAlignment++;
  1726. //}
  1727. //$ax.style.resumeSuspendTextAlignment = function () {
  1728. // _suspendTextAlignment--;
  1729. // if(_suspendTextAlignment == 0) $ax.style.setTextAlignment(_suspendedTextIds);
  1730. //}
  1731. var _transformTextWithVerticalAlignment = $ax.style.transformTextWithVerticalAlignment = function(textId, transformFn) {
  1732. if(!_originalTextCache[textId]) {
  1733. $ax.style.CacheOriginalText(textId);
  1734. }
  1735. var rtfElement = window.document.getElementById(textId);
  1736. if(!rtfElement) return;
  1737. return transformFn();
  1738. //_storeIdToAlignProps(textId);
  1739. //if (_suspendTextAlignment) {
  1740. // _suspendedTextIds.push(textId);
  1741. // return;
  1742. //}
  1743. //$ax.style.setTextAlignment([textId]);
  1744. };
  1745. // this is for vertical alignments set on hidden objects
  1746. //var _idToAlignProps = {};
  1747. //$ax.style.updateTextAlignmentForVisibility = function (textId) {
  1748. // var textObj = $jobj(textId);
  1749. // // must check if parent id exists. Doesn't exist for text objs in check boxes, and potentially elsewhere.
  1750. // var parentId = textObj.parent().attr('id');
  1751. // if (parentId && $ax.visibility.isContainer(parentId)) return;
  1752. // //var alignProps = _idToAlignProps[textId];
  1753. // //if(!alignProps || !_getObjVisible(textId)) return;
  1754. // //if (!alignProps) return;
  1755. // //_setTextAlignment(textId, alignProps);
  1756. // _setTextAlignment(textId);
  1757. //};
  1758. var _getObjVisible = _style.getObjVisible = function (id) {
  1759. var element = document.getElementById(id);
  1760. return element && (element.offsetWidth || element.offsetHeight);
  1761. };
  1762. //$ax.style.setTextAlignment = function (textIds) {
  1763. // var getTextAlignDim = function(textId, alignProps) {
  1764. // var dim = {};
  1765. // var vAlign = alignProps.vAlign;
  1766. // var paddingTop = Number(alignProps.paddingTop);
  1767. // var paddingBottom = Number(alignProps.paddingBottom);
  1768. // var paddingLeft = Number(alignProps.paddingLeft);
  1769. // var paddingRight = Number(alignProps.paddingRight);
  1770. // var topParam = 0.0;
  1771. // var bottomParam = 1.0;
  1772. // var leftParam = 0.0;
  1773. // var rightParam = 1.0;
  1774. // var textObj = $jobj(textId);
  1775. // var textObjParent = textObj.offsetParent();
  1776. // var parentId = textObjParent.attr('id');
  1777. // if(!parentId) {
  1778. // // Only case should be for radio/checkbox that get the label now because it must be absolute positioned for animate (offset parent ignored it before)
  1779. // textObjParent = textObjParent.parent();
  1780. // parentId = textObjParent.attr('id');
  1781. // }
  1782. // parentId = $ax.visibility.getWidgetFromContainer(textObjParent.attr('id'));
  1783. // textObjParent = $jobj(parentId);
  1784. // var parentObj = $obj(parentId);
  1785. // if(parentObj['bottomTextPadding']) bottomParam = parentObj['bottomTextPadding'];
  1786. // if(parentObj['topTextPadding']) topParam = parentObj['topTextPadding'];
  1787. // if(parentObj['leftTextPadding']) leftParam = parentObj['leftTextPadding'];
  1788. // if(parentObj['rightTextPadding']) rightParam = parentObj['rightTextPadding'];
  1789. // // smart shapes are mutually exclusive from compound vectors.
  1790. // var isConnector = parentObj.type == $ax.constants.CONNECTOR_TYPE;
  1791. // if(isConnector) return;
  1792. // var axTextObjectParent = $ax('#' + textObjParent.attr('id'));
  1793. // var jDims = textObj.css(['width','left','top']);
  1794. // var oldWidth = $ax.getNumFromPx(jDims['width']);
  1795. // var oldLeft = $ax.getNumFromPx(jDims['left']);
  1796. // var oldTop = $ax.getNumFromPx(jDims['top']);
  1797. // var newTop = 0;
  1798. // var newLeft = 0.0;
  1799. // var size = axTextObjectParent.size();
  1800. // var width = size.width;
  1801. // var height = size.height;
  1802. // //var width = axTextObjectParent.width();
  1803. // //var height = axTextObjectParent.height();
  1804. // // If text rotated need to handle getting the correct width for text based on bounding rect of rotated parent.
  1805. // var boundingRotation = -$ax.move.getRotationDegreeFromElement(textObj[0]);
  1806. // var boundingParent = $axure.fn.getBoundingSizeForRotate(width, height, boundingRotation);
  1807. // var extraLeftPadding = (width - boundingParent.width) / 2;
  1808. // width = boundingParent.width;
  1809. // var relativeTop = 0.0;
  1810. // relativeTop = height * topParam;
  1811. // var containerHeight = height * bottomParam - relativeTop;
  1812. // newLeft = paddingLeft + extraLeftPadding + width * leftParam;
  1813. // var newWidth = width * (rightParam - leftParam) - paddingLeft - paddingRight;
  1814. // var horizChange = newWidth != oldWidth || newLeft != oldLeft;
  1815. // if(horizChange) {
  1816. // dim.left = newLeft;
  1817. // dim.width = newWidth;
  1818. // //textObj.css('left', newLeft);
  1819. // //textObj.width(newWidth);
  1820. // }
  1821. // var textHeight = _getRtfElementHeight(textObj[0]);
  1822. // if(vAlign == "middle")
  1823. // newTop = _roundToEven(relativeTop + (containerHeight - textHeight + paddingTop - paddingBottom) / 2);
  1824. // else if(vAlign == "bottom")
  1825. // newTop = _roundToEven(relativeTop + containerHeight - textHeight - paddingBottom);
  1826. // else newTop = _roundToEven(paddingTop + relativeTop);
  1827. // var vertChange = oldTop != newTop;
  1828. // if (vertChange) dim.top = newTop; //textObj.css('top', newTop + 'px');
  1829. // return dim;
  1830. // };
  1831. // var applyTextAlignment = function(textId, dim) {
  1832. // var textObj = $jobj(textId);
  1833. // if(dim.left) {
  1834. // textObj.css('left', dim.left);
  1835. // textObj.width(dim.width);
  1836. // }
  1837. // if(dim.top) textObj.css('top', dim.top);
  1838. // if((dim.top || dim.left)) _updateTransformOrigin(textId);
  1839. // };
  1840. // var idToDim = [];
  1841. // for (var i = 0; i < textIds.length; i++) {
  1842. // var textId = textIds[i];
  1843. // var alignProps = _idToAlignProps[textId];
  1844. // if (!alignProps || !_getObjVisible(textId)) continue;
  1845. // idToDim.push({ id: textId, dim: getTextAlignDim(textId, alignProps) });
  1846. // }
  1847. // for (var i = 0; i < idToDim.length; i++) {
  1848. // var info = idToDim[i];
  1849. // applyTextAlignment(info.id, info.dim);
  1850. // }
  1851. //};
  1852. //var _setTextAlignment = function(textId, alignProps, updateProps) {
  1853. // if(updateProps) _storeIdToAlignProps(textId);
  1854. // if(!alignProps) return;
  1855. // var vAlign = alignProps.vAlign;
  1856. // var paddingTop = Number(alignProps.paddingTop);
  1857. // var paddingBottom = Number(alignProps.paddingBottom);
  1858. // var paddingLeft = Number(alignProps.paddingLeft);
  1859. // var paddingRight = Number(alignProps.paddingRight);
  1860. // var topParam = 0.0;
  1861. // var bottomParam = 1.0;
  1862. // var leftParam = 0.0;
  1863. // var rightParam = 1.0;
  1864. // var textObj = $jobj(textId);
  1865. // var textObjParent = textObj.offsetParent();
  1866. // var parentId = textObjParent.attr('id');
  1867. // var isConnector = false;
  1868. // if(parentId) {
  1869. // parentId = $ax.visibility.getWidgetFromContainer(textObjParent.attr('id'));
  1870. // textObjParent = $jobj(parentId);
  1871. // var parentObj = $obj(parentId);
  1872. // if(parentObj['bottomTextPadding']) bottomParam = parentObj['bottomTextPadding'];
  1873. // if(parentObj['topTextPadding']) topParam = parentObj['topTextPadding'];
  1874. // if(parentObj['leftTextPadding']) leftParam = parentObj['leftTextPadding'];
  1875. // if(parentObj['rightTextPadding']) rightParam = parentObj['rightTextPadding'];
  1876. // // smart shapes are mutually exclusive from compound vectors.
  1877. // isConnector = parentObj.type == $ax.constants.CONNECTOR_TYPE;
  1878. // }
  1879. // if(isConnector) return;
  1880. // var axTextObjectParent = $ax('#' + textObjParent.attr('id'));
  1881. // var oldWidth = $ax.getNumFromPx(textObj.css('width'));
  1882. // var oldLeft = $ax.getNumFromPx(textObj.css('left'));
  1883. // var oldTop = $ax.getNumFromPx(textObj.css('top'));
  1884. // var newTop = 0;
  1885. // var newLeft = 0.0;
  1886. // var width = axTextObjectParent.width();
  1887. // var height = axTextObjectParent.height();
  1888. // // If text rotated need to handle getting the correct width for text based on bounding rect of rotated parent.
  1889. // var boundingRotation = -$ax.move.getRotationDegreeFromElement(textObj[0]);
  1890. // var boundingParent = $axure.fn.getBoundingSizeForRotate(width, height, boundingRotation);
  1891. // var extraLeftPadding = (width - boundingParent.width) / 2;
  1892. // width = boundingParent.width;
  1893. // var relativeTop = 0.0;
  1894. // relativeTop = height * topParam;
  1895. // var containerHeight = height * bottomParam - relativeTop;
  1896. // newLeft = paddingLeft + extraLeftPadding + width * leftParam;
  1897. // var newWidth = width * (rightParam - leftParam) - paddingLeft - paddingRight;
  1898. // var horizChange = newWidth != oldWidth || newLeft != oldLeft;
  1899. // if(horizChange) {
  1900. // textObj.css('left', newLeft);
  1901. // textObj.width(newWidth);
  1902. // }
  1903. // var textHeight = _getRtfElementHeight(textObj[0]);
  1904. // if(vAlign == "middle") newTop = _roundToEven(relativeTop + (containerHeight - textHeight + paddingTop - paddingBottom) / 2);
  1905. // else if(vAlign == "bottom") newTop = _roundToEven(relativeTop + containerHeight - textHeight - paddingBottom);
  1906. // else newTop = _roundToEven(paddingTop + relativeTop);
  1907. // var vertChange = oldTop != newTop;
  1908. // if(vertChange) textObj.css('top', newTop + 'px');
  1909. // if((vertChange || horizChange)) _updateTransformOrigin(textId);
  1910. //};
  1911. //var _updateTransformOrigin = function (textId) {
  1912. // var textObj = $jobj(textId);
  1913. // var parentId = textObj.parent().attr('id');
  1914. // if(!$obj(parentId).hasTransformOrigin) return;
  1915. // //var transformOrigin = textObj.css('-webkit-transform-origin') ||
  1916. // // textObj.css('-moz-transform-origin') ||
  1917. // // textObj.css('-ms-transform-origin') ||
  1918. // // textObj.css('transform-origin');
  1919. // //if(transformOrigin) {
  1920. // var textObjParent = $ax('#' + textObj.parent().attr('id'));
  1921. // var newX = (textObjParent.width() / 2 - $ax.getNumFromPx(textObj.css('left')));
  1922. // var newY = (textObjParent.height() / 2 - $ax.getNumFromPx(textObj.css('top')));
  1923. // var newOrigin = newX + 'px ' + newY + 'px';
  1924. // textObj.css('-webkit-transform-origin', newOrigin);
  1925. // textObj.css('-moz-transform-origin', newOrigin);
  1926. // textObj.css('-ms-transform-origin', newOrigin);
  1927. // textObj.css('transform-origin', newOrigin);
  1928. // //}
  1929. //};
  1930. $ax.style.reselectElements = function () {
  1931. // TODO
  1932. console.log('reselect elements -- need to make sure selected/error/disabled are all correct');
  1933. for(let id in _selectedWidgets) {
  1934. // Only looking for the selected widgets that don't have their class set
  1935. if(!_selectedWidgets[id] || _hasAnySelectedClass(id)) continue;
  1936. const state = _generateFullState(id, undefined, true);
  1937. _applyImageAndTextJson(id, state);
  1938. }
  1939. for(let id in _disabledWidgets) {
  1940. // Only looking for the disabled widgets that don't have their class yet
  1941. if (!_disabledWidgets[id] || _hasAnyDisabledClass(id)) continue;
  1942. const state = _generateFullState(id, undefined, undefined, true);
  1943. _applyImageAndTextJson(id, state);
  1944. }
  1945. };
  1946. $ax.style.clearStateForRepeater = function(repeaterId) {
  1947. var children = $ax.getChildElementIdsForRepeater(repeaterId);
  1948. for(var i = 0; i < children.length; i++) {
  1949. var id = children[i];
  1950. delete _hintWidgets[id];
  1951. delete _errorWidgets[id];
  1952. delete _selectedWidgets[id];
  1953. delete _disabledWidgets[id];
  1954. }
  1955. }
  1956. _style.updateStateClass = function (repeaterId) {
  1957. var subElementIds = $ax.getChildElementIdsForRepeater(repeaterId);
  1958. for (var i = 0; i < subElementIds.length; i++) {
  1959. _applyImageAndTextJson(subElementIds[i], $ax.style.generateState(subElementIds[i]));
  1960. }
  1961. }
  1962. $ax.style.clearAdaptiveStyles = function() {
  1963. for(var shapeId in _adaptiveStyledWidgets) {
  1964. var repeaterId = $ax.getParentRepeaterFromScriptId(shapeId);
  1965. if(repeaterId) continue;
  1966. var elementId = $ax.GetButtonShapeId(shapeId);
  1967. if(elementId) _applyImageAndTextJson(elementId, $ax.style.generateState(elementId));
  1968. }
  1969. _adaptiveStyledWidgets = {};
  1970. };
  1971. $ax.style.setAdaptiveStyle = function(shapeId, style, state) {
  1972. _adaptiveStyledWidgets[$ax.repeater.getScriptIdFromElementId(shapeId)] = style;
  1973. var textId = $ax.GetTextPanelId(shapeId);
  1974. if(textId) _applyTextStyle(textId, style);
  1975. const svgContainerId = shapeId + "_img";
  1976. const container = document.getElementById(svgContainerId);
  1977. if(container && container.tagName.toLowerCase() == "svg") {
  1978. _applySvg(shapeId, state ?? NORMAL);
  1979. if(style.size) {
  1980. if($obj(shapeId).friendlyType == "Rectangle") {
  1981. $(container).css({ 'width': style.size.width, 'height': style.size.height });
  1982. } else {
  1983. var baseStyle = _computeFullStyle(shapeId, NORMAL, "");
  1984. var oldSize = baseStyle.size;
  1985. var oldWidth = oldSize.width;
  1986. var oldHeight = oldSize.height;
  1987. container.style.transformOrigin = 'top left';
  1988. var oldTransformMatrix = new WebKitCSSMatrix(window.getComputedStyle(container).transform);
  1989. var oldScaleX = oldTransformMatrix.m11;
  1990. var oldScaleY = oldTransformMatrix.m22;
  1991. var scaleX = (style.size.width / oldWidth) * oldScaleX;
  1992. var scaleY = (style.size.height / oldHeight) * oldScaleY;
  1993. if(oldScaleX !== scaleX || oldScaleY !== scaleY) {
  1994. container.style.transform = 'Scale(' + scaleX + ', ' + scaleY + ')';
  1995. }
  1996. }
  1997. }
  1998. }
  1999. $ax.placeholderManager.refreshPlaceholder(shapeId);
  2000. // removing this for now
  2001. // if(style.location) {
  2002. // $jobj(shapeId).css('top', style.location.x + "px")
  2003. // .css('left', style.location.y + "px");
  2004. // }
  2005. };
  2006. //-------------------------------------------------------------------------
  2007. // _applyTextStyle
  2008. //
  2009. // Applies a rollover style to a text element.
  2010. // id : the id of the text object to set.
  2011. // styleProperties : an object mapping style properties to values. eg:
  2012. // { 'fontWeight' : 'bold',
  2013. // 'fontStyle' : 'italic' }
  2014. //-------------------------------------------------------------------------
  2015. var _applyTextStyle = function (id, style, padding = {top:0, right: 0, bottom: 0, left: 0}) {
  2016. return _transformTextWithVerticalAlignment(id, function() {
  2017. var styleProperties = _getCssStyleProperties(style);
  2018. var container = $('#' + id);
  2019. var newSize = { width: container[0].offsetWidth, height: container[0].offsetHeight };
  2020. var hasLineHeight = !!container.css('line-height');
  2021. container.find('*').each(function(index, element) {
  2022. _applyCssProps(element, styleProperties);
  2023. var width = element.offsetWidth + padding.left + padding.right;
  2024. var height = element.offsetHeight + padding.top + padding.bottom;
  2025. if(width > newSize.width) newSize.width = width;
  2026. if(!hasLineHeight && height > newSize.height) newSize.height = height;
  2027. });
  2028. return newSize;
  2029. });
  2030. };
  2031. var _applyCssProps = function(element, styleProperties, applyAllStyle) {
  2032. if(applyAllStyle) {
  2033. var allProps = styleProperties.allProps;
  2034. for(var prop in allProps) element.style[prop] = allProps[prop];
  2035. } else {
  2036. var nodeName = element.nodeName.toLowerCase();
  2037. if(nodeName == 'p') {
  2038. var parProps = styleProperties.parProps;
  2039. for(prop in parProps) element.style[prop] = parProps[prop];
  2040. } else if(nodeName != 'a') {
  2041. var runProps = styleProperties.runProps;
  2042. for(prop in runProps) element.style[prop] = runProps[prop];
  2043. }
  2044. }
  2045. };
  2046. var _getCssShadow = function(shadow) {
  2047. return !shadow.on ? "none"
  2048. : shadow.offsetX + "px " + shadow.offsetY + "px " + shadow.blurRadius + "px " + _getCssColor(shadow.color);
  2049. };
  2050. var _getCssStyleProperties = function(style) {
  2051. var toApply = {};
  2052. toApply.runProps = {};
  2053. toApply.parProps = {};
  2054. toApply.allProps = {};
  2055. if(style.fontName) toApply.allProps.fontFamily = toApply.runProps.fontFamily = style.fontName;
  2056. // we need to set font size on both runs and pars because otherwise it well mess up the measure and thereby vertical alignment
  2057. if(style.fontSize) toApply.allProps.fontSize = toApply.runProps.fontSize = toApply.parProps.fontSize = style.fontSize;
  2058. if(style.fontWeight !== undefined) toApply.allProps.fontWeight = toApply.runProps.fontWeight = style.fontWeight;
  2059. if(style.fontStyle !== undefined) toApply.allProps.fontStyle = toApply.runProps.fontStyle = style.fontStyle;
  2060. var textDecoration = [];
  2061. if(style.underline !== undefined) textDecoration[0] = style.underline ? 'underline ' : 'none';
  2062. if(style.strikethrough !== undefined) {
  2063. var index = textDecoration.length;
  2064. if(style.strikethrough) textDecoration[index] ='line-through';
  2065. else if(index == 0) textDecoration[0] = 'none';
  2066. }
  2067. if (textDecoration.length > 0) {
  2068. var decorationLineUp = "";
  2069. for (var l = 0; l < textDecoration.length; l++) {
  2070. decorationLineUp = decorationLineUp + textDecoration[l];
  2071. }
  2072. toApply.allProps.textDecoration = toApply.runProps.textDecoration = decorationLineUp;
  2073. }
  2074. if(style.foreGroundFill) {
  2075. toApply.allProps.color = toApply.runProps.color = _getColorFromFill(style.foreGroundFill);
  2076. //if(style.foreGroundFill.opacity) toApply.allProps.opacity = toApply.runProps.opacity = style.foreGroundFill.opacity;
  2077. }
  2078. if(style.horizontalAlignment) toApply.allProps.textAlign = toApply.parProps.textAlign = toApply.runProps.textAlign = style.horizontalAlignment;
  2079. if(style.lineSpacing) toApply.allProps.lineHeight = toApply.parProps.lineHeight = style.lineSpacing;
  2080. if(style.textShadow) toApply.allProps.textShadow = toApply.parProps.textShadow = _getCssShadow(style.textShadow);
  2081. if (style.letterCase) toApply.allProps.textTransform = toApply.parProps.textTransform = style.letterCase;
  2082. if (style.characterSpacing) toApply.allProps.letterSpacing = toApply.runProps.letterSpacing = style.characterSpacing;
  2083. return toApply;
  2084. };
  2085. var _getColorFromFill = function(fill) {
  2086. //var fillString = '00000' + fill.color.toString(16);
  2087. //return '#' + fillString.substring(fillString.length - 6);
  2088. var val = fill.color;
  2089. var color = {};
  2090. color.b = val % 256;
  2091. val = Math.floor(val / 256);
  2092. color.g = val % 256;
  2093. val = Math.floor(val / 256);
  2094. color.r = val % 256;
  2095. color.a = typeof (fill.opacity) == 'number' ? fill.opacity : 1;
  2096. return _getCssColor(color);
  2097. };
  2098. var _getColorFromArgbColorProp = function (val) {
  2099. var color = {};
  2100. color.b = val % 256;
  2101. val = Math.floor(val / 256);
  2102. color.g = val % 256;
  2103. val = Math.floor(val / 256);
  2104. color.r = val % 256;
  2105. val = Math.floor(val / 256);
  2106. color.a = val % 256;
  2107. return _getCssColor(color);
  2108. };
  2109. var _getCssColor = function(rgbaObj) {
  2110. return "rgba(" + rgbaObj.r + ", " + rgbaObj.g + ", " + rgbaObj.b + ", " + rgbaObj.a + ")";
  2111. };
  2112. // //--------------------------------------------------------------------------
  2113. // // ApplyStyleRecursive
  2114. // //
  2115. // // Applies a style recursively to all span and div tags including elementNode
  2116. // // and all of its children.
  2117. // //
  2118. // // element : the element to apply the style to
  2119. // // styleName : the name of the style property to set (eg. 'font-weight')
  2120. // // styleValue : the value of the style to set (eg. 'bold')
  2121. // //--------------------------------------------------------------------------
  2122. // function ApplyStyleRecursive(element, styleName, styleValue) {
  2123. // var nodeName = element.nodeName.toLowerCase();
  2124. // if (nodeName == 'div' || nodeName == 'span' || nodeName == 'p') {
  2125. // element.style[styleName] = styleValue;
  2126. // }
  2127. // for (var i = 0; i < element.childNodes.length; i++) {
  2128. // ApplyStyleRecursive(element.childNodes[i], styleName, styleValue);
  2129. // }
  2130. // }
  2131. // //---------------------------------------------------------------------------
  2132. // // ApplyTextProperty
  2133. // //
  2134. // // Applies a text property to rtfElement.
  2135. // //
  2136. // // rtfElement : the the root text element of the rtf object (this is the
  2137. // // element named <id>_rtf
  2138. // // prop : the style property to set.
  2139. // // value : the style value to set.
  2140. // //---------------------------------------------------------------------------
  2141. // function ApplyTextProperty(rtfElement, prop, value) {
  2142. // /*
  2143. // var oldHtml = rtfElement.innerHTML;
  2144. // if (prop == 'fontWeight') {
  2145. // rtfElement.innerHTML = oldHtml.replace(/< *b *\/?>/gi, "");
  2146. // } else if (prop == 'fontStyle') {
  2147. // rtfElement.innerHTML = oldHtml.replace(/< *i *\/?>/gi, "");
  2148. // } else if (prop == 'textDecoration') {
  2149. // rtfElement.innerHTML = oldHtml.replace(/< *u *\/?>/gi, "");
  2150. // }
  2151. // */
  2152. // for (var i = 0; i < rtfElement.childNodes.length; i++) {
  2153. // ApplyStyleRecursive(rtfElement.childNodes[i], prop, value);
  2154. // }
  2155. // }
  2156. //}
  2157. //---------------------------------------------------------------------------
  2158. // GetAndCacheOriginalText
  2159. //
  2160. // Gets the html for the pre-rollover state and returns the Html representing
  2161. // the Rich text.
  2162. //---------------------------------------------------------------------------
  2163. var CACHE_COUNTER = 0;
  2164. $ax.style.CacheOriginalText = function(textId, hasRichTextBeenSet) {
  2165. var rtfQuery = $('#' + textId);
  2166. if(rtfQuery.length > 0) {
  2167. var styleCache = {};
  2168. rtfQuery.find('*').each(function(index, element) {
  2169. var elementId = element.id;
  2170. if(!elementId) element.id = elementId = 'cache' + CACHE_COUNTER++;
  2171. styleCache[elementId] = element.style.cssText;
  2172. });
  2173. _originalTextCache[textId] = {
  2174. styleCache: styleCache
  2175. };
  2176. if(hasRichTextBeenSet) {
  2177. var shapeId = $ax.GetShapeIdFromText(textId);
  2178. _shapesWithSetRichText[shapeId] = true;
  2179. }
  2180. }
  2181. };
  2182. $ax.style.ClearCacheForRepeater = function(repeaterId) {
  2183. for(var elementId in _originalTextCache) {
  2184. var scriptId = $ax.repeater.getScriptIdFromElementId(elementId);
  2185. if($ax.getParentRepeaterFromScriptId(scriptId) == repeaterId) delete _originalTextCache[elementId];
  2186. }
  2187. };
  2188. $ax.style.prefetch = function() {
  2189. var scriptIds = $ax.getAllScriptIds();
  2190. var image = new Image();
  2191. for(var i = 0; i < scriptIds.length; i++) {
  2192. var obj = $obj(scriptIds[i]);
  2193. if (!$ax.public.fn.IsImageBox(obj.type)) continue;
  2194. var images = obj.images;
  2195. for (var key in images) image.src = images[key];
  2196. var imageOverrides = obj.imageOverrides;
  2197. for(var elementId in imageOverrides) {
  2198. var override = imageOverrides[elementId];
  2199. for (var state in override) {
  2200. _addImageOverride(elementId, state, override[state]);
  2201. image.src = override[state];
  2202. }
  2203. }
  2204. }
  2205. };
  2206. });