Meet us at an event - Introduction - NL
Meet us
Take a look at our upcoming events below, where you’ll get to meet Kearneys and to experience working as a Strategy Consultant. Also, find more information about the opportunity for an internship at Kearney Amsterdam below, as well as the contact information of our recruiter.
Interested in joining Kearney?
An error occurred while processing the template.
The following has evaluated to null or missing:
==> serviceLocator.findService("template.custom.services.TemplateCustomService") [in template "20116#20152#510999" at line 49, column 34]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign TemplateCustomService = servi... [in template "20116#20152#510999" at line 49, column 1]
----
1<#--
2Application display templates can be used to modify the look of a
3specific application.
4
5Please use the left panel to quickly add commonly used variables.
6Autocomplete is also available and can be invoked by typing "${".
7-->
8
9<#assign DLFileEntryLocalService = serviceLocator.findService(
10"com.liferay.document.library.kernel.service.DLFileEntryLocalService")>
11<#assign DLFolderLocalService = serviceLocator.findService(
12"com.liferay.document.library.kernel.service.DLFolderLocalService")>
13<#assign JournalArticleLocalService = serviceLocator.findService(
14"com.liferay.journal.service.JournalArticleLocalService")>
15<#assign GroupLocalService = serviceLocator.findService(
16"com.liferay.portal.kernel.service.GroupLocalService")>
17<#assign LayoutSetService = serviceLocator.findService(
18"com.liferay.portal.kernel.service.LayoutSetLocalService")>
19<#assign AssetCategoryLocalService = serviceLocator.findService(
20"com.liferay.asset.kernel.service.AssetCategoryLocalService")>
21<#assign AssetVocabularyLocalService = serviceLocator.findService(
22"com.liferay.asset.kernel.service.AssetVocabularyLocalService")>
23<#assign AssetCategoryPropertyLocalService = serviceLocator.findService(
24"com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService")/>
25<#assign PropertyFactoryUtil = serviceLocator.findService(
26"com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil") />
27
28<#assign portletId = themeDisplay.getPortletDisplay().getId()>
29<#assign locale = themeDisplay.getLocale()>
30<#assign PortletPreferencesLocalService = serviceLocator.findService(
31"com.liferay.portal.kernel.service.PortletPreferencesLocalService")/>
32
33<#--
347.4 Upgrade start - portlet perferences would not be stored as xml, see https://github.com/liferay/liferay-portal/blob/master/readme/BREAKING_CHANGES.markdown#what-changed-11
35
36assign portletPreferencesXML = saxReaderUtil.read((PortletPreferencesLocalService.getPortletPreferences(themeDisplay.getPlid(), portletId)?first).getPreferences())
37-->
38
39<#assign plid = themeDisplay.getPlid()>
40
41<#assign portletPreferences = PortletPreferencesLocalService.getPortletPreferences(plid, portletId)?first />
42
43<#assign preferences = PortletPreferencesLocalService.fetchPreferences(portletPreferences.getCompanyId(), portletPreferences.getOwnerId(), portletPreferences.getOwnerType(), plid, portletId) />
44<#assign imageSaturationFilter = themeDisplay.getLayout().getExpandoBridge().getAttribute("Add-Image-Saturation-Filter")!false />
45<#--
467.4 Upgrade end
47-->
48
49<#assign TemplateCustomService = serviceLocator.findService("template.custom.services.TemplateCustomService") />
50
51<#-- Macro used to get specific field text from an Asset Entry -->
52<#macro entryNode document field>
53 <#if document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content")??>
54 "${document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content").getText()?js_string}"
55 <#else>
56 ""
57 </#if>
58</#macro>
59
60<#-- Macro used to get specific portlet preference -->
61
62<#-- 7.4 Upgrade question: where do we need this macro? -->
63
64<#macro preference prefKey prefIndex defaultValue>
65 <#if portletPreferencesXML.selectSingleNode("/portlet-preferences/preference[name='"+prefKey+"-"+prefIndex+"']/value")??>
66 "${portletPreferencesXML.selectSingleNode("/portlet-preferences/preference[name='"+prefKey+"-"+prefIndex+"']/value").getText()?js_string}"<#return>
67 <#else>
68 "${defaultValue?js_string}"<#return>
69 </#if>
70</#macro>
71
72<div id="articleAdtDiv_${portletId}"></div>
73<script>
74 <#if preferences.getValue("useSmallerHeadings", "false")?js_string == "true">
75 <#assign overrideHeadingSize = "heading3 mobile-heading2">
76 </#if>
77
78 <#assign multiArtBehavior = preferences.getValue("multiArticleBehavior", "Vertical Stack")?js_string>
79
80 <#assign fullWidthDisplay = preferences.getValue("fullWidthDisplay", "false")?js_string>
81
82 <#assign featureDisplayType = preferences.getValue("featureDisplayType", "Image Left")?js_string>
83
84 <#assign greyBackground = preferences.getValue("greyBackground", "false")?js_string>
85
86 <#assign extraSpacer = preferences.getValue("extraSpacer", "None")?js_string>
87
88 <#assign autoplay = preferences.getValue("autoPlay", "false")?js_string>
89
90 <#assign seeAllLink = preferences.getValue("seeAllLink", "")?js_string>
91
92 <#assign seeAllLinkText = preferences.getValue("seeAllLinkText", "")?js_string>
93
94 <#assign featureDisplayButtonType = preferences.getValue("featureDisplayButtonType", "Visible")?js_string>
95
96 <#assign featureDisplayButtonText = preferences.getValue("featureDisplayButtonText", "")?js_string>
97
98 <#assign gridTitle = preferences.getValue("gridTitle", "")?js_string>
99
100 var entries = [];
101
102 <#if entries?has_content>
103 <#list entries as curEntry>
104
105 <#assign jArt = JournalArticleLocalService.getLatestArticle(curEntry.getClassPK())>
106 <#assign document = saxReaderUtil.read(jArt.getContentByLocale(themeDisplay.getLocale()))>
107
108 <#assign structureName = jArt.getDDMStructure().getName("en_US")>
109
110
111 var componentType = "FEATURED_ARTICLE";
112 var voiceSearch = "featured-article";
113
114 var title = <@entryNode document=document field="ArticleTitle"/>;
115
116 var subtitle = <@entryNode document=document field="Subtitle"/>;
117
118 var description = <@entryNode document=document field="Description"/>;
119 if (description == ""){
120 description = <@entryNode document=document field="Intro"/>;
121 }
122
123 var slug = <@entryNode document=document field="Slug"/>;
124
125 <#assign articleGroup = GroupLocalService.getGroup(jArt.getGroupId())>
126
127 <#if LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false)??
128 && LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false).getThemeSetting("isMicroSite", "regular")?? >
129 <#assign isMicroSite = (LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false).getThemeSetting("isMicroSite", "regular") == "true")>
130 <#else>
131 <#assign isMicroSite = false>
132 </#if>
133
134 var imageFileEntryId = 0;
135 var imageFileName = "";
136 var image = '${TemplateCustomService.getDocumentFileDetails(document,"ThumbnailSquare",themeDisplay)}';
137 <#-- ATK-1338 Start -->
138 if((${(fullWidthDisplay == "true")?c}) && (!(${multiArtBehavior?matches("Carousel")?c}))) {
139 image = '${TemplateCustomService.getDocumentFileDetails(document,"Thumbnail",themeDisplay)}';
140 }
141 <#-- ATK-1338 Over -->
142 if (null == image || "" == image) {
143 image = '${TemplateCustomService.getDocumentFileDetails(document,"Thumbnail",themeDisplay)}';
144 }
145 if (null == image) {
146 image = "";
147 }
148
149 if ((image) || image != "") {
150 var [imageFileEntryId, restString] = image.split('+++++');
151 var [imageFileName, image] = restString.split('*****');
152 }
153
154 var componentData = {
155 locale: "${locale}",
156 structureName: "${structureName}",
157 displayType: "${featureDisplayType}",
158 slug: slug,
159 title: title,
160 subtitle: subtitle,
161 description: description,
162 image: image.trim(),
163 imageFileEntryId: imageFileEntryId,
164 imageFileName: imageFileName,
165 imageSaturationFilter: "${imageSaturationFilter?c}",
166 groupFriendlyUrl: '${articleGroup.getFriendlyURL()}',
167 isMicrosite: ${isMicroSite?c},
168 multiArtBehavior: '${multiArtBehavior}',
169 featureDisplayButtonText: '${featureDisplayButtonText}',
170 featureDisplayButtonType: '${featureDisplayButtonType}',
171 componentType: componentType,
172 voiceSearch: voiceSearch
173 };
174
175 <#if structureName == "Video">
176
177 componentData.displayType = "Video";
178 componentData.link = <@entryNode document=document field="LinkURL"/>;
179 componentData.videoUrl = <@entryNode document=document field="VideoURL"/>;
180
181 <#elseif structureName == "Article">
182
183 var linkTargetOverride = <@entryNode document=document field="LinkTargetOverride"/>;
184
185 if (linkTargetOverride !== ""){
186 componentData.link = linkTargetOverride;
187 } else {
188 <#assign assetCategories = AssetCategoryLocalService.getCategories(curEntry.getClassNameId(), curEntry.getClassPK())>
189
190 var articleCategories = [];
191
192 <#list assetCategories as category>
193 <#assign categoryVocabulary = AssetVocabularyLocalService.getAssetVocabulary(category.getVocabularyId())>
194 <#assign categoryUrl = "#">
195
196 <#list AssetCategoryPropertyLocalService.getCategoryProperties(category.categoryId) as categoryProperty>
197
198 <#if categoryProperty.key == "url">
199 <#assign categoryUrl = categoryProperty.value>
200 </#if>
201 </#list>
202
203 articleCategories.push({
204 id: "${category.categoryId}",
205 name: "${category.name}",
206 url: "${categoryUrl}",
207 vocabularyName: "${categoryVocabulary.getTitle(locale)}",
208 });
209
210 </#list>
211
212
213 componentData.categories = articleCategories;
214 componentData.urlTitle = "${jArt.getUrlTitle()?js_string}";
215 }
216
217 var byline = <@entryNode document=document field="Byline"/>;
218 if (byline != null && byline != ""){
219 componentData.byline = [];
220 };
221
222 <#elseif structureName == "External Article">
223
224
225
226 <#-- All External Articles should display at /media-center/article, so populate categories accordingly -->
227 <#-- var articleCategories = [];
228 articleCategories.push({
229 id: "0",
230 name: "Media Center",
231 url: "media-center",
232 vocabularyName: "Topics",
233 });
234 articleCategories.push({
235 id: "1",
236 name: "Article",
237 url: "article",
238 vocabularyName: "Article Type",
239 });
240
241 componentData.categories = articleCategories;
242 componentData.urlTitle = "${jArt.getUrlTitle()?js_string}"; -->
243
244 componentData.link = <@entryNode document=document field="LinkURL"/>;
245 componentData.isExternal = true;
246
247 var bylineSegments = [];
248 var pubName = <@entryNode document=document field="PublicationName"/>;
249
250 if (pubName != null && pubName != ""){
251 bylineSegments.push(pubName);
252 componentData.italicizeFirstByline = true;
253 };
254
255 <#--bylineSegments.push(<@entryNode document=document field="PublicationDate"/>); -->
256 componentData.byline = bylineSegments;
257
258 <#elseif structureName == "Link">
259
260 componentData.link = <@entryNode document=document field="LinkURL"/>;
261 componentData.isExternal = true;
262
263 var bylineSegments = [];
264
265 <#assign linkja = JournalArticleLocalService.getLatestArticle(curEntry.getClassPK()) >
266 <#assign linkdocument = saxReaderUtil.read(linkja.getContent())>
267 <#assign linknodes = document.selectNodes("/root/dynamic-element[@name='BylineSegment']/dynamic-content")>
268
269 <#list linknodes as curN>
270 bylineSegments.push("${curN.getText()?js_string}");
271 </#list>
272
273 componentData.byline = bylineSegments;
274 componentData.italicizeFirstByline = true;
275
276 </#if>
277
278 entries.push(componentData);
279 </#list>
280 </#if>
281
282 <#if multiArtBehavior == "Carousel">
283 var carouselProps = {
284 entries: entries,
285 gridTitle: "${gridTitle}",
286 fullWidthDisplay: ${(fullWidthDisplay == "true")?c},
287 greyBackground: "${greyBackground}",
288 autoplay: ${(autoplay == "true")?c}
289 };
290
291 ATK.React.Component.Carousel("articleAdtDiv_${portletId?js_string}", carouselProps);
292 <#else>
293 var componentVoiceSearch = "featured-article";
294 var extraProps = {
295 multiArtBehavior: "${multiArtBehavior}",
296 gridTitle: "${gridTitle}",
297 fullWidthDisplay: "${fullWidthDisplay}",
298 greyBackground: "${greyBackground}",
299 extraSpacer: "${extraSpacer}",
300 seeAllLink: "${seeAllLink}",
301 seeAllLinkText: "${seeAllLinkText}",
302 componentVoiceSearch: componentVoiceSearch
303 };
304 ATK.React.Component.FeaturedMultiDisplay("articleAdtDiv_${portletId?js_string}", extraProps, entries);
305 </#if>
306
307</script>
An error occurred while processing the template.
The following has evaluated to null or missing:
==> serviceLocator.findService("template.custom.services.TemplateCustomService") [in template "20116#20152#33020" at line 247, column 34]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign TemplateCustomService = servi... [in template "20116#20152#33020" at line 247, column 1]
----
1<#--
2Web content templates are used to lay out the fields defined in a web
3content structure.
4
5Please use the left panel to quickly add commonly used variables.
6Autocomplete is also available and can be invoked by typing "${".
7-->
8<#-- ATK-1068 Styles Start -->
9<style>
10 @media (min-width: 1025px) {
11 .articleAdtDiv {
12 margin-top: -20px !important;
13 margin-bottom: 50px !important;
14 }
15}
16
17@media (max-width: 1024px) {
18 .articleAdtDiv {
19 margin-bottom: 50px !important;
20 }
21}
22</style>
23<#-- ATK-1068 Styles End -->
24<#assign serviceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext() />
25<#assign DLFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")>
26<#assign themeDisplay = serviceContext.getThemeDisplay() />
27<#assign preview = false/>
28
29<#if (themeDisplay.getURLCurrent()?contains("preview_article_content.jsp")) || (themeDisplay.getURLCurrent()?contains("preview_article_content_template.jsp"))>
30 <#assign preview = true />
31
32 <script data-senna-track="permanent"
33 src="/o/atk-dot-com-theme/js/react/dist/vendor.bundle.js"></script>
34
35 <script data-senna-track="permanent"
36 src="/o/atk-dot-com-theme/js/react/dist/bundle.js"></script>
37
38 <style data-senna-track="temporary" type="text/css">
39 :root {
40 --container-max-sm: 576px;
41 --h4-font-size: 22px;
42 --font-weight-bold: 700;
43 --rounded-pill: 50rem;
44 --navigation-submenu-item-float: left;
45 --display4-weight: 300;
46 --danger: #da1414;
47 --atk-row: absolute;
48 --display2-size: 5.5rem;
49 --body-bg: #f9f9f9;
50 --display2-weight: 300;
51 --display1-weight: 300;
52 --display3-weight: 300;
53 --box-shadow-sm: 0 .125rem .25rem rgba(0, 0, 0, .075);
54 --text-align-hero-text-container: center;
55 --cta-background-color: #F5F5F5;
56 --font-weight-lighter: lighter;
57 --h3-font-size: 36px;
58 --btn-outline-primary-hover-border-color: #0b5fff;
59 --transition-collapse: height .35s ease;
60 --blockquote-small-color: #6b6c7e;
61 --gray-200: #f1f2f5;
62 --btn-secondary-hover-background-color: #f7f8f9;
63 --gray-600: #6b6c7e;
64 --secondary: #6b6c7e;
65 --btn-outline-primary-color: #0b5fff;
66 --btn-link-hover-color: #004ad7;
67 --hr-border-color: rgba(0, 0, 0, .1);
68 --hr-border-margin-y: 1rem;
69 --light: #f1f2f5;
70 --btn-outline-primary-hover-color: #0b5fff;
71 --font-weight-read-more: 400;
72 --btn-secondary-background-color: #fff;
73 --btn-outline-secondary-hover-border-color: transparent;
74 --display3-size: 4.5rem;
75 --primary: #0b5fff;
76 --container-max-md: 768px;
77 --border-radius-sm: 0.1875rem;
78 --display-line-height: 1.2;
79 --font-family-hero-text: 'Graphik Web';
80 --h6-font-size: 0.8125rem;
81 --h2-font-size: 44px;
82 --aspect-ratio-4-to-3: 75%;
83 --font-family-read-more: 'Graphik Web';
84 --spacer-10: 10rem;
85 --font-family-semibold: 'Graphik Web';
86 --font-weight-normal: 400;
87 --dark: #272833;
88 --blockquote-small-font-size: 80%;
89 --h5-font-size: 0.875rem;
90 --blockquote-font-size: 1.25rem;
91 --transition-fade: opacity .15s linear;
92 --display4-size: 3.5rem;
93 --border-radius-lg: 0.375rem;
94 --btn-primary-hover-color: #fff;
95 --display1-size: 6rem;
96 --black: #000;
97 --gray-300: #e7e7ed;
98 --gray-700: #495057;
99 --btn-secondary-border-color: #cdced9;
100 --btn-outline-secondary-hover-color: #272833;
101 --purple: #7823DC;
102 --body-color: #111;
103 --btn-outline-secondary-hover-background-color: rgba(39, 40, 51, 0.03);
104 --font-weight-button-body: 400;
105 --btn-primary-color: #fff;
106 --btn-secondary-color: #6b6c7e;
107 --btn-secondary-hover-border-color: #cdced9;
108 --box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, .175);
109 --container-max-lg: 992px;
110 --btn-outline-primary-border-color: #0b5fff;
111 --aspect-ratio: 100%;
112 --cta-link-hover-color: #000;
113 --body-container: #fff;
114 --cta-link-color: #7823DC;
115 --aspect-ratio-16-to-9: 56.25%;
116 --box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15);
117 --white: #fff;
118 --portlet-bg-color: #272833;
119 --warning: #b95000;
120 --info: #2e5aac;
121 --hr-border-width: 1px;
122 --btn-link-color: #0b5fff;
123 --gray-400: #cdced9;
124 --font-weight-hero-text-h4: 100;
125 --gray-800: #393a4a;
126 --font-weight-semibold: 600;
127 --btn-outline-primary-hover-background-color: #f0f5ff;
128 --btn-primary-hover-background-color: #0053f0;
129 --btn-primary-background-color: #0b5fff;
130 --font-weight-heading4: 100;
131 --font-weight-hero-text-h1: 600;
132 --font-weight-heading3: 400;
133 --success: #287d3c;
134 --font-family-heading4: 'Graphik Web';
135 --font-family-heading3: 'Graphik Web';
136 --font-weight-heading2: 400;
137 --font-weight-heading1: 600;
138 --font-size-sm: 0.875rem;
139 --font-family-heading2: 'Graphik Web';
140 --btn-primary-border-color: #0b5fff;
141 --font-family-heading1: 'Graphik Web';
142 --font-family-base: 'Arabic', sans-serif;
143 --spacer-0: 0;
144 --font-family-monospace: 'Arabic', sans-serif;
145 --lead-font-size: 1.25rem;
146 --border-radius: 0.25rem;
147 --spacer-9: 9rem;
148 --font-weight-light: 300;
149 --btn-secondary-hover-color: #272833;
150 --spacer-2: 0.5rem;
151 --font-family-button-body: 'Graphik Web';
152 --spacer-1: 0.25rem;
153 --spacer-4: 1.5rem;
154 --spacer-3: 1rem;
155 --spacer-6: 4.5rem;
156 --spacer-5: 3rem;
157 --spacer-8: 7.5rem;
158 --border-radius-circle: 50%;
159 --spacer-7: 6rem;
160 --font-size-lg: 1.125rem;
161 --aspect-ratio-8-to-3: 37.5%;
162 --font-family-sans-serif: 'Arabic', sans-serif;
163 --gray-100: #f7f8f9;
164 --font-weight-bolder: 900;
165 --container-max-xl: 1280px;
166 --btn-outline-secondary-color: #6b6c7e;
167 --custom-black: #1E1E1E;
168 --gray-500: #a7a9bc;
169 --h1-font-size: 66px;
170 --gray-900: #272833;
171 --text-muted: #a7a9bc;
172 --btn-primary-hover-border-color: transparent;
173 --btn-outline-secondary-border-color: #cdced9;
174 --lead-font-weight: 300;
175 --font-size-base: 0.875rem;
176 }
177
178 .article-breadcrumb
179 a{
180 color: var(--purple) !important;
181 text-decoration: underline !important;
182 text-decoration-color: #E6E6E6 !important;
183 }
184
185 .article-figure
186 img{
187 max-width: 100% !important;
188 }
189
190 #articleDiv
191 {
192 word-wrap:break-word;
193 }
194
195 .buttonBodyContainer:hover
196 a{
197 color: #ffffff !important;
198 }
199
200 .black-to-garnet-author{
201 color: var(--custom-black) !important;
202 text-decoration: underline !important;
203 text-decoration-color: #E6E6E6 !important;
204 }
205
206 .article-square-bio:hover
207 a{
208 color: var(--purple) !important;
209 text-decoration: underline !important;
210 text-decoration-color: #E6E6E6 !important;
211 }
212
213 .atk-article
214 a{
215 color: var(--purple) !important;
216 text-decoration: underline !important;
217 text-decoration-color: #E6E6E6 !important;
218 }
219
220 .atk-article
221 a:hover{
222 text-decoration: none !important;
223 }
224 </style>
225
226</#if>
227
228<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
229<#assign AssetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
230<#--
2317.4 Upgrade start
232-->
233<#assign AssetLinkLocalService = serviceLocator.findService("com.liferay.asset.link.service.AssetLinkLocalService")>
234<#--
2357.4 Upgrade end
236-->
237<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
238<#assign AssetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService")>
239<#assign AssetCategoryPropertyLocalService = serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService")/>
240<#assign LayoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")>
241<#assign PortletPreferencesLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.PortletPreferencesLocalService")/>
242<#assign PropertyFactoryUtil = serviceLocator.findService("com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil") />
243<#assign GroupLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService")>
244<#assign LayoutSetService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutSetLocalService")>
245<#assign DynamicQueryFactoryUtil = serviceLocator.findService("com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil") />
246<#assign virtualHostLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.VirtualHostLocalService") />
247<#assign TemplateCustomService = serviceLocator.findService("template.custom.services.TemplateCustomService") />
248<#assign ArticleTemplateCustomService = serviceLocator.findService("template.custom.services.ArticleTemplateCustomService") />
249<#assign DynamicPDFGenerationCustomService = serviceLocator.findService("template.custom.services.DynamicPDFGenerationCustomService") />
250
251<#assign
252serviceContextThreadLocal = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"]
253themeDisplay = serviceContextThreadLocal.getServiceContext().getThemeDisplay()
254/>
255<#assign imageSaturationFilter = themeDisplay.getLayout().getExpandoBridge().getAttribute("Add-Image-Saturation-Filter")!false />
256
257<#assign CurrentJournalArticle = JournalArticleLocalService.getLatestArticle(groupId,.vars['reserved-article-id'].data)>
258<#assign CurrentAssetEntry = AssetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle",CurrentJournalArticle.getResourcePrimKey())>
259<#assign AssetLinks=AssetLinkLocalService.getDirectLinks(CurrentAssetEntry.getEntryId()) >
260
261<#assign PropertyFactoryUtil = serviceLocator.findService("com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil") />
262
263<#-- update name here if change asset library name -->
264<#assign assetLibGroup = GroupLocalService.getGroup(themeDisplay.getCompanyId(), "Kearney Global Asset Library") />
265<#if assetLibGroup?? >
266 <#assign assetLibGroupId = assetLibGroup.getGroupId() />
267</#if>
268
269<#assign assetLinkOrder = CurrentJournalArticle.getExpandoBridge().getAttribute("Related Asset Ordering")!"" />
270
271<#--
2727.4 Upgrade start
273-->
274<#assign plid = themeDisplay.getPlid()>
275<#--
2767.4 Upgrade end
277-->
278<#if !(preview)>
279<#-- ATK 40 changes start -->
280 <#assign portletId = themeDisplay.getPortletDisplay().getId()>
281
282 <#assign portletPreferences = PortletPreferencesLocalService.getPortletPreferences(plid, portletId)?first />
283
284 <#assign preferences = PortletPreferencesLocalService.fetchPreferences(portletPreferences.getCompanyId(), portletPreferences.getOwnerId(), portletPreferences.getOwnerType(), plid, portletId) />
285
286<#-- Macro used to get specific field text from an Asset Entry -->
287<#macro entryNode document field>
288 <#if document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content")??>
289 "${document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content").getText()?js_string}"
290 <#else>
291 ""
292 </#if>
293</#macro>
294
295<#-- Macro used to get specific portlet preference -->
296<#macro preference prefKey prefIndex defaultValue>
297 <#if portletPreferencesXML.selectSingleNode("/portlet-preferences/preference[name='"+prefKey+"-"+prefIndex+"']/value")??>
298 "${portletPreferencesXML.selectSingleNode("/portlet-preferences/preference[name='"+prefKey+"-"+prefIndex+"']/value").getText()?js_string}"<#return>
299 <#else>
300 "${defaultValue?js_string}"<#return>
301 </#if>
302</#macro>
303<#-- ATK 40 changes end -->
304</#if>
305
306<#if (preview)>
307<#-- ATK 40 changes start -->
308
309 <#assign portletId = (PortletPreferencesLocalService.getPortletPreferencesByPlid(themeDisplay.getPlid())?first).getPortletId() >
310
311 <#assign portletPreferences = PortletPreferencesLocalService.getPortletPreferences(plid, portletId)?first />
312
313 <#assign preferences = PortletPreferencesLocalService.fetchPreferences(portletPreferences.getCompanyId(), portletPreferences.getOwnerId(), portletPreferences.getOwnerType(), plid, portletId) />
314
315<#-- Macro used to get specific field text from an Asset Entry -->
316<#macro entryNode document field>
317 <#if document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content")??>
318 "${document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content").getText()?js_string}"
319 <#else>
320 ""
321 </#if>
322</#macro>
323
324<#-- Macro used to get specific portlet preference -->
325<#macro preference prefKey prefIndex defaultValue>
326 <#if portletPreferencesXML.selectSingleNode("/portlet-preferences/preference[name='"+prefKey+"-"+prefIndex+"']/value")??>
327 "${portletPreferencesXML.selectSingleNode("/portlet-preferences/preference[name='"+prefKey+"-"+prefIndex+"']/value").getText()?js_string}"<#return>
328 <#else>
329 "${defaultValue?js_string}"<#return>
330 </#if>
331</#macro>
332<#-- ATK 40 changes end -->
333</#if>
334
335<#-- ATK-659 -->
336<#assign displayDate = "" />
337<#if CurrentJournalArticle.getDisplayDate()?has_content>
338 <#assign displayDate = CurrentJournalArticle.getDisplayDate()?date?string('MMMM dd, yyyy') />
339</#if>
340<#-- schema vars starts -->
341<#assign modifiedDate = "" />
342<#if CurrentJournalArticle.getModifiedDate()?has_content>
343 <#assign modifiedDate = CurrentJournalArticle.getModifiedDate()?date?string('yyyy-MM-dd') />
344</#if>
345<#assign displayDateForSchema = "" />
346<#if CurrentJournalArticle.getDisplayDate()?has_content>
347 <#assign displayDateForSchema = CurrentJournalArticle.getDisplayDate()?date?string('yyyy-MM-dd') />
348</#if>
349
350<#assign imageurlschema = "" />
351<#assign currenturi = "" />
352<#if (ThumbnailSquare.getData())??>
353 <#if (ThumbnailSquare.getData())?contains("?")>
354 <#assign imageurlschema = (ThumbnailSquare.getData())?keep_before("?") />
355 <#else>
356 <#assign imageurlschema = ThumbnailSquare.getData() />
357 </#if>
358
359</#if>
360<#if themeDisplay.getURLCurrent()?has_content >
361 <#if (themeDisplay.getURLCurrent())?contains("?") >
362 <#assign currenturi = (themeDisplay.getURLCurrent())?keep_before("?") />
363 <#else>
364 <#assign currenturi = (themeDisplay.getURLCurrent()) />
365 </#if>
366</#if>
367<#assign pageurlcurrent = themeDisplay.getCDNBaseURL() + currenturi />
368<#assign answer =''>
369<#if Intro.getData()?has_content >
370 <#assign answer = htmlUtil.unescape(Intro.getData())/>
371 <#else>
372 <#if Content.getSiblings()?has_content>
373 <#list Content.getSiblings() as cur_Content>
374 <#if (cur_Content.getData())??>
375 <#assign withouthtml = htmlUtil.unescape(cur_Content.getData())?replace('<[^>]+>','','r') />
376 <#assign withouthtml = withouthtml?replace('\\n+','','r') />
377 <#assign withouthtml = withouthtml?replace('\\t+','','r') />
378 <#assign withouthtml = withouthtml?replace('\\r+','','r') />
379 <#assign withouthtml = withouthtml?replace(' ','','r') />
380 <#assign answer += withouthtml />
381 </#if>
382 </#list>
383 </#if>
384</#if>
385<#assign hasExternalHeroBanner = false />
386<#assign externalHeroBannerImageURL = "" />
387<#assign externalHeroBannerTitle = "" />
388<#assign externalHeroBannerSubTitle = "" />
389<#if HeroImage?? && HeroImage.getData() == "">
390 <#assign externalHeroBannerData = ArticleTemplateCustomService.getHeroBannerData(plid, assetLibGroup.getGroupId(), themeDisplay) />
391 <#assign hasExternalHeroBanner = externalHeroBannerData.hasExternalHeroBanner />
392 <#assign externalHeroBannerImageURL = externalHeroBannerData.externalHeroBannerImageURL />
393 <#assign externalHeroBannerTitle = externalHeroBannerData.externalHeroBannerTitle />
394 <#assign externalHeroBannerSubTitle = externalHeroBannerData.externalHeroBannerSubTitle />
395</#if>
396<#-- schema ends -->
397<div id="articleDiv">
398</div>
399
400<script>
401
402 var articleMetadata = {};
403 articleMetadata.slug = "${(htmlUtil.unescape(Slug.getData()))?js_string}";
404 articleMetadata.articleTitle = "${(htmlUtil.unescape(ArticleTitle.getData()))?js_string}";
405
406 <#assign heroImageId = "" />
407 <#assign heroImageFileName = "" />
408 <#assign heroMobileImageId = "" />
409 <#assign heroMobileImageFileName = "" />
410
411 <#if HeroImage??>
412 articleMetadata.heroImage = "${HeroImage.getData()?js_string}";
413 <#assign parts = HeroImage.getData()?split("/")!"">
414 <#if HeroImage.getAttribute("title")??>
415 <#assign heroImageFileName = HeroImage.getAttribute("title")/>
416 <#else>
417 <#assign heroImageFileName = parts[4]!"" />
418 </#if>
419 <#if HeroImage.getAttribute("fileEntryId")??>
420 <#assign heroImageId = HeroImage.getAttribute("fileEntryId") />
421 <#else>
422 <#attempt>
423 <#assign heroImageId = DLFileEntryLocalService.getFileEntryByFileName(parts[2]?number, parts[3]?number, heroImageFileName).getFileEntryId()!"" />
424 <#recover>
425 <#if HeroImage.getAttribute("uuid")?? >
426 <#assign heroImageUuid = HeroImage.getAttribute("uuid")>
427 </#if>
428 <#if HeroImage.getAttribute("groupId")??>
429 <#assign heroImageGroupId = HeroImage.getAttribute("groupId")?number>
430 </#if>
431 <#if heroImageUuid?has_content && heroImageGroupId != 0 >
432 <#attempt>
433 <#assign fileEntry = DLFileEntryLocalService.getDLFileEntryByUuidAndGroupId(heroImageUuid,heroImageGroupId) />
434 <#recover>
435 <#assign fileEntry = "" />
436 </#attempt>
437 <#if fileEntry?? && fileEntry?has_content>
438 <#assign heroImageId = fileEntry.getFileEntryId() />
439 </#if>
440 </#if>
441 </#attempt>
442 </#if>
443 articleMetadata.imageFileEntryId = "${heroImageId}";
444 articleMetadata.imageName = "${heroImageFileName}";
445 articleMetadata.imageSaturationFilter = "${imageSaturationFilter?c}";
446 </#if>
447 <#if HeroMobile??>
448 articleMetadata.heroMobile = "${HeroMobile.getData()?js_string}";
449 <#assign partsMobile = HeroMobile.getData()?split("/")!"">
450 <#if HeroMobile.getAttribute("title")??>
451 <#assign heroMobileImageFileName = HeroMobile.getAttribute("title")/>
452 <#else>
453 <#assign heroMobileImageFileName = partsMobile[4]!"" />
454 </#if>
455 <#if HeroMobile.getAttribute("fileEntryId")??>
456 <#assign heroMobileImageId = HeroMobile.getAttribute("fileEntryId")>
457 <#else>
458 <#attempt>
459 <#assign heroMobileImageId = DLFileEntryLocalService.getFileEntryByFileName(partsMobile[2]?number, partsMobile[3]?number, heroMobileImageFileName).getFileEntryId()!"" />
460 <#recover>
461 <#if HeroMobile.getAttribute("uuid")??>
462 <#assign heroMobileUuid = HeroMobile.getAttribute("uuid")>
463 </#if>
464 <#if HeroMobile.getAttribute("groupId")??>
465 <#assign heroMobileGroupId = HeroMobile.getAttribute("groupId")?number>
466 </#if>
467 <#if heroMobileUuid?? && heroMobileGroupId??>
468 <#attempt>
469 <#assign heroMobileImageId = DLFileEntryLocalService.getDLFileEntryByUuidAndGroupId(heroMobileUuid,heroMobileGroupId).getFileEntryId()!"" />
470 <#recover>
471 <#assign heroMobileImageId = 0 />
472 </#attempt>
473 </#if>
474 </#attempt>
475 </#if>
476 articleMetadata.mobileImageFileEntryId = "${heroMobileImageId}";
477 articleMetadata.mobileImageName = "${heroMobileImageFileName}";
478 articleMetadata.imageSaturationFilter = "${imageSaturationFilter?c}";
479 </#if>
480
481 <#--
482 Set articleMetadata.publicTestArticle to restrict social sharing functionality to a single article.
483 Otherwise, leave commented to allow social sharing on all articles.
484 -->
485 <#--articleMetadata.publicTestArticle = 'test-article-url';-->
486
487
488 <#if BiggerTitle??>
489 articleMetadata.biggerTitle = ${getterUtil.getBoolean(BiggerTitle.getData())?c};
490 <#else>
491 articleMetadata.biggerTitle = false;
492 </#if>
493
494 articleMetadata.subtitle = "${(htmlUtil.unescape(Subtitle.getData()))?js_string}";
495
496 <#assign introData = htmlUtil.unescape(Intro.getData())>
497 <#if !introData?contains("l2it-audio-player")>
498 <#if AddArticleAudio??>
499 <#assign addarticleaudio = getterUtil.getBoolean(AddArticleAudio.getData())>
500 <#else>
501 <#assign addarticleaudio = false>
502 </#if>
503 <#if addarticleaudio == true>
504 <#assign articleaudiotext = '<div id="l2it-audio-player"></div>' >
505 <#assign introData = introData + articleaudiotext>
506 </#if>
507 </#if>
508
509 articleMetadata.intro = "${introData?js_string}";
510
511 <#assign LandingArticle = false />
512 <#if LandingPage??>
513 articleMetadata.landingPage = '${getterUtil.getBoolean(LandingPage.getData())?c}';
514 <#assign LandingArticle = getterUtil.getBoolean(LandingPage.getData()) />
515 <#else>
516 articleMetadata.landingPage = false;
517 </#if>
518
519 <#if SocialLinks??>
520 <#if SocialLinks.getData() == "">
521 articleMetadata.socialLinks = true;
522 <#else>
523 articleMetadata.socialLinks = ${getterUtil.getBoolean(SocialLinks.getData())?c};
524 </#if>
525 <#else>
526 articleMetadata.socialLinks = false;
527 </#if>
528
529 <#if GraySeparator??>
530 <#if GraySeparator.getData() == "">
531 articleMetadata.graySeparator = true;
532 <#else>
533 articleMetadata.graySeparator = ${getterUtil.getBoolean(GraySeparator.getData())?c};
534 </#if>
535 <#else>
536 articleMetadata.graySeparator = false;
537 </#if>
538
539 <#if ShowParentBreadcrumb?? && LandingPage?? && getterUtil.getBoolean(LandingPage.getData()) == true>
540 articleMetadata.showParentBreadcrumb = ${getterUtil.getBoolean(ShowParentBreadcrumb.getData())?c}
541 <#else>
542 articleMetadata.showParentBreadcrumb = true;
543 </#if>
544
545 <#if BreadcrumbLabel??>
546 articleMetadata.parentBreadcrumbLabel = "${(htmlUtil.unescape(BreadcrumbLabel.getData()))?js_string}";
547 </#if>
548
549 <#if BreadcrumbURL??>
550 articleMetadata.parentBreadcrumbURL = "${BreadcrumbURL.getData()?js_string}";
551 </#if>
552
553 <#if Byline??>
554 articleMetadata.byline = "${(htmlUtil.unescape(Byline.getData()))?js_string}";
555 </#if>
556
557 <#if FeaturedContributor??>
558 articleMetadata.featuredContributor = "${htmlUtil.unescape(FeaturedContributor.getData())}"
559 </#if>
560
561 <#-- Removed as of ATK-1208 -- No longer needed -- Legacy -->
562 <#--
563 <#if PostArticleSlideShareKey?? && PostArticleSlideShareKey.PostArticleSlideshareContent??>
564 articleMetadata.postArticleSlideshareKey = "${PostArticleSlideShareKey.getData()}"
565
566 articleMetadata.postArticleSlideshareContent = "${PostArticleSlideShareKey.PostArticleSlideshareContent.getData()}"
567 </#if>
568 -->
569
570 var articleContents = [];
571 <#if Content.getSiblings()?has_content>
572 <#list Content.getSiblings() as cur_Content>
573
574 var images = [];
575
576 <#if cur_Content.PrimaryImage?has_content>
577 <#list cur_Content.PrimaryImage.getSiblings() as cur_PrimaryImage>
578 <#assign contentImageName = "" />
579 <#assign contentImageFileEntryId = "" />
580
581 <#if cur_PrimaryImage.getData() != "">
582 <#assign cur_PrimaryImageParts = cur_PrimaryImage.getData()?split("/")!"" />
583 <#if cur_PrimaryImage.getAttribute("title")??>
584 <#assign contentImageName = cur_PrimaryImage.getAttribute("title") />
585 <#else>
586 <#assign contentImageName = cur_PrimaryImageParts[4]!"" />
587 </#if>
588 <#if cur_PrimaryImage.getAttribute("fileEntryId")??>
589 <#assign contentImageFileEntryId = cur_PrimaryImage.getAttribute("fileEntryId") />
590 <#else>
591 <#attempt>
592 <#assign contentImageFileEntryId = DLFileEntryLocalService.getFileEntryByFileName(cur_PrimaryImageParts[2]?number, cur_PrimaryImageParts[3]?number, contentImageName).getFileEntryId()!"" />
593 <#recover>
594 <#if cur_PrimaryImage.getAttribute("uuid")??>
595 <#assign curImageUuid = cur_PrimaryImage.getAttribute("uuid")/>
596 </#if>
597 <#if cur_PrimaryImage.getAttribute("groupId")??>
598 <#assign curImageGroupId = cur_PrimaryImage.getAttribute("groupId")?number />
599 </#if>
600 <#if curImageUuid?? && curImageGroupId??>
601 <#assign contentImageFileEntryId = DLFileEntryLocalService.getDLFileEntryByUuidAndGroupId(curImageUuid,curImageGroupId).getFileEntryId()!"" />
602 </#if>
603 </#attempt>
604 </#if>
605 </#if>
606
607 var image = {"imageURL": "${cur_PrimaryImage.getData()?js_string}", "imageFileEntryId": "${contentImageFileEntryId}", "imageFileName":"${contentImageName}", "imageSaturationFilter":"${imageSaturationFilter?c}"};
608
609 <#if cur_Content.PrimaryImage.SlideshowCaption??>
610 image["caption"] = "${(htmlUtil.unescape(cur_PrimaryImage.SlideshowCaption.getData()))?js_string}";
611 </#if>
612
613 image["sharingEnabled"] = ${(cur_PrimaryImage.SharingEnabled?? && cur_PrimaryImage.SharingEnabled.getData() == "true")?c};
614
615 images.push(image);
616
617 </#list>
618 </#if>
619
620 articleContents.push({
621 <#if cur_Content.FeatureSlug??>
622 slug: "${cur_Content.FeatureSlug.getData()?js_string}",
623 </#if>
624 <#if cur_Content.TextAlignment??>
625 textAlignment: "${cur_Content.TextAlignment.getData()?js_string}",
626 </#if>
627 content: "${(htmlUtil.unescape(cur_Content.getData()))?js_string}",
628 styling: "${cur_Content.stylingSelect.getData()?js_string}",
629 alternateText: "${(htmlUtil.unescape(cur_Content.AlternateText.getData()))?js_string}",
630 primaryImage: images,
631 secondaryImage: "${cur_Content.SecondaryMaskImage.getData()?js_string}",
632 buttonText: "${(htmlUtil.unescape(cur_Content.ButtonText.getData()))?js_string}",
633 buttonURL: "${cur_Content.ButtonURL.getData()?js_string}",
634 displayDate: "${displayDate}"
635 });
636
637
638 </#list>
639 </#if>
640
641 var bios = [];
642 <#assign articleGroup = GroupLocalService.getGroup(CurrentAssetEntry.getGroupId())
643 guestGroup = GroupLocalService.getFriendlyURLGroup(articleGroup.getCompanyId(), "/guest") />
644 <#--
645 Create list of groups that asset entries live in, so that linked bios can be retrieved by UUID
646 -->
647 <#assign assetLinkGroups = []>
648 <#if AssetLinks?has_content>
649 <#list AssetLinks as assetLink>
650 <#assign linkedAssetEntry = AssetEntryLocalService.getAssetEntry(assetLink.getEntryId2())>
651 <#assign assetLinkGroups = assetLinkGroups + [linkedAssetEntry.getGroupId()]>
652 </#list>
653 </#if>
654
655 //Create asset link ordering
656 var assetOrderArr = [];
657
658 <#list assetLinkOrder?split(",") as assetLinkUUID>
659 <#--
660 Find group which asset link is stored in and assign the resulting asset entry
661 -->
662 <#assign orderAssetEntry = "">
663
664 <#list assetLinkGroups as assetLinkGroupId>
665 <#assign orderAssetEntry = AssetEntryLocalService.fetchEntry(assetLinkGroupId, assetLinkUUID)!"">
666
667 <#if orderAssetEntry != "">
668 <#break />
669 </#if>
670 </#list>
671
672 <#if orderAssetEntry != "">
673 <#assign orderJournalArticle = JournalArticleLocalService.fetchLatestArticle(orderAssetEntry.getClassPK())!"">
674 <#if orderJournalArticle != "">
675 assetOrderArr.push("${orderJournalArticle.getArticleId()}");
676 </#if>
677 </#if>
678 </#list>
679
680 var assetOrderMap = {};
681
682 for(var order=1; order<assetOrderArr.length; order++) {
683 assetOrderMap[assetOrderArr[order-1]] = order;
684 }
685
686 var getAssetOrder = function(uuid) {
687 var order = assetOrderMap[uuid];
688 if(!order) {
689 order = Object.keys(assetOrderMap).length + 1;
690 assetOrderMap[uuid] = order;
691 }
692
693 return order;
694 };
695 <#assign authorlistschema = [] />
696 <#assign authorListForPdf = [] />
697
698 <#if Authors?? && Authors.getSiblings()?has_content>
699
700 var bioC =0;
701 <#list Authors.getSiblings() as cur_Authors>
702
703 <#if cur_Authors.getData() != "" >
704 <#assign cur_webContent_map = jsonFactoryUtil.createJSONObject(cur_Authors.getData())>
705 <#assign cur_webContent_classPK = cur_webContent_map.getString("classPK")>
706 <#if cur_webContent_classPK??>
707 <#if JournalArticleLocalService.fetchLatestArticle(cur_webContent_classPK?number)?? && !JournalArticleLocalService.fetchLatestArticle(cur_webContent_classPK?number).isExpired()>
708 <#assign articleK = JournalArticleLocalService.fetchLatestArticle(cur_webContent_classPK?number)>
709 <#assign articleKAssetEntry = AssetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle",articleK.getResourcePrimKey()) />
710
711 <#if articleKAssetEntry?? && articleKAssetEntry.getAssetRenderer()??>
712 <#assign xml = saxReaderUtil.read(articleKAssetEntry.getAssetRenderer().getArticle().getContentByLocale(themeDisplay.getLocale())) />
713
714
715
716 <#assign xml_fullName = xml.valueOf("//dynamic-element[@name='FullName']/dynamic-content/text()") />
717 <#assign xml_title = xml.valueOf("//dynamic-element[@name='Title']/dynamic-content/text()") />
718 <#assign xml_headshotImage = TemplateCustomService.getDocumentFileDetails(xml,"CutoutHeadshot",themeDisplay)/>
719
720 <#-- Split on '*****' to separate the ID+filename part and the URL -->
721 <#assign headshotxmlImageDetailParts = xml_headshotImage?split("*****")!"">
722
723 <#-- Extract the left and right parts -->
724 <#assign headshotxmlLeftPart = headshotxmlImageDetailParts[0]!"">
725 <#assign xml_headshotImage = headshotxmlImageDetailParts[1]!"">
726
727 <#-- From the left part, split on '+++++' to get the ID -->
728 <#assign headshotxmlImageFileEntryId = headshotxmlLeftPart?split("+++++")[0]!"">
729 <#assign headshotxmlImageFileName = headshotxmlLeftPart?split("+++++")[1]!"">
730
731 <#if xml_headshotImage?contains("&download=")>
732 <#assign xml_headshotImage = xml_headshotImage?keep_before("&download=")>
733 </#if>
734
735
736 var bio1 = {};
737 bio1.structureKey=('${articleK.getDDMStructure().getName("en_US")}');
738 bio1.weight= ++bioC;
739 bio1.fullName = '${(htmlUtil.unescape(xml_fullName))?js_string}';
740 bio1.headshot = '${xml_headshotImage?js_string}';
741 bio1.imageFileEntryId = '${headshotxmlImageFileEntryId?js_string}';
742 bio1.imageFileName = '${headshotxmlImageFileName?js_string}';
743 bio1.imageSaturationFilter = '${imageSaturationFilter?c}',
744 bio1.title = '${xml_title}';
745 <#if (articleGroup.getLiveGroupId() != 0 ) >
746 <#assign articleK = JournalArticleLocalService.getArticleByUrlTitle(assetLibGroupId, articleK.getUrlTitle()) />
747 </#if>
748 <#assign viewURL = '' />
749
750 <#if articleK.getDDMStructure().getName("en_US") == "Bio Page">
751 <#assign viewURL = TemplateCustomService.getArticleViewURL(articleK.getArticleId(),assetLibGroup,articleK.getGroupId(),themeDisplay,guestGroup.getGroupId())/>
752 <#if !(viewURL?has_content)>
753 <#assign viewURL = themeDisplay.getPortalURL() + "/about/people/bio/" + xml_fullName?lower_case?replace(" ", "-")/>
754 </#if>
755 </#if>
756
757 bio1.bioURL = '${viewURL}';
758 bios.push(bio1);
759 <#assign authorListForPdf = [xml_fullName + "::::::::" + xml_title + "++++++++" + viewURL + ";;;;;;;;" + headshotxmlImageFileEntryId] + authorListForPdf />
760 <#assign viewURLschema = ''/>
761 <#if viewURL?has_content>
762 <#assign viewURLschema = viewURL />
763 </#if>
764 <#assign authordataschema = {"url":viewURLschema, "jobTitle":xml_title, "name":xml_fullName} />
765 <#assign authorlistschema = authorlistschema + [authordataschema] />
766 </#if>
767 </#if>
768 </#if>
769 </#if>
770
771 </#list>
772
773 </#if>
774
775 <#assign oldwaytogetauthourforschema = false>
776 <#if authorlistschema?size == 0>
777 <#assign oldwaytogetauthourforschema = true>
778 </#if>
779
780 if (bios.length == 0){
781 <#assign authorCounter = authorListForPdf?size />
782 <#if AssetLinks?has_content>
783
784 <#list AssetLinks as assetLink>
785 <#assign linkedAssetEntry = AssetEntryLocalService.getAssetEntry(assetLink.getEntryId2())>
786 <#assign linkedJournalArticle = JournalArticleLocalService.getLatestArticle(linkedAssetEntry.getClassPK())>
787 <#assign xml = saxReaderUtil.read(linkedAssetEntry.getAssetRenderer().getArticle().getContentByLocale(themeDisplay.getLocale())) />
788 <#assign structureKey = linkedJournalArticle.getDDMStructure().getName("en_US") />
789
790 var bio = {};
791
792 <#assign xml_headshotDetails = TemplateCustomService.getDocumentFileDetails(xml,"CutoutHeadshot",themeDisplay)/>
793
794 <#-- Split on '*****' to separate the ID+filename part and the URL -->
795 <#assign headshotImageDetailParts = xml_headshotDetails?split("*****")!"">
796
797 <#-- Extract the left and right parts -->
798 <#assign headshotLeftPart = headshotImageDetailParts[0]!"">
799 <#assign xml_headshot = headshotImageDetailParts[1]!"">
800
801 <#-- From the left part, split on '+++++' to get the ID -->
802 <#assign headshotImageFileEntryId = headshotLeftPart?split("+++++")[0]!"">
803 <#assign headshotImageFileName = headshotLeftPart?split("+++++")[1]!"">
804
805
806 <#if xml_headshot?contains("&download=")>
807 <#assign xml_headshot = xml_headshot?keep_before("&download=")>
808 </#if>
809 <#if structureKey == "Bio Page" || structureKey == "Micro Bio" >
810 <#assign xml_fullName = xml.valueOf("//dynamic-element[@name='FullName']/dynamic-content/text()") />
811 <#assign xml_title = xml.valueOf("//dynamic-element[@name='Title']/dynamic-content/text()") />
812 bio.structureKey=('${structureKey}').trim();
813 bio.weight = getAssetOrder("${linkedJournalArticle.getArticleId()}");
814 bio.fullName = "${(htmlUtil.unescape(xml_fullName))?js_string}";
815 bio.position = "${xml.valueOf("//dynamic-element[@name='Position']/dynamic-content/text()")?js_string}";
816 bio.title = "${xml_title?js_string}";
817 bio.headshot = "${xml_headshot?js_string}";
818 bio.imageFileEntryId = "${headshotImageFileEntryId?js_string}";
819 bio.imageFileName = "${headshotImageFileName?js_string}";
820 bio.imageSaturationFilter ='${imageSaturationFilter?c}',
821 bio.description = "${xml.valueOf("//dynamic-element[@name='Description']/dynamic-content/text()")?js_string}";
822 bio.linkedInURL = "${xml.valueOf("//dynamic-element[@name='LinkedInURL']/dynamic-content/text()")?js_string}";
823
824 <#assign viewURL = '' />
825 <#if linkedJournalArticle.getDDMStructure().getName("en_US") == "Bio Page">
826 <#assign viewURL = themeDisplay.getPortalURL() + "/about/people/bio/" + xml_fullName?lower_case?replace(" ", "-")/>
827 </#if>
828
829 bio.bioURL = '${viewURL}';
830 bios.push(bio);
831
832 <#if authorCounter == 0>
833 <#assign authorListForPdf = [xml_fullName + "::::::::" + xml_title + "++++++++" + viewURL + ";;;;;;;;" + headshotImageFileEntryId] + authorListForPdf />
834 </#if>
835
836 <#assign viewURLschema = ''/>
837 <#if viewURL?has_content>
838 <#assign viewURLschema = viewURL />
839 </#if>
840
841 <#if oldwaytogetauthourforschema>
842 <#assign authordataschema = {"url":viewURLschema, "jobTitle":xml_title, "name":xml_fullName} />
843 <#assign authorlistschema = authorlistschema + [authordataschema] />
844 </#if>
845 </#if>
846 </#list>
847
848 bios.sort(function(bio1, bio2){
849 return bio1.weight - bio2.weight;
850 });
851 </#if>
852
853 }
854 <#assign assetCategories = AssetCategoryLocalService.getCategories(CurrentAssetEntry.getClassNameId(), CurrentAssetEntry.getClassPK())>
855
856 var articleCategories = [];
857
858 <#list assetCategories as category>
859 <#assign categoryVocabulary = AssetVocabularyLocalService.getAssetVocabulary(category.getVocabularyId())>
860 <#assign categoryUrl = "#">
861
862 <#list AssetCategoryPropertyLocalService.getCategoryProperties(category.categoryId) as categoryProperty>
863
864 <#if categoryProperty.key == "url">
865 <#assign categoryUrl = categoryProperty.value>
866 </#if>
867 </#list>
868
869 articleCategories.push({
870 id: "${category.categoryId}",
871 name: "${category.name}",
872 url: "${categoryUrl}",
873 vocabularyName: "${categoryVocabulary.getName()?js_string}",
874 });
875 </#list>
876
877 articleMetadata.categories = articleCategories;
878 <#if LayoutSetService.getLayoutSet(articleGroup.getGroupId(), false)??
879 && LayoutSetService.getLayoutSet(articleGroup.getGroupId(), false).getThemeSetting("isMicroSite", "regular")?? >
880 <#assign isMicroSite = (LayoutSetService.getLayoutSet(articleGroup.getGroupId(), false).getThemeSetting("isMicroSite", "regular") == "true")>
881 <#else>
882 <#assign isMicroSite = false>
883 </#if>
884
885 <#-- ATK-1384 -- 240212 is groupid for Microsite -->
886 <#assign siteName = "Kearney">
887 <#if GroupLocalService.getGroup(themeDisplay.getScopeGroupId()).getParentGroupId() == 240212>
888 <#assign siteName = GroupLocalService.getGroup(themeDisplay.getScopeGroupId()).getName("en_US")?cap_first />
889 </#if>
890
891 articleMetadata.isMicroSite = ${isMicroSite?c};
892 articleMetadata.groupName = "${articleGroup.getName("en_US")?js_string}";
893 articleMetadata.siteName = "${siteName?js_string}";
894 articleMetadata.groupFriendlyUrl = "${articleGroup.getFriendlyURL()?js_string}";
895
896 <#if ReadMoreURL??>
897 articleMetadata.readMoreURL = "${ReadMoreURL.getData()?js_string}";
898 <#else>
899 articleMetadata.readMoreURL = "";
900 </#if>
901
902 <#if ReadMoreTextOverride??>
903 articleMetadata.readMoreTextOverride = "${(htmlUtil.unescape(ReadMoreTextOverride.getData()))?js_string}";
904 <#else>
905 articleMetadata.readMoreTextOverride = "";
906 </#if>
907
908 <#if ContributorsTitleOverride??>
909 articleMetadata.contributorsTitleOverride = "${(htmlUtil.unescape(ContributorsTitleOverride.getData()))?js_string}";
910 <#else>
911 articleMetadata.contributorsTitleOverride = "";
912 </#if>
913
914 <#if ReadMoreOverlay??>
915 articleMetadata.readMoreOverlay = ${getterUtil.getBoolean(ReadMoreOverlay.getData())?c}
916 <#else>
917 articleMetadata.readMoreOverlay = false;
918 </#if>
919
920 var sidebarContents = [];
921 <#assign enableSidebar = false>
922 <#if EnableSidebar??>
923 <#assign enableSidebar = getterUtil.getBoolean(EnableSidebar.getData())>
924 </#if>
925 <#-- Check if Sidebar is enabled or not -->
926 <#if enableSidebar == true>
927
928 <#assign listingOfArticles = false>
929 <#assign singleAssetWithImage = false>
930 <#assign richTextSection = false>
931 <#assign listView = false>
932 <#if EnableSidebar.ListingOfArticles??>
933 <#assign listingOfArticles = getterUtil.getBoolean(EnableSidebar.ListingOfArticles.getData())>
934 </#if>
935 <#if EnableSidebar.SingleAssetWithImage??>
936 <#assign singleAssetWithImage = getterUtil.getBoolean(EnableSidebar.SingleAssetWithImage.getData())>
937 </#if>
938 <#if EnableSidebar.RichTextSection??>
939 <#assign richTextSection = getterUtil.getBoolean(EnableSidebar.RichTextSection.getData())>
940 </#if>
941 <#if EnableSidebar.ListView??>
942 <#assign listView = getterUtil.getBoolean(EnableSidebar.ListView.getData())>
943 </#if>
944
945 <#-- Web content with Link Structure -- ATK-1208 -->
946 <#if PostArticleSlideShareKeyFieldSet.PostArticleSlideShareKeyFieldSetFieldSet.PostArticleSlideshareContent?has_content>
947 <#assign linkAssetArticle = ArticleTemplateCustomService.getManualArticle(PostArticleSlideShareKeyFieldSet.PostArticleSlideShareKeyFieldSetFieldSet.PostArticleSlideshareContent.getData())!"null" />
948 <#if !linkAssetArticle?matches("null")>
949 <#assign jArt = JournalArticleLocalService.getLatestArticle(linkAssetArticle.getClassPK())>
950 <#assign document = saxReaderUtil.read(jArt.getContentByLocale(themeDisplay.getLocale()))>
951 <#assign structureName = jArt.getDDMStructure().getName("en_US")>
952 <#if structureName?matches("Link")>
953 var articleSidebarRichText = <@entryNode document=document field="ArticleSidebarRichText"/>;
954 var linkWebContentData = {
955 articleSidebarRichText: articleSidebarRichText
956 }
957 sidebarContents.push({
958 linkWebContentData:linkWebContentData,
959 componentType:"linkWebContent"
960 });
961 </#if>
962 </#if>
963 </#if>
964
965 <#-- If Asset publisher listing of articles is enabled -->
966 <#if listingOfArticles == true>
967
968 <#assign listOfArticlesTitles = "Related">
969 <#if EnableSidebarFieldSet.EnableSidebarFieldSetFieldSet.ListingOfArticlesFieldSet.ListingOfArticlesFieldSetFieldSet.getSiblings()?has_content>
970 <#list EnableSidebarFieldSet.EnableSidebarFieldSetFieldSet.ListingOfArticlesFieldSet.ListingOfArticlesFieldSetFieldSet.getSiblings() as assetArticleListEntry>
971 <#if assetArticleListEntry.ListingOfArticlesTitle.getData()?has_content>
972 <#assign listOfArticlesTitles = htmlUtil.unescape(assetArticleListEntry.ListingOfArticlesTitle.getData())>
973 </#if>
974 <#assign manualArticlesEntries = {}>
975 <#if assetArticleListEntry.SelectSidebarArticles??>
976 <#assign manualArticlesEntries = ArticleTemplateCustomService.getManualArticleList(assetArticleListEntry.SelectSidebarArticles.getSiblings())>
977 </#if>
978 var manualArticlesEntry = [];
979 <#if manualArticlesEntries?size > 0 >
980 <#list manualArticlesEntries as curEntry>
981 <#assign jArt = JournalArticleLocalService.getLatestArticle(curEntry.getClassPK())>
982 <#assign viewURL = TemplateCustomService.getSidebarArticleViewURL(themeDisplay,jArt,assetLibGroup)/>
983 var articleEntry = {"articleTitle": "${TemplateCustomService.getSidebarArticleTitle(themeDisplay,jArt,assetLibGroup)}","articleURL":"${viewURL}"};
984 manualArticlesEntry.push(articleEntry);
985 </#list>
986 <#else>
987 <#assign noOfFeatureArticle = "3">
988 <#if assetArticleListEntry.NoOfArticlesDisplayed.getData() != "0">
989 <#assign noOfFeatureArticle = assetArticleListEntry.NoOfArticlesDisplayed.getData()>
990 </#if>
991 <#assign manualArticlesEntries = ArticleTemplateCustomService.getRelatedArticles(CurrentAssetEntry.getEntryId(), CurrentAssetEntry.getClassTypeId(), noOfFeatureArticle, "Any")>
992 <#list manualArticlesEntries as curEntry>
993 <#assign jArt = JournalArticleLocalService.getLatestArticle(curEntry.getClassPK())>
994 <#assign viewURL = TemplateCustomService.getSidebarArticleViewURL(themeDisplay,jArt,assetLibGroup)/>
995 var articleEntry = {"articleTitle": "${TemplateCustomService.getSidebarArticleTitle(themeDisplay,jArt,assetLibGroup)}","articleURL":"${viewURL}"};
996 manualArticlesEntry.push(articleEntry);
997 </#list>
998 </#if>
999 sidebarContents.push({
1000 listingOfArticlesTitle:"${listOfArticlesTitles}",
1001 manualArticles:manualArticlesEntry,
1002 componentType:"listingOfArticles"
1003 });
1004 </#list>
1005 </#if>
1006
1007 </#if>
1008 <#-- Single Asset Image article -->
1009 <#if singleAssetWithImage == true>
1010 <#if EnableSidebarFieldSet.EnableSidebarFieldSetFieldSet.SingleAssetWithImageFieldSet.SingleAssetWithImageArticleFieldSet.getSiblings()?has_content>
1011 <#list EnableSidebarFieldSet.EnableSidebarFieldSetFieldSet.SingleAssetWithImageFieldSet.SingleAssetWithImageArticleFieldSet.getSiblings() as singleAssetEntry>
1012
1013 <#assign learnMoreText = "Learn more">
1014 <#assign enableTNSImage = true>
1015 <#assign enableSlug = true>
1016
1017 <#if singleAssetEntry.SingleAssetWithImageArticleFieldSetFieldSet.LearnMoreButtonText.getData()??>
1018 <#assign learnMoreText = htmlUtil.unescape(singleAssetEntry.SingleAssetWithImageArticleFieldSetFieldSet.LearnMoreButtonText.getData())/>
1019 </#if>
1020
1021 <#if singleAssetEntry.SingleAssetWithImageArticleFieldSetFieldSet.EnableTNSImage??>
1022 <#assign enableTNSImage = getterUtil.getBoolean(singleAssetEntry.SingleAssetWithImageArticleFieldSetFieldSet.EnableTNSImage.getData())/>
1023 </#if>
1024
1025 <#if singleAssetEntry.SingleAssetWithImageArticleFieldSetFieldSet.EnableSlug??>
1026 <#assign enableSlug = getterUtil.getBoolean(singleAssetEntry.SingleAssetWithImageArticleFieldSetFieldSet.EnableSlug.getData())>
1027 </#if>
1028
1029 <#assign singleAssetArticleData = jsonFactoryUtil.createJSONObject(singleAssetEntry.SingleAssetWithImageArticle.getData())/>
1030
1031 <#if singleAssetArticleData?has_content>
1032 <#assign singleAssetArticle = ArticleTemplateCustomService.getManualArticle(singleAssetEntry.SingleAssetWithImageArticle.getData())>
1033 <#assign jArt = JournalArticleLocalService.getLatestArticle(singleAssetArticle.getClassPK())>
1034 <#assign document = saxReaderUtil.read(jArt.getContentByLocale(themeDisplay.getLocale()))>
1035 <#assign structureName = jArt.getDDMStructure().getName("en_US")>
1036
1037 var componentType = "FEATURED_ARTICLE";
1038 var title = <@entryNode document=document field="ArticleTitle"/>;
1039 var subtitle = <@entryNode document=document field="Subtitle"/>;
1040 var description = <@entryNode document=document field="Description"/>;
1041 if (description == "") {
1042 description = <@entryNode document=document field="Intro"/>;
1043 }
1044 var slug = <@entryNode document=document field="Slug"/>;
1045 var linkTargetOverride = <@entryNode document=document field="LinkTargetOverride"/>;
1046
1047 if(linkTargetOverride == "" || linkTargetOverride == null) {
1048 linkTargetOverride = <@entryNode document=document field="LinkURL"/>;
1049 }
1050 <#-- ATK-1357 Changes Start -->
1051 var videoUrl = "";
1052 <#if structureName?matches('Video')>
1053 videoUrl = <@entryNode document=document field="VideoURL"/>;
1054 </#if>
1055 <#-- ATK-1357 Changes End -->
1056
1057 <#assign articleGroup = GroupLocalService.getGroup(jArt.getGroupId())>
1058
1059 <#if LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false)??&& LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false).getThemeSetting("isMicroSite", "regular")??>
1060 <#assign isMicroSite = (LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false).getThemeSetting("isMicroSite", "regular") == "true")>
1061 <#else>
1062 <#assign isMicroSite = false>
1063 </#if>
1064
1065 var imageFileEntryId = 0;
1066 var imageFileName = "";
1067 var image = '${TemplateCustomService.getDocumentFileDetails(document,"ThumbnailSquare",themeDisplay)}';
1068 if (null == image || "" == image) {
1069 image = '${TemplateCustomService.getDocumentFileDetails(document,"Thumbnail",themeDisplay)}';
1070 }
1071 if (null == image) {
1072 image = "";
1073 }
1074
1075 if ((image) || image != "") {
1076 var [imageFileEntryId, restString] = image.split('+++++');
1077 var [imageFileName, image] = restString.split('*****');
1078 }
1079
1080 var singleAssetComponent = {
1081 slug: slug,
1082 title: title,
1083 subtitle: subtitle,
1084 description: description,
1085 structureName: '${structureName}',
1086 image: image.trim(),
1087 imageFileEntryId: imageFileEntryId,
1088 imageFileName: imageFileName,
1089 imageSaturationFilter:'${imageSaturationFilter?c}',
1090 groupFriendlyUrl: '${articleGroup.getFriendlyURL()}',
1091 isMicrosite: ${isMicroSite?c},
1092 linkTargetOverride: linkTargetOverride,
1093 videoUrl: videoUrl
1094 }
1095
1096 sidebarContents.push({
1097 singleAssetData: singleAssetComponent,
1098 componentType: "singleAsset",
1099 learnMoreTextValue: '${learnMoreText}',
1100 enableSlugValue: ${enableSlug?c},
1101 enableTNSImageValue: ${enableTNSImage?c}
1102 });
1103 </#if>
1104 </#list>
1105 </#if>
1106
1107 </#if>
1108 <#-- Rich Text Section -->
1109 <#if richTextSection == true>
1110 var richTextSectionData = [];
1111 <#if EnableSidebar.RichTextSection.RichTextSectionContent.getSiblings()?has_content>
1112 <#list EnableSidebar.RichTextSection.RichTextSectionContent.getSiblings() as richTextData>
1113 <#if (richTextData.getData())??>
1114 <#assign richTextSection = richTextData.getData()>
1115 richTextSectionData.push({
1116 richTextSectionContent: '${richTextSection?js_string}'
1117 });
1118 </#if>
1119 </#list>
1120 </#if>
1121
1122 sidebarContents.push({
1123 richTextContentData : richTextSectionData,
1124 componentType:"richTextContent"
1125 });
1126 </#if>
1127 <#-- List View -->
1128 <#if listView == true>
1129 <#if EnableSidebarFieldSet.EnableSidebarFieldSetFieldSet.ListViewFieldSet.ListViewFieldSetFieldSet.getSiblings()?has_content>
1130 <#list EnableSidebarFieldSet.EnableSidebarFieldSetFieldSet.ListViewFieldSet.ListViewFieldSetFieldSet.getSiblings() as listViewEntry>
1131
1132 var listViewComponentData = [];
1133 <#assign listViewTitle = "Related">
1134 <#assign displayListViewTitle = false>
1135
1136 <#if listViewEntry.ListViewTitleFieldSet.ListViewTitle.getData()??>
1137 <#assign listViewTitle = htmlUtil.unescape(listViewEntry.ListViewTitleFieldSet.ListViewTitle.getData())>
1138 </#if>
1139
1140 <#if listViewEntry.ListViewTitleFieldSet.ListViewTitleFieldSetFieldSet.DisplayListViewTitle.getData()??>
1141 <#assign displayListViewTitle = getterUtil.getBoolean(listViewEntry.ListViewTitleFieldSet.ListViewTitleFieldSetFieldSet.DisplayListViewTitle.getData())>
1142 </#if>
1143
1144 <#if listViewEntry.ListViewTextFieldSet.getSiblings()?has_content>
1145 <#list listViewEntry.ListViewTextFieldSet.getSiblings() as listViewData>
1146 <#assign listView = htmlUtil.unescape(listViewData.ListViewText.getData())>
1147 <#assign listlink = listViewData.ListViewTextFieldSetFieldSet.ListViewLink.getData()>
1148 listViewComponentData.push({
1149 listViewTitle: '${listView}',
1150 listViewLink: '${listlink}',
1151 });
1152 </#list>
1153 </#if>
1154
1155 sidebarContents.push({
1156 listViewData: listViewComponentData,
1157 componentType: "listView",
1158 listViewTitleValue: '${listViewTitle}',
1159 displayListViewTitleValue: ${displayListViewTitle?c}
1160 });
1161 </#list>
1162 </#if>
1163
1164 </#if>
1165
1166 </#if>
1167
1168 <#-- ATK - 902 Changes Start -->
1169 ATK.isArticlePage = 'false';
1170 <#if LandingArticle == false >
1171 <#if themeDisplay.getURLCurrent()?contains("/article/") || themeDisplay.getURLCurrent()?contains("/-/") || (themeDisplay.getURLCurrent()?contains("/alumni/alumni-profiles/") && !themeDisplay.getURLCurrent()?ends_with("/alumni/alumni-profiles/")) >
1172 ATK.isArticlePage = 'true';
1173 </#if>
1174 </#if>
1175 <#-- ATK - 902 Changes Over -->
1176
1177 <#if PDF?? && PDF.getData() != "">
1178 articleMetadata.pdf = "${PDF.getData()?js_string}"
1179 <#else>
1180 <#if !GroupLocalService.getGroup(themeDisplay.getScopeGroupId()).getName("en_US")?matches("Japan") && !GroupLocalService.getGroup(themeDisplay.getScopeGroupId()).getName("en_US")?matches("China")>
1181 <#assign pdfURL = DynamicPDFGenerationCustomService.getPdfUrl(CurrentJournalArticle, assetLibGroup, "Article-Pdf", themeDisplay, authorListForPdf, isMicroSite, LandingArticle, "pdf-boilerplate-code", externalHeroBannerImageURL, hasExternalHeroBanner, externalHeroBannerTitle, externalHeroBannerSubTitle) />
1182 articleMetadata.pdf = "${pdfURL?js_string}";
1183 </#if>
1184 </#if>
1185
1186 ATK.React.App.Article('articleDiv', articleMetadata, articleContents, bios, sidebarContents);
1187
1188 // Run embedded scripts after article renders.
1189 for (var i in articleContents) {
1190
1191 var re = /<script>(.+)<\/script>/gi;
1192 var thisExtractedScript = ['', ''];
1193
1194 while (null != (thisExtractedScript = re.exec(articleContents[i].content))) {
1195 window.eval(thisExtractedScript[1]);
1196 }
1197 }
1198
1199</script>
1200
1201<div class="atk-container">
1202 <hr class="after-25-px-phone" style="display: none;" id="hrfeatureArticle">
1203</div>
1204
1205
1206<div id="articleAdtDiv_${portletId}" class="articleAdtDiv" />
1207
1208<script>
1209<#assign enableRelatedInsights = false>
1210
1211<#if EnableRelatedInsights??>
1212 <#assign enableRelatedInsights = getterUtil.getBoolean(EnableRelatedInsights.getData())>
1213</#if>
1214<#if enableRelatedInsights == true>
1215<#assign multiArtBehavior = "Two Wide">
1216<#assign gridTitle = "Also of interest">
1217<#assign noOfFeatureArticle = "2">
1218<#assign featureDisplayType = "Image Left">
1219
1220<#assign fullWidthDisplay = "false">
1221<#assign greyBackground = "false">
1222<#assign extraSpacer = "None">
1223<#assign seeAllLink = "">
1224<#assign seeAllLinkText = "">
1225<#assign greyBackground = "false">
1226<#assign extraSpacer = "None">
1227<#assign autoplay = "false">
1228<#assign featureDisplayButtonType = "Visible">
1229<#assign featureDisplayButtonText = "">
1230
1231<#if GridTitle??>
1232 <#assign gridTitle = htmlUtil.unescape(GridTitle.getData())>
1233</#if>
1234<#if gridTitle?has_content>
1235 <#-- ATK-712: Code Start -->
1236 <#if gridTitle?matches("Related insights") || gridTitle?matches("Related Insights")>
1237 <#assign gridTitle = "Also of interest">
1238 </#if>
1239 <#-- ATK-712: Code End -->
1240<#else>
1241 <#assign gridTitle = "Also of interest">
1242</#if>
1243<#if MultipleArticleBehavior??>
1244 <#assign multiArtBehavior = MultipleArticleBehavior.getData()>
1245</#if>
1246<#if multiArtBehavior?has_content>
1247<#else>
1248 <#assign multiArtBehavior = "Two Wide">
1249</#if>
1250<#if NoOfFeatureArticles??>
1251 <#assign noOfFeatureArticle = NoOfFeatureArticles.getData()>
1252</#if>
1253<#if noOfFeatureArticle?has_content>
1254<#else>
1255 <#assign noOfFeatureArticle = "2">
1256</#if>
1257
1258<#assign featureDisplayType = preferences.getValue("featureDisTypeRelatedInsights", "Image Left")?js_string>
1259
1260<#assign jaEntries = {}>
1261<#if RelatedInsightsArticles??>
1262 <#assign jaEntries = ArticleTemplateCustomService.getManualArticleList(RelatedInsightsArticles.getSiblings())>
1263</#if>
1264
1265<#if jaEntries?size == 0 >
1266 <#attempt>
1267 <#assign jaEntries = ArticleTemplateCustomService.getRelatedArticles(CurrentAssetEntry.getEntryId(), CurrentAssetEntry.getClassTypeId(), noOfFeatureArticle, "Any")>
1268 <#recover>
1269 <#assign jaEntries = {}>
1270 </#attempt>
1271</#if>
1272
1273<#if jaEntries?size == 0 >
1274 <#assign gridTitle = " ">
1275<#else>
1276 $('#hrfeatureArticle').css('display','block');
1277</#if>
1278
1279var entries = [];
1280 <#if jaEntries?size > 0 >
1281 <#list jaEntries as curEntry>
1282
1283 <#assign jArt = JournalArticleLocalService.getLatestArticle(curEntry.getClassPK())>
1284 <#assign document = saxReaderUtil.read(jArt.getContentByLocale(themeDisplay.getLocale()))>
1285
1286 <#assign structureName = jArt.getDDMStructure().getName("en_US")>
1287
1288 var componentType = "FEATURED_ARTICLE";
1289
1290 var title = <@entryNode document=document field="ArticleTitle"/>;
1291
1292 var subtitle = <@entryNode document=document field="Subtitle"/>;
1293
1294 var description = <@entryNode document=document field="Description"/>;
1295 if (description == ""){
1296 description = <@entryNode document=document field="Intro"/>;
1297 }
1298
1299 var slug = <@entryNode document=document field="Slug"/>;
1300
1301 <#assign articleGroup = GroupLocalService.getGroup(jArt.getGroupId())>
1302
1303 <#if LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false)??
1304 && LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false).getThemeSetting("isMicroSite", "regular")?? >
1305 <#assign isMicroSite = (LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false).getThemeSetting("isMicroSite", "regular") == "true")>
1306 <#else>
1307 <#assign isMicroSite = false>
1308 </#if>
1309
1310 var imageFileEntryId = 0;
1311 var imageFileName = "";
1312 var image = '${TemplateCustomService.getDocumentFileDetails(document,"ThumbnailSquare",themeDisplay)}';
1313 if (null == image || "" == image || ${(fullWidthDisplay == "true")?c}) {
1314 image = '${TemplateCustomService.getDocumentFileDetails(document,"Thumbnail",themeDisplay)}';
1315 }
1316 if (null == image) {
1317 image = "";
1318 }
1319
1320 if ((image) || image != "") {
1321 var [imageFileEntryId, restString] = image.split('+++++');
1322 var [imageFileName, image] = restString.split('*****');
1323 }
1324
1325 var componentData = {
1326 locale: "${locale}",
1327 structureName: "${structureName}",
1328 displayType: "${featureDisplayType}",
1329 slug: slug,
1330 title: title,
1331 subtitle: subtitle,
1332 description: description,
1333 image: image.trim(),
1334 imageFileEntryId: imageFileEntryId,
1335 imageFileName: imageFileName,
1336 imageSaturationFilter:'${imageSaturationFilter?c}',
1337 groupFriendlyUrl: '${articleGroup.getFriendlyURL()}',
1338 isMicrosite: ${isMicroSite?c},
1339 multiArtBehavior: '${multiArtBehavior}',
1340 featureDisplayButtonText: '${featureDisplayButtonText}',
1341 featureDisplayButtonType: '${featureDisplayButtonType}',
1342 componentType: componentType
1343 };
1344 <#if structureName == "Article">
1345
1346 var linkTargetOverride = <@entryNode document=document field="LinkTargetOverride"/>;
1347
1348 if (linkTargetOverride !== ""){
1349 componentData.link = linkTargetOverride;
1350 } else {
1351 <#assign assetCategories = AssetCategoryLocalService.getCategories(curEntry.getClassNameId(), curEntry.getClassPK())>
1352
1353 var articleCategories = [];
1354
1355 <#list assetCategories as category>
1356 <#assign categoryVocabulary = AssetVocabularyLocalService.getAssetVocabulary(category.getVocabularyId())>
1357 <#assign categoryUrl = "#">
1358
1359 <#list AssetCategoryPropertyLocalService.getCategoryProperties(category.categoryId) as categoryProperty>
1360
1361 <#if categoryProperty.key == "url">
1362 <#assign categoryUrl = categoryProperty.value>
1363 </#if>
1364 </#list>
1365
1366 articleCategories.push({
1367 id: "${category.categoryId}",
1368 name: "${category.name}",
1369 url: "${categoryUrl}",
1370 vocabularyName: "${categoryVocabulary.getTitle(locale)}",
1371 });
1372
1373 </#list>
1374
1375
1376 componentData.categories = articleCategories;
1377 componentData.urlTitle = "${jArt.getUrlTitle()?js_string}";
1378 }
1379
1380 var byline = <@entryNode document=document field="Byline"/>;
1381 if (byline != null && byline != ""){
1382 componentData.byline = [];
1383 };
1384 </#if>
1385 <#if structureName == "Link" || structureName == "External Article" || structureName == "Video">
1386 var linkURL = <@entryNode document=document field="LinkURL"/>;
1387 if (linkURL !== ""){
1388 componentData.link = linkURL;
1389 }
1390 </#if>
1391 <#if structureName == "Video">
1392 var videoURL = <@entryNode document=document field="VideoURL"/>;
1393 if (videoURL !== ""){
1394 componentData.videoURL = videoURL;
1395 }
1396 </#if>
1397 entries.push(componentData);
1398 </#list>
1399 </#if>
1400
1401var componentVoiceSearch = "article";
1402var extraProps = {
1403 multiArtBehavior: "${multiArtBehavior}",
1404 gridTitle: "${gridTitle}",
1405 fullWidthDisplay: "${fullWidthDisplay}",
1406 greyBackground: "${greyBackground}",
1407 extraSpacer: "${extraSpacer}",
1408 seeAllLink: "${seeAllLink}",
1409 seeAllLinkText: "${seeAllLinkText}",
1410 componentVoiceSearch: componentVoiceSearch
1411 };
1412 ATK.React.Component.FeaturedMultiDisplay("articleAdtDiv_${portletId?js_string}", extraProps, entries);
1413</#if>
1414</script>
1415
1416<#compress>
1417<#if (htmlUtil.unescape(Slug.getData()))?lower_case == "article" >
1418 <script id ="article-structured-data" type="application/ld+json">
1419 {
1420 "@context": "https://schema.org",
1421 "@type": "Article",
1422 "dateModified" : "${modifiedDate}",
1423 "datePublished": "${displayDateForSchema}",
1424 <#if (ArticleTitle.getData())?has_content>"headline": "${(htmlUtil.unescape(ArticleTitle.getData()))?json_string}",</#if>
1425 <#if answer?has_content>
1426 <#if answer?contains("l2it-audio-player")>
1427 <#assign answer = answer?json_string?keep_before_last('<div id') />
1428 <#else>
1429 <#assign answer = answer?json_string />
1430 </#if>
1431 "description" : "${answer}",</#if>
1432 <#if imageurlschema?has_content>"image" : "${imageurlschema}",</#if>
1433 "mainEntityOfPage": {
1434 "@type": "WebPage",
1435 "@id": "${pageurlcurrent}"
1436 },
1437 "author" : [
1438 <#if (authorlistschema?size > 0)>
1439 <#list authorlistschema as author>
1440 {
1441 "@type" : "Person",
1442 <#list author as cur_author_key, cur_author_value>
1443 <#if cur_author_key=="url" && cur_author_value?has_content>"${cur_author_key}" : "${cur_author_value}",</#if>
1444 <#if cur_author_key=="jobTitle" && cur_author_value?has_content>"${cur_author_key}" : "${cur_author_value}",</#if>
1445 <#if cur_author_key=="name" && cur_author_value?has_content>"${cur_author_key}" : "${cur_author_value}"</#if>
1446
1447 </#list>
1448 }<#if (author?index != (authorlistschema?size)-1)>,</#if>
1449 </#list>
1450 </#if>
1451 ],
1452 "publisher": {
1453 "@type": "Organization",
1454 "@id": "https://www.kearney.com#organization"
1455 }
1456 }
1457 </script>
1458<#elseif (htmlUtil.unescape(Slug.getData()))?lower_case == "question and answer" >
1459 <script id ="answer-structured-data" type="application/ld+json">
1460 {
1461 "@context": "https://schema.org",
1462 "@type": "FAQPage",
1463 "mainEntity": [{
1464 "@type": "Question",
1465 "name": "${(htmlUtil.unescape(ArticleTitle.getData()))?json_string}",
1466 "acceptedAnswer": {
1467 "@type": "Answer",
1468 <#if answer?has_content>
1469 <#if answer?contains("l2it-audio-player")>
1470 <#assign answer = answer?json_string?keep_before_last('<div id') />
1471 <#else>
1472 <#assign answer = answer?json_string />
1473 </#if>
1474 "text" : "${answer}",</#if>
1475 "author" : [
1476 <#if (authorlistschema?size > 0)>
1477 <#list authorlistschema as author>
1478 {
1479 "@type" : "Person",
1480 <#list author as cur_author_key, cur_author_value>
1481 <#if cur_author_key=="url" && cur_author_value?has_content>"${cur_author_key}" : "${cur_author_value}",</#if>
1482 <#if cur_author_key=="jobTitle" && cur_author_value?has_content>"${cur_author_key}" : "${cur_author_value}",</#if>
1483 <#if cur_author_key=="name" && cur_author_value?has_content>"${cur_author_key}" : "${cur_author_value}"</#if>
1484
1485 </#list>
1486 }<#if (author?index != (authorlistschema?size)-1)>,</#if>
1487 </#list>
1488 </#if>
1489 ]
1490 }
1491 }]
1492 }
1493 </script>
1494 </#if>
1495 </#compress>
1496
1497
1498 <script>
1499// Listen for Liferay's SPA navigation event
1500if (window.Liferay && Liferay.on) {
1501 Liferay.on('endNavigate', function() {
1502 // If the new page contains the audio player container, initialize Listen2It
1503 if (document.getElementById('l2it-audio-player')) {
1504 // Check if Listen2It has already been loaded; if not, load it.
1505 if (typeof Listen2It === 'undefined') {
1506 try {
1507 initialize(document, "listen2it-widget");
1508 }
1509 catch(error) {
1510 console.error("Error with Listen2it Audio:", error);
1511 }
1512 }
1513 else {
1514 // If the widget is already loaded, just initialize it for the new page
1515 try {
1516 initListen2It();
1517 }
1518 catch(error) {
1519 console.error("Error with initialization Listen2it Audio:", error);
1520 }
1521 }
1522 }
1523 });
1524}
1525</script>
1526
1527
1528 <script>
1529$(document).ready(function() {
1530
1531$("#linkedInShare").on( "click", function() {
1532 Analytics.track('socialShare',{
1533 'propertyName': 'socialShare',
1534 <#if (ArticleTitle.getData())?has_content>"articleTitle": "${(htmlUtil.unescape(ArticleTitle.getData()))?json_string}",</#if>
1535 'socialPlatform':'Linkedin',
1536 'pageURL':themeDisplay.getLayoutURL()
1537 });
1538 })
1539
1540 $("#twitterShare").on( "click", function() {
1541 Analytics.track('socialShare',{
1542 'propertyName': 'socialShare',
1543 <#if (ArticleTitle.getData())?has_content>"articleTitle": "${(htmlUtil.unescape(ArticleTitle.getData()))?json_string}",</#if>
1544 'socialPlatform':'Twitter',
1545 'pageURL':themeDisplay.getLayoutURL()
1546 });
1547 })
1548
1549 $("#facebookShare").on( "click", function() {
1550 Analytics.track('socialShare',{
1551 'propertyName': 'socialShare',
1552 <#if (ArticleTitle.getData())?has_content>"articleTitle": "${(htmlUtil.unescape(ArticleTitle.getData()))?json_string}",</#if>
1553 'socialPlatform':'Facebook',
1554 'pageURL':themeDisplay.getLayoutURL()
1555 });
1556 })
1557
1558 $("#printIcon").on( "click", function() {
1559 Analytics.track('printPage',{
1560 'propertyName': 'printPage',
1561 <#if (ArticleTitle.getData())?has_content>"articleTitle": "${(htmlUtil.unescape(ArticleTitle.getData()))?json_string}",</#if>
1562 'pageURL':themeDisplay.getLayoutURL()
1563 });
1564 })
1565
1566});
1567 </script>