Asset-Herausgeber

Weihnachtsfeier

Fehler bei der Verarbeitung der Vorlage.
The following has evaluated to null or missing:
==> lionsEventUtilService.getLionsEventDisplayModel(getterUtil.getLong(.vars['articleGroupId']), getterUtil.getString(.vars['articleId']))  [in template "10154#10194#LIONS_EVENT_V2" at line 41, column 26]

----
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: lionsEventDisplayModel = lionsEventUt...  [in template "10154#10194#LIONS_EVENT_V2" at line 41, column 1]
----
1<#-- LR7.x Version 06.11.2023 07:37h auf Basis des _Relaunch Bericht--> 
2<#-- Hinweise 
3            Alle Zurgiffe auf die DDL in Attempt - Recover Blöcke eingebait um keinen Fehler zu generieren 
4            wenn eine Zugriffskollision auf die DDL stattfindet 
5--> 
6 
7<#assign 
8defaultTeilnehmerliste = "Teilnehmer Clubveranstaltungen" 
9reservierungsZeit_ms = 120000 
10reservierungsZeitPuffer_ms = 1000 
11 
12optionsValue = "" 
13optionsComment = "" 
14 
15namespace = themeDisplay.getPortletDisplay().getNamespace() 
16groupLocalServiceUtil = staticUtil["com.liferay.portal.kernel.service.GroupLocalServiceUtil"] 
17journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") 
18localeUtil = staticUtil["com.liferay.portal.kernel.util.LocaleUtil"] 
19ddlRecordLocalService = serviceLocator.findService("com.liferay.dynamic.data.lists.service.DDLRecordLocalService") 
20lionsImageService = serviceLocator.findService("de.lions.foundation.service.LionsImageService") 
21lionsGroupService = serviceLocator.findService("de.lions.foundation.service.LionsGroupService") 
22lionsEventUtilService = serviceLocator.findService("de.lions.event.util.service.LionsEventUtilService") 
23lionsEventICSService = serviceLocator.findService("de.lions.event.util.service.LionsEventICSService") 
24serviceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext() 
25 
26imageUrlArray = [] 
27imgCntr = 0 
28 
29articleAuthorId = .vars['reserved-article-author-id'].data?number 
30articleId = .vars['reserved-article-id'].data 
31 
32ausgebucht = false 
33wirklichAusgebucht = false 
34vorReserviert = false 
35 
36namespace = randomNumber(5) 
37myRecordCreationKey = namespace 
38/> 
39 
40<#assign 
41lionsEventDisplayModel = lionsEventUtilService.getLionsEventDisplayModel(getterUtil.getLong(.vars['articleGroupId']), getterUtil.getString(.vars['articleId'])) 
42icsString = lionsEventICSService.getICSString(themeDisplay, lionsEventDisplayModel) 
43 
44recordSetId = lionsEventDisplayModel.getRecordSetId() 
45gueltigeRecordSetId = lionsEventDisplayModel.isRecordSetCorrectConfigured() 
46anzTickets = lionsEventDisplayModel.getNumberOfTickets() 
47begrenzteTeilnemerzahl = (anzTickets > 0) 
48 
49gastRegistrierungErlaubt = lionsEventDisplayModel.isGuests() 
50 
51<#-- @ G. Ortwein Anmeldung abgelaufen wurde nicht korrekte abgefragt - korrigiert --> 
52 
53anmeldungAbgelaufen = lionsEventDisplayModel.isRegistrationDateReached() 
54/> 
55 
56 
57<#-- Start: prüfen auf Konfigurationsfehler bei den Optionen --> 
58 
59<#-- @ G. Ortwein - das müsste iregendwie schöner gehen... 
60mir fiel aber ichts besseres ein --> 
61 
62<#if themeDisplay.isSignedIn() && (user.userId == articleAuthorId)  > 
63 
64    <#if options.getSiblings()?has_content> 
65        <#assign basisListe = [''] /> 
66        <#list options.getSiblings() as cur_options> 
67            <#if cur_options.getData() !=''> 
68                <#assign basis = cur_options.getData()?replace("\\W", "", "r") > 
69                <#if basisListe?seq_index_of(basis) lt 0> 
70                    <#assign basisListe += [ basis ] > 
71                <#else> 
72                    <div class="portlet-msg-alert"><h3><b>Konfigurationsfehler!</b></h3> 
73                        <b>${cur_options.getData()}</b> intern abgebildet auf: &quot;<b>${basis}</b>&quot; ist nicht 
74                        eindeutig! Bitte w&auml;hlen sie einen eindeutigen Begriff 
75                    </div> 
76                </#if> 
77                <#assign suchstringListe = [''] /> 
78                <#list cur_options.optionAnswer.getSiblings() as cur_options_optionAnswer> 
79                    <#assign suchstring = cur_options_optionAnswer.getData()?replace("\\W", "", "r") > 
80                    <#if suchstringListe?seq_index_of(suchstring) lt 0 > 
81                        <#assign suchstringListe += [ suchstring ] > 
82                    <#else> 
83                        <div class="portlet-msg-alert"><h3><b>Konfigurationsfehler!</b></h3> 
84                            <b>Konfigurationsfehler: ${cur_options.getData()}.${cur_options_optionAnswer.getData()}</b> 
85                            intern abgebildet auf: &quot;<b>${basis}.${suchstring}</b>&quot; ist nicht eindeutig! Bitte 
86                            w&auml;hlen sie einen eindeutigen Begriff 
87                        </div> 
88                    </#if> 
89                </#list> 
90            </#if> 
91        </#list> 
92    </#if> 
93</#if> 
94 
95<#-- Ende: Prüfen auf Konfigurationsfehler beinden Optionen --> 
96 
97 
98 
99<#if gueltigeRecordSetId && (themeDisplay.isSignedIn() || gastRegistrierungErlaubt)> 
100    <#assign 
101    recordSetId = lionsEventDisplayModel.getRecordSet().getRecordSetId() 
102    gastRegistrierungErlaubt = lionsEventDisplayModel.hasAddRecordPermission(themeDisplay) 
103    /> 
104 
105    <#if !gastRegistrierungErlaubt > 
106    <#-- Id = 0 entfernt Programmteile zur Registrierung --> 
107        <#assign 
108        recordSetId = 0 
109        /> 
110    </#if> 
111<#else> 
112<#-- Id = 0 entfernt Programmteile zur Registrierung --> 
113    <#assign recordSetId = 0 /> 
114</#if> 
115 
116 
117 
118<#-- CSS Ergänzungen --> 
119 
120<#-- autocomplete --> 
121 
122<style> 
123    /*the container must be positioned relative:*/ 
124    .autocomplete { 
125        position: relative; 
126        display: inline-block; 
127
128 
129 
130    .autocomplete-items { 
131        position: absolute; 
132        border: 1px solid #d4d4d4; 
133        border-bottom: none; 
134        border-top: none; 
135        z-index: 99; 
136        /*position the autocomplete items to be the same width as the container:*/ 
137        top: 100%; 
138        left: 0; 
139        right: 0; 
140
141 
142    .autocomplete-items div { 
143        padding: 10px; 
144        cursor: pointer; 
145        background-color: #fff; 
146        border-bottom: 1px solid #d4d4d4; 
147
148 
149    /*when hovering an item:*/ 
150    .autocomplete-items div:hover { 
151        background-color: #e9e9e9; 
152
153 
154    /*when navigating through the items using the arrow keys:*/ 
155    .autocomplete-active { 
156        background-color: DodgerBlue !important; 
157        color: #ffffff; 
158
159 
160</style> 
161 
162<#-- Rückmelde Buttons --> 
163 
164<style> 
165    .attendance-submit-button { 
166        width: 2.5em; 
167        height: 2.5em; 
168        line-height: 2.5em; 
169        font-size: 2em; 
170        margin: 2px; 
171        text-align: center; 
172        vertical-align: middle; 
173
174 
175    .attendance-submit-button:hover { 
176        width: 2.6em; 
177        height: 2.6em; 
178
179 
180    .attendance-submit-button:active { 
181        width: 2.4em; 
182        height: 2.4em; 
183
184 
185    .attendance-submit-button.disabled { 
186        background-color: lightgrey !important; 
187        color: grey; 
188
189 
190    .attendance-submit-button.update { 
191        color: grey; 
192
193 
194    .attendance-submit-button.green { 
195        background-color: lightgreen; 
196
197 
198    .attendance-submit-button.yellow { 
199        background-color: yellow; 
200
201 
202    .attendance-submit-button.red { 
203        background-color: red; 
204
205</style> 
206 
207<#-- List Visualisierung Rückmledung --> 
208 
209<style> 
210    .attendance-visual { 
211        width: 2em; 
212        height: 2em; 
213        line-height: 2em; 
214        font-size: 1.5em; 
215        margin: 2px; 
216        text-align: center; 
217        vertical-align: middle; 
218        color: black; 
219
220 
221    .attendance-visual.green { 
222        background-color: lightgreen; 
223
224 
225    .attendance-visual.yellow { 
226        background-color: yellow; 
227
228 
229    .attendance-visual.red { 
230        background-color: red; 
231
232</style> 
233 
234<#-- Edit Button --> 
235 
236<style> 
237    .attendance-edit-button { 
238        width: 2em; 
239        height: 2em; 
240        line-height: 2em; 
241        font-size: 1.5em; 
242        margin: 2px; 
243        text-align: center; 
244        vertical-align: middle; 
245        background-color: lightgrey !important; 
246        color: black; 
247
248 
249    .attendance-edit-button:hover { 
250        width: 2.1em; 
251        height: 2.1em; 
252
253 
254    .attendance-edit-button:active { 
255        width: 1.9em; 
256        height: 1.9em; 
257
258</style> 
259 
260<#-- Ende CSS Ergänzungen --> 
261 
262 
263<#-------- --> 
264 
265<#setting time_zone=eventDate.timezone.getData()> 
266 
267 
268 
269<#if themeDisplay.isSignedIn()> 
270    <#if !gueltigeRecordSetId && (recordSetId > 0)> 
271        <div class="portlet-msg-alert"> 
272            <h3><b>Konfigurationsfehler!</b></h3> 
273            <b>Bitte geben Sie eine korrekte Nummer der Teilnehmerliste ein!</b><br> 
274            <u>Mögliche Werte sind:</u><br> 
275            <#list lionsEventUtilService.getRecordSets(themeDisplay.getSiteGroupId()) as cur_recordSet> 
276                ${cur_recordSet.recordSetId}: ${cur_recordSet.name}<br> 
277            </#list> 
278            sowie<br> 
279            0: automatische Auswahl der Liste mit dem Namen &quot;${defaultTeilnehmerliste}&quot; 
280        </div> 
281    </#if> 
282</#if> 
283 
284 
285<script type="text/javascript"> 
286 
287  function addNonEmptyEntry(prefix, entry, postfix) { 
288    s0 = prefix + entry + postfix; 
289    if (entry == null) s0 = ""; 
290    if (entry == "null") s0 = ""; 
291    if (entry == "nil") s0 = ""; 
292    if (entry == "") s0 = ""; 
293    if (entry == " ") s0 = ""; 
294    return s0; 
295
296 
297  function makeNavUrl(name, street, zip, city, country) { 
298    addresslink = ""; 
299    this.beautyText = ""; 
300    addresslink += addNonEmptyEntry("", name, ", "); 
301    addresslink += addNonEmptyEntry("", street, ", "); 
302    addresslink += addNonEmptyEntry("", addNonEmptyEntry("", zip, "") + "+" + addNonEmptyEntry("", city, ""), ""); 
303    addresslink += addNonEmptyEntry("+", country, ""); 
304 
305    if (navigator.userAgent.match(/iPhone|iPod|iPad/i)) { 
306      addresslink = "https://maps.apple.com/?q=" + encodeURIComponent(addresslink); 
307    } else { 
308      addresslink = "https://maps.google.com/?q=" + encodeURIComponent(addresslink); 
309
310 
311    this.beautyText += addNonEmptyEntry("<a href=\"", addresslink, "\"target=\"_blank\">"); 
312    this.beautyText += addNonEmptyEntry("", name, "<br>"); 
313    this.beautyText += addNonEmptyEntry("", street, "<br>"); 
314    this.beautyText += addNonEmptyEntry("", addNonEmptyEntry("", zip, "") + " " + addNonEmptyEntry("", city, ""), "<br>"); 
315    this.beautyText += addNonEmptyEntry("", country, "<br>"); 
316    if (addNonEmptyEntry("<a href=\"", addresslink, "\"target=\"_blank\">") !== "") { 
317      this.beautyText += "</a>"; 
318
319    //console.log(this.beautyText); 
320    return this.beautyText; 
321 
322
323 
324 
325  //------------------------------- 
326 
327  function updateSelectedOptions(updateObject, jsonUpdateString) { 
328 
329    console.log("updateSelectedOptions"); 
330    console.log(jsonUpdateString); 
331    console.log(updateObject); 
332 
333 
334    <#-- Optionen auslesen --> 
335 
336 
337    <#assign empty_options_map> 
338
339      <#if options.getSiblings()?has_content> 
340      <#assign noOptions = 0> 
341      <#list options.getSiblings() as cur_options> 
342      <#if noOptions != 0> 
343
344      </#if> 
345 
346
347      ${cur_options.getData()?replace("\\W", "", "r")}. 
348
349      [] 
350      <#assign noOptions++> 
351      </#list> 
352      </#if> 
353
354    </#assign> 
355 
356    <#assign empty_options_map = empty_options_map?replace("\\s+","","r")> 
357 
358    if (jsonUpdateString == "") { 
359      jsonUpdateString = "${empty_options_map}"; 
360      jsonUpdateString = jsonUpdateString.replaceAll('.', '\"'); 
361
362 
363    var optionData = JSON.parse(jsonUpdateString); 
364 
365 
366    for (var key in optionData) { 
367      <#-- 
368        console.log(key); 
369        console.log(JSON.stringify(optionData[key])); 
370      --> 
371 
372      var optionsToSelect = JSON.stringify(optionData[key]); 
373 
374      var select = document.querySelector(updateObject + " select[id='" + key + "']"); 
375 
376      if (select !== undefined && select !== null) { 
377        for (var i = 0, l = select.options.length, o; i < l; i++) { 
378          o = select.options[i]; 
379          <#-- 
380                   console.log("oValue", o.value, o.value != ""); 
381          --> 
382          o.selected = ((optionsToSelect.indexOf(o.value) != -1) && (o.value != "")); 
383
384
385
386 
387
388 
389  //---------------------------------- 
390 
391 
392  function updateEntryInputField(updateObject1, name, email, recordSetId, key, updateObject2, jsonUpdateString, updateObject3, decision, updateObject4, comment) { 
393    var recordIdField = document.querySelector("div.anmeldenameFeld input[id='activeRecordSet']"); 
394    recordIdField.value = recordSetId; 
395 
396    var textField = document.querySelector("div.anmeldenameFeld input[id='partnerGastName']"); 
397    textField.value = name; 
398 
399    var partnerGastEMail = document.querySelector("div.anmeldenameFeld input[id='partnerGastEMail']"); 
400    partnerGastEMail.value = email; 
401 
402    var activeRecordCreationKey = document.querySelector("div.anmeldenameFeld input[id='activeRecordCreationKey']"); 
403    activeRecordCreationKey.value = key; 
404 
405    var participantComment = document.querySelector("div.rm-comment-form textarea[id='participantComment']"); 
406    participantComment.value = comment; 
407 
408 
409    json = jsonUpdateString.replaceAll('.', '\"'); 
410    console.log(json); 
411    updateSelectedOptions(updateObject2, json); 
412 
413    updateAttendanceButtons(decision); 
414 
415    window.location.hash = "MyFeedbackAnker1"; 
416    window.location.hash = "MyFeedbackAnker2"; 
417 
418    if ((parseInt(recordSetId) == 0) || (name.length > 0)) { 
419 
420      document.querySelector("div.anmeldenameFeld").hidden = false; 
421
422      if (document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value == "") { 
423        document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").focus(); 
424
425    } else { 
426      document.querySelector("div.anmeldenameFeld").hidden = true; 
427
428 
429
430 
431 
432  function updateAttendanceButtons(decision) { 
433      if (decision !== "update") { 
434          document.querySelectorAll('.attendance-submit-button').forEach(function (el) { 
435              el.classList.add('disabled'); 
436          }); 
437          document.querySelectorAll('.attendance-submit-button').forEach(function (el) { 
438              el.classList.remove('update'); 
439          }); 
440 
441      } else { 
442          document.querySelectorAll('.attendance-submit-button').forEach(function (el) { 
443              el.classList.add('update'); 
444          }); 
445
446 
447      console.log("DECISION: ", decision); 
448      if (decision === "ja") { 
449          document.querySelectorAll(".attendance-submit-button.green").forEach(function (el) { 
450              el.classList.remove('disabled'); 
451          }); 
452
453 
454      if (decision === "vielleicht") { 
455          document.querySelectorAll(".attendance-submit-button.yellow").forEach(function (el) { 
456              el.classList.remove('disabled'); 
457          }); 
458
459 
460      if (decision === "nein") { 
461          document.querySelectorAll(".attendance-submit-button.red").forEach(function (el) { 
462              el.classList.remove('disabled'); 
463							el.onclick = function() {sendAttendanceAddUpdateRequest('res', this)}; 
464							el.innerHTML ='<@clay["icon"] symbol="trash"/>'; 
465          }); 
466
467 
468      if (decision !== "nein") { 
469          document.querySelectorAll(".attendance-submit-button.red").forEach(function (el) { 
470							el.onclick = function() {sendAttendanceAddUpdateRequest('nein', this)}; 
471							el.innerHTML ='<@clay["icon"] symbol="times-small"/>'; 
472          }); 
473
474 
475 
476      if (decision === "all") { 
477          document.querySelectorAll(".attendance-submit-button.green").forEach(function (el) { 
478              el.classList.remove('disabled'); 
479          }); 
480          document.querySelectorAll(".attendance-submit-button.yellow").forEach(function (el) { 
481              el.classList.remove('disabled'); 
482          }); 
483          document.querySelectorAll(".attendance-submit-button.red").forEach(function (el) { 
484              el.classList.remove('disabled'); 
485          }); 
486
487
488 
489  function ensureNameFilled() { 
490    document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value = document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value.trim().replaceAll(/(\s\s\s*)/g, ' '); 
491    if (document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value == "") { 
492      document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").focus(); 
493    } else { 
494      var guestName = document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value; 
495      console.log(guestName); 
496      var indexOfGuestName = jsListeNamen.indexOf(guestName); 
497      console.log(indexOfGuestName); 
498      var guestEMail = ""; 
499      if (indexOfGuestName >= 0) { 
500        guestEMail = jsListeEMail[indexOfGuestName]; 
501
502      console.log(guestEMail); 
503 
504      var guestEMailField = document.querySelector("div.anmeldenameFeld form input[name='partnerGastEMail']"); 
505      if (guestEMailField.value == "") { 
506        guestEMailField.value = guestEMail; 
507
508 
509
510 
511    updateAttendanceButtons('update'); 
512
513 
514 
515  function icsDownload${namespace}() { 
516    var filename = encodeURIComponent("Kalender-${themeDisplay.getLayout().getGroup().getName(locale)?replace(" ", "_")?js_string}" + ".ics"); 
517    var icaldata = '${icsString?js_string}'; 
518    downloadIcsFile(filename, icaldata); 
519
520 
521  function downloadIcsFile(filename, text) { 
522    var element = document.createElement('a'); 
523    element.setAttribute('href', 'data:text/calendar;charset=utf-8,' + encodeURIComponent(text)); 
524    element.setAttribute('download', filename); 
525 
526    element.style.display = 'none'; 
527    document.body.appendChild(element); 
528 
529    element.click(); 
530 
531    document.body.removeChild(element); 
532
533</script> 
534 
535 
536<#-- --------------------------------- --> 
537 
538 
539<#macro renderImage 
540image 
541
542    <#if image.getData()?has_content> 
543 
544        <@addFrescoImageUrl image.getData() /> 
545 
546        <#assign 
547        imageCssClass = "img-fluid crop-center position-absolute h-100 w-100" 
548        fileVersion = lionsImageService.getFileVersionFromWebContentString(image.data)!"" 
549        /> 
550 
551        <div class="image-wrapper aspect-ratio aspect-ratio-3-to-2 w-100"> 
552            <#if fileVersion?? && fileVersion?has_content> 
553                <@adaptive_media_image["img"] 
554                fileVersion=fileVersion 
555                class=imageCssClass 
556                alt=image.alt.getData() 
557                data\-image\-id=getNextId() /> 
558            <#else> 
559                <img class="${imageCssClass}" 
560                     src="${image.getData()}" alt="${image.alt.getData()}" 
561                     data-image-id="${getNextId()}"> 
562            </#if> 
563        </div> 
564        <@renderImageCaption image/> 
565    </#if> 
566</#macro> 
567 
568<#macro renderSlider 
569images 
570showArrows=true 
571
572    <div class="swiper-navigation-wrapper"> 
573        <div class="swiper-button-next"></div> 
574        <div class="swiper-button-prev"></div> 
575    </div> 
576 
577    <div class="swiper swiper-container swiper-container-${namespace} h-100"> 
578        <div class="swiper-wrapper"> 
579            <#list images as cur_image> 
580 
581                <@addFrescoImageUrl cur_image.getData() /> 
582 
583                <#assign 
584                imageCssClass = "position-absolute img-fluid w-100 h-100 crop-center" 
585                imageAlt = cur_image.alt?has_content?then(cur_image.alt.getData(), '') 
586                fileVersion = lionsImageService.getFileVersionFromWebContentString(cur_image.data)!"" 
587                /> 
588 
589                <div class="swiper-slide ${cur_image?is_first?then('active', '')}"> 
590                    <div class="aspect-ratio aspect-ratio-3-to-2"> 
591                        <#if fileVersion?? && fileVersion?has_content> 
592                            <@adaptive_media_image["img"] 
593                            fileVersion=fileVersion 
594                            class=imageCssClass 
595                            alt=imageAlt 
596                            data\-image\-id=getNextId() /> 
597                        <#else> 
598                            <img class="${imageCssClass}" 
599                                 src="${cur_image.getData()}" 
600                                 alt="${imageAlt}" 
601                                 data-image-id="${getNextId()}"> 
602                        </#if> 
603                    </div> 
604                    <@renderImageCaption cur_image /> 
605                </div> 
606            </#list> 
607        </div> 
608        <#-- Add Pagination --> 
609        <div class="swiper-pagination"></div> 
610        <#-- Add Arrows --> 
611    </div> 
612 
613    <script type="module"> 
614      import Swiper from '/o/lions-js-module-loader/third-party/swiper.min.js'; 
615 
616      function initSwiper${namespace}(selector, showArrows) { 
617        let config = 
618
619            slidesPerView: 'auto', 
620            centeredSlides: true, 
621            loop: true, 
622            spaceBetween: 30, 
623            speed: 1200, 
624            pagination: { 
625              el: '.swiper-pagination', 
626              clickable: true, 
627            }, 
628          }; 
629 
630        if (showArrows) { 
631          config.navigation = { 
632            nextEl: '.swiper-button-next', 
633            prevEl: '.swiper-button-prev', 
634          }; 
635
636 
637        new Swiper(selector, config); 
638
639 
640      initSwiper${namespace}('.swiper-container-${namespace}', ${showArrows?c}); 
641    </script> 
642</#macro> 
643 
644<#macro renderImageCaption 
645image 
646
647    <#assign 
648    imageCaption = (image.caption?? && image.caption.getData()?has_content)?then(image.caption.getData(), "") 
649    imageSource = (image.source?? && image.source.getData()?has_content)?then(image.source.getData(), "") 
650    /> 
651 
652    <#if imageCaption?has_content || imageSource?has_content> 
653        <div class="image-caption"> 
654            <#if imageCaption?has_content || imageSource?has_content> 
655                ${imageCaption} 
656            </#if> 
657            <#if imageCaption?has_content || imageSource?has_content> 
658                <span class="px-1">|</span> 
659            </#if> 
660            <#if imageSource?has_content> 
661                ${imageSource} 
662            </#if> 
663        </div> 
664    </#if> 
665</#macro> 
666 
667<#function getNextId > 
668    <#assign imgCntr = imgCntr + 1> 
669    <#return imgCntr> 
670</#function> 
671 
672<#macro addFrescoImageUrl url > 
673    <#assign imageUrlArray = imageUrlArray + [url] /> 
674</#macro> 
675 
676<#function randomNumber salt> 
677    <#local str= .now?long /> 
678    <#assign str = (str * salt)/3 /> 
679    <#return str[(str?string?length-5)..]/> 
680</#function> 
681 
682<#-- Hier beginnt die Ausgabe des Veranstaltungshinweises --> 
683 
684<div class="container lions-event event-${articleId} lions-report lions-report-${articleId} mt-4"> 
685    <div class="headline row justify-content-center pb-2"> 
686        <div class="col-md-7"> 
687            <div class="row align-items-center"> 
688                <div class="col"> 
689                    <h1>${.vars['reserved-article-title'].data}</h1> 
690                </div> 
691                <div class="col-auto"> 
692                    <button onclick="javascript:icsDownload${namespace}();" 
693                            class="btn btn-primary btn-sm" type="button"> 
694                        <i class="far fa-calendar-alt"></i> <i class="ml-1 fas fa-cloud-download-alt"></i> 
695                    </button> 
696                </div> 
697            </div> 
698        </div> 
699    </div> 
700 
701    <#-- Zunächst erfolgt die Ausgabe der Termingrunddaten wie Datum, Ort und Zeit in einer Tabelle --> 
702 
703    <div class="content row justify-content-center"> 
704        <div class="col-md-7"> 
705            <div class="row" style="font-weight: bold"> 
706                <div class="col"> 
707                    <div class="row"> 
708                        <div class="col"> 
709                            Datum: ${lionsEventDisplayModel.getStartDateFormatted()} 
710                        </div> 
711                    </div> 
712 
713                    <#if lionsEventDisplayModel.isDisplayStartTime() > 
714                        <div class="row"> 
715                            <div class="col"> 
716                                Beginn: ${lionsEventDisplayModel.getStartTimeFormatted()} 
717                            </div> 
718                        </div> 
719                    </#if> 
720 
721                    <#if lionsEventDisplayModel.isDisplayEndTime() && lionsEventDisplayModel.isDisplayEndDate() > 
722                        <div class="row"> 
723                            <div class="col"> 
724                                Ende: ${lionsEventDisplayModel.getEndDateTimeFormatted()} 
725                            </div> 
726                        </div> 
727                    <#elseif lionsEventDisplayModel.isDisplayEndTime()> 
728                        <div class="row"> 
729                            <div class="col"> 
730                                Ende: ${lionsEventDisplayModel.getEndTimeFormatted()} 
731                            </div> 
732                        </div> 
733                    </#if> 
734 
735                    <#if lionsEventDisplayModel.isDisplayDoorsOpenTime() > 
736                        <div class="row"> 
737                            <div class="col"> 
738                                Einlass: ${lionsEventDisplayModel.getDoorsOpenTimeFormatted()} 
739                            </div> 
740                        </div> 
741                    </#if> 
742 
743                    <#if lionsEventDisplayModel.isDisplayRegistrationUntilDate() > 
744                        <div class="row"> 
745                            <div class="col"> 
746                                Anmeldeschlu&szlig;: 
747                                <nobr>${lionsEventDisplayModel.getRegistrationAllowedUntilDateTimeFormatted()}</nobr> 
748                            </div> 
749                        </div> 
750                    </#if> 
751 
752                    <#if lionsEventDisplayModel.isRegistrationDateReached() > 
753                        <div class="row"> 
754                            <div class="col"> 
755                                Anmeldung abgelaufen 
756                            </div> 
757                        </div> 
758                    </#if> 
759                </div> 
760                <div class="col-auto text-right"> 
761                    <div id="Veranstaltungsort"> 
762                        ${lionsEventDisplayModel.getLocationName()}<br> 
763                        ${lionsEventDisplayModel.getStreetAndNumber()}<br> 
764                        ${lionsEventDisplayModel.getZipCode()} ${lionsEventDisplayModel.getCity()}<br> 
765                    </div> 
766                    <#if validator.isNotNull(lionsEventDisplayModel.getOnlineUri()) > 
767                        <div id="OnlineUri" class="pt-2"> 
768                            <a href="${lionsEventDisplayModel.getOnlineUri()}">Online teilnehmen...</a> 
769                        </div> 
770                    </#if> 
771                </div> 
772            </div> 
773 
774            <#-- Piktogramme und Text für zulässige Optionen anzeigen --> 
775            <#if lionsEventDisplayModel.isPartner() > 
776                <div class="row"> 
777                    <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;"> 
778                        <@clay["icon"] symbol="user"/> 
779                    </div> 
780                    <div class="col">mit Partnern</div> 
781                </div> 
782            </#if> 
783            <#if lionsEventDisplayModel.isGuests() > 
784                <div class="row"> 
785                    <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;"> 
786                        <@clay["icon"] symbol="users"/> 
787                    </div> 
788                    <div class="col">mit G&auml;sten</div> 
789                </div> 
790            </#if> 
791 
792            <#if lionsEventDisplayModel.isFood() > 
793                <div class="row"> 
794                    <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;"> 
795                        <i class="fas fa-utensils"></i> 
796                    </div> 
797                    <div class="col">mit mit Essen</div> 
798                </div> 
799            </#if> 
800 
801            <#if anzTickets gt 0> 
802                <div class="row"> 
803                    <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;"> 
804                        <b>#</b><@clay["icon"] symbol="user"/> 
805                    </div> 
806                    <div class="col">Maximal ${anzTickets} Teilnehmer</div> 
807                </div> 
808            </#if> 
809        </div> 
810    </div> 
811 
812    <#-- Inhalte des Termins und Einladungstext ausgeben --> 
813    <#-- Hier begnnt die Ausgabe der Berichts - Kompatiblen Inhalte von Prodyne _Relaunch_Bericht übernommen --> 
814 
815    <#if validator.isNotNull(lionsEventDisplayModel.getTeaserText(false)) > 
816        <div class="abstract row justify-content-center pt-2"> 
817            <div class="col-md-7"> 
818                ${lionsEventDisplayModel.getTeaserText(false)} 
819            </div> 
820        </div> 
821    </#if> 
822 
823    <!-- Images --> 
824    <#if images.getSiblings()?size gt 0 > 
825        <@liferay_util["html-top"]> 
826            <meta name="image" property="og:image" content="${images.getSiblings()[0].getData()}"> 
827        </@> 
828 
829        <#if images.getSiblings()?size gt 1 > 
830            <div class="row justify-content-center pt-3"> 
831 
832                <div class="col-md-9 slider-col"> 
833                    <@renderSlider 
834                    images=images.getSiblings() 
835                    /> 
836                </div> 
837            </div> 
838        <#elseif images.getSiblings()[0].getData()?has_content > 
839            <div class="row justify-content-center pt-3"> 
840                <div class="col-md-9"> 
841                    <@renderImage 
842                    image=images.getSiblings()[0] 
843                    /> 
844                </div> 
845            </div> 
846        </#if> 
847    </#if> 
848 
849 
850    <div class="content row justify-content-center"> 
851        <div class="col-md-7"> 
852            <p>${lionsEventDisplayModel.getContent()}</p> 
853        </div> 
854    </div> 
855 
856    <link rel="stylesheet" type="text/css" href="${themeDisplay.getPathThemeCss()}/fresco.css"/> 
857 
858    <script type="module"> 
859      import Fresco from '/o/lions-js-module-loader/third-party/fresco.js'; 
860 
861      function getThumbnailUrl(url) { 
862        let pattern = new RegExp("(\\?|\\&)(imageThumbnail=).*?(&|$)"); 
863 
864        if (url && url.search(pattern) >= 0) { 
865          url = url.replace(pattern, "$1$3"); 
866
867        return url + ((url.indexOf('?') > -1) ? '&imageThumbnail=1' : '?imageThumbnail=1'); 
868
869 
870      function createImageElement(url) { 
871        let imageElement = {}; 
872        imageElement.url = url; 
873        imageElement.options = {}; 
874        imageElement.options.thumbnail = getThumbnailUrl(url); 
875        return imageElement; 
876
877 
878 
879      let imageUrls = [<#list imageUrlArray as imageElement>'${imageElement}', </#list>] 
880      let frescoImages = []; 
881      imageUrls.forEach(url => frescoImages.push(createImageElement(url))); 
882 
883      // lightbox start 
884      document.querySelectorAll('.lions-report-${articleId} img').forEach(function (img) { 
885          img.addEventListener('click', () => { 
886              Fresco.show(frescoImages, $(this).data('image-id')); 
887          }); 
888      }); 
889      document.querySelector('.lions-report-${articleId}').classList.add('lightbox'); 
890      // lightbox end 
891    </script> 
892 
893    <#-- Hier Endet die Ausgabe der Berichts - Kompatiblen Inhalte von Prodyne _Relaunch_Bericht übernommen --> 
894 
895    <div class="abstract row justify-content-center pt-2"> 
896        <div class="col-md-7"> 
897            <p> 
898                <#if validator.isNotNull(organizer.getData())> 
899 
900                    <b><i> 
901 
902                            Veranstalter: ${organizer.getData()} ${organizer.orgStreetAndNumber.getData()} ${organizer.orgZip.getData()} ${organizer.orgCity.getData()}</i></b> 
903 
904                </#if> 
905            </p> 
906            <p><i>Online gestellt von: ${.vars['reserved-article-author-name'].data}<br> 
907 
908                    <#assign DatumModified_Data = .vars['reserved-article-modified-date'].data> 
909 
910                    <#if validator.isNotNull(DatumModified_Data)> 
911                    <#assign DatumModified_DateObj = dateUtil.parseDate("EE, dd MMM yyyy HH:mm:ss Z", DatumModified_Data, locale)> 
912                    Letzte 
913                    Änderung: ${dateUtil.getDate(DatumModified_DateObj, "EE, d. MMM yyyy HH:mm", locale, themeDisplay.getTimeZone())} 
914                </i></p> 
915            </#if> 
916        </div> 
917    </div> 
918 
919 
920    <#if recordSetId != 0 > 
921 
922 
923 
924    <#-- Record Set auswählen --> 
925 
926 
927    <#-- start add reservation record --> 
928 
929    <#-- sofern die Teilnehmerzahl begrenzt ist, Buchung vorreservieren --> 
930    <#if begrenzteTeilnemerzahl > 
931 
932        <#assign dateTimeVorReserviert = .now?datetime?long > 
933 
934        <#assign reservationFormValues = {"Veranstaltung":"${articleId}","Name":"","Teilnahme": "res","Optionen":""} > 
935 
936        <#--<#assign newDDLRecord = ddlRecordLocalService.addRecord(user.userId, groupId, recordSetId, 0, reservationFormValues, serviceContext) >--> 
937 
938        <#assign vorReserviert = true > 
939 
940        <script> 
941            Liferay.Service( 
942                '/ddl.ddlrecord/add-record', 
943
944                    groupId: ${groupId}, 
945                    recordSetId: ${recordSetId}, 
946                    displayIndex: 0, 
947                    fieldsMap: JSON.stringify({ 
948                        "Veranstaltung": "${articleId}", 
949                        "Name": '', 
950                        "eMail": '', 
951                        "Teilnahme": 'res', 
952                        "Optionen": '', 
953                    }) 
954                }, 
955                function (obj) { 
956 
957
958            ); 
959        </script> 
960    </#if> 
961 
962    <#-- end add reservation record --> 
963 
964 
965 
966    <#assign records = ddlRecordLocalService.getRecords(recordSetId)> 
967 
968    <#-- Rückmeldungen ermitteln --> 
969    <#assign anzTeilnehmer = 0> 
970    <#assign aktuellJa = 0> 
971    <#assign aktuellVielleicht = 0> 
972    <#assign aktuellNein = 0> 
973    <#assign aktuellRes = 0 > 
974    <#list records?sort_by("modifiedDate") as cur_record> 
975        <#attempt> 
976        <#-- ${cur_record}<br> --> 
977            <#if (cur_record.getDDMFormFieldValues("Veranstaltung")?? && cur_record.getDDMFormFieldValues("Veranstaltung")?first.getValue().getString(locale) == articleId) > 
978                <#assign entscheidung = cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale) > 
979                <#if entscheidung == "ja" > 
980                    <#assign aktuellJa += 1 > 
981                <#elseif entscheidung == "vielleicht" > 
982                    <#assign aktuellVielleicht = aktuellVielleicht +1 > 
983                <#elseif entscheidung == "nein" > 
984                    <#assign aktuellNein += 1 > 
985                <#elseif entscheidung == "res" > 
986                    <#assign reservationCreateDate_DateObj = cur_record.getCreateDate() > 
987                <#-- 
988                CreateDate: ${reservationCreateDate_DateObj?iso_utc}<br> 
989                --> 
990                    <#assign nowDateTime_DateObj = .now> 
991                <#-- 
992                NowDate: ${nowDateTime_DateObj?iso_utc}<br> 
993                --> 
994                    <#assign dateDifference = nowDateTime_DateObj?long - (reservationCreateDate_DateObj?long )  /> 
995                <#-- 
996                Difference: ${dateDifference}<br> 
997                Reservierungszeit: ${reservierungsZeit_ms}<br> 
998                --> 
999                    <#if dateDifference gte (reservierungsZeit_ms + reservierungsZeitPuffer_ms)> 
1000                    <#-- Abgelaufen: ${cur_record.recordId}<br> --> 
1001                        <#--<#assign deletedDDLRecord = ddlRecordLocalService.deleteRecord(cur_record.recordId) >--> 
1002                        <script> 
1003                            Liferay.Service( 
1004                                '/ddl.ddlrecord/delete-record', 
1005
1006                                    recordId: ${cur_record.recordId} 
1007                                }, 
1008                                function (obj) { 
1009 
1010
1011                            ); 
1012                        </script> 
1013 
1014 
1015                    <#elseif (themeDisplay.isSignedIn() && cur_record.userId == user.userId) &&(cur_record.recordId != newDDLRecord.getRecordId()) > 
1016                    <#-- eigene abgelaufene Reservierungen bereinigen --> 
1017                        <#--<#assign deletedDDLRecord = ddlRecordLocalService.deleteRecord(cur_record.recordId) >--> 
1018                        <script> 
1019                            Liferay.Service( 
1020                                '/ddl.ddlrecord/delete-record', 
1021
1022                                    recordId: ${cur_record.recordId} 
1023                                }, 
1024                                function (obj) { 
1025 
1026
1027                            ); 
1028                        </script> 
1029                    <#else> 
1030                        <#assign aktuellRes += 1 > 
1031                    <#-- aktuellRes: ${aktuellRes}<br> --> 
1032                    </#if> 
1033                </#if> 
1034            </#if> 
1035            <#recover> 
1036        </#attempt> 
1037    </#list> 
1038    <#-- aus irgendeinem Grund werden bei Aufruf aus dem Asset Herausgeber immer zwei Reservierungen angelegt --> 
1039 
1040    <#-- Aktuelle Vorreservierungen: ${aktuellRes}<br> --> 
1041 
1042    <#assign anzTeilnehmer = aktuellJa + aktuellVielleicht + aktuellNein> 
1043 
1044    <#assign ausgebucht = false > 
1045    <#if  (anzTickets != 0) && (anzTickets <= (aktuellJa+aktuellRes-1))> 
1046        <#assign ausgebucht = true > 
1047    </#if> 
1048    <#assign wirklichAusgebucht = false > 
1049    <#if  (anzTickets != 0) && (anzTickets <= aktuellJa)> 
1050        <#assign wirklichAusgebucht = true > 
1051    </#if> 
1052    <#-- Ende Rückmeldungen Ermitteln --> 
1053 
1054    <#-- Eigene Rückmeldung prüfen --> 
1055 
1056    <#-- noch ist kein eigener Record gefunden, d.h. ID auf 0 setzen --> 
1057 
1058 
1059 
1060    <#assign myRecord = 0 > 
1061    <#assign essenValue = 0 > 
1062    <#-- weitere Teilnhemer --> 
1063    <#assign partnerErlaubt = false > 
1064    <#assign gaesteErlaubt = false > 
1065 
1066    <#if ddlId?? && ddlId.partner?? && getterUtil.getBoolean(ddlId.partner.getData())> 
1067 
1068        <#if ddlId.getData() == "" > 
1069        <#else> 
1070            <#assign partnerErlaubt = true > 
1071        </#if> 
1072 
1073    </#if> 
1074 
1075    <#if ddlId?? && ddlId.guests?? && getterUtil.getBoolean(ddlId.guests.getData())> 
1076 
1077        <#if ddlId.getData() == "" > 
1078        <#else> 
1079            <#assign gaesteErlaubt = true > 
1080        </#if> 
1081 
1082    </#if> 
1083 
1084 
1085 
1086    <#-- prüfen, ob es eine Rückmeldung des angemeldeten Users gibt --> 
1087    <#-- Records neu einlesen, da sie modifiziert wurden !!! --> 
1088    <#assign records = ddlRecordLocalService.getRecords(recordSetId)> 
1089 
1090    <#if records?has_content> 
1091 
1092        <#list records as cur_record> 
1093 
1094 
1095            <#attempt> 
1096                <#if (cur_record.getDDMFormFieldValues("Veranstaltung")?? && cur_record.getDDMFormFieldValues("Veranstaltung")?first.getValue().getString(locale) == articleId) && cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale) != "res" && (cur_record.userId == user.userId) > 
1097 
1098 
1099 
1100                    <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != "" > 
1101                    <#else> 
1102                        <#assign entscheidung = cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale)> 
1103                    <#-- ${entscheidung}<p> --> 
1104                        <#assign myRecord = cur_record.recordId > 
1105                    <#-- ${myRecord} --> 
1106 
1107 
1108                        <#assign optionsValue = "" > 
1109 
1110 
1111                        <#if cur_record.getDDMFormFieldValues("Optionen")?? > 
1112                            <#assign optionsValue = cur_record.getDDMFormFieldValues("Optionen")?first.getValue().getString(locale) > 
1113                        <#-- Optionen ${optionsValue}<br> --> 
1114 
1115                        </#if> 
1116 
1117                        <#assign optionsComment = "" > 
1118                        <#if cur_record.getDDMFormFieldValues("Kommentar")?? > 
1119                            <#assign optionsComment = cur_record.getDDMFormFieldValues("Kommentar")?first.getValue().getString(locale) > 
1120                        </#if> 
1121 
1122 
1123 
1124                    </#if> 
1125                </#if> 
1126                <#recover> 
1127            </#attempt> 
1128        </#list> 
1129    </#if> 
1130 
1131 
1132 
1133 
1134    <#-- --------------------------------------------- --> 
1135    <#-- Start Autocomplete Name                       --> 
1136    <#-- --------------------------------------------- --> 
1137 
1138    <#assign listeNamen = []> 
1139    <#assign listeEMail = []> 
1140 
1141    <#list records?reverse as cur_record> 
1142        <#attempt> 
1143            <#if (cur_record.getDDMFormFieldValues("Veranstaltung")?? && cur_record.getDDMFormFieldValues("Veranstaltung")?first.getValue().getString(locale) == articleId) > 
1144 
1145            <#else> 
1146            <#-- nur Namen zeigen, die man selbst schon einmal eingegeben hat --> 
1147                <#if user.userId == cur_record.userId > 
1148 
1149                    <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != "" && (user.userId == cur_record.userId)> 
1150 
1151                        <#if listeNamen?seq_contains(cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale))> 
1152                        <#else> 
1153                            <#assign listeNamen = listeNamen + [cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)]> 
1154                            <#if cur_record.getDDMFormFieldValues("eMail")?? > 
1155                                <#assign listeEMail += [cur_record.getDDMFormFieldValues("eMail")?first.getValue().getString(locale)]> 
1156                            <#else> 
1157                                <#assign listeEMail += [""]> 
1158                            </#if> 
1159                        </#if> 
1160 
1161 
1162 
1163                    </#if> 
1164 
1165                </#if> 
1166 
1167            </#if> 
1168            <#recover> 
1169        </#attempt> 
1170    </#list> 
1171 
1172 
1173    <script> 
1174      function autocomplete(inp, arr) { 
1175        /*the autocomplete function takes two arguments, 
1176        the text field element and an array of possible autocompleted values:*/ 
1177        var currentFocus; 
1178        /*execute a function when someone writes in the text field:*/ 
1179        inp.addEventListener("input", function (e) { 
1180          var a, b, i, val = this.value; 
1181          /*close any already open lists of autocompleted values*/ 
1182          closeAllLists(); 
1183          if (!val) { 
1184            return false; 
1185
1186          currentFocus = -1; 
1187          /*create a DIV element that will contain the items (values):*/ 
1188          a = document.createElement("DIV"); 
1189          a.setAttribute("id", this.id + "autocomplete-list"); 
1190          a.setAttribute("class", "autocomplete-items"); 
1191          /*append the DIV element as a child of the autocomplete container:*/ 
1192          this.parentNode.appendChild(a); 
1193          /*for each item in the array...*/ 
1194          for (i = 0; i < arr.length; i++) { 
1195            /*check if the item starts with the same letters as the text field value:*/ 
1196            pos = arr[i].toUpperCase().indexOf(val.toUpperCase()); 
1197 
1198            if (arr[i].substr(pos, val.length).toUpperCase() == val.toUpperCase()) { 
1199              /*create a DIV element for each matching element:*/ 
1200              b = document.createElement("DIV"); 
1201              /*make the matching letters bold:*/ 
1202              b.innerHTML = arr[i].substr(0, pos) 
1203              b.innerHTML += "<strong>" + arr[i].substr(pos, val.length) + "</strong>"; 
1204              b.innerHTML += arr[i].substr(pos + val.length); 
1205              /*insert a input field that will hold the current array item's value:*/ 
1206              b.innerHTML += "<input type='hidden' value='" + arr[i] + "'>"; 
1207              /*execute a function when someone clicks on the item value (DIV element):*/ 
1208              b.addEventListener("click", function (e) { 
1209                /*insert the value for the autocomplete text field:*/ 
1210                inp.value = this.getElementsByTagName("input")[0].value; 
1211                /* generate blur event on updated field */ 
1212                inp.focus(); 
1213                inp.blur(); 
1214 
1215                /*close the list of autocompleted values, 
1216                (or any other open lists of autocompleted values:*/ 
1217                closeAllLists(); 
1218              }); 
1219              a.appendChild(b); 
1220
1221
1222        }); 
1223        /*execute a function presses a key on the keyboard:*/ 
1224        inp.addEventListener("keydown", function (e) { 
1225          var x = document.getElementById(this.id + "autocomplete-list"); 
1226          if (x) x = x.getElementsByTagName("div"); 
1227          if (e.keyCode == 40) { 
1228            /*If the arrow DOWN key is pressed, 
1229            increase the currentFocus variable:*/ 
1230            currentFocus++; 
1231            /*and and make the current item more visible:*/ 
1232            addActive(x); 
1233          } else if (e.keyCode == 38) { //up 
1234            /*If the arrow UP key is pressed, 
1235            decrease the currentFocus variable:*/ 
1236            currentFocus--; 
1237            /*and and make the current item more visible:*/ 
1238            addActive(x); 
1239          } else if (e.keyCode == 13) { 
1240            /*If the ENTER key is pressed, prevent the form from being submitted,*/ 
1241            e.preventDefault(); 
1242            if (currentFocus > -1) { 
1243              /*and simulate a click on the "active" item:*/ 
1244              if (x) x[currentFocus].click(); 
1245
1246
1247        }); 
1248 
1249        function addActive(x) { 
1250          /*a function to classify an item as "active":*/ 
1251          if (!x) return false; 
1252          /*start by removing the "active" class on all items:*/ 
1253          removeActive(x); 
1254          if (currentFocus >= x.length) currentFocus = 0; 
1255          if (currentFocus < 0) currentFocus = (x.length - 1); 
1256          /*add class "autocomplete-active":*/ 
1257          x[currentFocus].classList.add("autocomplete-active"); 
1258
1259 
1260        function removeActive(x) { 
1261          /*a function to remove the "active" class from all autocomplete items:*/ 
1262          for (var i = 0; i < x.length; i++) { 
1263            x[i].classList.remove("autocomplete-active"); 
1264
1265
1266 
1267        function closeAllLists(elmnt) { 
1268          /*close all autocomplete lists in the document, 
1269          except the one passed as an argument:*/ 
1270          var x = document.getElementsByClassName("autocomplete-items"); 
1271          for (var i = 0; i < x.length; i++) { 
1272            if (elmnt != x[i] && elmnt != inp) { 
1273              x[i].parentNode.removeChild(x[i]); 
1274
1275
1276
1277 
1278        /*execute a function when someone clicks in the document:*/ 
1279        document.addEventListener("click", function (e) { 
1280          closeAllLists(e.target); 
1281        }); 
1282
1283 
1284      /*An array containing all the country names in the world:*/ 
1285 
1286      <#-- @ G. Ortwein - Korrektur --> 
1287      <#if themeDisplay.isSignedIn()> 
1288      var vorschlaege = [<#list listeNamen?sort as datensatz >"${datensatz?replace("\"","")?replace("'","")}", </#list>]; 
1289      var jsListeNamen = [<#list listeNamen as datensatz >"${datensatz?replace("\"","")?replace("'","")}", </#list>]; 
1290      var jsListeEMail = [<#list listeEMail as datensatz >"${datensatz?replace("\"","")?replace("'","")}", </#list>]; 
1291      <#else> 
1292      var vorschlaege = []; 
1293      var jsListeNamen = []; 
1294      var jsListeEMail = []; 
1295      </#if> 
1296 
1297 
1298      /*initiate the autocomplete function on the "recordNewName" element, and pass along the countries array as possible autocomplete values:*/ 
1299 
1300      console.log("Autocomplete VORSCHLAEGE:", vorschlaege); 
1301      console.log("jsListeNamen:", jsListeNamen); 
1302      console.log("jsListeEMail:", jsListeEMail); 
1303 
1304      //console.log(vorschlaege); 
1305      //autocomplete(document.getElementById("recordNewName"), vorschlaege); 
1306 
1307 
1308    </script> 
1309 
1310 
1311    <#-- --------------------------------------------- --> 
1312    <#-- Ende Autocomplete Name                       --> 
1313    <#-- --------------------------------------------- --> 
1314 
1315    <div class="abstract row justify-content-center pt-2"> 
1316        <div class="col-md-7"> 
1317            <hr> 
1318 
1319            <#-- hier beginnt die Ausgabe des Rückmeldefelds für die Anmeldung zur Veranstaltung --> 
1320            <div id="rueckmeldung"></div> 
1321            <div id="MyFeedbackAnker2">&nbsp;</div> 
1322            <div id="MyFeedbackAnker1"><h3>Meine R&uuml;ckmeldung</h3></div> 
1323 
1324            <#-- ergänzt, dass Gäste ihren Namen nennen müssen --> 
1325            <#if !themeDisplay.isSignedIn() && gastRegistrierungErlaubt> 
1326            <div class="anmeldenameFeld"> 
1327                <#else> 
1328                <div class="anmeldenameFeld" hidden> 
1329                    </#if> 
1330                    <form id="partnerGastNameForm"> 
1331                        <div class="row"> 
1332                            <div class="col-md-6"> 
1333                                <label for="partnerGastName">F&uuml;r</label> 
1334                                <div class="autocomplete w-100"> 
1335                                    <input type="text" autocomplete="off" id="partnerGastName" name="partnerGastName" 
1336                                           value="" class="form-control" 
1337                                           placeholder="bitte den Namen eingeben" onblur="ensureNameFilled()"> 
1338                                </div> 
1339                            </div> 
1340                            <div class="col-md-6"> 
1341                                <label for="partnerGastEMail">E-Mail</label> 
1342                                <div class="autocomplete w-100"> 
1343                                    <input type="text" autocomplete="off" id="partnerGastEMail" name="partnerGastEMail" 
1344                                           value="" class="form-control" 
1345                                           placeholder="bitte die E-Mail eingeben" onblur="ensureNameFilled()"> 
1346                                </div> 
1347                            </div> 
1348                        </div> 
1349                        <input type="hidden" id="activeRecordSet" name="activeRecordSet" value="${myRecord}"> 
1350                        <input type="hidden" id="activeRecordCreationKey" name="activeRecordCreationKey" 
1351                               value="${myRecordCreationKey}"><br> 
1352                    </form> 
1353                </div> 
1354 
1355                <script> 
1356                  autocomplete(document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']"), vorschlaege); 
1357                </script> 
1358 
1359 
1360                <#-- ---------------- Start Ausgabe der Optionen  --> 
1361 
1362                <div class="rm-option-form"> 
1363                    <p> 
1364                    <form id="rmOptionsForm"> 
1365                        <#if optionsValue != "" > 
1366                            <#assign selectedOptions = optionsValue?eval> 
1367                        </#if> 
1368                        <#if options.getSiblings()?has_content> 
1369                            <#list options.getSiblings() as cur_options> 
1370                                <#if cur_options.getData()?replace("\\W", "", "r") != ""> 
1371 
1372                                    <label for="${cur_options.getData()?replace("\\W", "", "r")}">${cur_options.getData()}</label> 
1373                                    <br> 
1374 
1375                                    <select class="form-control" 
1376                                            name="${cur_options.getData()?replace("\\W", "", "r")}" 
1377                                            id="${cur_options.getData()?replace("\\W", "", "r")}" 
1378                                            onblur="updateAttendanceButtons ('update')" 
1379                                            <#if getterUtil.getBoolean(cur_options.multipleChoicePossible.getData())> 
1380                                            multiple> 
1381                                        <#else> 
1382
1383                                        </#if> 
1384                                        <option value="">--bitte eine Auswahl treffen--</option> 
1385                                        <#if cur_options.optionAnswer.getSiblings()?has_content> 
1386                                            <#list cur_options.optionAnswer.getSiblings() as cur_options_optionAnswer> 
1387 
1388                                                <#if optionsValue != "" > 
1389                                                    <#assign basis = cur_options.getData()?replace("\\W", "", "r") > 
1390                                                    <#assign suchstring = cur_options_optionAnswer.getData()?replace("\\W", "", "r") > 
1391                                                </#if> 
1392                                            <#-- ${selectedOptions.basis?seq_index_of("${suchstring}")} --> 
1393                                                <#if cur_options_optionAnswer.getData()?replace("\\W", "", "r") != ""> 
1394                                                    <option value="${cur_options_optionAnswer.getData()?replace("\\W", "", "r")}" 
1395                                                            <#if optionsValue != "" && selectedOptions[basis]?? > 
1396                                                                ${selectedOptions[basis]?seq_contains(suchstring)?string("selected", "")} 
1397                                                            </#if> 
1398                                                    >${cur_options_optionAnswer.getData()} </option> 
1399                                                </#if> 
1400 
1401                                            </#list> 
1402 
1403                                        </#if> 
1404                                    </select><br> 
1405                                </#if> 
1406 
1407                            </#list> 
1408                        </#if> 
1409 
1410 
1411                    </form> 
1412                    </p> 
1413                </div> 
1414 
1415 
1416                <#-- Start Kommentarfeld --> 
1417 
1418                <div class="rm-comment-form"> 
1419 
1420                    <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 > 
1421                        <style> 
1422 
1423                            form { 
1424                                width: 100%; 
1425
1426 
1427                            label, textarea { 
1428                                width: 100%; 
1429                                font-size: 1em; 
1430
1431 
1432                            textarea { 
1433                                resize: vertical; 
1434                                width: 100%; 
1435                                height: 200px; 
1436                                background: #F1F2F5; 
1437                                border: solid 1px #EAEBF0; 
1438                                border-radius: 5px; 
1439                                padding: 1em; 
1440                                font-size: 1em; 
1441                                color: black; 
1442
1443 
1444                        </style> 
1445 
1446                        <form id="rmCommentForm"> 
1447                            <table width="100%"> 
1448                                <tr><label>Anmerkungen</label></tr> 
1449                                <tr> 
1450                                    <td><textarea id="participantComment" 
1451                                                  maxlength="${lionsEventDisplayModel.getCommentCharacterAmount()+5}" 
1452                                                  class="character-limit" 
1453                                                  placeholder="Eigene Anmerkungen... (max. ${lionsEventDisplayModel.getCommentCharacterAmount()} Zeichen)">${optionsComment}</textarea> 
1454                                    </td> 
1455                                </tr> 
1456                                <tr> 
1457                                    <td align="right"><label>&nbsp;<span 
1458                                                    class="counter">0</span>/${lionsEventDisplayModel.getCommentCharacterAmount()} 
1459                                        </label></td> 
1460                                </tr> 
1461                            </table> 
1462                        </form> 
1463 
1464                        <script> 
1465                            document.addEventListener('DOMContentLoaded', function () { 
1466                                document.querySelector('.character-limit').addEventListener('keyup', function (ev) { 
1467                                    let input = document.querySelector('.character-limit'); 
1468                                    let limit = ${lionsEventDisplayModel.getCommentCharacterAmount()}; // Max. Anz. Zeichen 
1469                                    let count = input.value.length; 
1470                                    document.querySelector('.counter').innerHTML(count); 
1471                                    if (count > limit) { 
1472                                        input.setAttribute('style', 'background:red;color:white'); 
1473                                    } else { 
1474                                        input.setAttribute('style', 'background:#F1F2F5;color:black'); 
1475
1476                                }); 
1477                            }); 
1478                        </script> 
1479 
1480                    <#else> 
1481                        <form id="rmCommentForm" hidden> 
1482                            <textarea id="participantComment"></textarea> 
1483                        </form> 
1484 
1485                    </#if> 
1486 
1487                </div> 
1488 
1489                <#-- Ende Kommentarfeld --> 
1490 
1491 
1492 
1493                <#-- Optionen auslesen --> 
1494 
1495 
1496                <script> 
1497                  var ${randomNamespace}optionsMap = ${jsonFactoryUtil.looseSerializeDeep( complex_options_map)}; 
1498                  ${randomNamespace}res = JSON.parse(${randomNamespace}optionsMap); 
1499                  console.log(${randomNamespace}res); 
1500 
1501                  var ${randomNamespace}gewOpt = ""; 
1502 
1503 
1504                  function handleOptionsForm(tnOptionsForm) { 
1505 
1506                    const data = new FormData(tnOptionsForm); 
1507 
1508                    const formJSON = Object.fromEntries(data.entries()); 
1509                    console.log(formJSON); 
1510 
1511                    <#if options.getSiblings()?has_content> 
1512                    <#list options.getSiblings() as cur_options> 
1513                    <#if cur_options.getData()?replace("\\W", "", "r") != ""> 
1514                    formJSON.${cur_options.getData()?replace("\\W", "", "r")} = data.getAll('${cur_options.getData()?replace("\\W", "", "r")}'); 
1515                    </#if> 
1516                    </#list> 
1517                    </#if> 
1518 
1519                    ${randomNamespace}gewOpt = JSON.stringify(formJSON, null, 2); 
1520 
1521                    <#-- Handle Name fuer Partner und Gäste --> 
1522                    if (document.querySelector("div.anmeldenameFeld").hidden == false) { 
1523                      if (document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value == "") { 
1524                        alert("Bitte geben Sie den Namen des Partners / Gastes ein!"); 
1525                        document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").focus(); 
1526                        return false; 
1527
1528
1529 
1530                    return true; 
1531
1532 
1533                </script> 
1534 
1535 
1536                <#-- ------------  Ende Ausgabe der Optionen   ----------------------- --> 
1537 
1538 
1539                <#-- Zu- Absage Buttons --> 
1540 
1541                <#-- noch nichts ausgewählt --> 
1542 
1543                <#--  add update request Start --> 
1544 
1545                <script type="text/javascript"> 
1546 
1547                  var activeElement; 
1548 
1549                  function sendAttendanceAddUpdateRequest(value, element) { 
1550                    <#if !anmeldungAbgelaufen> 
1551                    var ausgebucht = ${ausgebucht?string("true", "false")}; 
1552                    var wirklichAusgebucht = ${wirklichAusgebucht?string("true", "false")}; 
1553                    var vorReserviert = ${vorReserviert?string("true", "false")}; 
1554                    var buchungErlaubt = true; 
1555                    <#if vorReserviert> 
1556                    var dateTimeVorReserviert = ${dateTimeVorReserviert?long}; 
1557                    var reservierungsZeit_ms = ${reservierungsZeit_ms}; 
1558                    var aktuelleZeit = Date.now(); 
1559                    var zeitDifferenz = aktuelleZeit - dateTimeVorReserviert; 
1560                    var gueltigeReservierung = (zeitDifferenz < reservierungsZeit_ms); 
1561                    console.log("Zeitpunkt Vorreservierung: ", dateTimeVorReserviert); 
1562                    console.log("aktuelle Zeit: ", aktuelleZeit); 
1563                    console.log("zeitDifferenz: ", zeitDifferenz); 
1564                    console.log("Gueltige Reservierung: ", gueltigeReservierung); 
1565 
1566                    if (!gueltigeReservierung || ausgebucht) { 
1567                      buchungErlaubt = false; 
1568
1569 
1570                    </#if> 
1571 
1572                    <#-- 
1573                        console.log("Green Disabled", $('.attendance-submit-button.green').hasClass('disabled')); 
1574                    --> 
1575                    var greenDisabled = document.querySelector('.attendance-submit-button.green').classList.contains('disabled'); 
1576                    var yellowDisabled = document.querySelector('.attendance-submit-button.yellow')?.classList.contains('disabled'); 
1577                    var redDisabled = document.querySelector('.attendance-submit-button.red').classList.contains('disabled'); 
1578 
1579                    if (!greenDisabled && yellowDisabled && redDisabled) { 
1580                      buchungErlaubt = true; 
1581
1582 
1583                    console.log("Buchung erlaubt", buchungErlaubt); 
1584 
1585                    if (value === "ja" && !buchungErlaubt) { 
1586                      if (wirklichAusgebucht) { 
1587                        alert("Diese Veranstaltung ist ausgebucht."); 
1588                        window.location.reload(false); 
1589                      } else { 
1590                        alert("Zu dieser Veranstaltung sind derzeit keine weiteren Anmeldungen möglich, da alle verbliebenen Tickets für laufende Buchungsprozesse vorreserviert sind. Bitte versuchen Sie es später."); 
1591                        window.location.reload(false); 
1592
1593 
1594                    } else { 
1595                      activeElement = element; 
1596 
1597                      <#-- sicherstellen, dass die Optionen aktuell sind --> 
1598                      var rmOptionsForm = document.querySelector("div.rm-option-form form") 
1599                      var valid = handleOptionsForm(rmOptionsForm); 
1600 
1601                      if (!valid) { 
1602                        // z.B. wenn kein Name angegeben wurde 
1603                        return false; 
1604
1605 
1606                      var optTxt = ${randomNamespace}gewOpt; 
1607                      <#-- im Fall der Absage keine Optionen speichern --> 
1608                      if (value === "nein") { 
1609                        optTxt = ""; 
1610
1611                      <#-- im Fall keine Optionen auch keine Optionen speichern --> 
1612                      if (optTxt === "{}") { 
1613                        optTxt = ""; 
1614
1615 
1616 
1617                      var nameField = document.querySelector("div.anmeldenameFeld input[id='partnerGastName']"); 
1618                      //console.log("nameField: ", nameField.value); 
1619 
1620                      var partnerGastEMail = document.querySelector("div.anmeldenameFeld input[id='partnerGastEMail']"); 
1621                      //console.log("partnerGastEMail: ", partnerGastEMail.value); 
1622 
1623                      var activeRecordCreationKey = document.querySelector("div.anmeldenameFeld input[id='activeRecordCreationKey']"); 
1624                      //console.log("activeRecordCreationKey: ", activeRecordCreationKey.value); 
1625 
1626                      var participantComment = document.querySelector("div.rm-comment-form textarea[id='participantComment']"); 
1627                      //console.log("participantComment: ", participantComment.value); 
1628 
1629                      var recordIdField = document.querySelector("div.anmeldenameFeld input[id='activeRecordSet']"); 
1630                      //console.log("recordIdField: ", recordIdField.value); 
1631 
1632 
1633                      if (parseInt(recordIdField.value) == 0) { 
1634                        Liferay.Service( 
1635                          '/ddl.ddlrecord/add-record', 
1636
1637                            groupId: ${groupId}, 
1638                            recordSetId: ${recordSetId}, 
1639                            displayIndex: 0, 
1640                            fieldsMap: JSON.stringify({ 
1641                              "Veranstaltung": "${articleId}", 
1642                              "Name": nameField.value, 
1643                              "eMail": partnerGastEMail.value, 
1644                              "Teilnahme": value, 
1645                              "Optionen": optTxt, 
1646                              "Kommentar": participantComment.value, 
1647                              "Key": activeRecordCreationKey.value 
1648                            }) 
1649                          }, 
1650                          function (obj) { 
1651                            document.querySelectorAll('.attendance-submit-button').forEach(function (el) { 
1652                              el.classList.add('disabled') 
1653                            }); 
1654                            activeElement?.classList.remove('disabled') 
1655                            console.log(obj); 
1656 
1657                            <#-- @ G. Ortwein - dis ist neu --> 
1658                            <#-- Start Use local Storage --> 
1659                            <#-- Wenn der User nicht angemeldet ist, notwendige Anmeldedetails lokal speichern --> 
1660 
1661                            <#if !themeDisplay.isSignedIn() > 
1662 
1663                            localTnListItem = 'TNLIST${recordSetId}A${articleId}'; 
1664                            localTnListNew = JSON.stringify({ 
1665                              "tnListe": [{ 
1666                                "tnId": obj.recordId, 
1667                                "Veranstaltung": "${articleId}", 
1668                                "Name": nameField.value, 
1669                                "eMail": partnerGastEMail.value, 
1670                                "Teilnahme": value, 
1671                                "Optionen": optTxt, 
1672                                "Kommentar": participantComment.value, 
1673                                "Key": activeRecordCreationKey.value 
1674                              }] 
1675                            }); 
1676 
1677 
1678                            bisherigeTn = JSON.parse(localStorage.getItem(localTnListItem)); 
1679                            neueTn = JSON.parse(localTnListNew); 
1680 
1681                            if (bisherigeTn !== null) { 
1682                              for (i = 0; i < bisherigeTn.tnListe.length; i++) { 
1683                                neueTn.tnListe[i + 1] = bisherigeTn.tnListe[i]; 
1684
1685
1686                            localStorage.setItem(localTnListItem, JSON.stringify(neueTn)); 
1687                            </#if> 
1688 
1689                            <#-- Ende Use local Storage --> 
1690 
1691                            window.location.reload(false); 
1692
1693                        ); 
1694                      } else { 
1695                        Liferay.Service( 
1696                          '/ddl.ddlrecord/update-record', 
1697
1698                            recordId: recordIdField.value, 
1699                            displayIndex: 0, 
1700                            fieldsMap: JSON.stringify({ 
1701                              "Veranstaltung": "${articleId}", 
1702                              "Name": nameField.value, 
1703                              "eMail": partnerGastEMail.value, 
1704                              "Teilnahme": value, 
1705                              "Optionen": optTxt, 
1706                              "Kommentar": participantComment.value, 
1707                              "Essen": "" 
1708                            }), 
1709                            mergeFields: true 
1710                          }, 
1711                          function (obj) { 
1712                            document.querySelectorAll('.attendance-submit-button').forEach(function (el) { 
1713                              el.classList.add('disabled') 
1714                            }); 
1715                            activeElement?.classList.remove('disabled') 
1716                            console.log(obj); 
1717                            window.location.reload(false); 
1718
1719                        ); 
1720
1721
1722                    <#else> 
1723                    alert("Die Anmledefrist für diese Veranstaltung ist abgelaufen."); 
1724                    window.location.reload(false); 
1725                    </#if> 
1726 
1727
1728 
1729                </script> 
1730 
1731 
1732                <#--      add update request Ende  --> 
1733 
1734 
1735                <#-- ausgabe der zu / absage Buttons --> 
1736                <div class="visualisation-and-selection-attendance"> 
1737                    <table> 
1738                        <tr> 
1739                            <td> 
1740                                <#-- ja --> 
1741                                <#if myRecord == 0 > 
1742                                <#if !ausgebucht && !anmeldungAbgelaufen> 
1743                                <div class="attendance-submit-button green" 
1744                                     onclick="sendAttendanceAddUpdateRequest('ja', this)"> 
1745                                    <@clay["icon"] symbol="check"/> 
1746                                    <#else> 
1747                                        <div class="attendance-submit-button green disabled"> 
1748                                            <@clay["icon"] symbol="check"/> 
1749                                        </div> 
1750                                    </#if> 
1751 
1752                                    <#else> 
1753                                        <#if entscheidung == "ja" > 
1754                                            <div class="attendance-submit-button green" 
1755                                                 onclick="sendAttendanceAddUpdateRequest('ja', this)"> 
1756                                                <@clay["icon"] symbol="check"/> 
1757                                            </div> 
1758                                        <#else> 
1759                                            <#if !ausgebucht && !anmeldungAbgelaufen> 
1760                                                <div class="attendance-submit-button green disabled" 
1761                                                     onclick="sendAttendanceAddUpdateRequest('ja', this)"> 
1762                                                    <@clay["icon"] symbol="check"/> 
1763                                                </div> 
1764                                            <#else> 
1765                                                <div class="attendance-submit-button green disabled"> 
1766                                                    <@clay["icon"] symbol="check"/> 
1767                                                </div> 
1768                                            </#if> 
1769 
1770                                        </#if> 
1771                                    </#if> 
1772 
1773                            </td> 
1774                            <#if ddlId.possibleRegistrationTypes?? && ddlId.possibleRegistrationTypes.getData()?has_content && ddlId.possibleRegistrationTypes.getData() == "jn" > 
1775                            <#else> 
1776                                <td> 
1777                                    <#-- vielleicht --> 
1778                                    <#if myRecord == 0 > 
1779                                        <div class="attendance-submit-button yellow" 
1780                                             onclick="sendAttendanceAddUpdateRequest('vielleicht', this)"> 
1781                                            <@clay["icon"] symbol="question-circle"/> 
1782                                        </div> 
1783                                    <#else> 
1784                                        <#if entscheidung == "vielleicht" > 
1785                                            <div class="attendance-submit-button yellow" 
1786                                                 onclick="sendAttendanceAddUpdateRequest('vielleicht', this)"> 
1787                                                <@clay["icon"] symbol="question-circle"/> 
1788                                            </div> 
1789                                        <#else> 
1790                                            <div class="attendance-submit-button yellow disabled" 
1791                                                 onclick="sendAttendanceAddUpdateRequest('vielleicht', this)"> 
1792                                                <@clay["icon"] symbol="question-circle"/> 
1793                                            </div> 
1794                                        </#if> 
1795                                    </#if> 
1796                                </td> 
1797                            </#if> 
1798 
1799                            <td> 
1800                                <#-- nein --> 
1801                                <#if myRecord == 0 > 
1802                                    <div class="attendance-submit-button red" 
1803                                         onclick="sendAttendanceAddUpdateRequest('nein', this)"> 
1804                                        <@clay["icon"] symbol="times-small"/> 
1805                                    </div> 
1806                                <#else> 
1807                                    <#if entscheidung == "nein" > 
1808                                        <div class="attendance-submit-button red" 
1809                                             onclick="sendAttendanceAddUpdateRequest('res', this)"> 
1810                                            <@clay["icon"] symbol="trash"/> 
1811                                        </div> 
1812                                    <#else> 
1813                                        <div class="attendance-submit-button red disabled" 
1814                                             onclick="sendAttendanceAddUpdateRequest('nein', this)"> 
1815                                            <@clay["icon"] symbol="times-small"/> 
1816                                        </div> 
1817                                    </#if> 
1818                                </#if> 
1819                            </td> 
1820                    </table> 
1821                </div> 
1822 
1823                <#-- Ende der Ausgabe der Zu-/Absage Buttons --> 
1824 
1825                <#-- TESTENDE --> 
1826 
1827                <#if wirklichAusgebucht> 
1828                    <div class="portlet-msg-alert"> 
1829                        Diese Veranstaltung ist ausgebucht. 
1830                    </div> 
1831                <#elseif ausgebucht> 
1832                    <div class="portlet-msg-alert"> 
1833                        Zu dieser Veranstaltung sind derzeit keine weiteren Anmeldungen m&ouml;glich, da alle 
1834                        verbliebenen Tickets f&uuml;r 
1835                        laufende Buchungsprozesse vorreserviert sind. Bitte versuchen Sie es sp&auml;ter. 
1836                    </div> 
1837                </#if> 
1838 
1839                <#if themeDisplay.isSignedIn() && !ausgebucht && !anmeldungAbgelaufen && (gaesteErlaubt || partnerErlaubt || (user.userId == articleAuthorId) ) > 
1840                    <hr> 
1841                    <p> 
1842                        <b>Zu diesem Termin k&ouml;nnen auch 
1843                            ${partnerErlaubt?string("Partner ", "")} 
1844                            ${(partnerErlaubt && gaesteErlaubt)?string("und ", "")} 
1845                            ${gaesteErlaubt?string("G&auml;ste ", "")} 
1846                            ${(partnerErlaubt || gaesteErlaubt)?string("und ", "")} 
1847                            ${(user.userId == articleAuthorId)?string("weitere Teilnehmer", "")} 
1848                            angemeldet werden.</b> 
1849 
1850                        <#if user.userId == articleAuthorId > 
1851                            <br>Als Ersteller dieses Termins k&ouml;nnen Sie zu diesem Termin auch R&uuml;ckmeldungen weiterer Teilnehmer erg&auml;nzen, die diese nicht selbst eingeben. 
1852                        </#if> 
1853                    </p> 
1854                    <p> 
1855                    <form id="partnerGast"> 
1856                        <button class="btn btn-secondary" 
1857                                type="button" 
1858                                onclick="updateEntryInputField ('div.anmeldenameFeld', '', '', '0','${myRecordCreationKey}', 'div.rm-option-form', '', 'div.visualisation-and-selection-attendance', 'all','div.rm-comment-form','')"> 
1859                            ${(user.userId == articleAuthorId)?string("Teilnehmer", "")}${((user.userId == articleAuthorId)&&(partnerErlaubt || gaesteErlaubt))?string(", ", "")} 
1860                            ${partnerErlaubt?string("Partner ", "")} 
1861                            ${(partnerErlaubt && gaesteErlaubt)?string("oder ", "")} 
1862                            ${gaesteErlaubt?string("Gast ", "")}anmelden 
1863                        </button> 
1864                    </form> 
1865                    </p> 
1866                </#if> 
1867 
1868 
1869                <#if user.userId == articleAuthorId> 
1870 
1871                <#-- Rollen finden 
1872                <#assign usrRoles = user.getRoles()> 
1873 
1874                <#list usrRoles as usrRole> 
1875 
1876                    ${usrRole.getName()}<br> 
1877 
1878                </#list> 
1879 
1880                <#assign usrGroups = user.getGroups()> 
1881 
1882                <#list usrGroups as usrGroup> 
1883 
1884                    ${usrGroup.getName()}<br> 
1885 
1886                </#list> 
1887 
1888                --> 
1889                </#if> 
1890 
1891                <#if anzTeilnehmer gt 0> 
1892 
1893            <hr> 
1894                <h3>Insgesamt ${anzTeilnehmer} R&uuml;ckmeldungen</h3> 
1895                <#if aktuellJa gt 0> 
1896                    <@clay["icon"] symbol="check"/> = ${aktuellJa} 
1897                    <#if anzTickets gt 0> 
1898                        von ${anzTickets} 
1899                    </#if> 
1900                    &nbsp;&nbsp;&nbsp; 
1901                </#if> 
1902                <#if aktuellVielleicht gt 0> 
1903                    <@clay["icon"] symbol="question-circle"/> = ${aktuellVielleicht}&nbsp;&nbsp;&nbsp; 
1904                </#if> 
1905                <#if aktuellNein gt 0> 
1906                    <@clay["icon"] symbol="times-small"/> = ${aktuellNein} 
1907                </#if> 
1908                <p> 
1909                    </#if> 
1910 
1911 
1912                    <#-- hier benginnt die Liste --> 
1913                    <#if records?has_content> 
1914 
1915                    <#-- Klären, ob der Betrachter der Seite der Teilnehmer sehen darf --> 
1916                    <#assign 
1917                    <#-- teilnehmer bereich nur anzeigen wenn eingeloggt && (admin || author || hat rückmeldung gegeben)--> 
1918                    <#-- teilnehmerAnzeigen = themeDisplay.isSignedIn() && (themeDisplay.getPermissionChecker().isCompanyAdmin() || themeDisplay.getUserId() == articleAuthorId || validator.isNotNull(lionsEventDisplayModel.getUserRegistrationStatus(themeDisplay.getUserId())))--> 
1919                    teilnehmerAnzeigen = lionsEventDisplayModel.showRegisteredUsersArea(themeDisplay) 
1920                    alleTeilnehmerAnzeigen = lionsEventDisplayModel.showAllRegisteredUsers(themeDisplay) 
1921
1922 
1923                    <#assign 
1924                    listDownloadText = "Veranstaltung:;" + .vars['reserved-article-title'].data?url('ISO-8859-1') + "\r\n"?url('ISO-8859-1') 
1925                    listDownloadText = listDownloadText + "Datum:;" + lionsEventDisplayModel.getStartDateFormatted() + "\r\n"?url('ISO-8859-1') 
1926                    listDownloadText = listDownloadText + "Beginn:;" +  lionsEventDisplayModel.getStartTimeFormatted() + "\r\n\r\n"?url('ISO-8859-1') 
1927                    /> 
1928 
1929                    <#-- @ G. Ortwein das ist neu --> 
1930                    <#-- Start Use local Storage --> 
1931                    <#-- Wenn der User nicht angemeldet ist, notwendige Anmeldedetails lokal speichern --> 
1932 
1933                    <#if !teilnehmerAnzeigen && !alleTeilnehmerAnzeigen > 
1934            <hr> 
1935                <div id="weitereTnVorhanden"></div> 
1936 
1937                <script> 
1938                  localTnListItem = 'TNLIST${recordSetId}A${articleId}'; 
1939                  bisherigeTn = JSON.parse(localStorage.getItem(localTnListItem)); 
1940 
1941                  if (bisherigeTn !== null) { 
1942                    ausgabeText = "<h3>Von diesem Ger&auml;t aus wurden bereits folgende Teilnehmer angemeldet:</h3><p><table style=\"width:100%\"><tr><td><b>Name</b></td><td><b>R&uuml;ckmeldung</b></td><#-- <td><b>Ticket Nr.</b></td><td align=center><b>QR</b></td> --> <td align=center><nobr><i class=\"icon-ok\"><i class=\"icon-circle-blank\"><i class=\"icon-remove\"></nobr></td></tr>"; 
1943                    for (i = 0; i < bisherigeTn.tnListe.length; i++) { 
1944                      ausgabeText = ausgabeText + "<tr><td>" + bisherigeTn.tnListe[i].Name + "</td>"; 
1945 
1946                      <#-- 
1947                      ausgabeText = ausgabeText + "<td>" + bisherigeTn.tnListe[i].tnId +"</td>"; 
1948                      ausgabeText = ausgabeText + "<td align=center><div class=\"QR" +bisherigeTn.tnListe[i].tnId+ "\" onclick='showQRcode(" +bisherigeTn.tnListe[i].tnId+",\""+ bisherigeTn.tnListe[i].Name + "\")'><i class=\"fas fa-qrcode\"></i></div></i></td>"; 
1949                      --> 
1950 
1951                      <#-- @ G. Ortwein - das müsste iregendwie schöner gehen... 
1952                      mir fiel aber ichts besseres ein --> 
1953 
1954                      ausgabeOptText = "<td><small>"; 
1955 
1956                      if (bisherigeTn.tnListe[i].Optionen != "") { 
1957                        rO = JSON.parse(bisherigeTn.tnListe[i].Optionen); 
1958 
1959                        <#if options.getSiblings()?has_content> 
1960                        <#list options.getSiblings() as cur_options> 
1961                        <#if cur_options.getData() !=""> 
1962                        <#assign basis = cur_options.getData()?replace("\\W", "", "r") > 
1963                        ausgabeOptText += "<b>${cur_options.getData()}:</b>"; 
1964                        selectedOptions = JSON.stringify(rO, ["${basis}"], 0); 
1965 
1966                        if (selectedOptions != "{}") { 
1967                          selectedOptionsObj = JSON.parse(selectedOptions); 
1968                          var anzSelOpt = 0; 
1969                          <#list cur_options.optionAnswer.getSiblings() as cur_options_optionAnswer> 
1970                          <#assign suchstring = cur_options_optionAnswer.getData()?replace("\\W", "", "r") > 
1971                          if (selectedOptionsObj.${basis}.includes("${suchstring}")) { 
1972                            if (anzSelOpt > 0) { 
1973                              ausgabeOptText += " |"; 
1974
1975                            ausgabeOptText += " ${cur_options_optionAnswer.getData()}"; 
1976                            anzSelOpt += 1; 
1977
1978 
1979 
1980                          </#list> 
1981
1982 
1983                        if (bisherigeTn.tnListe[i].Kommentar != "") { 
1984                          ausgabeOptText += "<br>"; 
1985                          ausgabeOptText += "<b>Anmerkungen:</b>"; 
1986                          ausgabeOptText += bisherigeTn.tnListe[i].Kommentar; 
1987
1988 
1989                        ausgabeOptText += "<br>"; 
1990                        </#if> 
1991                        </#list> 
1992                        </#if> 
1993 
1994 
1995
1996                      ausgabeOptText += "</small></td>"; 
1997 
1998                      ausgabeText += ausgabeOptText; 
1999 
2000                      ausgabeText = ausgabeText + "<td align=\"center\" valign=\"center\">"; 
2001                      if (bisherigeTn.tnListe[i].Teilnahme == "ja") { 
2002                        ausgabeText = ausgabeText + "<div class=\"attendance-visual green\">"; 
2003                        ausgabeText = ausgabeText + "<@clay["icon"] symbol="check"/>"; 
2004                        ausgabeText = ausgabeText + "</div>"; 
2005
2006 
2007                      if (bisherigeTn.tnListe[i].Teilnahme == "vielleicht") { 
2008                        ausgabeText = ausgabeText + "<div class=\"attendance-visual yellow\">"; 
2009                        ausgabeText = ausgabeText + "<@clay["icon"] symbol="question-circle"/>"; 
2010                        ausgabeText = ausgabeText + "</div>"; 
2011
2012 
2013                      if (bisherigeTn.tnListe[i].Teilnahme == "nein") { 
2014                        ausgabeText = ausgabeText + "<div class=\"attendance-visual red\">"; 
2015                        ausgabeText = ausgabeText + "<@clay["icon"] symbol="times-small"/>"; 
2016                        ausgabeText = ausgabeText + "</div>"; 
2017
2018                      ausgabeText = ausgabeText + "</td></tr>"; 
2019
2020                    ausgabeText = ausgabeText + "</table></p><p>&nbsp</p>"; 
2021 
2022                    document.getElementById("weitereTnVorhanden").innerHTML = ausgabeText; 
2023
2024                </script> 
2025                </#if> 
2026 
2027                <#-- Ende Use local Storage --> 
2028 
2029                <#if teilnehmerAnzeigen || alleTeilnehmerAnzeigen > 
2030                    <hr> 
2031                    <table width=100%> 
2032                        <tr style="border-bottom: 2px solid #ddd;"> 
2033                            <td align="left" width="30%"><b>Name</b></td> 
2034                            <#assign listDownloadText = listDownloadText + "Name;" > 
2035                            <td align="left" width="50%"><b>R&uuml;ckmeldung</b></td> 
2036                            <#assign listDownloadText = listDownloadText + "Zeitpunkt der Rückmeldung;"?url('ISO-8859-1') > 
2037                            <#-- Überschriften der Excel Tabelle Dynamisch ergänzen --> 
2038                            <#if options.getSiblings()?has_content> 
2039                                <#list options.getSiblings() as cur_options> 
2040                                    <#if cur_options.getData() != "" > 
2041                                        <#assign listDownloadText = listDownloadText + cur_options.getData()?url('ISO-8859-1') + ";" > 
2042                                    </#if> 
2043                                </#list> 
2044                            </#if> 
2045                            <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 > 
2046                                <#assign listDownloadText = listDownloadText + "Anmerkungen;" > 
2047                            </#if> 
2048                            <#-- Ende Überschriften dynamisch ergänzen --> 
2049 
2050                            <td align="center" width="10%"> 
2051                                <b> 
2052                                    <nobr><@clay["icon"] symbol="check"/><@clay["icon"] symbol="question-circle"/> 
2053                                        <@clay["icon"] symbol="times-small"/> 
2054                                    </nobr> 
2055                                </b> 
2056                            </td> 
2057 
2058                            <td align="center" width="10%"></td> 
2059 
2060                        </tr> 
2061                        <#assign listDownloadText = listDownloadText + "Zu-/Absage\r\n"?url('ISO-8859-1') > 
2062 
2063                        <#list records as cur_record> 
2064                            <#attempt> 
2065                                <#if (cur_record.getDDMFormFieldValues("Veranstaltung")?? && cur_record.getDDMFormFieldValues("Veranstaltung")?first.getValue().getString(locale) == articleId) > 
2066                                    <#if (themeDisplay.getUserId() == articleAuthorId) || (themeDisplay.getUserId() == cur_record.userId) || alleTeilnehmerAnzeigen > 
2067                                        <#if cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale) != "res" > 
2068                                            <tr style="border-bottom: 1px solid #ddd;"> 
2069                                                <#-- <td>${cur_record}</td> --> 
2070                                                <#-- <td>${cur_record.recordId}</td> --> 
2071                                                <td valign="center"> 
2072                                                    <#assign partnerGuestName = "" > 
2073                                                    <#assign partnerGastEMail = "" > 
2074                                                    <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != "" && (user.userId == cur_record.userId)> 
2075                                                        <#assign partnerGuestRecord = true > 
2076                                                        <#assign partnerGuestName = cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) > 
2077                                                        <#if cur_record.getDDMFormFieldValues("eMail")??> 
2078                                                            <#assign partnerGastEMail = cur_record.getDDMFormFieldValues("eMail")?first.getValue().getString(locale) > 
2079                                                        </#if> 
2080 
2081                                                        ${cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)} 
2082                                                        <#assign listDownloadText = listDownloadText + cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)?url('ISO-8859-1')> 
2083                                                    <#else> 
2084                                                        <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != ""> 
2085                                                            ${cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)} 
2086                                                            <#assign listDownloadText = listDownloadText + cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)?url('ISO-8859-1')> 
2087                                                        <#else> 
2088                                                            ${cur_record.userName} 
2089                                                            <#assign listDownloadText = listDownloadText + cur_record.userName?url('ISO-8859-1') > 
2090                                                        </#if> 
2091                                                        <#assign partnerGuestRecord = false > 
2092                                                    </#if> 
2093                                                    <#assign listDownloadText = listDownloadText + ";" > 
2094                                                </td> 
2095                                                <td valign="center"> 
2096                                                    <#--${cur_record.modifiedDate?string["dd.MM.yyyy HH:mm"]}h --> 
2097                                                    <#assign listDownloadText = listDownloadText + cur_record.modifiedDate?string["dd.MM.yyyy HH:mm"]?url('ISO-8859-1') + "h" > 
2098                                                    <#assign listDownloadText = listDownloadText + ";" > 
2099 
2100 
2101 
2102                                                    <#-- Entscheidung auslesen --> 
2103 
2104                                                    <#assign entscheidung = cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale) > 
2105 
2106 
2107                                                    <#assign recordCreationKey ="" > 
2108                                                    <#assign comment = ""> 
2109                                                    <#if cur_record.getDDMFormFieldValues("Key")?? > 
2110                                                        <#assign recordCreationKey = cur_record.getDDMFormFieldValues("Key")?first.getValue().getString(locale) > 
2111                                                    </#if> 
2112 
2113                                                    <#if cur_record.getDDMFormFieldValues("Kommentar")?? > 
2114                                                        <#assign comment = cur_record.getDDMFormFieldValues("Kommentar")?first.getValue().getString(locale)?js_string > 
2115                                                    </#if> 
2116                                                    <script> 
2117                                                      var jsComment${cur_record.recordId} = "${comment}"; 
2118                                                    </script> 
2119 
2120 
2121                                                    <#-- Start Ausgabe der gewählten Optionen --> 
2122                                                    <small> 
2123                                                        <#if cur_record.getDDMFormFieldValues("Optionen")?? > 
2124                                                            <#assign optionsValue = cur_record.getDDMFormFieldValues("Optionen")?first.getValue().getString(locale) > 
2125                                                        <#else> 
2126                                                            <#assign optionsValue = "" > 
2127                                                        </#if> 
2128                                                        <#if optionsValue != "" > 
2129                                                            <#assign selectedOptions = optionsValue?eval> 
2130                                                        </#if> 
2131                                                        <#if options.getSiblings()?has_content> 
2132                                                            <#list options.getSiblings() as cur_options> 
2133                                                                <#if (entscheidung != "nein") && (cur_options.getData() !="") > 
2134                                                                    <b>${cur_options.getData()}:</b> 
2135                                                                    <#if cur_options.optionAnswer.getSiblings()?has_content> 
2136                                                                        <#assign anzCurOpt = 0 > 
2137                                                                        <#list cur_options.optionAnswer.getSiblings() as cur_options_optionAnswer> 
2138                                                                            <#if optionsValue != "" > 
2139                                                                                <#assign basis = cur_options.getData()?replace("\\W", "", "r") > 
2140                                                                                <#assign suchstring = cur_options_optionAnswer.getData()?replace("\\W", "", "r") > 
2141                                                                            </#if> 
2142                                                                            <#if optionsValue != "" && selectedOptions[basis]??> 
2143                                                                                <#if selectedOptions[basis]?seq_contains(suchstring)> 
2144                                                                                    <#if anzCurOpt != 0 > 
2145                                                                                        <#assign listDownloadText = listDownloadText + " | " > 
2146
2147                                                                                    </#if> 
2148                                                                                    ${cur_options_optionAnswer.getData()} 
2149                                                                                    <#assign listDownloadText = listDownloadText + cur_options_optionAnswer.getData()?url('ISO-8859-1') > 
2150                                                                                    <#assign anzCurOpt++ > 
2151                                                                                </#if> 
2152                                                                            </#if> 
2153                                                                        </#list> 
2154                                                                    </#if> 
2155                                                                    <br> 
2156 
2157                                                                </#if> <#-- (entscheidung != "nein") && (cur_options.getData() !="") --> 
2158                                                                <#assign listDownloadText = listDownloadText + ";" > 
2159                                                            </#list> 
2160                                                        </#if> 
2161                                                    </small> 
2162 
2163 
2164                                                    <#--  Ende Ausgabe der gewählten Optionen --> 
2165 
2166                                                    <#-- Ausgabe Kommentar --> 
2167 
2168                                                    <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 && cur_record.getDDMFormFieldValues("Kommentar")?? > 
2169                                                        <#assign optionsComment = cur_record.getDDMFormFieldValues("Kommentar")?first.getValue().getString(locale) > 
2170                                                    <#else> 
2171                                                        <#assign optionsComment = "" > 
2172                                                    </#if> 
2173 
2174                                                    <#if optionsComment != "" > 
2175                                                        <small> 
2176                                                            <b>Anmerkungen:</b> 
2177                                                            ${optionsComment} 
2178                                                        </small> 
2179 
2180                                                    </#if> 
2181                                                    <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 > 
2182                                                        <#assign listDownloadText += "\\\"" > 
2183                                                        <#assign optionsCommentSafe = optionsComment?replace("\"","\"\"")?url('ISO-8859-1') > 
2184                                                        <#assign listDownloadText += optionsCommentSafe > 
2185                                                        <#assign listDownloadText += "\\\"" > 
2186                                                        <#assign listDownloadText += ";" > 
2187                                                    </#if> 
2188 
2189 
2190                                                    <#-- Ende Ausgabe KOmentar --> 
2191 
2192                                                </td> 
2193 
2194                                                <td align="center" valign="center"> 
2195 
2196 
2197                                                    <#if entscheidung == "ja" > 
2198                                                        <div class="attendance-visual green"> 
2199                                                            <@clay["icon"] symbol="check"/> 
2200                                                        </div> 
2201                                                        <#assign listDownloadText = listDownloadText + "ja;" > 
2202                                                    <#elseif entscheidung == "vielleicht" > 
2203                                                        <div class="attendance-visual yellow"> 
2204                                                            <@clay["icon"] symbol="question-circle"/> 
2205                                                        </div> 
2206                                                        <#assign listDownloadText = listDownloadText + "vielleicht;" > 
2207                                                    <#elseif entscheidung == "nein" > 
2208                                                        <div class="attendance-visual red"> 
2209                                                            <@clay["icon"] symbol="times-small"/> 
2210                                                        </div> 
2211                                                        <#assign listDownloadText = listDownloadText + "nein;" > 
2212                                                    </#if> 
2213 
2214                                                    <#assign listDownloadText = listDownloadText + ";" > 
2215                                                </td> 
2216 
2217                                                <td align="center" valign="center"> 
2218                                                    <#-- <#if partnerGuestRecord == true> --> 
2219                                                    <#if user.userId == cur_record.userId > 
2220 
2221                                                    <#-- optionsValueString Anführungszeichen ersetzen, da 
2222                                                    Freemarker sonst einen nicht kontrollierbaren Output Recoding Fehler macht 
2223                                                    Ein Punkt "." ist ok, da der String keine Sonderteichen enthalten kann--> 
2224                                                        <#assign optionsValueString = optionsValue?replace("\"",".")?replace("\\s+","","r") > 
2225 
2226                                                        <div class="attendance-edit-button" 
2227                                                             onclick="updateEntryInputField ('div.anmeldenameFeld', '${partnerGuestName}','${partnerGastEMail}', '${cur_record.recordId}','${recordCreationKey}', 'div.rm-option-form', 
2228                                                                     '${optionsValueString}', 'div.visualisation-and-selection-attendance', '${entscheidung}','',jsComment${cur_record.recordId} 
2229                                                                     )"> 
2230                                                            <@clay["icon"] symbol="pencil" cssClass="p-1"/> 
2231                                                        </div> 
2232 
2233                                                    </#if> 
2234                                                </td> 
2235                                                <#assign listDownloadText = listDownloadText + "\r\n"?url('ISO-8859-1') > 
2236                                            </tr> 
2237                                        </#if> <#-- kein Reservierungs Datensatz --> 
2238 
2239                                    </#if> 
2240 
2241                                </#if> 
2242                                <#recover> 
2243                            </#attempt> 
2244                        </#list> 
2245                    </table> 
2246 
2247                <#-- CSV Download der Teilnhemer --> 
2248 
2249 
2250                    <hr><p><b>Hier k&ouml;nnen Sie die Teilnehmerliste herunterladen:</b></p> 
2251                    <p> 
2252                        <input type="button" id="${articleId}_listeDownloadButton" class="btn btn-secondary" 
2253                               value="Teilnehmerliste laden"/> 
2254                    </p> 
2255                    <#if !(alleTeilnehmerAnzeigen || (user.userId == articleAuthorId))> 
2256                        <p><small>Anmerkung: Auf Grund der DSGVO k&ouml;nnen Sie nur solche Teilnehmer sehen und 
2257                                herunterladen, 
2258                                die Sie selbst eingegeben haben.<br>Weitere Teilnehmer sehen Sie nur, wenn das bei der 
2259                                Veranstaltung explizit erlaubt ist.</small></p> 
2260                    <#else> 
2261                        <p><small>Hinweis zur DSGVO: Der Organisator hat festgelegt, dass Sie die vollst&auml;dige 
2262                                Teilnehmerliste einsehen k&ouml;nnen.<br>Bitte gehen Sie entsprechend sorgf&auml;ltig 
2263                                und 
2264                                entsprechend der DSGVO mit den bereitgestellten Daten um.</small></p> 
2265                    </#if> 
2266                </#if> 
2267            </div> 
2268 
2269            <script type="text/javascript"> 
2270              function downloadListe(filename, text) { 
2271                var element = document.createElement('a'); 
2272                //element.setAttribute('href', 'data:application/csv,' + encodeURIComponent(text)); 
2273                element.setAttribute('href', 'data:text/comma-separated-values,' + text); 
2274                element.setAttribute('download', filename); 
2275 
2276                element.style.display = 'none'; 
2277                document.body.appendChild(element); 
2278 
2279                element.click(); 
2280 
2281                document.body.removeChild(element); 
2282
2283 
2284              // Start Teilnehmerliste download. 
2285              document.getElementById("${articleId}_listeDownloadButton").addEventListener("click", function () { 
2286                var filename = encodeURIComponent("Teilnehmer-Event-${.vars['reserved-article-id'].data}" + ".csv"); 
2287                downloadListe(filename, "${listDownloadText}"); 
2288              }, false); 
2289            </script> 
2290            <#-- ENDE CSV Download der Teilnhemer --> 
2291 
2292            </#if> 
2293 
2294            </#if> 
2295 
2296            <#-- hier endet die Liste --> 
2297 
2298 
2299            <#-- ics Download script --> 
2300 
2301            <script type="text/javascript"> 
2302 
2303              beautyNavUrl = makeNavUrl("${location.getData()?replace("\"", "'")?replace("\r", " ")?replace("\n", " ")}", "${location.streetAndNumber.getData()}", "${location.zip.getData()}", "${location.city.getData()}", "${location.country.getData()}"); 
2304 
2305              document.getElementById("Veranstaltungsort").innerHTML = beautyNavUrl; 
2306 
2307            </script>