I progetti innovativi
The following has evaluated to null or missing:
==> cur_image.TopImageSlide.getAttribute(" alt") [in template "20099#20135#850962" at line 354, column 64]
----
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: ${cur_image.TopImageSlide.getAttribut... [in template "20099#20135#850962" at line 354, column 62]
----
1<style>
2 #barDiv {
3 position: absolute !important;
4 }
5
6 .carousel-control-prev:focus,
7 .carousel-control-next:focus,
8 .banner_hp_video-control:focus {
9 outline: revert !important;
10 }
11
12 .modal-iframe-video .modal-dialog {
13 margin-left: auto;
14 margin-right: auto;
15 }
16
17
18 .modal-iframe-video .modal-body {
19 border-top: 0;
20 }
21
22 @media (min-width: 992px) {
23 .modal-video .modal-dialog {
24 min-width: 800px;
25 }
26 }
27
28 /* Frecce del carousel quando e' presente il menu laterale:
29 il prev a left:0 finirebbe sopra la tile del menu. */
30 @media (min-width: 992px) {
31 #main-carousel.menulateralepresente .carousel-control-prev {
32 left: 33.333% !important;
33 }
34 }
35
36</style>
37<#assign nomepagina=themeDisplay.getLayout().getName(locale) />
38<#assign currentURL=themeDisplay.getURLCurrent()?keep_before("?") />
39<#assign imgcounter=0 hideclass="hidden" padLg="px-lg-3 px-2" internalpadding="" menulateralepresente="" />
40
41<#assign classAccessibility="" />
42<#if getterUtil.getBoolean(gradientLayer.getData())>
43 <#assign classAccessibility="hasGradientAccessible" />
44</#if>
45
46<#if image.getSiblings()?has_content>
47 <#list image.getSiblings() as cur_image>
48 <#if cur_image.getData()?? && cur_image.getData() !="">
49 <#assign imgcounter=imgcounter+1 />
50 </#if>
51 </#list>
52</#if>
53<#if imgcounter gt 1>
54 <#assign hideclass="" padLg="px-lg-5 px-3" />
55</#if>
56<#assign title=.vars['reserved-article-title'].data vocabularyId=0
57 journalArticleServiceUtil=objectUtil("com.liferay.journal.service.JournalArticleServiceUtil")
58 assetVocabularyServiceUtil=objectUtil("com.liferay.asset.kernel.service.AssetVocabularyServiceUtil")
59 vocabulariesList=assetVocabularyServiceUtil.getGroupVocabularies(themeDisplay.getScopeGroupId())
60 journalArticle=journalArticleServiceUtil.getArticle(getterUtil.getLong(scopeGroupId),
61 .vars['reserved-article-id'].data)
62 assetCategoryServiceUtil=objectUtil("com.liferay.asset.kernel.service.AssetCategoryServiceUtil")
63 journalArticleCategories=assetCategoryServiceUtil.getCategories("com.liferay.journal.model.JournalArticle",
64 journalArticle.getResourcePrimKey()) nomecomune="comune-generico" larghezzaLineaTesto="w-75 w-md-50"
65 arrowcolor="white" classLateralCss="" classLateral="" comuniVar=languageUtil.get(locale, "COMUNI" )
66 gruppoUrl=languageUtil.get(locale, "gruppo-internal-url" )
67 group_engVar=languageUtil.get(locale, "gruppo-internal-eng-url" )
68 offerteServiziUrl=languageUtil.get(locale, "offerte-internal-url" )
69 assistenzaUrl=languageUtil.get(locale, "assistenza-internal-url" ) trueVar="true"
70 dlgblockVar=languageUtil.get(locale, "d-lg-block" ) yesVar=languageUtil.get(locale, "yesVar" )
71 chiaveIngleseVar=languageUtil.get(locale, "chiave-inglese" ) mouseVar=languageUtil.get(locale, "mouse" ) />
72<#list vocabulariesList as vocabulary>
73 <#assign vocabularyName=vocabulary.getName() />
74 <#if vocabularyName==comuniVar>
75 <#assign vocabularyId=vocabulary.getVocabularyId() />
76 </#if>
77</#list>
78<#assign listcomuni=[] />
79<#list journalArticleCategories as category>
80 <#if category.vocabularyId==vocabularyId>
81 <#assign listcomuni=listcomuni + [category.name] />
82 </#if>
83</#list>
84<#list listcomuni as comune>
85 <#if (listcomuni?size gt 0)>
86 <#assign nomecomune=nomecomune +"@" + comune />
87 <#else>
88 <#assign nomecomune=comune />
89 </#if>
90</#list>
91<#assign hasMenuLaterale = MostraMenuLaterale?? && MostraMenuLaterale.getData()==dlgblockVar />
92<#if hasMenuLaterale>
93 <#assign menulateralepresente="menulateralepresente" />
94</#if>
95<#assign siblings=image.getSiblings() />
96<input type="hidden" name="nomecomune" value="${nomecomune}" />
97<#if siblings?has_content>
98 <section id="main-carousel" class="page-head ${menulateralepresente} ${classAccessibility}">
99
100
101 <div id="head-carousel" class="carousel slide prelative" data-ride="carousel">
102
103 <#assign finalmodalid="">
104 <#assign modalcounter=0 actualUrl=themeDisplay.getLayout().getName(locale) idnumber=0 breadcrumbmenulaterale="" brothersviewmenu=[] currentindex=0 />
105 <#list themeDisplay.getLayout().getAncestors() as ancestor>
106 <#if (ancestor?index==0)>
107 <#assign fulllayout=ancestor publiclayout=fulllayout.isPublicLayout() breadcrumbName=ancestor.getName(locale) breadcrumbURL=ancestor.getFriendlyURL() />
108 </#if>
109 </#list>
110 <#assign ancestorIndex=1 />
111 <#if breadcrumbURL??>
112 <#if breadcrumbURL?contains(gruppoUrl) || breadcrumbURL?contains(group_engVar)>
113 <#assign ancestorIndex=2 />
114 <#elseif breadcrumbURL?contains(offerteServiziUrl)>
115 <#assign ancestorIndex=3 />
116 <#elseif breadcrumbURL?contains(assistenzaUrl)>
117 <#assign ancestorIndex=3 />
118 </#if>
119 </#if>
120 <#list themeDisplay.getLayout().getAncestors()?reverse as ancestor>
121 <#if (ancestor?index==ancestorIndex)>
122 <#assign fulllayout=ancestor />
123 </#if>
124 </#list>
125 <#if fulllayout?? && fulllayout !="">
126 <#assign pageName=fulllayout.getName(locale) />
127 </#if>
128 <#if hasMenuLaterale>
129 <#list fulllayout.getChildren() as children>
130 <#assign brotherschildnames=[] />
131 <#assign brotherschildurls=[] />
132 <#assign brothersviewmenu +=[children.getExpandoBridge().getAttribute("VisualizzabileInMenu")] />
133 <#list children.getChildren() as brotherschild>
134 <#assign brotherschildnames +=[brotherschild.getName(locale)] brotherschildurls
135 +=[brotherschild.getFriendlyURL()] />
136 </#list>
137 <#assign breadcrumbURL=layout.getGroup().getDisplayURL(themeDisplay, false) +
138 children.getName(locale) />
139 <#assign
140 assetVocabularyServiceUtil=objectUtil("com.liferay.asset.kernel.service.AssetVocabularyServiceUtil")
141 pageVocabularies=assetVocabularyServiceUtil.getGroupVocabularies(themeDisplay.getScopeGroupId(), "COMUNI", -1, -1, null)
142 assetCategoryServiceUtil=objectUtil("com.liferay.asset.kernel.service.AssetCategoryServiceUtil")
143 pageCategories=assetCategoryServiceUtil.getCategories("com.liferay.portal.kernel.model.layout",
144 children.getPrimaryKey()) cssPageCategories="" pageVocabularyId=0 />
145 <#if pageVocabularies?size gt 0>
146 <#list pageVocabularies as pageVocabulary>
147 <#assign pageVocabularyId=pageVocabulary.getVocabularyId() />
148 </#list>
149 <#if pageCategories?size gt 0>
150 <#list pageCategories as pageCategory>
151 <#if pageCategory.getVocabularyId()==pageVocabularyId>
152 <#assign cssPageCategories +="@" + pageCategory.getName() />
153 </#if>
154 </#list>
155 </#if>
156 </#if>
157 <#if brotherschildnames?size !=0>
158 <#if brothersviewmenu[currentindex]?c==trueVar>
159 <#assign menuStyle="" iconChevron="icon-chevron-right" collapse="collapse" />
160 <#if actualUrl==children.getName(locale)>
161 <#assign menuStyle="font-weight: 600" iconChevron="icon-chevron-down" collapse="collapse show" />
162 </#if>
163 <#assign breadcrumbURLLink="<div class=\" dropdown px-2 py-2 verifycomunemenu ${cssPageCategories}\">
164 <div class='row'>
165 <div class='col-10'><a class='d-inline pointer greyish-brown normal2'
166 style='${menuStyle}' href='" + children.getFriendlyURL() + "'>"
167 breadcrumbURLLink += children.getName(locale) + "</a></div>"
168 />
169 <#-- breadcrumbURLLink +="<div class='col-1'><div id='submenu_" + idnumber
170 + "' class=' pointer ${iconChevron} dropdown-toggle d-inline greyish-brown normal2' role='button' data-toggle='dropdown' aria-haspopup='true' aria-expanded='false'></div>"
171 breadcrumbURLLink
172 +="<div style='top:-30px!important;' class='ml-4 dropdown-menu white' labelledby='submenu_"
173 + idnumber + "'>" idnumber=idnumber+1 -->
174 <#assign idArrowSubmenu=children.getName(locale)?replace(" ", "
175 -")?replace(":", "" )?lower_case breadcrumbURLLink
176 +="<div class='col-1'><div class='arrow-submenu pointer ${iconChevron} dropdown-toggle d-inline greyish-brown teal-blue normal2' role='button' data-toggle='collapse' id='arrow-submenu-${idArrowSubmenu}' data-target='#submenu-${idnumber}' aria-haspopup='true' aria-expanded='false'></div></div>"
177 breadcrumbURLLink +="<div class='col-11 pl-4 ${collapse}' id='submenu-"
178 + idnumber + "'>" idnumber=idnumber+1 />
179 <#list children.getChildren() as brotherschild>
180 <#if brotherschild.getExpandoBridge().getAttribute("VisualizzabileInMenu")>
181 <#assign
182 assetVocabularyServiceUtil=objectUtil("com.liferay.asset.kernel.service.AssetVocabularyServiceUtil")
183 pageVocabularies=assetVocabularyServiceUtil.getGroupVocabularies(themeDisplay.getScopeGroupId(), "COMUNI"
184 , -1, -1, null)
185 assetCategoryServiceUtil=objectUtil("com.liferay.asset.kernel.service.AssetCategoryServiceUtil")
186 pageCategories=assetCategoryServiceUtil.getCategories("com.liferay.portal.kernel.model.layout",
187 brotherschild.getPrimaryKey()) cssPageCategories=""
188 pageVocabularyId=0 />
189 <#if pageVocabularies?size gt 0>
190 <#list pageVocabularies as pageVocabulary>
191 <#assign
192 pageVocabularyId=pageVocabulary.getVocabularyId() />
193 </#list>
194 <#if pageCategories?size gt 0>
195 <#list pageCategories as pageCategory>
196 <#if pageCategory.getVocabularyId()==pageVocabularyId>
197 <#assign cssPageCategories +="@" +
198 pageCategory.getName() />
199 </#if>
200 </#list>
201 </#if>
202 </#if>
203 <#assign menuStyle="" />
204 <#if actualUrl==brotherschild.getName(locale)>
205 <#assign menuStyle="font-weight: 600" />
206 </#if>
207 <#assign brotherschildname=brotherschild.getName(locale)
208 brotherschildurl=brotherschild.getFriendlyURL()
209 breadcrumbURLLink +="<a class=\" d-block pointer greyish-brown
210 normal2 px-1 py-1 verifycomunemenu ${cssPageCategories}\"
211 style='${menuStyle}' href='" + brotherschildurl + "'>" +
212 brotherschildname + "</a>"
213 />
214 </#if>
215 </#list>
216 <#assign breadcrumbURLLink +="</div></div></div>" />
217 <#assign breadcrumbmenulaterale=breadcrumbmenulaterale +
218 breadcrumbURLLink />
219 </#if>
220 <#else>
221 <#if brothersviewmenu[currentindex]?c==trueVar>
222 <#assign menuStyle="" />
223 <#if actualUrl==children.getName(locale)>
224 <#assign menuStyle="font-weight: 600" />
225 </#if>
226 <#assign breadcrumbURLLink="<a class=\" d-block col-10 greyish-brown normal2 px-2
227 py-2 verifycomunemenu ${cssPageCategories}\" style='${menuStyle}'
228 href='" + children.getFriendlyURL() + "'>" + children.getName(locale) + "</a>"
229 breadcrumbmenulaterale = breadcrumbmenulaterale + breadcrumbURLLink
230 />
231 </#if>
232 </#if>
233 <#assign currentindex=currentindex+1 />
234 </#list>
235 </#if>
236
237 <style>
238 <#list siblings as cur_image>
239 <#assign slideImgUrl=cur_image.getData() />
240 <#if cur_image.ImmagineMobile?? && cur_image.ImmagineMobile.getData()!="">
241 <#assign slideImgMobileUrl=cur_image.ImmagineMobile.getData() />
242 <#else>
243 <#assign slideImgMobileUrl=slideImgUrl />
244 </#if>
245 #superhomepage-carousel-slide-${cur_image?index} {
246 background-image: url('${slideImgUrl}');
247 }
248 @media (max-width: 990px) {
249 #superhomepage-carousel-slide-${cur_image?index} {
250 background-image: url('${slideImgMobileUrl}');
251 max-height: 450px;
252 }
253 }
254 </#list>
255 </style>
256
257 <div class="carousel-inner">
258 <#list siblings as cur_image>
259 <#assign imgUrl=cur_image.getData() />
260 <#assign tipobottone="btn green-blue-gradient-button" />
261 <#if cur_image.LinkPulsante.TipoBottone??>
262 <#if cur_image.LinkPulsante.TipoBottone.getData()!="">
263 <#assign tipobottone=cur_image.LinkPulsante.TipoBottone.getData() />
264 </#if>
265 </#if>
266 <#if cur_image.ImmagineMobile??>
267 <#assign imgMobileUrl=cur_image.ImmagineMobile.getData() />
268 <#else>
269 <#assign imgMobileUrl=imgUrl />
270 </#if>
271 <#assign modalcounter=modalcounter+1 />
272 <#assign finalmodalid="modal_id_" + modalcounter>
273 <#if hasMenuLaterale>
274 <#assign classLateral="" />
275 <#assign classLateralCss="" />
276 </#if>
277
278
279 <div id="superhomepage-carousel-slide-${cur_image?index}"
280 class="${(cur_image?counter == 1)?then('active', '')} carousel-item">
281 <div id="colnumber" class="${cur_image?index}" style="display:none"></div>
282 <div class="container h-100 position-relative ${classLateral}" ${classLateralCss}>
283 <div class="row h-100 mx-md-0 ">
284 <#assign colLg="col-lg-12" styleLg="marginlarge" />
285 <#if hasMenuLaterale>
286 <#assign colLg="col-lg-8" styleLg="" />
287 <div class="col-lg-4 d-lg-block">
288 <#if hasMenuLaterale>
289 <div class="tile mt-5 position-relative">
290 <div class="tile-content">
291 <div class="tilewrapper">
292 <h1
293 class="bolder greyish-brown normal2 px-2 text-uppercase">
294 ${pageName}</h1>
295 <hr class="my-3 mx-2">
296 ${breadcrumbmenulaterale}
297 </div>
298 </div>
299 </div>
300
301 </#if>
302 </div>
303 </#if>
304 <div
305 class="carousel-item-content h-100 w-lg-100 pr-0 ${padLg} w-md-75 ${colLg} ${styleLg}">
306 <#if hasMenuLaterale>
307 <#assign internalpadding="px-5">
308 </#if>
309 <div class="${internalpadding}">
310 <#if ColoreTesto??>
311 <#assign coloreTesto=ColoreTesto.getData() />
312 <#else>
313 <#assign coloreTesto="white" />
314 </#if>
315 <#assign actualUrl="<span class='actualurlbread ${coloreTesto} bold'>" +
316 themeDisplay.getLayout().getName(locale) + "</span>"
317 breadcrumbNames=[] breadcrumbURLS=[]
318 rightAngleBracket="<span class='right-angle-bracket ${coloreTesto}'> > </span>"
319 breadcrumb="" />
320 <#list themeDisplay.getLayout().getAncestors() as ancestor>
321 <#assign breadcrumbNames +=[ancestor.getName(locale)] breadcrumbURLS
322 +=[ancestor.getFriendlyURL()] />
323 </#list>
324 <#assign breadcrumbNames=breadcrumbNames?reverse
325 breadcrumbURLS=breadcrumbURLS?reverse />
326 <#list breadcrumbNames as breadcrumbName>
327 <#if breadcrumbName !="Super Homepage">
328 <#assign menuStyle="" />
329 <#if actualUrl==breadcrumbName>
330 <#assign menuStyle="font-weight: 600" />
331 </#if>
332 <#assign breadcrumbIndex=breadcrumbName?index
333 breadcrumbURL=breadcrumbURLS[breadcrumbIndex]
334 breadcrumbURL=layout.getGroup().getDisplayURL(themeDisplay,
335 false) + breadcrumbURL
336 breadcrumbURLLink="<u><a class='${coloreTesto} pr-2' style='${menuStyle}' href='" + breadcrumbURL + "'>" + breadcrumbName + "</a></u>"
337 breadcrumb=breadcrumb + breadcrumbURLLink +
338 rightAngleBracket />
339 </#if>
340 </#list>
341 <#assign breadcrumb=breadcrumb + actualUrl />
342 <div>
343
344 <#if cur_image.LarghezzaLineaTesto??>
345 <#if cur_image.LarghezzaLineaTesto.getData()!="">
346 <#assign
347 larghezzaLineaTesto=cur_image.LarghezzaLineaTesto.getData() />
348 </#if>
349 </#if>
350
351 <#if cur_image.TopImageSlide.getData()?? &&
352 cur_image.TopImageSlide.getData() !="">
353 <img title="${nomepagina}"
354 alt="${cur_image.TopImageSlide.getAttribute(" alt")}"
355 data-fileentryid="${cur_image.TopImageSlide.getAttribute("
356 fileEntryId")}" src="${cur_image.TopImageSlide.getData()}"
357 class="img-fluid mt-lg-5" />
358 </#if>
359 </div>
360 <#if (MostraBreadcrumb?? && MostraBreadcrumb.getData()==yesVar)>
361 <p class="header-breadcrumb black">${breadcrumb}</p>
362 </#if>
363 <#if cur_image.testoAbstract.getData() !="">
364 <div class="carousel-abstract white title-bigger2 bolder letter-spacing-sm mt-md-5 mt-0 ${larghezzaLineaTesto}">
365 ${cur_image.testoAbstract.getData()}</div>
366 </#if>
367 <#assign controlSummary=cur_image.TestoSummary.getData() />
368 <#if controlSummary?has_content>
369 <#if cur_image.ImmagineSummary??>
370 <#if cur_image.ImmagineSummary.getData()==chiaveIngleseVar>
371 <#assign imageSum="icon-tenaglia" />
372 <#elseif cur_image.ImmagineSummary.getData()==mouseVar>
373 <#assign imageSum="icon-mouse" />
374 <#else>
375 <#assign imageSum="" />
376 </#if>
377 </#if>
378
379
380
381 <h3 class="white mb-md-5 mb-0 ${larghezzaLineaTesto}">
382 <#if image.ImmagineSummary??>
383 <#if image.ImmagineSummary.getData()!="">
384 <i class="${imageSum} title-big align-text-top mr-2"></i>
385 </#if>
386 </#if>
387 <p class="big light text-left" style="line-height:normal;">
388 ${htmlUtil.unescape(controlSummary)}</p>
389 </h3>
390 </#if>
391 <#-- ***** Visualizzazione Button + Link *****-->
392 <#assign controlButton=cur_image.LinkPulsante.TestoPulsante.getData() />
393
394 <div class="">
395 <#list cur_image.LinkPulsante.getSiblings() as cta>
396 <#assign buttonLink="" />
397
398 <#if cur_image.UrlVideoYOUTUBE.getData()!="" && cta.TestoPulsante.getData()?lower_case=="guarda il video">
399
400 <button type="button" id="btn_${modalcounter}" data-toggle="modal"
401 data-target="#${finalmodalid}"
402 class="${tipobottone} mr-2">
403 <img title="${nomepagina}"
404 src="${themeDisplay.getPathThemeImages()}/play-video.png"
405 class="ml-2 mr-3">
406 ${cta.TestoPulsante.getData()}
407 </button>
408 <div class='modal modal-video modal-iframe-video fade form-popup-Servizi'
409 id='${finalmodalid}' tabindex='-1' role='dialog'
410 aria-labelledby='videomodallabel'
411 style='display:none;padding-right: 17px;'>
412 <div class="modal-dialog">
413 <div class="modal-content">
414 <div class="modal-header">
415 <p class="pointer w-100 text-right mt-3 mb-4"
416 data-dismiss="modal"
417 aria-label="Close">
418 <i class="icon-cancel normal white"></i>
419 </p>
420 </div>
421 <div class="modal-body" style="margin-top:-35px;">
422 <div class="row">
423 <div class="col-md-12">
424 <#if cur_image.UrlVideoYOUTUBE.getData()?has_content>
425 <#assign noVideoText="Cookie disabilitati - contenuto non disponibile" />
426 <#if getterUtil.getString(themeDisplay.getThemeSetting("ambiente-lang"))==languageUtil.get(locale, "ENG")>
427 <#assign noVideoText="Cookies disabled - content not available" />
428 </#if>
429 <div class='embed-responsive embed-responsive-16by9' data-video='false'>
430 <p class='nocookie-text'>${noVideoText}</p>
431 <input type='hidden'
432 id='coockieinput'
433 class='coockieinput autoplayAdder'
434 value='https://www.youtube.com/embed/${cur_image.UrlVideoYOUTUBE.getData()}'>
435 <iframe frameBorder="0"
436 width="100%"
437 height="500" src=""
438 class='iframe-video coockieinput-iframe autoplayAdder-iframe'
439 style="background-color: transparent;z-index: 3"></iframe>
440 </div>
441 </#if>
442 </div>
443 </div>
444 </div>
445 </div>
446 </div>
447 </div>
448
449 <#else>
450
451 <#if cta.LinkEsterno?? && cta.LinkEsterno.getData() != "">
452 <#assign buttonLink=cta.LinkEsterno.getData() targetLink="_blank" />
453 <#elseif cta.getData()?? && cta.getData() !="">
454 <#assign buttonLink=cta.getFriendlyUrl() targetLink="" />
455 </#if>
456
457 <#if buttonLink!="">
458 <a href="${buttonLink}" target="targetLink"
459 class="${tipobottone} brake-line mr-2">${cta.TestoPulsante.getData()}
460 <#if cta.TestoContestoLink?? &&
461 cta.TestoContestoLink.getData() !="">
462 <span
463 class="visually-hidden">${cta.TestoContestoLink.getData()}</span>
464 </#if>
465 </a>
466 </#if>
467
468 </#if>
469 </#list>
470 </div>
471 </div>
472 </div>
473 </div>
474 </div>
475 </div>
476 </#list>
477 </div>
478
479 <#-- Frecce e indicatori DEVONO stare dentro #head-carousel:
480 Bootstrap cerca .carousel-indicators con querySelector sul root. -->
481 <div class="d-none d-lg-block ${hideclass}"
482 style="position:absolute;top: 50%;left:0%; right: 0%;">
483
484 <a class="carousel-control carousel-control-prev" href="#head-carousel" role="button"
485 data-slide="prev" style="width:10%;z-index:5;">
486 <i class="icon-arrow-l ${arrowcolor} title-bigger"></i>
487 <span class="sr-only">${languageUtil.get(locale, "previous")}</span>
488 </a>
489
490 <a class="carousel-control carousel-control-next" href="#head-carousel" role="button"
491 data-slide="next" style="width:10%;z-index:5;">
492 <i class="icon-arrow-r ${arrowcolor} title-bigger"></i>
493 <span class="sr-only">${languageUtil.get(locale, "next")}</span>
494 </a>
495 </div>
496
497 <ol class="carousel-indicators pabsolute ${hideclass}" style="z-index:5!important;bottom:15px;">
498 <#list siblings as cur_image>
499 <li role="button" class="li-carousel-indicator ${(cur_image?index == 0)?then('active', '')}"
500 data-slide-to="${cur_image?index}" data-target="#head-carousel"><span></span></li>
501 </#list>
502 </ol>
503
504 </div>
505 <#-- /#head-carousel -->
506
507 <#if (siblings?size gt 1)>
508 <button type="button" class="banner_hp_video-control" aria-label="Pausa"
509 title="Pausa">Pausa</button>
510 </#if>
511
512 <div class="mobile d-lg-none">
513 <script>
514 !function (t) {
515 t.fn.bcSwipe = function (e) {
516 var n = {threshold: 50};
517 return e && t.extend(n, e), this.each(function () {
518 function e(t) {1 == t.touches.length && (u = t.touches[0].pageX, c = !0, this.addEventListener("touchmove", o, !1))}
519 function o(e) {if (c) {var o = e.touches[0].pageX, i = u - o; Math.abs(i) >= n.threshold && (h(), t(this).carousel(i > 0 ? "next" : "prev"))} }
520 function h() {this.removeEventListener("touchmove", o), u = null, c = !1}
521 var u, c = !1; "ontouchstart" in document.documentElement && this.addEventListener("touchstart", e, !1)
522 }), this
523 }
524 }(jQuery);
525 // Swipe functions for Bootstrap Carousel
526 $('#head-carousel').bcSwipe({threshold: 50});
527 </script>
528 </div>
529 </section>
530
531 <script>
532 $(document).ready(function () {
533 $(".modal-iframe-video").on('shown.bs.modal', function () {
534 if ($('#head-carousel').length > 0) {
535 $('#head-carousel').carousel("pause");
536 }
537 });
538 $(".modal-iframe-video").on('hidden.bs.modal', function () {
539 $("iframe").each(function () {
540 var src = $(this).attr('src');
541 $(this).attr('src', src);
542 });
543 if ($('#head-carousel').length > 0) {
544 $('#head-carousel').carousel("cycle");
545 }
546 });
547 });
548
549 /* accessibility carousel */
550 (function () {
551 var carouselDesktop = document.getElementById("main-carousel");
552 var carouselRoot = document.getElementById("head-carousel");
553 if (!carouselDesktop || !carouselRoot) {
554 return;
555 }
556
557 var dotsDesktopWrapper = carouselRoot.querySelector(".carousel-indicators");
558 var dotsDesktop = dotsDesktopWrapper
559 ? Array.prototype.slice.call(dotsDesktopWrapper.querySelectorAll("li"))
560 : [];
561 var triggeredByDot = false;
562
563 $(carouselRoot).on("slide.bs.carousel", function (event) {
564 var nextIndex = event.to;
565 dotsDesktop.forEach(function (dot, index) {
566 if (index === nextIndex) {
567 dot.setAttribute("tabindex", "0");
568 if (triggeredByDot) {
569 dot.focus();
570 }
571 } else {
572 dot.setAttribute("tabindex", "-1");
573 }
574 });
575 triggeredByDot = false;
576 });
577
578 dotsDesktop.forEach(function (dot, index) {
579 dot.setAttribute("tabindex", index === 0 ? "0" : "-1");
580 });
581
582 if (dotsDesktopWrapper) {
583 dotsDesktopWrapper.addEventListener("keydown", function (event) {
584 if (carouselDesktop.classList.contains("page-head")) {
585 if (event.key === "ArrowLeft") {
586 triggeredByDot = true;
587 //$(carouselRoot).carousel("prev");
588 } else if (event.key === "ArrowRight") {
589 triggeredByDot = true;
590 //$(carouselRoot).carousel("next");
591 }
592 }
593 });
594 }
595 })();
596 </script>
597
598 <#if (siblings?size gt 1)>
599 <style>
600 .banner_hp_video-control {
601 bottom: 100px !important;
602 }
603
604 @media(max-width:767px) {
605 .banner_hp_video-control {
606 right: 2.65% !important;
607 bottom: 10px !important;
608 }
609 }
610
611 button.banner_hp_video-control.d-none.d-md-block {
612 position: absolute;
613 bottom: 50px;
614 right: 50px;
615 z-index: 99999;
616 }
617 </style>
618 <script>
619 document.addEventListener("DOMContentLoaded", function () {
620 var controlButton = document.querySelector('.banner_hp_video-control');
621 var $carousel = $('#head-carousel');
622
623 if (!controlButton || $carousel.length === 0) {
624 return;
625 }
626
627 function isAutoplayActive() {
628 var data = $carousel.data('bs.carousel');
629 return !!data && data._interval !== null;
630 }
631
632 function updateButtonState(button, isPaused) {
633 if (isPaused) {
634 button.classList.add('play');
635 button.setAttribute('aria-label', 'Play');
636 button.setAttribute('title', 'Play');
637 button.innerText = 'Play';
638 } else {
639 button.classList.remove('play');
640 button.setAttribute('aria-label', 'Pausa');
641 button.setAttribute('title', 'Pausa');
642 button.innerText = 'Pausa';
643 }
644 }
645
646 $carousel.on('mouseover mouseout', function () {
647 setTimeout(function () {
648 updateButtonState(controlButton, !isAutoplayActive());
649 }, 100);
650 });
651
652 controlButton.addEventListener('click', function () {
653 if (isAutoplayActive()) {
654 $carousel.carousel("pause");
655 updateButtonState(controlButton, true);
656 } else {
657 updateButtonState(controlButton, false);
658 $carousel.carousel("cycle");
659 $carousel.carousel("next");
660 }
661 });
662 });
663 </script>
664 </#if>
665</#if>
per dare nuova vita agli
ingombranti riutilizzabili,
alimentando il circolo virtuoso del riuso.


per dare nuova vita agli
ingombranti riutilizzabili,
alimentando il circolo virtuoso del riuso.


bisogno, sostenendo cinque diversi
progetti di solidarietà.
Insieme possiamo fare la differenza
Storie di sostenibilità, progetti e iniziative sul territorio, nuove idee:
tutto questo è la newsletter Insieme!


del mondo che premia
scuole e ambiente.


del mondo che premia
scuole e ambiente.


cittadini contribuiscono alla
piantumazione di alberi in città.
cibo e aiutare i più bisognosi.


cibo e aiutare i più bisognosi.


comune di Ravenna per la promozione
delle sostenibilità degli esercizi pubblici.
a cittadini e scuole.


a cittadini e scuole.


albergatori di Cesenatico
Perché per ogni fine, c’è un nuovo inizio.


Perché per ogni fine, c’è un nuovo inizio.


non scaduti e creare una rete solidale sul territorio.
Risparmiamo energia, insieme.
Il sito è in modalità risparmio energetico per ridurre i consumi, basta un click per ripartire.
Clicca in un punto qualsiasi per continuare a navigareHeraSmartsearchAgent
Virtual Hera: le risposte che cerchi a portata di mano
Ciao sono VHERA, con l'Intelligenza Artificiale Generativa ti aiuto a trovare informazioni su obiettivi e risultati economico-finanziari e di sostenibilità nel sito del Gruppo Hera.
Si invita l'Utente a non inserire dati personali come nome, cognome, indirizzo, numero di telefono, ecc. durante l'interazione. Il chatbot non tratta informazioni personali per fornire una risposta. Lo storico della conversazione viene archiviato per un anno.
VHERA è il Chatbot messo a disposizione da Hera S.p.A., quale provider, sul sito istituzionale www.gruppohera.it per fornire informazioni riguardanti l'area Investor Relator e VCS.
Le risposte fornite da VHERA sono generate tramite sistemi di intelligenza artificiale generativa. In particolare, le risposte fornite dall’assistente virtuale sono elaborate sulla base dei contenuti già disponibili alla consultazione attraverso la normale navigazione del sito. VHERA offre risposte citando o producendo una sintesi del contenuto identificato come più probabile in relazione alle parole inserite nella domanda formulata dall’utente. Ogni risposta contiene il link della pagina utilizzata per la formulazione della risposta. L'obiettivo è offrire risposte utili e pertinenti, ma possono comunque verificarsi casi in cui le risposte risultino incomplete o imprecise.
Pertanto, ti consigliamo di verificare sempre le risposte fornite da VHERA e, se necessario, di proseguire la navigazione sul sito al fine di verificare la pertinenza dei contenuti suggeriti dall’assistente virtuale.
In ogni caso, se noti errori, inesattezze o anomalie nelle risposte, ti invitiamo a segnalarle tramite il feedback: il tuo contributo sarà prezioso per migliorare il servizio.
Le informazioni fornite da VHERA non rappresentano la posizione ufficiale di Hera S.p.A. e non devono essere considerate come consulenza professionale, né utilizzate come base per decisioni importanti. Per conoscere le posizioni ufficiali della Società, ti invitiamo ad utilizzare il canale istituzionale www.gruppohera.it e a fare riferimento alle fonti e alla reportistica ufficiale pubblicata dall'azienda a questi link:
https://www.gruppohera.it/gruppo/investitori/risultati-e-presentazioni/archivio
https://www.gruppohera.it/gruppo/sostenibilita/rendicontazione-di-sostenibilita/csv
Si segnala che nel rispetto delle regole di sicurezza, alcune domande potrebbero non ricevere risposta se non conformi ai criteri impostati.
Per approfondire il funzionamento di VHERA, consulta la Sezione - Scopri come funziona VHERA
VHERA è un chatbot basato su Intelligenza Artificiale Generativa di cui Hera S.p.A. è il provider. Grazie a questa tecnologia, risponde alle tue richieste interrogando i contenuti e i documenti più rilevanti presenti nel sito www.gruppohera.it. Per elaborare le risposte, VHERA prende in considerazione le pagine web e i documenti finanziari e di sostenibilità più recenti, i comunicati stampa degli ultimi due anni, il Codice Etico e altri materiali aziendali di particolare importanza.
Attraverso VHERA puoi approfondire le tematiche di tuo interesse e avere una panoramica aggiornata sulla
comunicazione corporate e istituzionale di Hera S.p.A..
Se invece desideri cercare una specifica informazione sulla gestione delle tue utenze, oppure per tematiche
inerenti il servizio clienti, comunicati stampa o news, puoi utilizzare la navigazione del sito o il motore di
ricerca tradizionale tramite l'icona della lente presente nella testata del sito www.gruppohera.it
Puoi infine fare riferimento alle fonti e alla reportistica pubblicata dall’azienda ai seguenti link:
https://www.gruppohera.it/gruppo/investitori/risultati-e-presentazioni/archivio
https://www.gruppohera.it/gruppo/sostenibilita/rendicontazione-di-sostenibilita/csv
Come ogni sistema basato su intelligenza artificiale generativa, VHERA si impegna a fornire risposte
utili e pertinenti, suggerire fonti ma, basandosi su logiche algoritmiche probabilistiche, può proporre anche
informazioni non pertinenti, incomplete o non del tutto precise: ti consigliamo quindi di verificarle e di
consultare le fonti ufficiali per confermare l'attendibilità delle informazioni ricevute.
Se la richiesta non trova una corrispondenza perfetta nei dati disponibili, VHERA può comunque generare
una risposta sulla base delle informazioni presenti nei propri sistemi: se noti errori o inesattezze, segnalali
tramite l'apposito strumento di feedback per aiutarci a migliorare il servizio.
Ricorda che le informazioni fornite da VHERA non riflettono la posizione ufficiale di Hera S.p.A. e non
sostituiscono la consultazione di documenti istituzionali e ufficiali, soprattutto per decisioni importanti o
questioni rilevanti.
Alcune domande potrebbero non ricevere risposta se non conformi ai criteri di sicurezza impostati; si fa
presente che l'inserimento di informazioni personali non è utile per una risposta del chatbot: ti chiediamo di
non inserire tale tipo di informazioni durante l'interazione con VHERA e di non utilizzare un linguaggio
inappropriato rispetto alle tematiche per cui è prevista l’interazione con l’assistente digitale, o comunque
discriminatorio, offensivo basato su identità, etnia, genere, religione, intimidatorio, riferito a pratiche
sessuali, nudità o contenuti osceni, relativo ad attività illegali.
L’utente si impegna a non:
-
utilizzare VHERA in qualsiasi modo che possa compromettere la disponibilità o l’accessibilità della stessa o renderla meno efficiente;
-
eludere o cercare di eludere le misure di sicurezza di VHERA e manomettere la tecnologia su cui l’assistente digitale si basa.
Alcuni suggerimenti utili per parlare con VHERA
-
Più la domanda è dettagliata e precisa, più VHERA potrà individuare una risposta puntuale e pertinente.
-
Se desideri cambiare argomento o porre domande su un contesto diverso, ti consigliamo di riavviare la chat attraverso il bottone "Riavvia": questo aiuta il sistema a "ripartire da zero" e a fornirti risposte più coerenti con il nuovo tema.
-
In caso di risposte errate, poco chiare o che ti sembrano "allucinazioni" del chatbot, puoi riavviare la conversazione con click su "Riavvia" per svuotare la chat e riprovare a porre la domanda in modo diverso.
-
Se lo strumento non risponde alla domanda o la risposta è incompleta, prova a riformulare la richiesta con termini diversi o a suddividerla in più domande: spesso il dialogo progressivo aiuta VHERA a comprendere meglio le tue esigenze.
Lingua e fonti
VHERA comprende domande poste in quasi tutte le lingue, ma le risposte vengono fornite in italiano.
“AS IS” e “AS AVAILABLE” disclaimer
Il servizio attraverso VHERA è fornito nello stato in cui si trova e senza alcuna garanzia di buon
funzionamento. Pertanto, Hera S.p.A. non è tenuta a rilasciare alcun aggiornamento e non ha alcun obbligo di
eliminare gli eventuali difetti del servizio reso tramite VHERA.
Hera S.p.A. si impegna a fare quanto ragionevolmente possibile per mantenere l’accessibilità e le
funzionalità di VHERA, senza peraltro in alcun modo garantire l’accesso continuo, ininterrotto e sicuro
all’assistente virtuale in questione. Pertanto, Hera S.p.A. non sarà responsabile per qualsiasi disfunzione
nell’accesso o utilizzo di VHERA.
Hera S.p.A. non fornisce alcuna garanzia o impegno, e non rilascia alcuna dichiarazione che l’utilizzo di
VHERA soddisferà le aspettative dell'utente, raggiungerà i risultati previsti dall’utente, funzionerà senza
interruzioni.
Per approfondire
Per conoscere le linee guida Hera sull'adozione dell'intelligenza artificiale generativa, consulta il documento:
IL NOSTRO IMPEGNO NELL'UTILIZZO DELL'INTELLIGENZA ARTIFICIALESei sicuro di voler riavviare la chat?
Se vuoi salvare le informazioni puoi copiarla prima di riavviare la conversazione
Suggerimento sull'assistente digitale
Scopri il nuovo assistente digitale del Gruppo HERA. Puoi dialogare e fare domande per saperne di più sui nostri obiettivi aziendali, sui nostri risultati economico-finanziari e sul nostro approccio alla sostenibilità.

