Asset-Herausgeber

Weihnachtsmarkt

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