Zertifizierte Natur- und Landschaftsführer

Natur- und Landschaftsführer buchen

Sie suchen noch nach einer originellen Idee für den nächsten Kindergarten-, Schul-, Vereins- oder Betriebsausflug? Sie planen einen Urlaub oder einen Wochenend-Trip in Deutschland? Wie wäre es einmal mit einer Tour durch die Natur? Am besten gelingt diese natürlich unter professioneller Anleitung. Geschulte Natur- und Landschaftsführerinnen und -führer sind qualifizierte Begleitpersonen, die gemeinsam mit Ihnen die schönen, spannenden und interessanten Seiten der Region erkunden. Für einen nachhaltigen Umgang mit Flora und Fauna sensibilisieren

Kleinkinder und Grundschülerinnen und -schüler lernen spielerisch und pädagogisch angemessen die Natur kennen. Unternehmen können ihre Mitarbeiterinnen und Mitarbeiter auf diesem Weg für einen nachhaltigen Umgang mit Flora, Fauna und Ressourcen sensibilisieren.

Bei einer Tour mit einem zertifizierten Natur- und Landschaftsführer erfahren Sie eine Menge spannender und lehrreicher Fakten über Ihre Heimat. Sie lernen interessante Gebiete und Regionen kennen, die Sie auf eigene Faust vielleicht nie entdeckt hätten. Sie können Fragen stellen, Fotos machen und sich in der freien Natur bewegen. Sie treffen Menschen mit den gleichen Interessen und führen inspirierende Dialoge. 

So nehmen Sie Kontakt auf

Für jeden Naturraum in Baden-Württemberg gibt es qualifizierte Ansprechpartnerinnen und -partner. Die Auswahl beziehungsweise Buchung für den naturraumbezogenen Natur- & Landschaftsführer ist über die regionalen Kontaktstellen möglich. Nehmen Sie Kontakt mit den regionalen Kontaktstellen auf, um Ihren persönlichen, naturraumbezogenen Natur- und Landschaftsführer zu buchen!

Fehler bei der Verarbeitung der Vorlage.
The following has evaluated to null or missing:
==> entry.getAssetRenderer()  [in template "20116#20152#221867" at line 82, column 21]

----
Tip: If the failing expression is known to be 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: assetRenderer = entry.getAssetRenderer()  [in template "20116#20152#221867" at line 82, column 5]
	- Reached through: #assign-container  [in template "20116#20152#221867" at line 81, column 5]
----
1<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
2<#assign journalContent = serviceLocator.findService("com.liferay.journal.util.JournalContent") /> 
3<#assign groupLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService") /> 
4<#assign portletPreferencesLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.PortletPreferencesLocalService") /> 
5<#assign ddmStructureLocalService = serviceLocator.findService("com.liferay.dynamic.data.mapping.service.DDMStructureLocalService") /> 
6<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") /> 
7<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") /> 
8<#assign calendarBookingLocalService = serviceLocator.findService("com.liferay.calendar.service.CalendarBookingLocalService") /> 
9<#assign namespace = randomNamespace /> 
10<#assign day = 24 * 60 * 60 * 1000 /> 
11<#assign eventCalendarStructureKeysFilter = "" /> 
12 
13<script type="text/javascript"> 
14    ${namespace}eventDetailLinkTemplates = new Array(); 
15</script> 
16 
17<#if (eventCalendarIds?? && eventCalendarIds?has_content)> 
18    <#assign 
19        layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") 
20        classResolverUtil = staticUtil["com.liferay.portal.kernel.util.ClassResolverUtil"] 
21        dynamicQueryFactoryUtil = staticUtil["com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil"] 
22        propertyFactoryUtil = staticUtil["com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil"] 
23        portletPreferencesClass = classResolverUtil.resolveByPortalClassLoader("com.liferay.portal.kernel.model.PortletPreferences") 
24        dynamicQuery = dynamicQueryFactoryUtil.forClass(portletPreferencesClass) 
25        VOID = dynamicQuery.add(propertyFactoryUtil.forName("portletId").eq("de_xdot_um_event_ui_lr7_portlet_EventCalendarPortlet")) 
26        portletPreferencesList = portletPreferencesLocalService.dynamicQuery(dynamicQuery) 
27    /> 
28    <#list portletPreferencesList as portletPreferences> 
29        <#assign 
30            javaxPortletPreferences = portletPreferencesLocalService.getPreferences(portletPreferences.companyId, portletPreferences.ownerId, portletPreferences.ownerType, portletPreferences.plid, portletPreferences.portletId) 
31            calendarIdValue = javaxPortletPreferences.getValue("calendarId", "") 
32            calendarIds = stringUtil.split(calendarIdValue) 
33            targetLayout = layoutLocalService.getLayout(portletPreferences.plid) 
34            targetFriendlyURL = targetLayout.friendlyURL 
35            eventDetailLinkTemplate = targetFriendlyURL + "?p_p_id=de_xdot_um_event_ui_lr7_portlet_EventCalendarPortlet&_de_xdot_um_event_ui_lr7_portlet_EventCalendarPortlet_eventId=" 
36        /> 
37        <#list calendarIds as calendarId> 
38            <script type="text/javascript"> 
39                ${namespace}eventDetailLinkTemplates['${calendarId}'] = "${eventDetailLinkTemplate}"; 
40            </script> 
41        </#list> 
42    </#list> 
43 
44</#if> 
45 
46<#if eventCalendarStructureKeys?? && eventCalendarStructureKeys?has_content> 
47    <#if eventCalendarStructureKeys?contains(",")> 
48        <#assign eventCalendarStructureKeysFilter>,ddmStructureKeys: [<#list eventCalendarStructureKeysFilter?split(",") as key>"${key}"<#if key?has_next>,</#if></#list>]</#assign> 
49    <#else> 
50        <#assign eventCalendarStructureKeysFilter>,ddmStructureKeys: ["${eventCalendarStructureKeys}"]</#assign> 
51    </#if> 
52</#if> 
53 
54<#assign defaultTimeRange = "30"> 
55<#if eventCalendarDefaultTimeRange?? && eventCalendarDefaultTimeRange?has_content> 
56    <#assign defaultTimeRange = eventCalendarDefaultTimeRange /> 
57</#if> 
58 
59<#assign featureCollectionJSONObject = jsonFactoryUtil.createJSONObject() /> 
60 
61<@liferay.silently featureCollectionJSONObject.put("type", "FeatureCollection") /> 
62 
63<#assign featureJSONArray = jsonFactoryUtil.createJSONArray() /> 
64 
65<#assign 
66    allCategoryIds = [] 
67/> 
68 
69<#list entries as entry> 
70    <#list entry.getCategoryIds() as categoryId> 
71        <#assign 
72        strCategoryId = categoryId?c 
73        /> 
74        <#if !allCategoryIds?seq_contains(strCategoryId)> 
75            <#assign 
76            allCategoryIds = allCategoryIds + [ categoryId?c ] 
77            /> 
78        </#if> 
79    </#list> 
80 
81    <#assign 
82    assetRenderer = entry.getAssetRenderer() 
83 
84    ddmFormValuesReader = assetRenderer.getDDMFormValuesReader() 
85 
86    ddmFormFieldValues = ddmFormValuesReader.getDDMFormFieldValues("ddm-geolocation") 
87 
88    coordinatesJSONObjects = [] 
89    /> 
90 
91    <#list ddmFormFieldValues as ddmFormFieldValue> 
92        <#assign 
93        value = ddmFormFieldValue.getValue() 
94 
95        coordinatesJSONObject = jsonFactoryUtil.createJSONObject(value.getString(locale)) 
96 
97        coordinatesJSONObjects = coordinatesJSONObjects + [coordinatesJSONObject] 
98        /> 
99    </#list> 
100 
101    <#list coordinatesJSONObjects as coordinatesJSONObject> 
102        <#assign featureJSONObject = jsonFactoryUtil.createJSONObject() /> 
103 
104        <@liferay.silently featureJSONObject.put("type", "Feature") /> 
105 
106        <#assign geometryJSONObject = jsonFactoryUtil.createJSONObject() /> 
107 
108        <@liferay.silently geometryJSONObject.put("type", "Point") /> 
109 
110        <#assign coordinatesJSONArray = [coordinatesJSONObject.getDouble("longitude"), coordinatesJSONObject.getDouble("latitude")] /> 
111 
112        <@liferay.silently geometryJSONObject.put("coordinates", coordinatesJSONArray) /> 
113 
114        <@liferay.silently featureJSONObject.put("geometry", geometryJSONObject) /> 
115 
116        <#assign propertiesJSONObject = jsonFactoryUtil.createJSONObject() /> 
117 
118        <#assign article = assetRenderer.getArticle() /> 
119        <#assign title = article.getTitle(locale) /> 
120        <#assign structureKey = article.getDDMStructureKey() /> 
121        <#assign templateKey = getTemplateKey(structureKey) /> 
122 
123        <@liferay.silently propertiesJSONObject.put("title", title) /> 
124 
125        <@liferay.silently propertiesJSONObject.put("groupId", entry.groupId) /> 
126        <@liferay.silently propertiesJSONObject.put("articleId", article.articleId) /> 
127        <@liferay.silently propertiesJSONObject.put("version", article.version) /> 
128        <@liferay.silently propertiesJSONObject.put("templateKey", templateKey) /> 
129 
130        <#assign categoriesJSONArray = jsonFactoryUtil.createJSONArray() /> 
131        <#list assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", getterUtil.getLong(article.getResourcePrimKey())) as assetCategory> 
132            <#assign categoryJSONObject = jsonFactoryUtil.createJSONObject() /> 
133            <@liferay.silently categoryJSONObject.put("categoryId", assetCategory.getCategoryId()) /> 
134            <@liferay.silently categoryJSONObject.put("categoryName", assetCategory.getName()) /> 
135            <@liferay.silently categoriesJSONArray.put(categoryJSONObject) /> 
136        </#list> 
137        <@liferay.silently propertiesJSONObject.put("assetCategories", categoriesJSONArray) /> 
138 
139        <#if eventCalendarIds?? && eventCalendarIds?has_content> 
140            <#assign calendarBookinsJSONArray = jsonFactoryUtil.createJSONArray() /> 
141            <#list  getterUtil.getString(eventCalendarIds)?split(',') as eventCalendarId> 
142                <#list calendarBookingLocalService.getCalendarBookings(getterUtil.getLong(eventCalendarId)) as calendarBooking> 
143                    <#list assetCategoryLocalService.getCategories("com.liferay.calendar.model.CalendarBooking", getterUtil.getLong(calendarBooking.getPrimaryKey())) as assetCategory> 
144                        <#assign calendarBookingCategoryJSONObject = jsonFactoryUtil.createJSONObject() /> 
145                        <@liferay.silently calendarBookingCategoryJSONObject.put("categoryId", assetCategory.getCategoryId()) /> 
146                        <@liferay.silently calendarBookingCategoryJSONObject.put("categoryName", assetCategory.getName()) /> 
147                        <@liferay.silently calendarBookinsJSONArray.put(calendarBookingCategoryJSONObject) /> 
148                    </#list> 
149                </#list> 
150            </#list> 
151            <@liferay.silently propertiesJSONObject.put("calendarBookingCategories", calendarBookinsJSONArray) /> 
152        </#if> 
153 
154        <@liferay.silently propertiesJSONObject.put("assetCategories", categoriesJSONArray) /> 
155        <@liferay.silently featureJSONObject.put("properties", propertiesJSONObject) /> 
156 
157        <@liferay.silently featureJSONArray.put(featureJSONObject) /> 
158    </#list> 
159</#list> 
160 
161<@liferay.silently featureCollectionJSONObject.put("features", featureJSONArray) /> 
162 
163<#assign portletURL> 
164    <@liferay_portlet.renderURL /> 
165</#assign> 
166 
167<div id="${namespace}umweltakademie-map" class="umweltakademie-map"></div> 
168 
169<#assign hasDateFilter = false /> 
170<#if (eventCalendarIds?? && eventCalendarIds?has_content)> 
171    <#assign hasDateFilter = true /> 
172</#if> 
173<#if eventCalendarShowDateFilter?? && eventCalendarShowDateFilter?has_content> 
174    <#assign hasDateFilter = getterUtil.getBoolean(eventCalendarShowDateFilter) /> 
175</#if> 
176 
177<#if !hasDateFilter> 
178    <input class="form-control searchInput" type="hidden" id="${namespace}fromDate"> 
179    <input class="form-control searchInput" type="hidden" id="${namespace}toDate"> 
180</#if> 
181 
182<#if hasDateFilter> 
183    <div class="umweltakademie-map__datefilter"> 
184        <div class="row-fluid container date-picker-form"> 
185            <div class="col-md-3 date-picker-field-wrapper"> 
186                <select class="target form-control" id="${namespace}dateRange"> 
187                    <option value>INDIVIDUELLER ZEITRAUM</option> 
188                    <option value="7" <#if defaultTimeRange == "7">selected</#if>>IN DEN NÄCHSTEN 7 TAGEN</option> 
189                    <option value="14" <#if defaultTimeRange == "14">selected</#if>>IN DEN NÄCHSTEN 14 TAGEN</option> 
190                    <option value="30" <#if defaultTimeRange == "30">selected</#if>>IN DEN NÄCHSTEN 30 TAGEN</option> 
191                    <option value="365" <#if defaultTimeRange == "365">selected</#if>>INNERHALB EINES JAHRES</option> 
192                </select> 
193            </div> 
194            <div class="col-md-3 date-picker-field-wrapper"> 
195                <input class="form-control searchInput" type="text" placeholder="DATUM: VON" id="${namespace}fromDate"> 
196            </div> 
197            <div class="col-md-3 date-picker-field-wrapper"> 
198                <input class="form-control searchInput" type="text" placeholder="DATUM: BIS" id="${namespace}toDate"> 
199            </div> 
200            <div class="col-md-3 date-picker-field-wrapper"> 
201                <button class="btn btn-large btn-block btn-primary" id="${namespace}searchButton">SUCHEN</button> 
202            </div> 
203        </div> 
204    </div> 
205 
206    <div class="row-fluid container reset-btn-holder umweltakademie-map__reset-button"> 
207        <a class="date-picker-reset-btn" id="${namespace}resetButton">FILTER ZURÜCKSETZEN</a> 
208    </div> 
209    <script> 
210        YUI().use( 
211            'aui-button', 
212            function (Y) { 
213                new Y.Button( 
214
215                        srcNode: '#${namespace}searchButton', 
216                        on: { 
217                            click: function () { 
218                                var searchOptions = { 
219                                    fromDate: formatStringToDate(${namespace}fromDate.value).getTime(), 
220                                    toDate: formatStringToDate(${namespace}toDate.value).getTime() + ${day} 
221                                }; 
222                                ${namespace}loadMap(); 
223                                ${namespace}loadEvents(searchOptions) 
224 
225 
226                                AUI().use('aui-base', function(A) { 
227                                    var filters = A.all('#${namespace}umweltakademie-map-filter .template-filter:checked'); 
228                                    var subFilters = A.all('#${namespace}umweltakademie-map-filter .template-subfilter'); 
229 
230                                    filters.each(function (filter) { 
231                                        filter['_node'].checked = false; 
232                                    }); 
233                                    subFilters.each(function (filter) { 
234                                        filter['_node'].checked = false; 
235                                    }); 
236                                }); 
237
238
239
240                ).render(); 
241 
242
243        ); 
244    </script> 
245    <script> 
246        YUI().use( 
247            'aui-button', 
248            function (Y) { 
249                new Y.Button( 
250
251                        srcNode: '#${namespace}resetButton', 
252                        on: { 
253                            click: function () { 
254                                ${namespace}fromDate.setAttribute('value', formatDate(new Date())); 
255                                ${namespace}toDate.setAttribute('value', formatDate(new Date(new Date().getTime() + (${defaultTimeRange?number} * ${day})))); 
256                                ${namespace}fromDate.value = formatDate(new Date()); 
257                                ${namespace}toDate.value = formatDate(new Date(new Date().getTime() + (${defaultTimeRange?number} * ${day}))); 
258 
259                                var searchOptions = { 
260                                    fromDate: formatStringToDate(${namespace}fromDate.value).getTime(), 
261                                    toDate: formatStringToDate(${namespace}toDate.value).getTime() + ${day} 
262                                }; 
263 
264                                $('#${namespace}dateRange option').each(function () { 
265                                    if (this.value == '${defaultTimeRange}') { 
266                                        this.selected = true; 
267                                        return false; 
268
269                                }); 
270 
271                                ${namespace}loadMap(searchOptions); 
272                                ${namespace}loadEvents(searchOptions) 
273 
274                                AUI().use('aui-base', function(A) { 
275                                    var filters = A.all('#${namespace}umweltakademie-map-filter .template-filter:checked'); 
276                                    var subFilters = A.all('#${namespace}umweltakademie-map-filter .template-subfilter'); 
277 
278                                    filters.each(function (filter) { 
279                                        filter['_node'].checked = false; 
280                                    }); 
281                                    subFilters.each(function (filter) { 
282                                        filter['_node'].checked = false; 
283                                    }); 
284                                }); 
285
286
287
288                ).render(); 
289 
290
291        ); 
292    </script> 
293    <script> 
294        $(".target").change(function () { 
295            ${namespace}fromDate.setAttribute('value', formatDate(new Date())); 
296            ${namespace}toDate.setAttribute('value', formatDate(new Date(new Date().getTime() + (${namespace}dateRange.value * ${day})))); 
297            ${namespace}fromDate.value = formatDate(new Date()); 
298            ${namespace}toDate.value = formatDate(new Date(new Date().getTime() + (${namespace}dateRange.value * ${day}))) 
299        }); 
300    </script> 
301    <script> 
302        var ${namespace}datepickerFrom; 
303        YUI({lang: 'de'}).use( 
304            'aui-datepicker', 
305            function (Y) { 
306                ${namespace}datepickerFrom = new Y.DatePicker( 
307
308                        trigger: '#${namespace}fromDate', 
309                        mask: '%d.%m.%Y', 
310                        popover: { 
311                            on : { 
312                                click: function () { 
313                                    $('#${namespace}dateRange option').each(function () { 
314                                        if (this.value == '') { 
315                                            this.selected = true; 
316                                            return false; 
317
318                                    }); 
319 
320
321                            }, 
322                            zIndex: 2 
323
324
325                ); 
326
327        ); 
328    </script> 
329    <script> 
330        var ${namespace}datepickerTo; 
331        YUI({lang: 'de'}).use( 
332            'aui-datepicker', 
333            function (Y) { 
334                ${namespace}datepickerTo = new Y.DatePicker( 
335
336                        trigger: '#${namespace}toDate', 
337                        mask: '%d.%m.%Y', 
338                        popover: { 
339                            on : { 
340                                click: function () { 
341                                    $('#${namespace}dateRange option').each(function () { 
342                                        if (this.value == '') { 
343                                            this.selected = true; 
344                                            return false; 
345
346                                    }); 
347
348                            }, 
349                            zIndex: 2 
350
351
352                ); 
353
354        ); 
355    </script> 
356</#if> 
357 
358<script> 
359    function formatDate(date) { 
360        var day = date.getDate(); 
361        var monthIndex = date.getMonth() + 1; 
362        var year = date.getFullYear(); 
363 
364        return day + '.' + monthIndex + '.' + year; 
365
366 
367    function formatStringToDate(str) { 
368        // Split date string to ['dd', 'mm', 'yyyy'] 
369        var day = str.split('.')[0]; 
370        var month = str.split('.')[1]; 
371        var year = str.split('.')[2]; 
372 
373        return new Date(month + '/' + day + '/' + year); 
374
375 
376    function ${namespace}initDates() { 
377        if (typeof ${namespace}fromDate !== 'undefined') { 
378            ${namespace}fromDate.setAttribute('value', formatDate(new Date())); 
379            ${namespace}toDate.setAttribute('value', formatDate(new Date(new Date().getTime() + (${defaultTimeRange?number} * ${day})))); 
380            ${namespace}fromDate.value = formatDate(new Date()); 
381            ${namespace}toDate.value = formatDate(new Date(new Date().getTime() + (${defaultTimeRange?number} * ${day}))); 
382
383
384 
385    $(document).ready(${namespace}initDates); 
386    Liferay.on('endNavigate', ${namespace}initDates); 
387</script> 
388 
389<#if anyClassTypeJournalArticleAssetRendererFactory?? && anyClassTypeJournalArticleAssetRendererFactory?has_content && anyClassTypeJournalArticleAssetRendererFactory != "false"> 
390    <#assign classTypeIdsJournalArticleAssetRendererFactory = anyClassTypeJournalArticleAssetRendererFactory /> 
391</#if> 
392 
393<#assign groupIds = portal.getCurrentAndAncestorSiteGroupIds(themeDisplay.getScopeGroupId())/> 
394 
395<#assign showFilter = true /> 
396<#if eventCalendarShowCategoryFilter?? && eventCalendarShowCategoryFilter?has_content> 
397    <#assign showFilter = getterUtil.getBoolean(eventCalendarShowCategoryFilter) /> 
398</#if> 
399<#assign hasFilterCategories = false /> 
400 
401<#if !(eventCalendarIds?? && eventCalendarIds?has_content)> 
402    <#if !classTypeIdsJournalArticleAssetRendererFactory?contains(",")> 
403        <#assign classTypeId = classTypeIdsJournalArticleAssetRendererFactory> 
404        <#assign assetVocabularies = assetVocabularyLocalService.getGroupsVocabularies(groupIds, "com.liferay.journal.model.JournalArticle", getterUtil.getLong(classTypeId)) /> 
405        <#if assetVocabularies?? && assetVocabularies?has_content> 
406            <#list assetVocabularies as assetVocabulary> 
407                <#if assetVocabulary.name != "Topic" && assetVocabulary.name != "Topic (2)"> 
408                    <#assign assetCategoriesCount = assetCategoryLocalService.getVocabularyRootCategoriesCount(assetVocabulary.vocabularyId) /> 
409                    <#if assetCategoriesCount &gt; 0> 
410                        <#assign hasFilterCategories = true /> 
411                        <#break /> 
412                    </#if> 
413                </#if> 
414            </#list> 
415            <#if hasFilterCategories == false> 
416                <#assign showFilter = false /> 
417            </#if> 
418        </#if> 
419    </#if> 
420</#if> 
421 
422<#if showFilter == true> 
423    <div class="umweltakademie-map-filter-wrapper <#if hasDateFilter>with-date-filter</#if>"> 
424        <a id="${namespace}umweltakademie-map-filter-button" href="#${namespace}umweltakademie-map-filter" class="umweltakademie-map-filter-button" data-toggle="collapse" aria-expanded="false"><span class="title">Filter</span> <span class="icon icon-um-chevron-down-small"></span><span class="icon icon-um-close"></span></a> 
425        <div id="${namespace}umweltakademie-map-filter" class="collapse umweltakademie-map-filter accordion-group" aria-expanded="false"> 
426 
427            <#if eventCalendarIds?? && eventCalendarIds?has_content> 
428                <div id="${namespace}umweltakademie-map-filter-events"></div> 
429            </#if> 
430 
431            <#list classTypeIdsJournalArticleAssetRendererFactory?split(",") as classTypeId> 
432 
433                <#assign ddmStructure = ddmStructureLocalService.getStructure(getterUtil.getLong(classTypeId)) /> 
434                <#assign ddmStructureKey = ddmStructure.getStructureKey() /> 
435                <#assign ddmTemplateKey = getTemplateKey(ddmStructureKey) /> 
436                <#assign assetVocabularies = assetVocabularyLocalService.getGroupsVocabularies(groupIds, "com.liferay.journal.model.JournalArticle", getterUtil.getLong(classTypeId)) /> 
437 
438                <#if ddmTemplateKey == "MEDIATHEK-POPUP"> 
439                    <#assign ddmStructureKey = "MEDIATHEK" /> 
440                </#if> 
441 
442                <#switch ddmStructureKey> 
443                    <#case "LANDSCHAFTSFUEHRER"> 
444                    <#case "ARTENSCHUTZ-FACHBERATER"> 
445                    <#case "AKTEUR-LEBENDIGER-WEINBERG"> 
446                    <#case "MEDIATHEK"> 
447                    <#case "UM_ERLEBNISSE"> 
448                    <#case "UM_FACHTAGUNGEN"> 
449                    <#case "UM_NATURERLEBNISWOCHE"> 
450                        <#assign name = ddmStructure.getName(locale) /> 
451 
452                        <#if name == "Mediathek"> 
453                            <#assign name = "Audio-VideoGuides" /> 
454                        </#if> 
455 
456                        <div class="checkbox-line"> 
457                            <#if ddmTemplateKey == 'LANDSCHAFTSFUEHRER-POPUP'> 
458                                <img src="/o/um-enviroment-academy-theme/images/map/Pin_Landschaftsfuehrer_4c.svg" class="checkbox-line-image"> 
459                            <#elseif ddmTemplateKey == 'AKTEUR-LEBENDIGER-WEINBERG-POPUP'> 
460                                <img src="/o/um-enviroment-academy-theme/images/map/Pin_Lebendiger_Weinberg_4c.svg" class="checkbox-line-image" > 
461                            <#elseif ddmTemplateKey == 'ARTENSCHUTZ-FACHBERATER-POPUP'> 
462                                <img src="/o/um-enviroment-academy-theme/images/map/Pin_Artenschutz_Fachberater_4c.svg" class="checkbox-line-image" > 
463                            <#elseif ddmTemplateKey == 'MEDIATHEK-POPUP'> 
464                                <img src="/o/um-enviroment-academy-theme/images/map/Pin_Audio_VideoGuides_4c.svg" class="checkbox-line-image" > 
465                            </#if> 
466 
467                            <label class="checkbox-label"> 
468                                <input type="checkbox" class="checkbox template-filter" data-templatekey="${ddmTemplateKey}" checked="true"> 
469                                <span class="checkbox-title">${name}</span> 
470                                <span class="checkbox-marker"></span> 
471                            </label> 
472 
473 
474                            <#assign hasCategories = false /> 
475 
476                            <#if assetVocabularies?? && assetVocabularies?has_content> 
477                                <#list assetVocabularies as assetVocabulary> 
478                                    <#if assetVocabulary.name != "Topic" && assetVocabulary.name != "Topic (2)"> 
479                                        <#assign assetCategoriesCount = assetCategoryLocalService.getVocabularyRootCategoriesCount(assetVocabulary.vocabularyId) /> 
480                                        <#if assetCategoriesCount &gt; 0> 
481                                            <a href="#${namespace}${ddmTemplateKey}" data-toggle="collapse" data-parent="#${namespace}umweltakademie-map-filter" aria-expanded="false" class="collapse-icon-wrapper"> 
482                                               <span class="icon icon-um-chevron-down-small"></span> 
483                                            </a> 
484                                            <#break /> 
485                                        </#if> 
486                                    </#if> 
487                                </#list> 
488                            </#if> 
489 
490                            <div class="collapse-categories-wrapper"> 
491                                <div id="${namespace}${ddmTemplateKey}" class="collapse"> 
492 
493                                    <#list assetVocabularies as assetVocabulary> 
494                                        <#if assetVocabulary.name != "Topic" && assetVocabulary.name != "Topic (2)"> 
495                                            <#assign assetCategories = assetCategoryLocalService.getVocabularyRootCategories(assetVocabulary.vocabularyId, -1, -1, nullArg) /> 
496 
497                                            <span>${assetVocabulary.getTitle(locale)}</span> 
498                                            <div id="${namespace}${assetVocabulary.name}${ddmTemplateKey}" style="margin: 0 5px 0 22px; max-width: 340px;"> 
499                                                <#list assetCategories as assetCategory> 
500                                                    <#if allCategoryIds?seq_contains(assetCategory.categoryId?c)> 
501                                                        <label class="checkbox-label"> 
502                                                            <span class="checkbox-title">${assetCategory.getTitle(locale)}</span> 
503                                                            <input type="checkbox" 
504                                                                   class="template-subfilter checkbox" 
505                                                                   data-templatekey="${ddmTemplateKey}" 
506                                                                   data-vocabularyName="${assetVocabulary.name}" 
507                                                                   data-categoryId="${assetCategory.categoryId}" 
508                                                                   checked="true" 
509
510                                                            <span class="checkbox-marker"></span> 
511                                                        </label> 
512                                                    </#if> 
513                                                </#list> 
514                                            </div> 
515                                        </#if> 
516                                    </#list> 
517 
518                                </div> 
519                            </div> 
520                        </div> 
521                        <#break /> 
522                </#switch> 
523            </#list> 
524        </div> 
525    </div> 
526</#if> 
527<script> 
528    var tipObj = null; 
529    var tipOffset = { 
530        x: 10, 
531        y: 20 
532    }; 
533 
534    function ${namespace}initMap(options) { 
535        ${namespace}infowindow = new google.maps.InfoWindow( 
536
537                maxWidth: 300 
538
539        ); 
540 
541        var geoJSON = JSON.parse('${featureCollectionJSONObject}'); 
542        var maxZoomLevel = 16; 
543 
544        var mapDiv = document.getElementById('${namespace}umweltakademie-map'); 
545 
546        if (mapDiv) { 
547            ${namespace}map = new google.maps.Map( 
548                mapDiv, 
549
550                    center: { lat: 48.78232, lng: 9.17702 }, 
551                    zoom: 8, 
552                    maxZoom: maxZoomLevel, 
553                    zoomControl: (! Liferay.Browser.isMobile()), 
554                    mapTypeControl: false, 
555                    scaleControl: false, 
556                    streetViewControl: false, 
557                    rotateControl: false, 
558                    fullscreenControl: false, 
559                    styles: [ 
560
561                            "featureType": "poi", 
562                            "stylers": [ 
563
564                                    "visibility": "off" 
565
566
567                        }, 
568
569                            "featureType": "poi.park", 
570                            "elementType": "labels", 
571                            "stylers": [ 
572
573                                    "visibility": "off" 
574
575
576                        }, 
577
578                            "featureType": "transit", 
579                            "stylers": [ 
580
581                                    "visibility": "off" 
582
583
584
585
586
587            ); 
588 
589            ${namespace}oms = new OverlappingMarkerSpiderfier( 
590                ${namespace}map, 
591
592                    markersWontMove: true, 
593                    markersWontHide: true, 
594                    basicFormatEvents: false, 
595                    keepSpiderfied: true, 
596                    circleFootSeparation: 100, 
597                    circleStartAngle: 1, 
598                    circleSpiralSwitchover: Infinity, 
599                    spiralFootSeparation: 100, 
600                    spiralLengthStart: 25, 
601                    spiralLengthFactor: 8, 
602                    legWeight: 2.5 
603
604            ); 
605 
606            ${namespace}markers = geoJSON && geoJSON.features.map( 
607                function(feature) { 
608                    var coords = feature.geometry.coordinates; 
609                    var marker = new google.maps.Marker( 
610
611                            position: new google.maps.LatLng(coords[1], coords[0]), 
612                            properties: feature.properties, 
613                            selected: false, 
614                            title: feature.properties.title 
615
616                    ); 
617 
618                    var icon; 
619                    if (feature.properties.templateKey === 'LANDSCHAFTSFUEHRER-POPUP') { 
620                        icon = '/o/um-enviroment-academy-theme/images/map/Pin_Landschaftsfuehrer_4c.svg'; 
621                    } else if (feature.properties.templateKey === 'AKTEUR-LEBENDIGER-WEINBERG-POPUP') { 
622                        icon = '/o/um-enviroment-academy-theme/images/map/Pin_Lebendiger_Weinberg_4c.svg'; 
623                    } else if (feature.properties.templateKey === 'ARTENSCHUTZ-FACHBERATER-POPUP') { 
624                        icon = '/o/um-enviroment-academy-theme/images/map/Pin_Artenschutz_Fachberater_4c.svg'; 
625                    } else if (feature.properties.templateKey === 'MEDIATHEK-POPUP') { 
626                        icon = '/o/um-enviroment-academy-theme/images/map/Pin_Audio_VideoGuides_4c.svg'; 
627
628                    if (icon) { 
629                        marker.setIcon( 
630
631                                url: icon, 
632                                scaledSize: new google.maps.Size(61, 100), 
633                                origin: new google.maps.Point(0, 0), 
634                                anchor: new google.maps.Point(30, 100) 
635
636                        ); 
637
638 
639                    marker.addListener('click', function() { 
640                        Liferay.Service( 
641                            '/um_service_helper.journalarticle/get-article-content', 
642
643                                plid: ${themeDisplay.plid}, 
644                                groupId: marker.properties.groupId, 
645                                articleId: marker.properties.articleId, 
646                                version: marker.properties.version, 
647                                languageId: '${locale.toString()}', 
648                                viewMode: 'view', 
649                                ddmTemplateKey: marker.properties.templateKey 
650                            }, 
651                            function(result) { 
652                                ${namespace}infowindow.setContent(result); 
653                                ${namespace}infowindow.open(${namespace}map, marker); 
654 
655                                if (showCopyrightMarker) { 
656                                    showCopyrightMarker(); 
657
658
659                        ); 
660                    }); 
661 
662                    marker.addListener('mouseover', function() { 
663                        deleteTooltip(); 
664                    }); 
665 
666                    if (!options){ 
667                        ${namespace}oms.removeMarker(marker); 
668
669                    else { 
670                        ${namespace}oms.addMarker(marker); 
671 
672                        return marker; 
673
674
675            ); 
676 
677            var greenMarkersOptions = { 
678                styles: [ 
679
680                        textColor: 'black', 
681                        url: '${themeDisplay.getPathThemeImages()}/map/cluster_icon_green.svg', 
682                        height: 66, 
683                        width: 65, 
684                        textSize: 16 
685
686
687            }; 
688 
689            var brownMarkersOptions = { 
690                styles: [ 
691
692                        textColor: 'white', 
693                        url: '${themeDisplay.getPathThemeImages()}/map/cluster_icon_brown.svg', 
694                        height: 66, 
695                        width: 65, 
696                        textSize: 16 
697
698
699            }; 
700 
701            var yellowMarkersOptions = { 
702                styles: [ 
703
704                        textColor: 'black', 
705                        url: '${themeDisplay.getPathThemeImages()}/map/cluster_icon_yellow.svg', 
706                        height: 66, 
707                        width: 65, 
708                        textSize: 16 
709
710
711            }; 
712 
713            var blueMarkersOptions = { 
714                styles: [ 
715
716                        textColor: 'black', 
717                        url: '${themeDisplay.getPathThemeImages()}/map/cluster_icon_blue.svg', 
718                        height: 66, 
719                        width: 65, 
720                        textSize: 16 
721
722
723            }; 
724            var grayMarkersOptions = { 
725                styles: [ 
726
727                        textColor: 'black', 
728                        url: '${themeDisplay.getPathThemeImages()}/map/cluster_icon_gray.svg', 
729                        height: 66, 
730                        width: 65, 
731                        textSize: 16 
732
733
734            }; 
735            var lightBlueMarkersOptions = { 
736                styles: [ 
737
738                        textColor: 'black', 
739                        url: '${themeDisplay.getPathThemeImages()}/map/cluster_icon_lightblue.svg', 
740                        height: 66, 
741                        width: 65, 
742                        textSize: 16 
743
744
745            }; 
746 
747 
748            var veranstaltungenMarkerOptions = { 
749                styles: [ 
750
751                        textColor: 'black', 
752                        url: '${themeDisplay.getPathThemeImages()}/map/cluster_icon_orange.svg', 
753                        height: 66, 
754                        width: 65, 
755                        textSize: 16 
756
757
758            }; 
759 
760            var greenMarkers = []; 
761            var brownMarkers = []; 
762            var yellowMarkers = []; 
763            var blueMarkers = []; 
764            var grayMarkers = []; 
765            var veranstaltungenMarkers = []; 
766            var lightBlueMarkers = []; 
767 
768            if (options) { 
769                ${namespace}markers.forEach(function (item) { 
770                    if (!item) { 
771                        return; 
772
773                    if (item.properties.templateKey === 'LANDSCHAFTSFUEHRER-POPUP') { 
774                        greenMarkers.push(item); 
775                    } else if (item.properties.templateKey === 'AKTEUR-LEBENDIGER-WEINBERG-POPUP') { 
776                        brownMarkers.push(item); 
777                    } else if (item.properties.templateKey === 'ARTENSCHUTZ-FACHBERATER-POPUP') { 
778                        yellowMarkers.push(item); 
779                    } else if (item.properties.templateKey === 'MEDIATHEK-POPUP') { 
780                        blueMarkers.push(item); 
781                    } else if (item.properties.templateKey === 'UM_FACHTAGUNGEN') { 
782                        grayMarkers.push(item); 
783                    } else if (item.properties.templateKey === 'UM_ERLEBNISSE') { 
784                        veranstaltungenMarkers.push(item); 
785                    } else if (item.properties.templateKey === 'UM_NATURERLEBNISWOCHE') { 
786                        lightBlueMarkers.push(item); 
787
788                }); 
789
790 
791            ${namespace}veranstaltungenMarkerCluster = new MarkerClusterer(${namespace}map, veranstaltungenMarkers, veranstaltungenMarkerOptions); 
792            ${namespace}greenMarkerCluster = new MarkerClusterer(${namespace}map, greenMarkers, greenMarkersOptions); 
793            ${namespace}brownMarkerCluster = new MarkerClusterer(${namespace}map, brownMarkers, brownMarkersOptions); 
794            ${namespace}yellowMarkerCluster = new MarkerClusterer(${namespace}map, yellowMarkers, yellowMarkersOptions); 
795            ${namespace}blueMarkerCluster = new MarkerClusterer(${namespace}map, blueMarkers, blueMarkersOptions); 
796            ${namespace}grayMarkerCluster = new MarkerClusterer(${namespace}map, grayMarkers, grayMarkersOptions); 
797            ${namespace}lightBlueMarkerCluster = new MarkerClusterer(${namespace}map, lightBlueMarkers, lightBlueMarkersOptions); 
798 
799            ${namespace}veranstaltungenMarkerCluster.setMaxZoom(13); 
800            ${namespace}grayMarkerCluster.setMaxZoom(13); 
801            ${namespace}greenMarkerCluster.setMaxZoom(13); 
802            ${namespace}brownMarkerCluster.setMaxZoom(13); 
803            ${namespace}yellowMarkerCluster.setMaxZoom(13); 
804            ${namespace}blueMarkerCluster.setMaxZoom(13); 
805            ${namespace}lightBlueMarkerCluster.setMaxZoom(13); 
806 
807            /** 
808             * 5 -  Schwäbische Alb & Albvorland 
809             * 7 -  Oberrheinisches Tiefland 
810             * 6 -  Odenwald und Bauland 
811             * 63 - Schwäbisch-Fränkischer Wald und Hohenloher Land 
812             * 4 -  Neckarland und Gäulandschaften 
813             * 8 -  Schwarzwald 
814             * 1 -  Bodensee und Oberschwaben 
815
816             * @type 
817             */ 
818            var areaColors = { 
819 
820                "5" : "#bac013", 
821                "7" : "#00aaa8", 
822                "6" : "#76b82a", 
823                "63" : "#fdc543", 
824                "4" : "#648c2e", 
825                "8" : "#006c5c", 
826                "1" : "#007fa4" 
827            }; 
828            ${namespace}map.data.loadGeoJson('${themeDisplay.getPathThemeRoot()}/conf/naturraeume_complete_wgs84.json'); 
829            ${namespace}map.data.setStyle(function (feature) { 
830 
831                return { 
832                    fillColor: areaColors[feature.getProperty('OBJECTID')], 
833                    fillOpacity: 0.3, 
834                    strokeWeight: 0.5 
835
836            }); 
837            //${namespace}map.data.addListener('click', ${namespace}filterMarkersByArea); 
838            ${namespace}map.data.addListener('mouseover', showTooltip); 
839            ${namespace}map.data.addListener('mousemove', moveTooltip); 
840            ${namespace}map.data.addListener('mouseout', deleteTooltip); 
841
842
843 
844    function showTooltip(event){ 
845        var areaName = event.feature.getProperty('NATURRAUM'); 
846        tipObj = document.createElement("div"); 
847 
848        tipObj.style.background = "white"; 
849        tipObj.style.padding = "10px"; 
850        tipObj.style.fontFamily = "gudea, arial, verdana, Sans-Serif"; 
851        tipObj.style.textAlign = "center"; 
852        tipObj.innerHTML = areaName; 
853 
854        var keys = Object.keys(event); 
855        var x, y; 
856        for (var i = 0; i < keys.length; i++) { 
857            if (MouseEvent.prototype.isPrototypeOf(event[keys[i]])) { 
858                x = event[keys[i]].clientX; 
859                y = event[keys[i]].clientY; 
860
861
862 
863        //position it 
864        tipObj.style.position = "fixed"; 
865        tipObj.style.top = y + tipOffset.y + "px"; 
866        tipObj.style.left = x + tipOffset.x + "px"; 
867 
868        //add it to the body 
869        document.body.appendChild(tipObj); 
870
871 
872    function moveTooltip(event) { 
873        if (tipObj && event) { 
874            var keys = Object.keys(event); 
875            var x, y; 
876            for (var i = 0; i < keys.length; i++) { 
877                if (MouseEvent.prototype.isPrototypeOf(event[keys[i]])) { 
878                    x = event[keys[i]].clientX; 
879                    y = event[keys[i]].clientY; 
880
881
882 
883            //position it 
884            tipObj.style.top = y + tipOffset.y + "px"; 
885            tipObj.style.left = x + tipOffset.x + "px"; 
886
887
888 
889    function deleteTooltip() { 
890        if (tipObj) { 
891            document.body.removeChild(tipObj); 
892            tipObj = null; 
893
894
895 
896    function ${namespace}loadMap(options) { 
897        if (Liferay.umweltakademieMap && Liferay.umweltakademieMap.gmapsReady) { 
898            ${namespace}initMap(options); 
899        } else { 
900            Liferay.once('gmapsReady', function () { 
901                ${namespace}initMap(options); 
902            }); 
903
904 
905        ${namespace}initializeFilters(); 
906
907 
908    function ${namespace}initializeFilters() { 
909        AUI().use('aui-base', function(A) { 
910            A.all('#${namespace}umweltakademie-map-filter .template-filter').each(function(item) { 
911                item.on('click', function(e) { 
912                    ${namespace}filterMarkers(e); 
913                }) 
914            }); 
915            A.all('#${namespace}umweltakademie-map-filter .template-subfilter').each(function(item) { 
916                item.on('click', function(e) { 
917                    ${namespace}filterMarkers(e); 
918                }) 
919            }); 
920        }); 
921
922 
923    function ${namespace}filterMarkersByArea(event) { 
924        var poly = new google.maps.Polygon({ 
925            paths: event.feature.getGeometry().getAt(0).getAt(0).getArray() 
926        }); 
927 
928        AUI().use('aui-base', function(A) { 
929 
930            var filters = A.all('#${namespace}umweltakademie-map-filter .template-filter'); 
931            var checkedFilters = A.all('#${namespace}umweltakademie-map-filter .template-filter:checked'); 
932            var subFilters = A.all('#${namespace}umweltakademie-map-filter .template-subfilter'); 
933 
934            checkedFilters.each(function(filter) { 
935                filter['_node'].checked = false; 
936            }); 
937            subFilters.each(function(filter) { 
938                filter['_node'].checked = false; 
939            }); 
940            filters.each(function(category){ 
941                category['_node'].indeterminate = false; 
942            }); 
943 
944            ${namespace}markers.forEach(function(marker) { 
945                if (google.maps.geometry.poly.containsLocation(marker.position, poly)) { 
946                    if (${namespace}greenMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'LANDSCHAFTSFUEHRER-POPUP') { 
947                        ${namespace}greenMarkerCluster.addMarker(marker); 
948
949                    if (${namespace}brownMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'AKTEUR-LEBENDIGER-WEINBERG-POPUP') { 
950                        ${namespace}brownMarkerCluster.addMarker(marker); 
951
952                    if (${namespace}yellowMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'ARTENSCHUTZ-FACHBERATER-POPUP') { 
953                        ${namespace}yellowMarkerCluster.addMarker(marker); 
954
955                    if (${namespace}blueMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'MEDIATHEK-POPUP') { 
956                        ${namespace}blueMarkerCluster.addMarker(marker); 
957
958                    if (${namespace}veranstaltungenMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'UM_ERLEBNISSE') { 
959                        ${namespace}veranstaltungenMarkerCluster.addMarker(marker); 
960
961                    if (${namespace}lightBlueMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'UM_NATURERLEBNISWOCHE') { 
962                        ${namespace}lightBlueMarkerCluster.addMarker(marker); 
963
964                    if (${namespace}grayMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'UM_FACHTAGUNGEN') { 
965                        ${namespace}grayMarkerCluster.addMarker(marker); 
966
967                    if (${namespace}oms.getMarkers().indexOf(marker) === -1) { 
968                        ${namespace}oms.addMarker(marker); 
969
970                    checkSubFilters(marker); 
971                } else { 
972                    ${namespace}greenMarkerCluster.removeMarker(marker); 
973                    ${namespace}brownMarkerCluster.removeMarker(marker); 
974                    ${namespace}yellowMarkerCluster.removeMarker(marker); 
975                    ${namespace}blueMarkerCluster.removeMarker(marker); 
976                    ${namespace}grayMarkerCluster.removeMarker(marker); 
977                    ${namespace}veranstaltungenMarkerCluster.removeMarker(marker); 
978                    ${namespace}lightBlueMarkerCluster.removeMarker(marker); 
979                    ${namespace}oms.removeMarker(marker); 
980
981 
982                ${namespace}greenMarkerCluster.repaint(); 
983                ${namespace}brownMarkerCluster.repaint(); 
984                ${namespace}yellowMarkerCluster.repaint(); 
985                ${namespace}blueMarkerCluster.repaint(); 
986                ${namespace}grayMarkerCluster.repaint(); 
987                ${namespace}veranstaltungenMarkerCluster.repaint(); 
988                ${namespace}lightBlueMarkerCluster.repaint(); 
989            }); 
990 
991            function checkSubFilters(marker){ 
992                subFilters.each(function (filter) { 
993                    var filterClusterName = filter.getData('templatekey'); 
994                    var filterCategoryId = filter.getData('categoryId'); 
995                    var vocabularyName = filter.getData('vocabularyName'); 
996                    if (filterClusterName === marker.properties.templateKey && (marker.properties.assetCategories && marker.properties.assetCategories.length)) { 
997                        marker.properties.assetCategories.forEach(function(data) { 
998                            if (filterCategoryId === data.categoryId && vocabularyName === 'Naturraum') { 
999                                filter['_node'].checked = true; 
1000                                filters.each(function(category){ 
1001                                    var templateKey = category.getData('templatekey'); 
1002                                    if (templateKey === filterClusterName && !category['_node'].checked) { 
1003                                        category['_node'].indeterminate = true; 
1004
1005                                }) 
1006
1007                        }) 
1008
1009                }); 
1010
1011        }); 
1012 
1013
1014 
1015    function ${namespace}filterMarkers(e) { 
1016        AUI().use('aui-base', function(A) { 
1017            var filters = A.all('#${namespace}umweltakademie-map-filter .template-filter'); 
1018            var subFilters = A.all('#${namespace}umweltakademie-map-filter .template-subfilter'); 
1019 
1020            filters.each(function(category){ 
1021                category['_node'].indeterminate = false; 
1022            }); 
1023 
1024            if (e.target.hasClass('template-filter')) { 
1025                var mytemplatekey = e.target.getData('templatekey') 
1026 
1027                if (e.target._node.checked) { 
1028                    //check all subfilters 
1029                    subFilters.each(function(category) { 
1030                        if (category.getData('templatekey') === mytemplatekey) { 
1031                            category['_node'].checked = true; 
1032
1033                    }); 
1034                } else { 
1035                    //uncheck all subfilters 
1036                    subFilters.each(function(category) { 
1037                        if (category.getData('templatekey') === mytemplatekey) { 
1038                            category['_node'].checked = false; 
1039
1040                    }); 
1041
1042            } else if (e.target.hasClass('template-subfilter')) { 
1043                var mytemplatekey = e.target.getData('templatekey') 
1044 
1045                if (e.target._node.checked) { 
1046                    var allChecked = true; 
1047 
1048                    subFilters.each(function(category) { 
1049                        if (category.getData('templatekey') === mytemplatekey) { 
1050                            if (category['_node'].checked === false) { 
1051                                allChecked = false; 
1052
1053
1054                    }); 
1055 
1056                    if (allChecked) { 
1057                        filters.each(function(category){ 
1058                            if (category.getData('templatekey') === mytemplatekey) { 
1059                                category['_node'].indeterminate = false; 
1060                                category['_node'].checked = true; 
1061
1062                        }); 
1063                    } else { 
1064                        filters.each(function(category){ 
1065                            if (category.getData('templatekey') === mytemplatekey) { 
1066                                category['_node'].indeterminate = true; 
1067                                category['_node'].checked = false; 
1068
1069                        }); 
1070
1071                } else { 
1072                    var allUnchecked = true; 
1073 
1074                    subFilters.each(function(category) { 
1075                        if (category.getData('templatekey') === mytemplatekey) { 
1076                            if (category['_node'].checked === true) { 
1077                                allUnchecked = false; 
1078
1079
1080                    }); 
1081 
1082                    if (allUnchecked) { 
1083                        filters.each(function(category){ 
1084                            if (category.getData('templatekey') === mytemplatekey) { 
1085                                category['_node'].indeterminate = false; 
1086                                category['_node'].checked = false; 
1087
1088                        }); 
1089                    } else { 
1090                        filters.each(function(category){ 
1091                            if (category.getData('templatekey') === mytemplatekey) { 
1092                                category['_node'].indeterminate = true; 
1093                                category['_node'].checked = false; 
1094
1095                        }); 
1096
1097
1098
1099 
1100            var checkedFilters = A.all('#${namespace}umweltakademie-map-filter .template-filter:checked'); 
1101            var checkedSubFilters = A.all('#${namespace}umweltakademie-map-filter .template-subfilter:checked'); 
1102 
1103            var size = checkedFilters.size(); 
1104            var subSize = checkedSubFilters.size(); 
1105 
1106            ${namespace}markers.forEach(function(marker) { 
1107                var found = false; 
1108 
1109                if (!marker) { 
1110                    return; 
1111
1112 
1113                // find markers by checking filters 
1114                checkedFilters.each(function (filter) { 
1115                    var templateKey = filter.getData('templatekey'); 
1116                    if (templateKey === marker.properties.templateKey) { 
1117                        found = true; 
1118
1119                }); 
1120 
1121 
1122                // find markers by checking SUB filters and indeterminate parent filter 
1123                checkedSubFilters.each(function (filter) { 
1124                    var filterTemplateKey = filter.getData('templatekey'); 
1125                    var filterCategoryId = filter.getData('categoryId'); 
1126                    if (filterTemplateKey === marker.properties.templateKey && (marker.properties.assetCategories && marker.properties.assetCategories.length)) { 
1127                        marker.properties.assetCategories.forEach(function(data) { 
1128                            if (filterCategoryId === data.categoryId) { 
1129                                found = true; 
1130
1131                        }); 
1132
1133                }); 
1134 
1135                if (found) { 
1136                    if (${namespace}greenMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'LANDSCHAFTSFUEHRER-POPUP') { 
1137                        ${namespace}greenMarkerCluster.addMarker(marker); 
1138
1139                    if (${namespace}brownMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'AKTEUR-LEBENDIGER-WEINBERG-POPUP') { 
1140                        ${namespace}brownMarkerCluster.addMarker(marker); 
1141
1142                    if (${namespace}yellowMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'ARTENSCHUTZ-FACHBERATER-POPUP') { 
1143                        ${namespace}yellowMarkerCluster.addMarker(marker); 
1144
1145                    if (${namespace}blueMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'MEDIATHEK-POPUP') { 
1146                        ${namespace}blueMarkerCluster.addMarker(marker); 
1147
1148                    if (${namespace}veranstaltungenMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'UM_ERLEBNISSE') { 
1149                        ${namespace}veranstaltungenMarkerCluster.addMarker(marker); 
1150
1151                    if (${namespace}lightBlueMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'UM_NATURERLEBNISWOCHE') { 
1152                        ${namespace}lightBlueMarkerCluster.addMarker(marker); 
1153
1154                    if (${namespace}grayMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'UM_FACHTAGUNGEN') { 
1155                        ${namespace}grayMarkerCluster.addMarker(marker); 
1156
1157                    if (${namespace}oms.getMarkers().indexOf(marker) === -1) { 
1158                        ${namespace}oms.addMarker(marker); 
1159
1160                } else { 
1161                    ${namespace}greenMarkerCluster.removeMarker(marker); 
1162                    ${namespace}brownMarkerCluster.removeMarker(marker); 
1163                    ${namespace}yellowMarkerCluster.removeMarker(marker); 
1164                    ${namespace}blueMarkerCluster.removeMarker(marker); 
1165                    ${namespace}grayMarkerCluster.removeMarker(marker); 
1166                    ${namespace}veranstaltungenMarkerCluster.removeMarker(marker); 
1167                    ${namespace}lightBlueMarkerCluster.removeMarker(marker); 
1168                    ${namespace}oms.removeMarker(marker); 
1169
1170            }) 
1171 
1172            ${namespace}greenMarkerCluster.repaint(); 
1173            ${namespace}brownMarkerCluster.repaint(); 
1174            ${namespace}yellowMarkerCluster.repaint(); 
1175            ${namespace}blueMarkerCluster.repaint(); 
1176            ${namespace}grayMarkerCluster.repaint(); 
1177            ${namespace}veranstaltungenMarkerCluster.repaint(); 
1178            ${namespace}lightBlueMarkerCluster.repaint(); 
1179        }); 
1180
1181 
1182    function ${namespace}clearAllFilters() { 
1183        ${namespace}markers.forEach(function(item) { 
1184            if (!item) { 
1185                return; 
1186
1187 
1188            if (${namespace}greenMarkerCluster.getMarkers().indexOf(item) === -1 && item.properties.templateKey === 'LANDSCHAFTSFUEHRER-POPUP') { 
1189                ${namespace}greenMarkerCluster.addMarker(item); 
1190
1191            if (${namespace}brownMarkerCluster.getMarkers().indexOf(item) === -1 && item.properties.templateKey === 'AKTEUR-LEBENDIGER-WEINBERG-POPUP') { 
1192                ${namespace}brownMarkerCluster.addMarker(item); 
1193
1194            if (${namespace}yellowMarkerCluster.getMarkers().indexOf(item) === -1 && item.properties.templateKey === 'ARTENSCHUTZ-FACHBERATER-POPUP') { 
1195                ${namespace}yellowMarkerCluster.addMarker(item); 
1196
1197            if (${namespace}blueMarkerCluster.getMarkers().indexOf(item) === -1 && item.properties.templateKey === 'MEDIATHEK-POPUP') { 
1198                ${namespace}blueMarkerCluster.addMarker(item); 
1199
1200            if (${namespace}grayMarkerCluster.getMarkers().indexOf(item) === -1 && item.properties.templateKey === 'UM_FACHTAGUNGEN') { 
1201                ${namespace}grayMarkerCluster.addMarker(item); 
1202
1203            if (${namespace}veranstaltungenMarkerCluster.getMarkers().indexOf(item) === -1 && item.properties.templateKey === 'UM_ERLEBNISSE') { 
1204                ${namespace}veranstaltungenMarkerCluster.addMarker(item); 
1205
1206            if (${namespace}lightBlueMarkerCluster.getMarkers().indexOf(item) === -1 && item.properties.templateKey === 'UM_NATURERLEBNISWOCHE') { 
1207                ${namespace}lightBlueMarkerCluster.addMarker(item); 
1208
1209 
1210            if (${namespace}oms.getMarkers().indexOf(item) === -1) { 
1211                ${namespace}oms.addMarker(item); 
1212
1213        }); 
1214
1215 
1216    $(document).ready(${namespace}loadMap); 
1217    Liferay.on('endNavigate', ${namespace}loadMap); 
1218    Liferay.on('beforeNavigate', deleteTooltip); 
1219</script> 
1220 
1221<#if eventCalendarIds?? && eventCalendarIds?has_content> 
1222    <script> 
1223        function ${namespace}loadEvents(searchOptions) { 
1224            var mapDiv = document.getElementById('${namespace}umweltakademie-map'); 
1225 
1226            if (mapDiv) { 
1227                var originalUrlInvoke = Liferay.Service.URL_INVOKE; 
1228 
1229                Liferay.Service.URL_INVOKE = "${eventServerUrl}/api/jsonws/invoke"; 
1230                Liferay.Service( 
1231                    '/event.event/search-events', 
1232
1233                        calendarIds: [${eventCalendarIds}], 
1234                        keywords: '', 
1235                        startTime: searchOptions.fromDate ? searchOptions.fromDate : formatStringToDate(${namespace}fromDate.value).getTime(), 
1236                        endTime: searchOptions.toDate ? searchOptions.toDate : formatStringToDate(${namespace}toDate.value).getTime() + ${day}, 
1237                        locale: 'de_DE', 
1238                        recurring: true, 
1239                        includeEvents: true, 
1240                        includeOfferings: true, 
1241                        categoryIds: [] ${eventCalendarStructureKeysFilter} 
1242                    }, 
1243                    function (events) { 
1244                        var results = events.results; 
1245 
1246                        if (results) { 
1247                            var structureKeys = []; 
1248                            var vocabularies = []; 
1249 
1250                            results.forEach(function (item) { 
1251                                var marker; 
1252                                //TODO choose icon based on type / calendar etc. 
1253 
1254                                if (item.geolocation) { 
1255 
1256                                    var cssClass = ""; 
1257 
1258                                    //TODO replace when new structures have been created 
1259                                    if (item.ddm_structure_key === "UM_ERLEBNISSE") { 
1260                                        icon = '/o/um-enviroment-academy-theme/images/map/Pin_Erlebnisse_Veranstaltungen_4c.svg'; 
1261                                        cssClass = "erlebnisse-veranstaltungen"; 
1262                                    } else if (item.ddm_structure_key === "UM_FACHTAGUNGEN") { 
1263                                        icon = '/o/um-enviroment-academy-theme/images/map/Pin_Fachtagungen_Fachveranstaltungen_4c.svg'; 
1264                                        cssClass = "fachtagungen-fachveranstaltungen"; 
1265                                    } else if (item.ddm_structure_key === "UM_NATURERLEBNISWOCHE") { 
1266                                        icon = '/o/um-enviroment-academy-theme/images/map/Pin_Hellblau_Kalender_4c.svg'; 
1267                                        cssClass = "naturerlebniswoche"; 
1268
1269 
1270                                    // Write structure keys 
1271                                    structureKeys[item.ddm_structure_key] = item.ddm_structure_name; 
1272 
1273                                    // Write vocabularies for every structure key 
1274                                    if (vocabularies[item.ddm_structure_key]) { 
1275                                        vocabularies[item.ddm_structure_key] = mergeVocabularies(vocabularies[item.ddm_structure_key], item.vocabularies); 
1276                                    } else { 
1277                                        vocabularies[item.ddm_structure_key] = item.vocabularies 
1278
1279 
1280                                    marker = new google.maps.Marker( 
1281
1282                                            position: new google.maps.LatLng(item.geolocation.latitude, item.geolocation.longitude), 
1283                                            properties: { 
1284                                                templateKey: item.ddm_structure_key, 
1285                                                templateName: item.ddm_structure_name, 
1286                                                assetCategories: item.vocabularies.length ? getCategoriesFromVocabularies(item.vocabularies) : [] 
1287                                            }, 
1288                                            selected: false, 
1289                                            title: item.short_title 
1290
1291                                    ); 
1292 
1293                                    function getCategoriesFromVocabularies(vocabularies) { 
1294                                        var categories = []; 
1295                                        vocabularies.map(function (vocabulary) { 
1296                                            vocabulary.categories.map(function (category) { 
1297                                                category.categoryId = category.id; 
1298                                                categories.push(category); 
1299                                            }) 
1300                                        }); 
1301                                        return categories; 
1302
1303 
1304                                    marker.setIcon( 
1305
1306                                            url: icon, 
1307                                            scaledSize: new google.maps.Size(61, 100), 
1308                                            origin: new google.maps.Point(0, 0), 
1309                                            anchor: new google.maps.Point(30, 100) 
1310
1311                                    ); 
1312 
1313                                    marker.addListener('click', function () { 
1314                                        //language=html 
1315                                        var startDate = new Date(item.startTime); 
1316                                        var endDate = new Date(item.endTime); 
1317                                        var eventDetailLinkTemplate = ${namespace}eventDetailLinkTemplates[item.calendarId]; 
1318                                        var topic; 
1319 
1320                                        item.vocabularies.forEach(function (item) { 
1321                                            if (item.label === 'Veranstaltungsart') { 
1322                                                if (item.categories.length > 0) { 
1323                                                    topic = item.categories[0].label; 
1324
1325
1326                                        }); 
1327 
1328                                        var onerrorAttr = ' onerror="this.onerror=null; this.src=\'/o/um-enviroment-academy-theme/images/map/event_img.png\'" '; 
1329 
1330                                        var html = '<div class="' + cssClass + ' infowindow-content journal-content-article">' + 
1331                                            '   <div>' + 
1332                                            '       <p>' + 
1333                                            '           ' + (item.city ? item.city : "&nbsp;") + 
1334                                            '       </p>' + 
1335                                            '   </div>' + 
1336                                            '   <div class="img aspect-ratio aspect-ratio-16-to-9" style="height: 120px">\n' + 
1337                                            '      <img src="${eventServerUrl}' + item.small_image_url + '" ' + onerrorAttr; 
1338 
1339                                        if (item.AltTag) { 
1340                                            html = html + 
1341                                                'alt="' + item.AltTag + '" title="' + item.AltTag + '" '; 
1342
1343 
1344                                        html = html + 
1345                                            '                />\n'; 
1346                                        if (item.Bildnachweis) { 
1347                                            html = html + 
1348                                                '<div class="bildnachweis">Quelle: ' + item.Bildnachweis + '</div>'; 
1349
1350 
1351                                        html = html + 
1352                                            '    </div>\n' + 
1353                                            '    <div class="clearfix">' + 
1354                                            '       <p> ' + 
1355                                            '           <span style="float:left">' + startDate.toLocaleDateString('de', {weekday: 'long'}) + '</span>' + 
1356                                            '           <span style="float:right">' + startDate.toLocaleTimeString('de', { 
1357                                                hour: '2-digit', 
1358                                                minute: '2-digit' 
1359                                            }) + ' - ' + endDate.toLocaleTimeString('de', { 
1360                                                hour: '2-digit', 
1361                                                minute: '2-digit' 
1362                                            }) + ' Uhr</span>' + 
1363                                            '      </p>' + 
1364                                            '    </div>\n' + 
1365                                            '    <div class="divider"></div>\n' + 
1366                                            '    <div>' + 
1367                                            '        <h3 class="asset-title">' + startDate.toLocaleDateString('de', { 
1368                                                day: '2-digit', 
1369                                                month: 'long', 
1370                                                year: 'numeric' 
1371                                            }) + '</h3>' + 
1372                                            '   </div>\n' + 
1373                                            '   <div class="divider"></div>\n' + 
1374                                            '   <div>'; 
1375                                        if (topic) { 
1376                                            html = html + 
1377                                                '<p>' + topic + '</p>' 
1378
1379                                        html = html + 
1380                                            '<h3 class="asset-title">' + item.short_title + '</h3>'; 
1381                                        if (item.organizer) { 
1382                                            html = html + 
1383                                                '<p>' + item.organizer + '</p>'; 
1384
1385 
1386                                        html = html + 
1387                                            '   </div>' + 
1388                                            '   <div class="divider"></div>' + 
1389                                            '   <div class="footer">\n' + 
1390                                            '      <p>\n' + 
1391                                            '         <a class="internal-icon" href="' + eventDetailLinkTemplate + item.uuid + '">\n' + 
1392                                            '             Zum Veranstaltungskalender\n' + 
1393                                            '             <span class="hide-accessible"><@liferay.language key="about" /> ' + item.short_title + '</span>\n' + 
1394                                            '         </a>\n' + 
1395                                            '      </p>\n' + 
1396                                            '   </div>\n' + 
1397                                            '</div>'; 
1398 
1399                                        ${namespace}infowindow.setContent(html); 
1400                                        ${namespace}infowindow.open(${namespace}map, marker); 
1401 
1402                                        if (showCopyrightMarker) { 
1403                                            showCopyrightMarker(); 
1404
1405                                    }); 
1406 
1407                                    marker.addListener('mouseover', function() { 
1408                                        deleteTooltip(); 
1409                                    }); 
1410 
1411                                    ${namespace}markers.push(marker); 
1412                                    if (${namespace}grayMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'UM_FACHTAGUNGEN') { 
1413                                        ${namespace}grayMarkerCluster.addMarker(marker); 
1414
1415                                    if (${namespace}veranstaltungenMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'UM_ERLEBNISSE') { 
1416                                        ${namespace}veranstaltungenMarkerCluster.addMarker(marker); 
1417
1418                                    if (${namespace}lightBlueMarkerCluster.getMarkers().indexOf(marker) === -1 && marker.properties.templateKey === 'UM_NATURERLEBNISWOCHE') { 
1419                                        ${namespace}lightBlueMarkerCluster.addMarker(marker); 
1420
1421                                    ${namespace}oms.addMarker(marker); 
1422
1423                            }); 
1424 
1425                            var filterHtml = ""; 
1426                            var structureKey; 
1427                            for (structureKey in structureKeys) { 
1428                                var cssStyle = 'max-width: 20px; float: right;'; 
1429                                var miniIconUrl; 
1430 
1431                                if (structureKey === 'UM_ERLEBNISSE') { 
1432                                    miniIconUrl = '/o/um-enviroment-academy-theme/images/map/Pin_Erlebnisse_Veranstaltungen_4c.svg'; 
1433                                } else if (structureKey === 'UM_FACHTAGUNGEN') { 
1434                                    miniIconUrl = '/o/um-enviroment-academy-theme/images/map/Pin_Fachtagungen_Fachveranstaltungen_4c.svg'; 
1435                                } else if (structureKey === 'UM_NATURERLEBNISWOCHE') { 
1436                                    miniIconUrl = '/o/um-enviroment-academy-theme/images/map/Pin_Hellblau_Kalender_4c.svg'; 
1437
1438 
1439                                var collapseFilters = ''; 
1440                                var collapseStart = ''; 
1441                                var subFilters = ''; 
1442                                var collapseEnd = '</div>'; 
1443 
1444                                vocabularies[structureKey].map(function (vocabulary) { 
1445                                    subFilters = ''; 
1446 
1447                                    collapseStart = 
1448                                        '<span>' + vocabulary.label + '</span>\n' + 
1449                                        '<div id="${namespace}' + vocabulary.label + structureKey + 
1450                                        '"style="margin: 0 5px 0 22px; max-width: 340px;">\n'; 
1451 
1452                                    vocabulary.categories.map(function (category) { 
1453                                        subFilters += 
1454                                            '<label class="checkbox-label">\n' + 
1455                                            '<input type="checkbox" class="template-subfilter" data-templatekey="' + 
1456                                            structureKey + '" data-categoryId="' + category.id + '" data-vocabularyName="' + vocabulary.label + '" checked="true"><span class="checkbox-marker"></span>\n' + 
1457                                            '<span class="checkbox-title">' + category.label + '</span>' + 
1458                                            '</label>'; 
1459                                    }); 
1460 
1461                                    collapseFilters += collapseStart + subFilters + collapseEnd; 
1462                                }); 
1463 
1464                                var caretIcon = ''; 
1465                                if (vocabularies[structureKey].length) { 
1466                                    caretIcon = '<a href="#${namespace}' + structureKey + '" data-toggle="collapse" aria-expanded="false" class="collapse-icon-wrapper">' + 
1467                                        '                <span class="icon icon-um-chevron-down-small"></span>' + 
1468                                        '            </a>'; 
1469
1470 
1471                                filterHtml = filterHtml + 
1472                                    '                <div class="checkbox-line" style="min-height: 30px">\n' + 
1473                                    '                    <label class="checkbox-label">\n' + 
1474                                    '                        <input type="checkbox" class="checkbox template-filter" data-templatekey="' + structureKey + '" checked="true">\n' + 
1475                                    '                        <span class="checkbox-title">' + structureKeys[structureKey] + '</span>\n<span class="checkbox-marker"></span>' + 
1476                                    '                    </label>\n' + 
1477                                    '                    <img src="' + miniIconUrl + '" class="checkbox-line-image">' 
1478                                    + caretIcon + 
1479                                    '                    <div class="collapse-categories-wrapper">' + 
1480                                    '                       <div id="${namespace}' + structureKey + '" class="collapse">' 
1481                                    + collapseFilters + 
1482                                    '                       </div>' + 
1483                                    '                    </div>' + 
1484                                    '                </div>\n'; 
1485 
1486
1487 
1488                            var mapFilterEventsElem = document.getElementById("${namespace}umweltakademie-map-filter-events"); 
1489                            if (mapFilterEventsElem) { 
1490                                mapFilterEventsElem.innerHTML = filterHtml; 
1491
1492 
1493                            ${namespace}veranstaltungenMarkerCluster.repaint(); 
1494                            ${namespace}grayMarkerCluster.repaint(); 
1495                            ${namespace}lightBlueMarkerCluster.repaint(); 
1496 
1497                            <#if hasFilterCategories == false> 
1498                            var mapFilterButton = document.getElementById('${namespace}umweltakademie-map-filter-button'); 
1499                            if (Object.keys(structureKeys).length == 0) { 
1500                                mapFilterButton.style.display = 'none'; 
1501                            } else { 
1502                                mapFilterButton.style.display = 'block'; 
1503
1504                            </#if> 
1505 
1506                            ${namespace}initializeFilters(); 
1507
1508
1509                ); 
1510                Liferay.Service.URL_INVOKE = originalUrlInvoke; 
1511 
1512                function mergeVocabularies(vocabularies1, vocabularies2) { 
1513                    var result = []; 
1514 
1515                    result = result.concat(vocabularies1); 
1516 
1517                    for (var key in vocabularies2) { 
1518                        var vocabulary = vocabularies2[key]; 
1519 
1520                        var existing = result.filter(function (elem) { 
1521                            return elem.id === vocabulary.id 
1522                        }); 
1523                        if (existing.length > 0) { 
1524                            existing[0].categories = _.unique(existing[0].categories.concat(vocabulary.categories), 'id'); 
1525                        } else { 
1526                            result = result.concat(vocabulary); 
1527
1528
1529 
1530                    return result; 
1531
1532
1533
1534 
1535        $(document).ready(${namespace}loadEvents); 
1536        Liferay.on('endNavigate', ${namespace}loadEvents); 
1537    </script> 
1538</#if> 
1539 
1540<#function getTemplateKey(structureKey)> 
1541    <#switch structureKey> 
1542        <#case "LANDSCHAFTSFUEHRER"> 
1543            <#return "LANDSCHAFTSFUEHRER-POPUP" /> 
1544            <#break /> 
1545        <#case "AKTEUR-LEBENDIGER-WEINBERG"> 
1546            <#return "AKTEUR-LEBENDIGER-WEINBERG-POPUP" /> 
1547            <#break /> 
1548        <#case "ARTENSCHUTZ-FACHBERATER"> 
1549            <#return "ARTENSCHUTZ-FACHBERATER-POPUP" /> 
1550            <#break /> 
1551        <#case "MEDIATHEK"> 
1552        <#case "42705"> 
1553            <#return "MEDIATHEK-POPUP" /> 
1554            <#break /> 
1555        <#default> 
1556            <#return "NONE" /> 
1557            <#break /> 
1558    </#switch> 
1559</#function>