Commercial real estate news releases from Avison Young
Quarterly and topical research insights to help your business gain competitive edge in commercial real estate.
An error occurred while processing the template.
?substring(...) expects a number as argument #1, but received a Null. ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign yturl2 = yturl?substring(index) [in template "20302#20342#NEWS_RELEASE_DETAIL" at line 96, column 9] ----
1<#assign _dlfels = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService") />
2
3<#-- set a boolean to determine if we should show the hero at all based on flag set in structure -->
4<#-- Optimized through discussion https://chatgpt.com/share/684f45a6-1118-8004-9d2a-6f0607678a31 -->
5<#assign hideHeroVal = Hide_hero_image_on_detail_page.getData()>
6<#assign showHero = !(hideHeroVal?has_content && hideHeroVal == "1")>
7
8
9<#-- set the default image and alt text -->
10<#assign imgSrc = Image.getData() >
11<#assign imgAltText = Content.getData() >
12<#-- sets Alternate image -->
13<#assign altImgSrc = Alternate_Hero_Image.getData() >
14<#assign altImgAltText = Content.getData() >
15
16<#-- try to set more advanced options of image display -->
17<#-- set the base hostname url for environment (local/qa/stg/prod) -->
18<#assign imageBaseUri = ui_config.getCdnCgiUri() >
19<#-- determine if we want to use CDN Image Optimizations or not -->
20<#if ui_config.getUseCdnImageOptimizations() >
21<#-- set the instructions to use for optimizing the image(s) in this item -->
22 <#assign instructionPath = "/cdn-cgi/image/q=50" >
23 <#if !getterUtil.getBoolean(By_pass_Cloudflare_optimization.getData())>
24 <#assign imageBaseUri = imageBaseUri + instructionPath >
25 </#if>
26</#if>
27
28<#assign treePath = group_util.getGroupFriendlyUrlTreePath(groupId) >
29
30<#assign imageAttributes = jsonFactoryUtil.createJSONObject(Image.getAttributes()) >
31
32<#if (imageAttributes.fileEntryId??) >
33 <#assign fileEntryId = imageAttributes.fileEntryId?number >
34 <#if fileEntryId??>
35 <#assign fe = _dlfels.getFileEntry(fileEntryId)>
36 <#if fe??>
37 <#assign imgSrc = imageBaseUri + "/documents/" + fe.repositoryId +"/" + fe.fileEntryId + "/" + fe.fileName + "/" + fe.uuid + "?t=" + fe.modifiedDate?long >
38 <#if imageAttributes.alt?has_content>
39 <#assign imgAltText = imageAttributes.alt >
40 <#else>
41 <#assign imgAltText = imgAltText?replace('<[^>]+>','','r') >
42 </#if>
43 </#if>
44 </#if>
45</#if>
46
47<#assign
48 useAltImage = false,
49 altImageAttributes = jsonFactoryUtil.createJSONObject(Alternate_Hero_Image.getAttributes()) >
50<#if (altImageAttributes.fileEntryId??) >
51 <#assign altFileEntryId = altImageAttributes.fileEntryId?number >
52 <#if altFileEntryId??>
53 <#assign fe = _dlfels.getFileEntry(altFileEntryId)>
54 <#if fe??>
55 <#assign
56 useAltImage = true,
57 altImgSrc = imageBaseUri + "/documents/" + fe.repositoryId +"/" + fe.fileEntryId + "/" + fe.fileName + "/" + fe.uuid + "?t=" + fe.modifiedDate?long >
58 <#if altImageAttributes.alt?has_content>
59 <#assign altImgAltText = altImageAttributes.alt >
60 <#else>
61 <#assign altImgAltText = altImgAltText?replace('<[^>]+>','','r') >
62 </#if>
63 </#if>
64 </#if>
65</#if>
66
67<!-- handle the video URL logic if present -->
68<!-- this section has room for optimization -->
69<#assign useVideo = false>
70<#if validator.isNotNull(Youtube_Video_Hero_.getData()) >
71 <#assign yturl = Youtube_Video_Hero_.getData()>
72<#else>
73 <#assign yturl = ''>
74</#if>
75<#if validator.isNotNull(Youtube_Video_Hero_.getData()) >
76 <#assign
77 useVideo = true,
78 isVimeo = "false">
79 <#assign yturl = Youtube_Video_Hero_.getData()>
80 <#if yturl?contains("https://youtu.be/")>
81 <#assign index = yturl?index_of('https://youtu.be/')>
82 <#assign index = index + 17>
83 </#if>
84 <#if yturl?contains("https://www.youtube.com/watch?v=")>
85 <#assign index = yturl?index_of('https://www.youtube.com/watch?v=')>
86 <#assign index = index + 32>
87 </#if>
88
89 <#if yturl?contains("https://vimeo.com/")>
90 <#assign isVimeo = "true">
91 <#assign index = yturl?remove_beginning("https://vimeo.com/")>
92 <#assign videoEmbedCode = "https://player.vimeo.com/video/" + index>
93 <#assign yturl2 = videoEmbedCode>
94 <#assign linkURL = yturl>
95 <#else>
96 <#assign yturl2 = yturl?substring(index)>
97 <#assign linkURL = "https://www.youtube.com/embed/${yturl2}?rel=0&showinfo=0&autoplay=1">
98 </#if>
99</#if>
100
101<#assign displayDate = .vars['reserved-article-display-date'].data>
102<#setting time_zone = languageUtil.get(locale, "template-timezone")>
103<#assign originalLocale = locale>
104<#setting locale = localeUtil.getDefault()>
105<#assign displayDate = displayDate?date("EEE, d MMM yyyy HH:mm:ss Z")>
106<#setting locale = originalLocale>
107<#assign displayDate = displayDate?string("long")>
108
109
110
111<style>
112 .ay-news-release__content{
113 min-height:150px;
114 }
115 /*displays bios on one row if there's room */
116 #ay .ay-news-release__content .contact-group {
117 display:flex;
118 flex-justify:start;
119 flex-wrap:wrap;
120 }
121 /*Keeps the ay-bio from smooshing width-wise.*/
122 #ay .ay-news-release__content .ay-bio {
123 min-width:240px;
124 }
125 /* added the white on hover because the primary button is supposed to have white text, but it has light blue so the text disappears on hover. */
126 #ay .ay-button__primary:hover {
127 color:#FFF;
128 }
129</style>
130
131<div class="ay-news-release">
132 <h1 id="ay-artTitle" class="h2">${Content.getData()}</h1>
133
134 <#assign
135 useImage = showHero && !useVideo,
136 finalImgSrc = imgSrc,
137 finalImgAltText = imgAltText,
138 imgStyle = ""
139 >
140
141 <#if useImage && showHero>
142 <#if useAltImage>
143 <#assign
144 finalImgSrc = altImgSrc,
145 finalImgAltText = altImgAltText,
146 imgStyle = 'style="max-height: none;"'
147 >
148 </#if>
149 <img src="${finalImgSrc}" alt="${finalImgAltText}" ${imgStyle}>
150 </#if>
151
152
153
154 <#if validator.isNotNull(Youtube_Video_Hero_.getData()) >
155
156 <div class="ay-video-firefox-extra-wrap">
157 <div class="ay-video-wrapper">
158 <#if Image.getData()?has_content>
159 <a href="${linkURL}" target="youtubevideo" style="background:url('${Image.getData()}') no-repeat center center; background-size:cover;"></a>
160 </#if>
161 <div class="<#if isVimeo == 'true'>ytv-container<#else>yt-container ytv-container</#if>" video="${yturl2}">
162 <#if isVimeo == "true">
163 <iframe id="youtubeiframe" name="youtubevideo" width="1280" height="720" src="${videoEmbedCode}" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>
164 </#if>
165 </div>
166 <#if isVimeo == "true">
167 <script src="https://player.vimeo.com/api/player.js"></script>
168 <script>const player = new Vimeo.Player("youtubeiframe");</script>
169 </#if>
170 <script>
171 $(document).ready(function(){
172 $(".ay-video-wrapper a").bind("click",function(event){
173 <#if isVimeo == "true">
174 event.preventDefault();
175 $(this).next().children().css({visibility:'visible'});
176 player.play();
177 <#else>
178 $(this).next().children().css({visibility:'visible'});
179 </#if>
180 if($(".cc-window").hasClass("cc-invisible") == true){
181 if($(".yt-container").html() != ""){
182 $(this).css({display:'none'});
183 <#if isVimeo == "false">
184 $(this).next().children().css({visibility:'visible'}).click();
185 </#if>
186 }
187 }else{
188 event.preventDefault();
189 }
190 });
191 });
192 </script>
193 </div>
194 </div>
195 </#if>
196
197 <small>${displayDate}</small>
198 <div class="ay-news-release__content">
199 <#if SubTitle.getData()?has_content>
200 <h3 class="ay-news-release__subtitle">${SubTitle.getData()}</h3>
201 </#if>
202 ${News_Release_Detail_Content.getData()}
203 <#if Boiler_Plate_Content.getData()?has_content >
204 <div class="ay-news-release__boiler">
205 ${Boiler_Plate_Content.getData()}
206 </div>
207 </#if>
208 <div class="ay-news-release__social">
209 <a id="ay-email-to" href="#" target="_blank" class="ay-news-release__social--item">
210 <svg class="ay-news-release__social--icon">
211 <use xlink:href="/o/ay-theme/resources/images/images.svg#email" />
212 </svg>
213 </a>
214 <a id="ay-social-twitter" href="#" class="ay-news-release__social--item" target="_blank">
215 <svg class="ay-news-release__social--icon" xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;">
216 <defs>
217 <style>
218 .cls-1 {
219 fill: #000;
220 stroke-width: 0px;
221 }
222 </style>
223 </defs>
224 <path fill="#000" class="cls-1" d="m85.89,109.23h22.79l-25.62-41.4,19.49-25.09h0l4.68-6h-8.9l-19.21,24.74-15.03-24.27h-22.79l25.12,40.59-24.05,30.97h8.9l4.68-6h0l14.46-18.58,15.53,25.09-.06-.03Zm-25.15-66.02l37.16,60.01h-8.65l-37.16-60.01s8.65,0,8.65,0Zm89.26,31.78c0,41.42-33.58,75-75,75S0,116.42,0,75,33.58,0,75,0s75,33.58,75,75Z"/>
225 </svg>
226 </a>
227 <a id="ay-social-facebook" href="#" class="ay-news-release__social--item" target="_blank">
228 <svg class="ay-news-release__social--icon">
229 <use xlink:href="/o/ay-theme/resources/images/images.svg#facebook" />
230 </svg>
231 </a>
232 <a id="ay-social-linkedin" href="#" class="ay-news-release__social--item" target="_blank">
233 <svg class="ay-news-release__social--icon">
234 <use xlink:href="/o/ay-theme/resources/images/images.svg#linkedin1" />
235 </svg>
236 </a>
237 <#if treePath?contains("/ay/de/") >
238 <a id="ay-social-xming" href="#" class="ay-news-release__social--item" target="_blank">
239 <svg class="ay-news-release__social--icon">
240 <use xlink:href="/o/ay-theme/resources/images/images.svg#xing-social" />
241 </svg>
242 </a>
243 </#if>
244 </div>
245 </div>
246</div>
247<#assign newsTitle = Content.getData() />
248
249<script>
250 function socialLinks(){
251 uri=window.location;
252 uri=uri.toString();
253 ofLoc=$(".ay-header-options h3 a").html();
254 enc=encodeURIComponent(uri);
255 prtitle=$("#ay-artTitle").html();
256 //prtitle=prtitle.replace(/(\r\n\t|\n|\r\t)/gm,"");
257 prtitle=encodeURI(prtitle);
258 mailtoSub="Avison Young - "+ofLoc+" News: ";
259 mailtoSub=encodeURI(mailtoSub);
260 //alert(enc);
261 $("#ay-social-twitter").attr("href","https://twitter.com/intent/tweet?url="+enc+"&text="+prtitle+"&via=AvisonYoung");
262 $("#ay-social-facebook").attr("href","https://www.facebook.com/sharer/sharer.php?u="+enc);
263 $("#ay-social-linkedin").attr("href","https://www.linkedin.com/cws/share?url="+enc);
264 <#if treePath?contains("/ay/de/") >
265 $("#ay-social-xming").attr("href","https://www.xing.com/spi/shares/new?url="+enc);
266 </#if>
267 $("#ay-email-to").attr("href","mailto:?subject="+mailtoSub+prtitle+"&body="+enc);
268 }
269 $(document).ready(function(){
270 socialLinks();
271 })
272</script>