PageSourceSearch

https://www.ornitho.de/

html ornitho.de collected 2026-10-02 10:12:35 UTC 195,882 bytes, 3,819 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3<!-- RESPONSIVE HEADER START HERE -->
4<head>
5                <link rel="shortcut icon" href="./favicon.ico" type="image/x-icon">
6            <link rel="icon" href="./apple-touch-icon.png" type="image/png" sizes="57x57">
7            <link rel="apple-touch-icon" href="./apple-touch-icon.png">
8                    <style>
9            :root {--alink:black;--menu_head:#cedaea;--title_box:#0061a1;--button-color:#f9ba57;--menu_head_off:#9cb7d6;--title_box_text:#ffffff;--toplevel-color:#0061a1;--backpanel-color:#e0e0e0;--frontpanel-color:#ffffff;--title-menu-color:#ffffff;--shadowpanel-color:#999999;--profile-card-color:#ffffff;--title_gradien_stop:#0061a1;--lowlevel-menu-color:#f9ba57;--midlevel-menu-color:#f5f5f5;--title_gradien_start:#0061a1;--toplevel-menu-color:#0061a1;--highlevel-menu-color:#f9ba57;--lightshadowpanel-color:#b7b7b7}        </style>
10        <link href="https://cdnfiles1.biolovision.net/common/css/responsive_styles_e4abb055.css" rel="stylesheet" type="text/css">
11        <link href="https://cdnfiles1.biolovision.net/common/css/btn-sprite_a59ff6ea.css" rel="stylesheet" type="text/css">
12
13                    <style>
14            @media (min-width: 1800px) {
15                .tab-group {
16                    margin-top: 0;
17                }
18                .tab-title,
19                .tab-active-hidden {
20                    display: block;
21                }
22            }
23            </style>
24            
25        <meta name="google-site-verification" content="nZTtSUyudi8QJFYl-yX3b6Ret999zHtlp_VaA8825zc">
26        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
27                <title>Home ornitho.de / ornitho.lu - www.ornitho.de</title>
28            <meta property="og:title" content="Home ornitho.de / ornitho.lu - www.ornitho.de">
29            <meta property="og:image" content="https://www.biolovision.net/logo_2021_small.png">
30            <meta property="twitter:card" content="summary">
31            <meta property="twitter:title" content="Home ornitho.de / ornitho.lu - www.ornitho.de">
32            <meta property="twitter:image" content="https://www.biolovision.net/logo_2021_small.png">
33                <meta name="viewport" content="width=device-width, initial-scale=1">
34    </head>
35
36<body>
37
38<div id="ornithobody">
39
40                <!--[if LT IE 10]>
41            <div class="ie6">
42            You are using an outdated browser. For a faster, safer browsing experience,             <a class="ie6" href="http://ie.microsoft.com/">upgrade for free today</a>.
43            </div>
44            <![endif]-->
45        
46    <div id="responsive-sidebar-left-container">
47        <em id="sidebar-open" class="fa-solid fa-bars iconhome"></em>
48        <a class="a-bk" href="/"><em class="fa-solid fa-home iconhome"></em></a>
49                <a href="https://play.google.com/store/apps/details?id=ch.biolovision.naturalist" style="display: none;margin-left:-5px;margin-right:0.5rem;"><em class="btn btn-naturalist btn-naturalist-android sidebar-btn"></em></a>
50        <a href="https://itunes.apple.com/us/app/naturalist/id1175280268?mt=8" style="display: none;margin-left:-5px;margin-right:0.5rem;"><em class="btn btn-naturalist btn-naturalist-ios sidebar-btn"></em></a>
51    </div>
52
53    <div id="responsive-sidebar-container">
54                        <div class="topLogo">                <div style="z-index:100">
55                                    <a onclick="send_das_stat(19);" rel='nofollow' href='https://www.ornitho.de'>
56                    <img class="topleftlogo" style="" alt="www.ornitho.de" src="https://cdnfiles2.biolovision.net/www.ornitho.de/images/das/logoddaweisstransparent-5945.png">                    </a>
57
58                      
58<script>
59                         //<![CDATA[
60                         function send_das_stat(id_das)
61                         {
62                             $.post("index.php?m_id=63&content=ads_stat_click&id_ads=" + id_das,{});
63                         }
64                         // ]]>
65                     </script>
65
66
67                                    </div>
68
69                </div>
70                <div class="notlogged">ornitho.de</div>
71                <div class="toprightlogo">                <div style="z-index:100">
72                                    <a onclick="send_das_stat(14);" rel='nofollow' href='https://www.dda-web.de/'>
73                    <img class="toprightlogoimg" style="" alt="www.ornitho.de" src="https://cdnfiles2.biolovision.net/www.ornitho.de/images/das/logoddaweisstransparent-7288.png">                    </a>
74
75                      
75<script>
76                         //<![CDATA[
77                         function send_das_stat(id_das)
78                         {
79                             $.post("index.php?m_id=63&content=ads_stat_click&id_ads=" + id_das,{});
80                         }
81                         // ]]>
82                     </script>
82
83
84                                    </div>
85
86                </div>                    <div class="langubox">
87                        <div class="langButton" 
88											onmouseover="this.className='langButtonOver'" 
89											onmouseout="this.className='langButton'" 
90											onclick="location.href='https://www.ornitho.de/index.php?m_id=1&amp;langu=fr'">
91											<a class="bvLangu" href="https://www.ornitho.de/index.php?m_id=1&amp;langu=fr">fr</a>
92											</div><div class="langButton" 
93											onmouseover="this.className='langButtonOver'" 
94											onmouseout="this.className='langButton'" 
95											onclick="location.href='https://www.ornitho.de/index.php?m_id=1&amp;langu=de'">
96											<a class="bvLangu" href="https://www.ornitho.de/index.php?m_id=1&amp;langu=de">de</a>
97											</div><div class="langButtonSelected">en</div>                    </div>
98                    
99    </div>
100
101    <div class="clearfix"></div>
102
103            
103<script type="importmap">
104            {
105                "imports": {
106                    "vendor-carbon": "https://cdnfiles1.biolovision.net/common/components/vendor-carbon_770d19c5.js",
107                    "vendor-chart": "https://cdnfiles1.biolovision.net/common/components/vendor-chart_8830aae6.js",
108                    "vendor-map": "https://cdnfiles1.biolovision.net/common/components/vendor-map_d3fcc28e.js",
109                    "vendor-misc": "https://cdnfiles1.biolovision.net/common/components/vendor-misc_f66f55fa.js",
110                    "vendor-svelte": "https://cdnfiles1.biolovision.net/common/components/vendor-svelte_fc689eb8.js"
111                }
112            }
113        </script>
113
114        
114<script type="module" crossorigin src="https://cdnfiles1.biolovision.net/common/components/polyfills_d532c8be.js"></script>
114
115        
115<script type="module" crossorigin src="https://cdnfiles1.biolovision.net/common/components/components_1f6d7283.js"></script>
115
116        <link rel="stylesheet" crossorigin href="https://cdnfiles1.biolovision.net/common/components/v3-reset_66a2ff10.css">
117        <link rel="stylesheet" crossorigin href="https://cdnfiles1.biolovision.net/common/components/carbon.all.v3.min_f9f97f0b.css">
118        <link rel="stylesheet" crossorigin href="https://cdnfiles1.biolovision.net/common/components/components_fa26e04c.css">
119
120        
120<script type="module">
121            import { setDataColorTheme, setPlatformContext, componentRegistry, LazySpeciesRepository } from 'https://cdnfiles1.biolovision.net/common/components/components_1f6d7283.js';
122
123            setDataColorTheme({
124                single: {
125                    primary: getComputedStyle(document.documentElement).getPropertyValue('--toplevel-menu-color').trim(),
126                    primary50: '#e6eff6'
127                },
128                sequential: {},
129                diverging: {},
130                qualitative: {
131                    default: ['#0765a8', '#74ccfb'],
132                    muted: ['#bccedd', '#bcbcc5']
133                },
134                special: {
135                    rarity: {
136                        verycommon: '#000000',
137                        common: '#000000',
138                        escaped: '#3366FF',
139                        never: '#CC0099',
140                        rare: '#CC3300',
141                        veryrare: '#CC3300',
142                        unusual: '#000000'
143                    }
144                }
145            });
146
147            setPlatformContext({
148                speciesRepository: LazySpeciesRepository.withBasePath(new URL('https://www.ornitho.de/'))
149            });
150
151            window.componentRegistry = componentRegistry;
152        </script>
152
153                
153<script src="https://cdnfiles1.biolovision.net/common/js/jquery-3.6.0.min.js"></script>
153
154        
154<script>
155            //<![CDATA[
156            $(document).ready(function(){
157                $("#login").click(function(){
158                    if ($("#slidingLogin").is(":hidden")) {
159                        $("#slidingLogin").slideDown("slow", function() {$("#loginemail").focus()});
160                    }
161                    else {
162                        $("#slidingLogin").hide();
163                    }
164                });
165            });
166            // ]]>
167        </script>
167
168        
169    <div id="maincontent"></div>
170    <div id="td-full-content">
171        <div id="td-sidebar">
172            <!-- RESPONSIVE START LEFT -->
173<script src="https://cdnfiles1.biolovision.net/common/js/menu_f0d31db0.js"></script>
vendor: 2 bytes, line 173
173
174<script>
175    // <![CDATA[
176    var menu = menuBuilder('/');
177
178    $(function(){
179
180        $(".bvMenuSubTitle").click(function() {
181            menu.toggleSubSub($(this).attr("id"),1);
182            return false;
183        });
184
185        $(".bvMenuTitle").click(function() {
186            menu.toggleSub($(this).attr("id"));
187            return false;
188        });
189    })
190    // ]]>
191</script>
191
192
193<div id="table-sidebar" class="bvMenuBar">
194    <div class="row_1st home ">
195        <div class="col-xs-12">
196                                <div id="conbt" onclick="javascript:menu.toggleConnect();" class="takepart takepartmenu">
197                        <input name="login_button" type="submit" class="submit takepartbutton" value="Participate!"/>
198                    </div>
199                            </div>
200    </div>
201
202    <form id="confm" name="loginform" style="background-color: white;" class="loginformform" action="https://www.ornitho.de/index.php" method="post">
203        <input type="hidden" name="login" value="1"/>
204        <div class="loginform">
205            <div class="logintext">
206                <input class="textlogin" id="loginemail" placeholder="My e-mail" type="text" autocomplete="username" name="USERNAME" size="20" value=""/>
207            </div>
208            <div class="logintext">
209                <input class="textlogin" placeholder="My password" type="password" autocomplete="current-password" name="PASSWORD" size="20"/>
210            </div>
211            <div class="logintext">
212                <input id="remember" type="checkbox" name="REMEMBER" value="ON"/><label for="remember">Remember password</label>
213            </div>
214            <div class="logintext">
215                <a class="alink" href="https://www.ornitho.de/index.php?m_id=60">I have lost my password</a>
216            </div>
217        </div>
218
219        <div class="loginform connect" style="padding:0">
220            <input name="login_button" type="submit" class="submit" value="Login"/>
221        </div>
222        <div class="logintext" style="margin-bottom:0;background-color: var(--midlevel-menu-color);">
223            <a class="alink submit submit--link" style="font-size:0.8rem;" href="https://www.ornitho.de/index.php?m_id=61">Register</a>
224        </div>
225    </form>
226    <div id="20"  class="bvMenuTitle" ><em id="oc-t20" class="menu_title_deco fa fa-chevron-right"></em><em  class="menu_title_deco_icon fa-solid fa-newspaper fa-2x"></em><div class="bvMT">Latest</div></div><div style="display:none" id="t20"><div id="5"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=5&amp;sp_DOffset=5'"><div class="bvMI-pad-1"></div><div class="bvMIt">Current observations</div></div><div id="7"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=7'"><div class="bvMI-pad-1"></div><div class="bvMIt">Photo and sound gallery</div></div><div id="12"  class="bvMenuSubTitleUsePageBoxes" onmouseover="this.className='bvMenuSubTitleUsePageBoxesOver'" onmouseout="this.className='bvMenuSubTitleUsePageBoxes'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1501&parent=12'"><div class="bvMI-pad-1"></div><em style="color:var(--title_box);margin-right: 0.25rem;" class="menu_title_deco fa-solid fa-grip"></em><em style="color:var(--title_box);margin-right: 0.25rem;" class="menu_title_deco_icon fa-solid fa-table-cells-large fa-12x"></em><div class="bi-l1t">Distribution</div></div><div  id="t12"></div><div id="400"  class="bvMenuSubTitle" onmouseover="this.className='bvMenuSubTitleOver'" onmouseout="this.className='bvMenuSubTitle'" ><em id="oc-t400" class="menu_deco fa-solid fa-square-plus"></em><div class="bvMI-pad-1"></div><div class="bi-l1t">News & Events</div></div><div style="display:none" id="t400"><div id="1164"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1164'"><div class="bvMI-pad-4"></div><div class="bvMIt">Latest news</div></div><div id="21"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.dda-web.de/aktuelles/kalender'"><div class="bvMI-pad-4"></div><div class="bvMIt">Events and meetings</div></div></div></div><div id="510"  class="bvMenuTitle" ><em id="oc-t510" class="menu_title_deco fa fa-chevron-right"></em><em  class="menu_title_deco_icon fa-solid fa-square-poll-vertical fa-2x"></em><div class="bvMT">Analyses</div></div><div style="display:none" id="t510"><div id="68"  class="bvMenuSubTitleUsePageBoxes" onmouseover="this.className='bvMenuSubTitleUsePageBoxesOver'" onmouseout="this.className='bvMenuSubTitleUsePageBoxes'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1501&parent=68'"><div class="bvMI-pad-1"></div><em style="color:var(--title_box);margin-right: 0.25rem;" class="menu_title_deco fa-solid fa-grip"></em><em style="color:var(--title_box);margin-right: 0.25rem;" class="menu_title_deco_icon fa-solid fa-chart-line fa-12x"></em><div class="bi-l1t">Statistics</div></div><div style="display:none" id="t68"></div><div id="1184"  class="bvMenuSubTitle" onmouseover="this.className='bvMenuSubTitleOver'" onmouseout="this.className='bvMenuSubTitle'" ><em id="oc-t1184" class="menu_deco fa-solid fa-square-minus"></em><div class="bvMI-pad-1"></div><div class="bi-l1t">Publications & Evaluations</div></div><div  id="t1184"><div id="1127"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1127&amp;item=12'"><div class="bvMI-pad-4"></div><div class="bvMIt">Publications</div></div><div id="1183"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1183&amp;item=126'"><div class="bvMI-pad-4"></div><div class="bvMIt">Annual reports, newsletters</div></div></div></div><div id="67"  class="bvMenuTitle" ><em id="oc-t67" class="menu_title_deco fa fa-chevron-right"></em><em  class="menu_title_deco_icon fa-solid fa-circle-question fa-2x"></em><div class="bvMT">Help</div></div><div style="display:none" id="t67"><div id="1124"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1124&amp;item=13'"><div class="bvMI-pad-1"></div><div class="bvMIt">Who is my regional coordinator?</div></div><div id="41"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=41'"><div class="bvMI-pad-1"></div><div class="bvMIt">Symbols and abbreviations</div></div><div id="125"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=125'"><div class="bvMI-pad-1"></div><div class="bvMIt">Frequently asked questions (FAQ)</div></div></div><div id="499"  class="bvMenuTitle" ><em id="oc-t499" class="menu_title_deco fa fa-chevron-right"></em><em  class="menu_title_deco_icon fa-solid fa-circle-info fa-2x"></em><div class="bvMT">
226Background</div></div><div style="display:none" id="t499"><div id="1116"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1116&amp;item=7'"><div class="bvMI-pad-1"></div><div class="bvMIt">About ornitho.de resp. ornitho.lu</div></div><div id="1126"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1126&amp;c=PART'"><div class="bvMI-pad-1"></div><div class="bvMIt">Legal body and partners</div></div><div id="401"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.dda-web.de/unterstuetzen/spenden/spendenformular'"><div class="bvMI-pad-1"></div><div class="bvMIt">Donate to ornitho.de</div></div><div id="1121"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1121&amp;item=3'"><div class="bvMI-pad-1"></div><div class="bvMIt">Terms and conditions of use</div></div><div id="1115"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1115&amp;item=8'"><div class="bvMI-pad-1"></div><div class="bvMIt">Code of conduct</div></div><div id="1129"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1129&amp;item=11'"><div class="bvMI-pad-1"></div><div class="bvMIt">Disclaimer</div></div><div id="402"  class="bvMenuSubTitle" onmouseover="this.className='bvMenuSubTitleOver'" onmouseout="this.className='bvMenuSubTitle'" ><em id="oc-t402" class="menu_deco fa-solid fa-square-plus"></em><div class="bvMI-pad-1"></div><div class="bi-l1t">Technical-organizational</div></div><div style="display:none" id="t402"><div id="156"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=156'"><div class="bvMI-pad-4"></div><div class="bvMIt">Species protected automatically</div></div></div><div id="404"  class="bvMenuSubTitle" onmouseover="this.className='bvMenuSubTitleOver'" onmouseout="this.className='bvMenuSubTitle'" ><em id="oc-t404" class="menu_deco fa-solid fa-square-plus"></em><div class="bvMI-pad-1"></div><div class="bi-l1t">Data Usage</div></div><div style="display:none" id="t404"><div id="405"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.dda-web.de/ornitho/datennutzung'"><div class="bvMI-pad-4"></div><div class="bvMIt">Use of ornitho Data</div></div><div id="1118"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=1118&amp;item=15'"><div class="bvMI-pad-4"></div><div class="bvMIt">Reference lists, guide lines and forms</div></div><div id="406"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=406&amp;item=92'"><div class="bvMI-pad-4"></div><div class="bvMIt">QR Codes from ornitho.de</div></div></div><div id="407"  class="bvMenuSubTitle" onmouseover="this.className='bvMenuSubTitleOver'" onmouseout="this.className='bvMenuSubTitle'" ><em id="oc-t407" class="menu_deco fa-solid fa-square-plus"></em><div class="bvMI-pad-1"></div><div class="bi-l1t">Research Projects</div></div><div style="display:none" id="t407"><div id="408"  class="bvMenuSub" onmouseover="this.className='bvMenuSubOver'" onmouseout="this.className='bvMenuSub'" onclick="location.href='https://www.ornitho.de/index.php?m_id=408&amp;item=94'"><div class="bvMI-pad-4"></div><div class="bvMIt">Project Artenvielfalt</div></div></div></div></div>
227<!-- RESPONSIVE END LEFT -->
228        </div>
229        <div id="td-backdrop"></div>
230        <div id="td-page-content">
231                    <div id="ajaxErrorMessageDisplay"></div>
232         
232<script>
233            //<![CDATA[
234            //Global function that can be called by ajax functions to display error/result box
235            function errorMessageDisplay(json_result)
236            {
237                $('#ajaxErrorMessageDisplay').empty();
238                var nbre_message_success = 0;
239
240                let fixed = 0;
241
242                if(Array.isArray(json_result)){
243                    json_result.forEach(function(entry) {
244                        var style = entry.style;
245                        var message = entry.text;
246                        var status = entry.status;
247
248                        if(typeof(style) !== "undefined" && typeof(message) !== "undefined" && typeof(status) !== "undefined")
249                        {
250
251                            if(status != "error" && status != "info" && status != "warning")
252                                nbre_message_success++;
253
254                            if(style == 'fixed')
255                                fixed = 1;
256
257                            var class_name = 'errorMessage';
258
259                            switch(status)
260                            {
261                                case 'error':
262                                    class_name = 'errorError';
263                                    break;
264                                case 'info':
265                                    class_name = 'errorInfo';
266                                    break;
267                                case 'warning':
268                                    class_name = 'errorWarning';
269                                    break;
270                            }
271
272                            var display_style = ((class_name == 'errorMessage' && style == 'fade') || style == 'overlay') ? "style=\"position:absolute; z-index:100; width:100%\"" : '';
273                            if(style == 'fixed') {
274                                display_style = "style=\"position:fixed;\"";
275                                $("#ajaxErrorMessageDisplay").css("position", "fixed");
276                            }
277                            else {
278                                $("#ajaxErrorMessageDisplay").css("position", "absolute");
279                            }
280
281                            var div_error_box = $('<div>',{'class' : class_name,'style':display_style});
282                            div_error_box.html(message);
283
284                            $('#ajaxErrorMessageDisplay').append(div_error_box);
285                        }
286                    });
287                }
288
289                if(nbre_message_success>0){
290                                            $(".errorMessage").delay(6000).slideToggle(1000);
291                                        }
292
293                if(fixed) {
294                    $(".errorMessage").delay(6000).fadeOut(1000);
295                    $(".errorError").delay(6000).fadeOut(1000);
296                    $(".errorInfo").delay(6000).fadeOut(1000);
297                    $(".errorWarning").delay(6000).fadeOut(1000);
298                }
299
300                return nbre_message_success;
301            }
302
303            //Global function that will do some ajax on the link (we expect the link to provide utf8 json result) and it will send json to errorMessageDisplay so we can have a display of error message
304            //beforeFct: function that will be called before doing any ajax call (to activate wait icon for example ...)
305            //link: the url used for ajax call
306            //callbackFct: function used after ajax call and after displaying ErrorMessages
307            function ajaxToLink(beforeFct,used_method,link,send_data,callbackFct,sentData_contentType,sentData_processData)
308            {
309                beforeFct();
310                $.ajax({
311                    url: link,
312                    method: used_method,
313                    type: used_method,
314                    data: send_data,
315                    success: function(json_result) {
316                        if(json_result===null)
317                        {
318                            callbackFct(0);
319                        }
320                        else{
321                            if(typeof(json_result['data'])!='undefined')
322                            {
323                                var nbre_message_success = errorMessageDisplay(json_result['data']['error_messages']);
324                                callbackFct(nbre_message_success,json_result['data']['result']);
325                            }
326                            else{
327                                callbackFct(0);
328                            }
329                        }
330                    },
331                    error: function(jqXHR, textStatus, errorThrown){
332                        callbackFct(0);
333                    },
334                    contentType: (typeof(sentData_contentType)=='undefined')?'application/x-www-form-urlencoded; charset=UTF-8':sentData_contentType,
335                    processData: (typeof(sentData_processData)=='undefined')?true:sentData_processData
336                });
337            }
338
339            function sendErrorToService(error) {
340                var errorMessage = error.message;
341                var errorLine = error.lineNumber || error.line || 'N/A';
342                var errorStack = error.stack || 'N/A';
343
344                var errorData = {
345                    message: errorMessage,
346                    line: errorLine,
347                    stack: errorStack,
348                    url: 'core',
349                    obid: '30'
350                };
351
352                console.log(errorData);
353
354                $.ajax({
355                    type: 'POST',
356                    url: 'index.php?m_id=1351&backlink=skip&content=debug',
357                    data: {data: JSON.stringify(errorData)},
358                    success: function(response) {
359                        console.log('error message sucessfully sent');
360                    },
361                    error: function(xhr, status, error) {
362                        console.log('error sending error message: ' + error);
363                    }
364                });
365            }
366
367            // ]]>
368        </script>
368
369                    <!-- HEADER STOP HERE -->
370            <div id="td-main-table">    <!-- start middle responsive column -->
371
372    
372<script src="https://cdnfiles1.biolovision.net/common/js/java_tools_1.js"></script>
372
373    
373<script src="https://cdnfiles1.biolovision.net/common/js/query_ajax_endpage_19.js"></script>
373
374
375    <div id="core-main-title">
376            <div class="pageTitle">
377                            </div>
378    </div>
379
380            <div style="display:none" class="rslides_container_top"></div>
381                    <div class="rslides_container">
382                <ul id="slider1" class="rslides"><li>    <div id="SpeciesOfTheDayMapComponent"></div>
383    
383<script type="module">
384        import { locale, addTranslations, SpeciesOfTheDayMapComponent } from 'https://cdnfiles1.biolovision.net/common/components/components_1f6d7283.js';
385
386        const dto = {"locale":"en","translations":{"CORE_TEXT_SPECIES_OF_THE_DAY_MAP_TITLE":"Observations of %s based on data entered since %s.","CORE_TEXT_SPECIES_OF_THE_DAY_CALL_TO_ACTION_TEXT":"Explore lots more information about the \u2018Species of the Day\u2019!","CORE_TEXT_SPECIES_OF_THE_DAY_CALL_TO_ACTION_BUTTON":"Learn more","DISPLAY_CUSTOM_POLYGON_NETWORK_ERROR":"Network error. Please try again later."},"basePath":"https:\/\/www.ornitho.de\/","speciesMapId":"2625","viewport":{"minLongitude":3.1664981886187,"maxLongitude":15.164732659117,"minLatitude":47.199153938505,"maxLatitude":55.998115828402},"countryId":1,"species":{"name":"Northern Nutcracker (ssp. macrorhynchos)","latinName":"Nucifraga caryocatactes macrorhynchos","id":"1174","image":{"src":"https:\/\/cdnfiles2.biolovision.net\/www.ornitho.de\/images\/birds\/TannenhaeherMPutze2-9559.jpg","alt":"Northern Nutcracker (ssp. macrorhynchos)","layout":"mirrored"}},"startDate":"2026-09-01","callToActionlink":"https:\/\/www.ornitho.de\/index.php?m_id=81&tab=tabs-stats&frmSpecies=1174","callToActionPlacement":"bottom-center","mobileBackground":"opaque","mobileAspectRatio":"constrained"}
387        locale.set(dto.locale);
388        addTranslations(dto.translations, dto.locale);
389
390        new SpeciesOfTheDayMapComponent(`SpeciesOfTheDayMapComponent`)
391            .mapProps({
392                basePath: dto.basePath,
393                speciesMapId: dto.speciesMapId,
394                viewport: dto.viewport,
395                observations: dto.observations,
396                countryId: dto.countryId,
397                species: dto.species,
398                startDate: Temporal.PlainDate.from(dto.startDate),
399                callToActionlink: dto.callToActionlink,
400                callToActionPlacement: dto.callToActionPlacement,
401                mobileBackground: dto.mobileBackground,
402                mobileAspectRatio: dto.mobileAspectRatio
403            })
404            .render();
405    </script>
405
406    </li>                <li style="height:100%;overflow: hidden;"><img
407                            src="https://cdnfiles2.biolovision.net/www.ornitho.de/images/header/rotmilanMBoeniornitho2-6945.jpg"
408                            alt="What are the aims of ornitho.de/lu and who stands behind it?"/>
409                                            <div class="head_caption">What are the aims of ornitho.de/lu and who stands behind it?                                                            <input onclick="window.location.href='https://www.dda-web.de/ornitho/info'"
410                                       name="login_button" type="submit" style="padding:0" class="submit"
411                                       value="Learn more"/>                        </div>
412                                        </li>
413                                <li style="height:100%;overflow: hidden;"><img
414                            src="https://cdnfiles2.biolovision.net/www.ornitho.de/images/header/GartenrotschwanzLThiessslider1-3669.jpg"
415                            alt="What are observation lists and why are they so important?"/>
416                                            <div class="head_caption">What are observation lists and why are they so important?                                                            <input onclick="window.location.href='https://www.ornitho.de/index.php?m_id=20039'"
417                                       name="login_button" type="submit" style="padding:0" class="submit"
418                                       value="Learn more"/>                        </div>
419                                        </li>
420                                <li style="height:100%;overflow: hidden;"><img
421                            src="https://cdnfiles2.biolovision.net/www.ornitho.de/images/header/NewsbannerWVZ2-1010.jpg"
422                            alt="Want to take part in bird monitoring? You can do it right around the corner!"/>
423                                            <div class="head_caption">Want to take part in bird monitoring? You can do it right around the corner!                                                            <input onclick="window.location.href='https://www.dda-web.de/monitoring/mrw/mitmachen'"
424                                       name="login_button" type="submit" style="padding:0" class="submit"
425                                       value="Learn more"/>                        </div>
426                                        </li>
427                                <li style="height:100%;overflow: hidden;"><img
428                            src="https://cdnfiles2.biolovision.net/www.ornitho.de/images/header/SliderSpendeFormation-7077.jpg"
429                            alt="Happy with ornitho.de/lu? Then support us with a donation!"/>
430                                            <div class="head_caption">Happy with ornitho.de/lu? Then support us with a donation!                                                            <input onclick="window.location.href='https://www.dda-web.de/unterstuetzen/spenden/spendenformular'"
431                                       name="login_button" type="submit" style="padding:0" class="submit"
432                                       value="Learn more"/>                        </div>
433                                        </li>
434                                <li style="height:100%;overflow: hidden;"><img
435                            src="https://cdnfiles2.biolovision.net/www.ornitho.de/images/header/KranichMPutze2-4017.jpg"
436                            alt=""/>
437                                    </li>
438                </ul>            </div>
439
440            
440<script src="https://cdnfiles1.biolovision.net/common/js/responsiveslides_1_55c.js"></script>
440
441            
441<script src="https://cdnfiles1.biolovision.net/common/js/jquery.touchSwipe.1.6.min.js"></script>
441
442            
442<script>
443                //<![CDATA[
444
445                function resize() {
446                    if($(window).width() > 1670)
447                    {
448                        //Mobile
449                        $(".rslides_container").insertAfter(".rslides_container_news");
450                    }
451                    else
452                    {
453                        //Desktop
454                        $(".rslides_container").insertAfter(".rslides_container_top");
455                        //Leave original layout
456                    }
457                }
458
459                $(function() {
460
461                    $(window).resize(function() {
462                        resize();
463                    });
464
465                    $(document).ready(function() {
466                        resize();
467                    });
468
469                    $("#slider1").responsiveSlides({
470                        nav: true,
471                        speed: 0,
472                        timeout: 8000,
473                        pager: true,
474                        auto: true,
475                        pause: true,
476                        prevText: '<i class="fa fa-chevron-left fa-1x"></i>',
477                        nextText: '<i class="fa fa-chevron-right fa-1x"></i>',
478                        namespace: "large-btns"
479                    });
480
481                    $("#slider1").swipe( {
482                        swipeLeft: function(){
483                            $(".large-btns_nav.next").click();
484                        },
485                        swipeRight: function(){
486                            $(".large-btns_nav.prev").click();
487                        }
488                    });
489
490                });
491                // ]]>
492            </script>
492
493
494            <div style="clear:both;"></div>
495
496                <div class="block-news" style="overflow: hidden">
497        <div class="right_news">
498            <div class="container-fluid-home">
499                <div style="display:none" class="rslides_container_right_news"></div>
500                            <div class="rslides_container2">
501                <ul id="slider2" class="rslides">
502                    <!-- Moon -->
503                    <li style="overflow:hidden;margin-bottom: 2rem;">
504                                    <div id="large-btns-right2_s_spinner_0"  style="height:18rem;display:none;align-items:center;justify-content:center;">
505                <em class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>
506            </div>
507                        <div class="moonbox" style="flex:1">                <style>
508                    .moon {opacity:0.6;}
509                    .moonimage {position:absolute;width:120px;}
510                    .glow {position:absolute;}
511
512                    .moon-left,.moon-right {display:inline-block;width:60px;position:relative;margin:0;}
513
514                    .moon-left .bg {fill:black;}
515                    .moon-left .fg {fill:white;transform-origin: 0 0;}
516
517                    .moon-right .fg {transform: scaleX(1);}
518                    .moon-left .fg {transform: scaleX(0) translateX(0);}
519                    .centered-content {
520                        position:absolute;
521                        background-color: black;
522                        width: 50vw;
523                        height: 50vw;
524                    }
525                </style>
526                
526<script>
527                    Math.radians = function(degrees) {
528                        return degrees * Math.PI / 180;
529                    };
530
531                    function updateMoon(phase, moondiv, size) {
532                        var phaseScale = 1,
533                            phaseTrans = 1,
534                            phaseRightScale = 0,
535                            midMoonAge = 29.53 / 2;
536                        halfMidMoonAge = midMoonAge / 2;
537
538                        //$('#' + moondiv + ' .moonday').html(phase);
539
540                        var MoonRightFg = $('#' + moondiv + ' .moon .moon-right .fg');
541                        var MoonLeftFg  = $('#' + moondiv + ' .moon .moon-left .fg');
542
543
544                        if (phase <= midMoonAge)
545                        {
546                            phaseTrans = size / 6;
547
548                            if (phase <= halfMidMoonAge)
549                            {
550                                phaseRightScale = (1 - phase / halfMidMoonAge);
551                            }
552                            else
553                            {
554                                phaseScale = (1 - (phase - halfMidMoonAge) / halfMidMoonAge);
555                                phaseTrans = size / 2 * phaseScale;
556                            }
557
558                            MoonRightFg.css({
559                                'transform': 'scaleX(' + phaseRightScale + ')'
560                            });
561
562                            MoonLeftFg.css({
563                                'transform': 'translate(' + phaseTrans + 'px,0) scaleX(' + (1 - phaseScale) + ')'
564                            });
565                        }
566                        else
567                        {
568                            phaseTrans = 0;
569
570                            $('#' + moondiv + ' .moon .moon-left .bg').css({
571                                'fill': 'white'
572                            });
573
574                            $('#' + moondiv + ' .moon .moon-right .bg').css({
575                                'fill': 'black'
576                            });
577
578
579                            if (phase <= midMoonAge + halfMidMoonAge)
580                            {
581                                phaseRightScale = (1 - (phase - halfMidMoonAge) / halfMidMoonAge);
582
583                                MoonRightFg.css({
584                                    'fill': 'white'
585                                });
586
587                            }
588                            else
589                            {
590                                phaseScale = (1 - (phase - halfMidMoonAge) / halfMidMoonAge);
591                                phaseTrans = -size / 2 * phaseScale;
592
593                                MoonLeftFg.css({
594                                    'fill': 'black'
595                                });
596                            }
597
598                            MoonLeftFg.css({
599                                'transform': 'translate(' + phaseTrans + 'px,0) scaleX(' + (1 + phaseScale) + ')'
600                            });
601
602
603                            MoonRightFg.css({
604                                'transform': 'scaleX(' + (1 + phaseRightScale) + ')'
605                            });
606                        }
607                    }
608
609                    function sleep(ms) {
610                        return new Promise(resolve => setTimeout(resolve, ms));
611                    }
612                </script>
612
613                                
613<script>
614                    $(document).ready(function(){
615                        updateMoon(20.805263635477, 'moon', 120);
616                    })
617                </script>
617
618                            <div id="moon">
619                                        <div class="glow">
620                            <svg>
621                                <defs
622                                        id="defs13197">
623                                    <filter
624                                            id="filter6851"
625                                            color-interpolation-filters="sRGB"
626                                            x="-0.058809649"
627                                            y="-0.058790288"
628                                            width="1.1176193"
629                                            height="1.1175806">
630                                        <feGaussianBlur
631                                                id="feGaussianBlur6853"
632                                                stdDeviation="2.2880777"></feGaussianBlur>
633                                    </filter>
634                                </defs>
635                                <circle
636                                        id="path6735"
637                                        style="fill:#cccccc;stroke-width:0.23687;filter:url(#filter6851)"
638                                        cx="64" cy="64" r="60" stroke="none" stroke-width="1"></circle>
639                            </svg>
640                        </div>
641                                        <div class="moonimage" style="margin:4px">
642                    <img alt="Waning Gibbous" src="https://cdnfiles1.biolovision.net/common/images/moon/moon.svg"/>
643                </div>
644                <div class="moon" style="margin:4px">
645                    <svg height="120" width="60" class="moon-left">
646                        <circle cx="60" cy="60" r="60" stroke="none" fill="white" class="bg"></circle>
647                        <circle cx="60" cy="60" r="60" stroke="none" fill="black" class="fg"></circle>
648                    </svg><svg height="120" width="60" class="moon-right">
649                        <circle cx="0" cy="60" r="60" stroke="none" fill="white" class="bg"></circle>
650                        <circle cx="0" cy="60" r="60" stroke="none" fill="black" class="fg"></circle>
651                    </svg>
652                </div>
653                <div style="clear:both"></div>
654            </div>
655            
656                <div class="moontextwhite">
657                    <span class="text-bold">Kassel (HE, KS*), Friday, October 2nd, 2026</span><br/>
658                    Waning Gibbous (20&nbsp;days)<br/>moonrise at 21h52, moonset at 15h03                </div>
659                <div class="moontext">
660                    Sun: sunrise at 07h25, sunset at 18h57<br/>Day : dawn at 06h52 and dusk at 19h30                </div>
661            </div>
662                                </li>
663                                            <!-- Livemap -->
664                        <li style="overflow: hidden;height: 18rem;margin-bottom: 2rem;">
665                                        <div id="large-btns-right2_s_spinner_1"  style="height:18rem;display:none;align-items:center;justify-content:center;">
666                <em class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>
667            </div>
668                                    </li>
669                                            <!-- Stats -->
670                    <li style="overflow: hidden;margin-bottom: 2rem;">
671                                    <div id="large-btns-right2_s_spinner_2"  style="height:18rem;display:none;align-items:center;justify-content:center;">
672                <em class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>
673            </div>
674                                </li>
675                    <!-- windly -->
676                    <li style="overflow: hidden;height:18rem;margin-bottom: 2rem;">
677                        <style>
678                            .responsive-iframe-container {
679                                position: relative;
680                                height: 0;
681                                min-height: 100%;
682                            }
683
684                            .responsive-iframe-container iframe {
685                                position: absolute;
686                                top: 0;
687                                left: 0;
688                                width: 100%;
689                                height: 100%;
690                            }
691                        </style>
692                                    <div id="large-btns-right2_s_spinner_3"  style="height:18rem;display:none;align-items:center;justify-content:center;">
693                <em class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>
694            </div>
695                                    <div class="responsive-iframe-container">
696                            <iframe id="windlyiFrame" title="windy.com" width="650" height="288" src="" style="display:none;"></iframe>
697                        </div>
698                    </li>
699                    <!-- EBP -->
700                    <li style="overflow: hidden;margin-bottom: 2rem;">
701                                    <div id="large-btns-right2_s_spinner_4"  style="height:18rem;display:none;align-items:center;justify-content:center;">
702                <em class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>
703            </div>
704                                </li>
705                                    </ul>
706            </div>
707
708            
708<script src="https://cdnfiles1.biolovision.net/common/js/responsiveslides_1_55c.js"></script>
708
709            
709<script src="https://cdnfiles1.biolovision.net/common/js/jquery.touchSwipe.1.6.min.js"></script>
709
710            
710<script>
711                //<![CDATA[
712                                var livemap = {
713                    id_group : 0,
714                    img_h : 948,
715                    x_1 : 0,
716                    y_1 : 948,
717                    lat_1 : 46.9636,
718                    lon_1 : 3.06044,
719                    x_2 : 764,
720                    y_2 : 0,
721                    lat_2 : 56.2227,
722                    lon_2 : 15.2982,
723                    last_id : 0,
724                    live : true
725                };
726                
727                var livestats = {
728                    id_group : 0,
729                    last_id : 0,
730                    part : 'today',
731                    live : true
732                };
733
734                // ]]>
735            </script>
735
736
737            
737<script src="https://cdnfiles1.biolovision.net/common/js/livemap_core_n.js"></script>
737
738            <style>
739                :root {
740                --fsliderTab_1_icon: "\f186";--fsliderTab_2_icon: "\f279";--fsliderTab_3_icon: "\f3ca";--fsliderTab_4_icon: "\f72e";--fsliderTab_5_icon: "\f7a2";                }
741            </style>
742            
742<script>
743            //<![CDATA[
744
745            function resize_right(){
746                if($(window).width() > 1670)
747                {
748                    //Mobile
749                    $(".rslides_container2").insertAfter(".rslides_container_right_news");
750                }
751                else
752                {
753                    //Desktop
754                    $(".rslides_container2").insertAfter(".rslides_container_right_news");
755                    //Leave original layout
756                }
757            }
758
759            function display_ebp()
760            {
761                
762                return `<a style="background-color: #2a2d35" target="_blank" href="https://eurobirdportal.org/embedded/ger/en/22712252/counts/52weeks">
763                            <iframe style="z-index:100;position:relative" title="https://eurobirdportal.org/" width="100%" height="288px" src="https://eurobirdportal.org/embedded/ger/en/22712252/counts/52weeks" allowfullscreen></iframe>
764                            <div style="top:0;z-index: 101;position: absolute;height:20rem;width:100%;cursor: pointer;background-color: transparent;" id="ebpDiv"></div>
765                        </a>`;
766            }
767
768            
769                            function display_livemap()
770                {
771                    
772                    return '                    <div class="row box_head" style="padding:5px;height:auto">                        <div class="col-sm-12 text-bold">Records in realtime</div>                    </div>                    <div id="realtime-sightings-livemap" class="col-sm-12 d-flex flex-wrap" style="height:16.2rem;">                        <div class="row col-home-realtime" style="padding-top:0;padding-bottom:0;flex:1;height:100%;min-height:200px;
772min-width:200px;float:none;margin:auto;overflow:hidden">                            <div id="livemap" style="height:100%;width: 100%;">                                <em id="livemap_wait" class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>                            </div>                        </div>                    </div>                    ';
773                }
774            
775            function display_stats()
776            {
777                
778                return '                <div id="realtime-sightings-stats" style="height:18rem;">                    <nav aria-label="stats">                        <div class="bvNav bvNav-tabs" id="nav-tab-stats" role="tablist">                            <span class="bvNav-item nav-link-stats bvNav-link active" id="nav-today-tab"     data-toggle="tab" role="tab" aria-controls="nav-today" aria-selected="true">today</span>                            <span class="bvNav-item nav-link-stats bvNav-link"        id="nav-yesterday-tab" data-toggle="tab" role="tab" aria-controls="nav-yesterday" aria-selected="false">yesterday</span>                            <span class="bvNav-item nav-link-stats bvNav-link"        id="nav-month-tab"     data-toggle="tab" role="tab" aria-controls="nav-month" aria-selected="false">this month</span>                            <span class="bvNav-item nav-link-stats bvNav-link"        id="nav-year-tab"      data-toggle="tab" role="tab" aria-controls="nav-year" aria-selected="false">2026</span>                        </div>                    </nav>                    <div class="tab-content" id="nav-tabContent-stats">                        <div class="bvPane tab-pane fade show active" id="nav-today" role="tabpanel" aria-labelledby="nav-today-tab"></div>                        <div class="bvPane tab-pane fade" id="nav-yesterday" role="tabpanel" aria-labelledby="nav-yesterday-tab"></div>                        <div class="bvPane tab-pane fade" id="nav-month" role="tabpanel" aria-labelledby="nav-month-tab"></div>                        <div class="bvPane tab-pane fade" id="nav-year" role="tabpanel" aria-labelledby="nav-year-tab"></div>                    </div>                </div>                ';
779            }
780
781            function get_stats_button(icon, title, cnt)
782            {
783                return `<div class="bvbspanel bvbspanel-primary bvbspanel-heading">
784                          <div class="bspanel-heading">
785                            <a class="falinkwhite" href="index.php?m_id=79&tab=tabs-contrib">
786                              <em class="fa ` + icon + ` fa-2x"></em>
787                            </a>
788                            <div>
789                              <div id="statistics-sighting-number" class="box_stat text-bold"> ` + cnt + ` </div>
790                              <span> ` + title + ` </span>
791                            </div>
792                          </div>
793                        </div>`;
794            }
795
796            function fill_stats_button(targetId, data)
797            {
798                var statsHTML = get_stats_button('fa-binoculars', 'sightings', data.nb_sightings.toLocaleString(navigator.language))
799                    + get_stats_button('fa-user-circle', 'observers', data.nb_observers.toLocaleString(navigator.language))
800                    + get_stats_button('fa-rectangle-list', 'lists', data.nb_forms.toLocaleString(navigator.language))
801                    + get_stats_button('fa-dna', 'species', data.nb_species.toLocaleString(navigator.language));
802
803                $(targetId).html(statsHTML);
804            }
805
806            function refresh_stats_button(jsonData)
807            {
808                var yearData = jsonData.year;
809                var monthData = jsonData.month;
810                var yesterdayData = jsonData.yesterday;
811                var todayData = jsonData.today;
812
813                fill_stats_button("#nav-today", todayData);
814                fill_stats_button("#nav-yesterday", yesterdayData);
815                fill_stats_button("#nav-month", monthData);
816                fill_stats_button("#nav-year", yearData);
817            }
818
819            $(function() {
820
821                var slider_array = ["moon","livemap","stats","windly","ebp"];
822
823                    $(window).resize(function() {
824                        resize_right();
825                    });
826
827                    $(document).ready(function() {
828                        resize_right();
829                    });
830
831                    var slider2 = $("#slider2");
832
833                    slider2.responsiveSlides({
834                        nav: true,
835                        speed: 0,
836                        timeout: 8000,
837                        pager: true,
838                        auto: false,
839                        pause: true,
840                        prevText: '<i class="fa fa-chevron-left fa-1x"></i>',
841                        nextText: '<i class="fa fa-chevron-right fa-1x"></i>',
842                        namespace: "large-btns-right",
843                        after: function(index) {
844
845                            var spinner = $('#large-btns-right2_s_spinner_' + index);
846                            var panel = $('#large-btns-right2_s' + index);
847
848                            spinner.css('display', 'flex');
849
850                                                            livemap.stop();
851                                livestats.stop();
852                                
853                            if (slider_array[index] === 'stats')
854                            {
855                                panel.html(display_stats());
856
857                                $("#nav-today").html(get_stats_button('fa-binoculars', 'sightings', 0)
858                                                    + get_stats_button('fa-user-circle', 'observers', 0)
859                                                    + get_stats_button('fa-rectangle-list', 'lists', 0)
860                                                    + get_stats_button('fa-dna', 'species', 0));
861
862
863                                $(".nav-link-stats").click(function (e) {
864                                    var nav_tab = $(this).parent();
865                                    var tab_content = $(this).parent().parent().next();
866                                    var nav_active = $(this);
867                                    var controls = $(this).attr("aria-controls");
868
869                                    var i = 0;
870                                    nav_tab.children().each(function () {
871                                        if (nav_active.index() === i)
872                                            $(this).addClass("active");
873                                        else
874                                            $(this).removeClass("active");
875
876                                        i++;
877                                    });
878
879                                    tab_content.children().each(function () {
880                                        if ($(this).attr("id") === controls)
881                                            $(this).addClass("active");
882                                        else
883                                            $(this).removeClass("active");
884                                    });
885                                });
886
887                                livestats.run();
888                            }
889
890                            if (slider_array[index] === 'ebp')
891                            {
892                                panel.html(display_ebp());
893                            }
894
895                            if (slider_array[index] === 'windly')
896                            {
897                                var iframe = $('#windlyiFrame');
898
899                                if (iframe.attr('src') === '') {
900                                    iframe.attr('src', "https://embed.windy.com/embed2.html?lat=51.3115151083163&lon=9.46039220983643&detailLat=51.3115151083163&detailLon=9.46039220983643&width=650&height=320&zoom=4&level=surface&overlay=wind&product=ecmwf&menu=&message=true&marker=&calendar=now&pressure=true&type=map&location=coordinates&detail=&metricWind=km%2Fh&metricTemp=%C2%B0C&radarRange=-1");
901                                    iframe.css('display', 'block');
902                                }
903                            }
904
905                            if (slider_array[index] === 'toplist')
906                            {
907                                panel.html(display_toplist());
908                            }
909
910                                                            if (slider_array[index] === 'livemap')
911                                {
912                                    panel.html(display_livemap());
913                                    livemap.run();
914
915                                }
916                                
917                            spinner.css('display', 'none');
918                        }
919                    });
920
921                    slider2.swipe({
922                        swipeLeft: function(){
923                            $(".large-btns-right_nav.next").click();
924                        },
925                        swipeRight: function(){
926                            $(".large-btns-right_nav.prev").click();
927                        }
928                    });
929                });
930
931            // ]]>
932            </script>
932
933
934            <div style="clear:both;"></div>
935
936                        
936<script>
937                //<![CDATA[
938                function send_das_stat(id_das) {
939                    $.post("index.php?m_id=63&content=ads_stat_click&id_ads=" + id_das,{});
940                }
941                // ]]>
942            </script>
942
943                        <a onclick="send_das_stat(12);" rel='nofollow' href=' https://orniwelt.de/p/202206-carl-zeiss-conquest-gavia-85mm-paket'>
944                            <div class="rightlogostretch rightlogostretch12"></div>
945                <style>
946                    .rightlogostretch12 {
947                        background-image: url("https://cdnfiles2.biolovision.net/www.ornitho.de/images/das/small/20260211-Banner-Ornitho-2600x320px-01-2595.jpg");
948                    }
949
950                    @media (max-width: 480px), (min-width: 901px) and (max-width: 1280px) {
951                        .rightlogostretch12 {
952                            background-image: url("https://cdnfiles2.biolovision.net/www.ornitho.de/images/das/xsmall/20260211-Banner-Ornitho-2600x320px-01-2595.jpg");
953                        }
954                    }
955
956                    @media (min-width: 2160px) {
957                        .rightlogostretch12 {
958                            background-image: url("https://cdnfiles2.biolovision.net/www.ornitho.de/images/das/20260211-Banner-Ornitho-2600x320px-01-2595.jpg");
959                        }
960                    }
961                </style>
962                        </a>
963                            <!-- Sightings-->
964                <div>
965                    <div class="verif_content_box" style="display:none">
966                        <div class="row box_head box_header">
967                            <div class="col-sm-12 text-bold text-ellipsis">My observations under verification</div>
968                        </div>
969                        <div style="padding:1rem; background-color: rgba(255, 204, 102, 0.68);">
970                            <div id="verif_content"></div>
971                            <div class="text-center">
972                                <div id="verif_content_more" class="submit" style="display:none;" onclick="obsQueryEndPage.queryNewContent();">More sightings</div>
973                            </div>
974                            <div class="verif_content_container_wait text-center">
975                                <em id="verif_content_wait" class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>
976                            </div>
977                            <div class="clearfix"></div>
978                        </div>
979                    </div>
980
981
982                    <div class="rc_content_box" style="display:none">
983                        <div class="row box_head box_header">
984                            <div class="col-sm-12 text-bold text-ellipsis">My records without rarity report</div>
985                        </div>
986                        <div style="padding:1rem;background-color: rgba(255, 204, 102, 0.68);">
987                            <div id="rc_content"></div>
988                            <div class="text-center">
989                                <div id="rc_content_more" class="submit" style="display:none;" onclick="obsQueryEndPage.queryNewContent();">More sightings</div>
990                            </div>
991                            <div class="rc_content_container_wait text-center">
992                                <em id="rc_content_wait" class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>
993                            </div>
994                            <div class="clearfix"></div>
995                        </div>
996                    </div>
997
998                    <nav>
999                        <div class="bvNav bvNav-tabs" id="nav-tab" role="tablist">
1000                            <span onclick="setTimeout(function() {$(window).resize();}, 200);" class="bvNav-item nav-link bvNav-link active" style="" id="nav-sightings-tab" data-toggle="tab" role="tab" aria-controls="nav-sightings" aria-selected="true">Latest observations</span>
1001                            <span onclick="setTimeout(function() {$(window).resize();}, 200);" class="bvNav-item nav-link bvNav-link" style="display:none;" id="nav-sightings-selected-tab" data-toggle="tab" role="tab" aria-controls="nav-sightings-selected" aria-selected="false">The most interesting observations</span>
1002                        </div>
1003                    </nav>
1004                    <div class="tab-content" id="nav-sightingsContent">
1005                        <div class="tab-pane fade show active" id="nav-sightings" role="tabpanel" aria-labelledby="nav-news-tab">
1006                                         
1006<script>
1007                //<![CDATA[
1008
1009            function print_svg_javascript(svg)
1010            {
1011                var ret_string = '';
1012
1013                if (svg != '')
1014                {
1015                    ret_string += "<div style=\"display:inline-block;vertical-align: middle\"><svg width=\"12\" height=\"12\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"><g>";
1016                    ret_string += svg;
1017                    ret_string += "</g></svg></div>";
1018                }
1019
1020                return ret_string;
1021            }
1022
1023            function generate_image(species_array, day_number, is_hidden, is_admin_hidden, is_new, is_second_hand, no_link, show_transparent, is_favorite, protocol_name, protocol_svg, admin_hidden_type) {
1024                const committees_urls = {"DAK":"https:\/\/www.dda-web.de\/dak\/meldebogen","AKBW":"https:\/\/www.avikombw.de\/","BAK":"https:\/\/www.og-bayern.de\/bak\/","AKBB":"https:\/\/www.abbo-info.de\/nabu\/akbb.php","AKH":"https:\/\/www.hgon.de\/beobachten\/monitoring\/avifaunistische-kommission\/","SKMV":"https:\/\/www.oamv.de\/seltenheiten-ak-m-v.html","AKN":"https:\/\/www.aknb-web.de\/de\/aknb","AKNW":"https:\/\/www.nw-ornithologen.de\/index.php\/aktivitaeten\/avikom","AKRP":"https:\/\/gnor.de\/akrp\/","AKSL":"https:\/\/www.ornithologie-saar.de\/","AKS":"https:\/\/vso-web.de\/avifaunistik\/avifaunistische-kommission-sachsen-aksn\/","AKST":"https:\/\/www.osa-internet.de\/voegel-in-sachsen-anhalt\/seltenheiten-kommission","AKSHH":"https:\/\/www.oagsh.de\/seltenheiten","AKT":"https:\/\/ornithologen-thueringen.de\/avifaunistik\/avifaunistische-kommission","HAK":"https:\/\/www.oag-helgoland.de\/index.php\/hsk-meldebogen\/","AKB":"https:\/\/www.bodensee-ornis.de\/"};
1025                var color = "transparent";
1026                var alt = '' + 'Common species';
1027                var atlas_start = species_array['atlas_start'];
1028                var atlas_end = species_array['atlas_end'];
1029                var category = species_array['category'];
1030                var has_synonyms = 0;
1031
1032                                var ret_string = "";
1033
1034                if (is_admin_hidden !== 0) {
1035                    if(admin_hidden_type === 'refused') {
1036                        ret_string += '<em class="fas fa-check-exclamation" title="The record is incorrect, mark it as invalid"></em>';
1037                    }
1038                    else if(admin_hidden_type === 'incomplete') {
1039                        ret_string += '<em class="fas fa-check-wrench" title="The record is correct, request additional information"></em>';
1040                    }
1041                    else {
1042                        ret_string += '<em class="fas fa-check-question" title="The record is probably wrong, request a modification"></em>';
1043                    }
1044                }
1045
1046                if (is_new !== 0) {
1047                    ret_string += '<em title="New since my last visit" class="fas fa-new"></em>';
1048                }
1049
1050                //Note : alt and title are empty because normally in php we would do a $language->get_string('OBSERVATIONS_TEXT_NAME_' . $protocol_name) but we have access to protocol_name only in javascript but there is no equivalent to $language->get_string in javascript... we should print all the protocols before execution and then print from there? (same for rarity_committee)
1051                if (protocol_name !== '') {
1052                    if (protocol_name === 'full_form') {
1053                        ret_string += '<em class="fas fa-full-list" title="Data coming from an complete observation list"></em>';
1054                    }
1055                    else if  (protocol_name === 'partial_form') {
1056                        ret_string += '<em class="fas fa-partial-list" title="This sighting is part of a partial list"></em>';
1057                    }
1058                    else {
1059                        ret_string += print_svg_javascript(protocol_svg);
1060                    }
1061                }
1062
1063                if (is_second_hand !== 0) {
1064                    ret_string += '<em class="fas fa-second-hand" title="Second-hand data (agreement of observer necessary!)"></em>';
1065                }
1066
1067                if (is_hidden !== 0) {
1068                    ret_string += '<em class="fas fa-keylock-yellow" title="Hidden observation"></em>';
1069                }
1070
1071                if (is_favorite !== 0) {
1072                    ret_string += '<em class="fas fa-ok" title="DISPLAY_PAGE_TEXT_FAVORITE"></em>';
1073                }
1074
1075                if (typeof species_array['rarity_committee'] === 'object') {
1076                    Object.entries(species_array['rarity_committee']).forEac
1076h(([committee, status]) => {
1077                        let color;
1078
1079                        if (committee === 'LHK') {
1080                            color = '#83dafa';
1081                        } else if (['CAVS', 'KF', 'CHN', 'DAK', 'SEO'].includes(committee)) {
1082                            color = '#f7ef18';
1083                        } else {
1084                            color = 'white';
1085                        }
1086
1087
1088                        if(committees_urls[committee] !== undefined)
1089                            ret_string += '<a href= "' + committees_urls[committee] + '" target="_blank">';
1090                        ret_string += `<em class="fas fa-rc" style="--fa-secondary-color:${color}"></em>`;
1091
1092                        if (status === 'ACCEPTED') {
1093                            ret_string += `<em class="fas fa-ok"></em>`;
1094                        } else if (status === 'REJECTED') {
1095                            ret_string += `<em class="fas fa-cancel"></em>`;
1096                        }
1097                        if(committees_urls[committee] !== undefined)
1098                            ret_string += '</a>';
1099                    });
1100                }
1101
1102                                if (category === 'A') {
1103                    color = "red";
1104                    alt = '' + 'Scarce or uncommon species (announce every observation, category A)';
1105                }
1106
1107                if (category === 'B' || category === 'BH') {
1108                    color = "orange";
1109                    alt = '' + 'Less-common to rare breeding bird species for which, if possible, all observations should be reported and for which the number of individuals observed should be stated as precisely as possible with each report (especially during the breeding season; \"ADEBAR species\").  ';
1110                }
1111
1112                if (category === 'H' || category === 'BH') {
1113                    if (day_number <= 46 || day_number >= 334) {
1114                        color = "blue";
1115                        alt = '' + 'Uncommon wintering species (announce at least sightings occurring between 1st December and 15th February, category H)';
1116                    }
1117                }
1118
1119                if (show_transparent !== 0 || color !== 'transparent') {
1120                    ret_string += '<em title="' + alt + '" class="fas fa-category-'+color+'"></em>';
1121                }
1122                
1123                switch(has_synonyms)
1124                {
1125                    case 1:
1126                        ret_string += '<em class="fas fa-synonym" title="Synonymous taxa"></em>';
1127                        break;
1128                    case 2:
1129                        break;
1130                }
1131
1132                return ret_string;
1133            }
1134            // ]]>
1135            </script>
1135
1136                 
1136<script>
1137            //<![CDATA[
1138        function get_rarity_color(rarity)
1139        {
1140            var color = "-";
1141
1142            switch(rarity)
1143            {
1144                case 'veryrare':
1145                color = '' + '#CC3300';
1146                break;
1147
1148                case 'rare':
1149                color = '' + '#CC3300';
1150                break;
1151
1152                case 'never':
1153                color = '' + '#CC0099';
1154                break;
1155
1156                case 'escaped':
1157                color = '' + '#3366FF';
1158                break;
1159
1160                case 'unusual':
1161                color = '' + '#000000';
1162                break;
1163
1164                case 'common':
1165                color = '' + '#000000';
1166                break;
1167
1168                case 'verycommon':
1169                color = '' + '#000000';
1170                break;
1171            }
1172
1173            if (color == '-')
1174                return "#000000"; // black
1175
1176            return color;
1177        }
1178            // ]]>
1179        </script>
1179
1180                                    <div>
1181                                        <p class="home-last-sightings-buttons"><a class="alink" href="https://www.ornitho.de/index.php?m_id=5&amp;sp_DOffset=5">[Display latest observations]</a></p>
1182                                    </div>
1183                            <div id="observation_content"></div>
1184                            <div class="text-center" style="justify-items: center;">
1185                                <div id="observation_content_more" class="submit topmorebutton" style="display:none;" onclick="obsQueryEndPage.queryNewContent();">More sightings</div>
1186                            </div>
1187                            <div class="observation_content_container_wait">
1188                                <em id="observation_content_wait" class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>
1189                            </div>
1190                        </div>
1191                        <div class="tab-pane fade" id="nav-sightings-selected" role="tabpanel" aria-labelledby="nav-schedules-tab" style="display:none;">
1192                            <p class="home-last-sightings-buttons"><a class="alink" href="https://www.ornitho.de/index.php?m_id=1662">[Archives]</a></p>
1193                                                    </div>
1194                    </div>
1195                </div>
1196            </div>
1197        </div>
1198        <div class="left_news">
1199            <div class="container-fluid">
1200                <div style="display:none" class="rslides_container_news"></div>
1201
1202                                    <div class="row hidden-xs-down" style="margin-left:7px;"> <!--Version longue visible si pas sur portait phones-->
1203                        <div class="col-md-12">
1204                            <div class="textintro_wide"><em>Ornitho.de / lu</em> is the internet portal for bird watching and population surveys in Germany and Luxembourg. It is run by the <a target="_blank" href="https://www.dda-web.de">Dachverband Deutscher Avifaunisten (DDA) e.V.</a> (Federation of German Avifaunists) and <a target="_blank" href="https://www.naturemwelt.lu">natur&ëmwelt</a>, respectively, supported by and in close cooperation with all national ornithological associations, many regional and local working groups, and federal and state nature conservation authorities. <em>Ornitho.de / lu</em> aim to collate data on bird life, make it available in a verified form for scientific evaluation and use it for nature conservation purposes. In addition, <em>ornitho.de</em> and <em>ornitho.lu</em> aim to bring together people interested in bird life, inspire people to take an interest in avifauna and support environmental education.</div>                        </div>
1205                    </div>
1206
1207                    <div class="row hidden-sm-up" style="margin-left:7px;"> <!--Version courte visible uniquement sur portait phones-->
1208                        <div class="col-md-12">
1209                            <div class="textintro_narrow"><em>Ornitho.de / lu</em> is the internet portal for bird watching and population surveys in Germany and Luxembourg. It is run by the <a target="_blank" href="https://www.dda-web.de">Dachverband Deutscher Avifaunisten (DDA) e.V.</a> (Federation of German Avifaunists) and <a target="_blank" href="https://www.naturemwelt.lu">natur&ëmwelt</a>, respectively, supported by and in close cooperation with all national ornithological associations, many regional and local working groups, and federal and state nature conservation authorities. <em>Ornitho.de / lu</em> aim to collate data on bird life, make it available in a verified form for scientific evaluation and use it for nature conservation purposes. In addition, <em>ornitho.de</em> and <em>ornitho.lu</em> aim to bring together people interested in bird life, inspire people to take an interest in avifauna and support environmental education.</div>                        </div>
1210                    </div>
1211                    
1212                        <div style="margin: 8px">
1213                            <div id="LastObsBannerComponent"></div>
1214                        </div>
1215                        
1215<script type="module">
1216                            import { locale, addTranslations, LastObsBannerComponent } from 'https://cdnfiles1.biolovision.net/common/components/components_1f6d7283.js';
1217
1218                            const dto = {"locale":"en","translations":{"CORE_TEXT_NEW_ITEM":"New since my last visit","DISPLAY_PAGE_TEXT_ADMIN_HIDDEN_INCOMPLETE":"The record is correct, request additional information","DISPLAY_PAGE_TEXT_ADMIN_HIDDEN_QUESTION":"The record is probably wrong, request a modification","DISPLAY_PAGE_TEXT_ADMIN_HIDDEN_REFUSED":"The record is incorrect, mark it as invalid","DISPLAY_PAGE_TEXT_FAVORITE":"DISPLAY_PAGE_TEXT_FAVORITE","OBSERVATIONS_TEXT_NOT_COMMON_BREEDER":"Less-common to rare breeding bird species for which, if possible, all observations should be reported and for which the number of individuals observed should be stated as precisely as possible with each report (especially during the breeding season; \"ADEBAR species\").  ","OBSERVATIONS_TEXT_NOT_COMMON_WINTER":"Uncommon wintering species (announce at least sightings occurring between 1st December and 15th February, category H)","OBSERVATIONS_TEXT_RARE_SPECIES":"Scarce or uncommon species (announce every observation, category A)"},"basePath":"https:\/\/www.ornitho.de\/","rarityCommitteeUrls":{"DAK":"https:\/\/www.dda-web.de\/dak\/meldebogen","AKBW":"https:\/\/www.avikombw.de\/","BAK":"https:\/\/www.og-bayern.de\/bak\/","AKBB":"https:\/\/www.abbo-info.de\/nabu\/akbb.php","AKH":"https:\/\/www.hgon.de\/beobachten\/monitoring\/avifaunistische-kommission\/","SKMV":"https:\/\/www.oamv.de\/seltenheiten-ak-m-v.html","AKN":"https:\/\/www.aknb-web.de\/de\/aknb","AKNW":"https:\/\/www.nw-ornithologen.de\/index.php\/aktivitaeten\/avikom","AKRP":"https:\/\/gnor.de\/akrp\/","AKSL":"https:\/\/www.ornithologie-saar.de\/","AKS":"https:\/\/vso-web.de\/avifaunistik\/avifaunistische-kommission-sachsen-aksn\/","AKST":"https:\/\/www.osa-internet.de\/voegel-in-sachsen-anhalt\/seltenheiten-kommission","AKSHH":"https:\/\/www.oagsh.de\/seltenheiten","AKT":"https:\/\/ornithologen-thueringen.de\/avifaunistik\/avifaunistische-kommission","HAK":"https:\/\/www.oag-helgoland.de\/index.php\/hsk-meldebogen\/","AKB":"https:\/\/www.bodensee-ornis.de\/"},"displayAbhIcons":1,"speciesLatinFirst":0}
1219                            locale.set(dto.locale);
1220                            addTranslations(dto.translations, dto.locale);
1221
1222                            new LastObsBannerComponent(`LastObsBannerComponent`)
1223                                .mapProps({
1224                                    basePath: dto.basePath,
1225                                    rarityCommitteeUrls: dto.rarityCommitteeUrls,
1226                                    displayAbhIcons: dto.displayAbhIcons,
1227                                    speciesLatinFirst: dto.speciesLatinFirst
1228                                })
1229                                .render();
1230                        </script>
1230
1231                                    <nav aria-label="News">
1232                    <div class="bvNav bvNav-tabs" id="nav-tab" role="tablist">
1233                        <span class="bvNav-item nav-link bvNav-link active" id="nav-news-tab" data-toggle="tab" role="tab" aria-controls="nav-news" aria-selected="true">News</span>
1234                        <span class="bvNav-item nav-link bvNav-link" style="display: none;" id="nav-schedules-tab" data-toggle="tab" role="tab" aria-controls="nav-schedules" aria-selected="false">On your diary</span>
1235                        <span class="bvNav-item nav-link bvNav-link" style="display: none;" id="nav-report-tab" data-toggle="tab" role="tab" aria-controls="nav-report" aria-selected="false">Reports</span>
1236                        <span class="bvNav-item nav-link bvNav-link" style="display: none;" id="nav-comment-observation-tab" data-toggle="tab" role="tab" aria-controls="nav-comment-observation" aria-selected="false">Comments on sightings</span>
1237                        <span class="bvNav-item nav-link bvNav-link" style="display: none;" id="nav-comment-media-tab" data-toggle="tab" role="tab" aria-controls="nav-comment-media" aria-selected="false">Comments on photos</span>
1238                        <span class="bvNav-item nav-link bvNav-link" style="display: none;" id="nav-comment-news-tab" data-toggle="tab" role="tab" aria-controls="nav-comment-news" aria-selected="false">Comments on news</span>
1239                    </div>
1240                </nav>
1241                <div class="tab-content" id="nav-tabContent">
1242                    <div class="tab-pane fade show active" id="nav-news" role="tabpanel" aria-labelledby="nav-news-tab">
1243                        <div id="news_content" class="page_content"></div>
1244                        <div id="news-loader" class="text-center"><em id="news_content_wait" class="fa-solid fa-spinner fa-spin fa-1x-spin"></em></div>
1245                        <div id="news-button-more" class="nocontent" style="display:none;justify-items: center;" onclick="newsQueryEndPage.queryNewContent();"><div class="submit topmorebutton">Show more news</div></div>
1246                    </div>
1247                    <div class="tab-pane fade" id="nav-schedules" role="tabpanel" aria-labelledby="nav-schedules-tab">
1248                        <div id="schedules_content" style="max-width: 1024px; margin: 0 auto"></div>
1249                        <div id="schedules-loader" class="text-center"><em id="schedules_content_wait" class="fa-solid fa-spinner fa-spin fa-1x-spin"></em></div>
1250                    </div>
1251                    <div class="tab-pane fade" id="nav-report" role="tabpanel" aria-labelledby="nav-report-tab">
1252                        <div id="reports_content" style="max-width: 1024px; margin: 0 auto"></div>
1253                        <div id="reports-loader" class="text-center"><em id="reports_content_wait" class="fa-solid fa-spinner fa-spin fa-1x-spin"></em></div>
1254                    </div>
1255                    <div class="tab-pane fade" id="nav-comment-observation" role="tabpanel" aria-labelledby="nav-comment-observation-tab">
1256                        <div id="comments_observation_content" style="max-width: 1024px; margin: 0 auto;padding:10px;display:grid;"></div>
1257                        <div id="comments-observation-loader" class="text-center"><em id="comments_observation_content_wait" class="fa-solid fa-spinner fa-spin fa-1x-spin"></em></div>
1258                        <div id="comments-observation-button-more" class="nocontent" style="display:block;justify-items: center;" onclick="commentObservationQueryEndPage.queryNewContent();"><div class="submit topmorebutton">Show more comments</div></div>
1259                    </div>
1260                    <div class="tab-pane fade" id="nav-comment-media" role="tabpanel" aria-labelledby="nav-comment-media-tab">
1261                        <div id="comments_media_content" style="max-width: 1024px; margin: 0 auto;padding:10px;display:grid"></div>
1262                        <div id="comments-media-loader" class="text-center"><em id="comments_media_content_wait" class="fa-solid fa-spinner fa-spin fa-1x-spin"></em></div>
1263                        <div id="comments-media-button-more" class="nocontent" style="display:block;justify-items: center;" onclick="commentMediaQueryEndPage.queryNewContent();"><div class="submit topmorebutton">Show more comments</div></div>
1264                    </div>
1265
1266                    <div class="tab-pane fade" id="nav-comment-news" role="tabpanel" aria-labelledby="nav-comment-news-tab">
1267                        <div id="comments_news_content" style="max-width: 1024px; margin: 0 auto;padding:10px;display:grid;"></div>
1268                        <div id="comments-news-loader" class="text-center"><em id="comments_news_content_wait" class="fa-solid fa-spinner fa-spin fa-1x-spin"></em></div>
1269                        <div id="comments-news-button-more" class="nocontent" style="display:block;justify-items: center;" onclick="commentNewsQueryEndPage.queryNewContent();"><div class="submit topmorebutton">Show more comments</div></div>
1270
1271                    </div>
1272                </div>
1273            </div>
1274        </div>
1275    </div>
1276    <!-- end middle responsive column -->
1277
1278     
1278<script>
1279    // <![CDATA[
1280	var newsQueryEndPage;
1281    $(function(){
1282
1283        var container = $("#news_content");
1284
1285		newsQueryEndPage = queryEndPage()
1286                .mp_current_page(1)
1287                .request("index.php?m_id=1351&content=news&backlink=skip&from=0")
1288                .element_id("#news_content")
1289                .element_wait_id("#news_content_wait")
1290                .callback(display_news)
1291                .load_more_offset(2)
1292                .load_more_button($("#news-button-more"));
1293
1294        function display_news(dt)
1295        {
1296            txid = dt.txid;
1297            data = dt.data;
1298
1299            $.each(data, function (index)
1300            {
1301                var href = 'index.php?m_id=1164'+'&a='+data[index].nid+'#FN'+data[index].nid;
1302
1303                var image = '';
1304                var image_small = '';
1305
1306                if (data[index].attached_image != null && data[index].attached_image !== "") {
1307                    image_small = '<div class="news-photo-div-front"><a class="news-photo-link" href="' + href + '"><img alt="" border="0" class="news-photo-front" src="https://cdnfiles2.biolovision.net/www.ornitho.de/pdffiles/news/' + data[index].attached_image + '"></a></div>';
1308                    image = '<div class="news-photo-div"><a class="news-photo-link" href="' + href + '"><img alt="" border="0" class="news-photo" src="https://cdnfiles2.biolovision.net/www.ornitho.de/pdffiles/news/' + data[index].attached_image + '"></a></div>';
1309                }
1310
1311                var pageTitle = '<a name="FN' + data[index].nid + '"></a><div class="news-title">' + data[index].title + '</div>';
1312
1313                                let string, color;
1314
1315                if (data[index].news_type === 'technews') {
1316                    string = 'technews';
1317                    color = '#CD6969';
1318                } else if (data[index].news_type === 'avinews') {
1319                    string = 'avinews';
1320                    color = '#69CD69';
1321                } else if (data[index].news_type === 'faunanews') {
1322                    string = 'faunanews';
1323                    color = '#69CD69';
1324                } else if (data[index].news_type === 'atlasnews') {
1325                    string = 'atlasnews';
1326                    color = '#1B92FF';
1327                } else {
1328                    string = 'tipnews';
1329                    color = '#ffcc66';
1330                }
1331
1332                var newsType = '<div style="background-color:' + color + '" class="news_type">' + string + '</div>';
1333                
1334                var protocolInfo = '';
1335                if (data[index].protocol_name !== undefined && data[index].protocol_name !== null) {
1336                    protocolInfo = '<div class="protocol-type"><svg viewBox="0 0 12 12" version="1.1" xmlns="http://www.w3.org/2000/svg"><g><title>' + data[index].protocol_fullname + '</title>' + data[index].protocol_svg + '</g></svg>' + data[index].protocol_fullname + '</div>';
1337                }
1338
1339                var authorLink = 'posted by ' + data[index].name;
1340
1341                                var editLine = '';
1342                
1343                var authorLine = '<div class="author-content">' + authorLink + ' <em class="fa-solid fa-clock"></em> ' + data[index].date + editLine + '</div>';
1344
1345                var share = '<div class="news-share" id="share_' + data[index].nid + '"></div>';
1346
1347                var pageStart = $('<div>', {'class':"elastic-container"});
1348
1349
1350                if (0 != parseInt(data[index].nid))
1351                {
1352                    pageContent = '<div class="message-content">' + data[index].message + '</div>';
1353                    var button = '<div class="blurnext"></div><div class="readnext"><a class="alink btn-open-news" href="' + href + '">Show more&nbsp;<em class="fa-solid fa-right-long"></em></a></div>';
1354
1355                    content = '<div class="message-type">' + protocolInfo + newsType + '</div>' + pageTitle + authorLine + share + pageContent;
1356
1357                    // news lists
1358                    pageStart.append('<div onclick="location.href=\'' + href + '\';" class="container-next">' + image_small + '<div class="news_text_div">' + content + '</div></div>' + button);
1359                    container.append(pageStart);
1360                }
1361                else
1362                {
1363
1364                    var url_string = '';
1365
1366                    if (data[index].url != null && data[index].url !== "") {
1367
1368                        var target = (data[index].popup) ? "target=\"_blank\"" : "";
1369                        var url_value = ((data[index].url.startsWith("http")) ? "" : WEB_PATH) + data[index].url;
1370                        var url_text = (data[index].url_text != null && data[index].url_text !== "") ? data[index].url_text : url_value;
1371
1372                        url_string = "<div><em class=\"fa-solid fa-link\"></em> <a class=\"alink\" href=\"" + url_value + "\" " + target + ">" + url_text + "</a></div>\r\n";
1373                    }
1374
1375                    var attached_file = '';
1376
1377                    if (data[index].attached_file != null && data[index].attached_file !== "") {
1378
1379                        var icon_filename = 'https://cdnfiles1.biolovision.net/common/images/icons/' + data[index].attached_file.split('.').pop() + '.gif';
1380
1381                        var file_path = 'https://cdnfiles2.biolovision.net/www.ornitho.de/pdffiles/news/' + data[index].attached_file;
1382
1383                        var attached_file_text = data[index].attached_file;
1384
1385                        if (data[index].attached_file_text != null)
1386                        {
1387                            attached_file_text = data[index].attached_file_text;
1388                        }
1389
1390                        attached_file = '<div>Document to download : <a href="' + file_path + '"><img border="0" alt="" src="' + icon_filename + '"/></a>&nbsp;<a class="alink" href="' + file_path + '">' + attached_file_text + '</a></div>';
1391
1392                    }
1393
1394                    // selected news
1395                    pageContent =  '<div style="margin-top: 2rem;"></div>' + '<div class="message-content">' + data[index].message + url_string + attached_file + '</div>';
1396                    pageStart.append(pageTitle + authorLine + image 
1396+ pageContent + share);
1397                    container.append(pageStart);
1398
1399                                    }
1400
1401                
1402
1403                container.css("height", "auto");
1404            });
1405            return true;
1406        }
1407        newsQueryEndPage.start();
1408    });
1409    // ]]>
1410</script>
1410
1411     
1411<script>
1412        // <![CDATA[
1413        var schedulesQueryEndPage;
1414        $(function(){
1415
1416            var container = $("#schedules_content");
1417
1418            schedulesQueryEndPage = queryEndPage()
1419                .mp_current_page(0)
1420                .request("index.php?m_id=1351&content=schedules&backlink=skip&from=0")
1421                .element_id("#schedules_content")
1422                .element_wait_id("#schedules_content_wait")
1423                .callback(display_schedules);
1424
1425            function display_schedules(dt)
1426            {
1427                txid = dt.txid;
1428                data = dt.data;
1429
1430                var tab = $("#nav-schedules-tab");
1431                if((data.length < 1) && tab.length && schedulesQueryEndPage.mp_current_page() === 1)
1432                {
1433                    tab.hide();
1434                }
1435                else
1436                {
1437                    tab.show();
1438                }
1439
1440                $.each(data, function (index)
1441                {
1442                    var href = 'index.php?m_id=21'+'&a='+data[index].sid+'#S'+data[index].sid;
1443
1444                    var pageTitle = '<a name="FN' + data[index].sid + '"></a>';
1445                    pageTitle += '<div class="news-subtitle">' + data[index].date_start;
1446                    if(data[index].date_end && data[index].date_start !== data[index].date_end)
1447                        pageTitle +=  " - " + data[index].date_end ;
1448                    pageTitle += "</div>";
1449                    pageTitle += '<div class="news-title">' + data[index].title + '</div>';
1450
1451                    var authorLink = 'posted by ' + data[index].name;
1452
1453                    var authorLine = '<div class="author-content">' + authorLink + ' <em class="fa-solid fa-clock"></em> ' + data[index].insert_date + '</div>';
1454
1455                    var share = '<div class="news-share" id="share_' + data[index].sid + '"></div>';
1456
1457                    var pageStart = '<div class="elastic-container">';
1458
1459                    if (0 != parseInt(data[index].sid))
1460                    {
1461                        pageContent = '<div class="message-content">' + data[index].comment + '</div>';
1462                        var button = '<div class="blurnext"></div><div class="readnext"><a class="alink btn-open-news" href="' + href + '">Show more&nbsp;<em class="fa-solid fa-right-long"></em></a></div>';
1463
1464                        content = pageTitle + authorLine + share + pageContent;
1465
1466                        container.append(pageStart + '<div onclick="location.href=\'' + href + '\';" class="container-next"><div>' + content + '</div></div>' + button + '</div>');
1467                    }
1468                    else
1469                    {
1470                        pageContent =  '<div style="margin-top: 2rem;"></div>' + '<div class="message-content">' + data[index].comment + '</div>';
1471                        container.append('<div class="elastic-container">
1471' + pageTitle + authorLine + pageContent + share + '</div>');
1472
1473                                            }
1474
1475                    container.css("height", "auto");
1476
1477                });
1478                return true;
1479            }
1480            schedulesQueryEndPage.start();
1481        });
1482        // ]]>
1483    </script>
1483
1484         
1484<script>
1485        // <![CDATA[
1486        var reportsQueryEndPage;
1487        var report = null;
1488        $(function(){
1489
1490            var container = $("#reports_content");
1491            var web_pdf_path = 'https://cdnfiles2.biolovision.net/www.ornitho.de/pdffiles';
1492            var web_image_icons_path = 'https://cdnfiles1.biolovision.net/common/images/icons';
1493
1494            reportsQueryEndPage = queryEndPage()
1495                .mp_current_page(0)
1496                .request("index.php?m_id=1351&content=reports&backlink=skip&from=0")
1497                .element_id("#reports_content")
1498                .element_wait_id("#reports_content_wait")
1499                .callback(display_reports);
1500
1501            translationsR = {
1502                'EXCURSION': 'Excursion','PHOTOS': 'REPORTS_TEXT_TYPE_PHOTOS','TRAVEL': 'Travel','GENERAL_MEETING': 'REPORTS_TEXT_TYPE_GENERAL_MEETING',            };
1503
1504            function display_reports(dt)
1505            {
1506                txid = dt.txid;
1507                data = dt.data;
1508
1509                var tab = $("#nav-report-tab");
1510                if((data.length < 1) && tab.length && reportsQueryEndPage.mp_current_page() === 1)
1511                {
1512                    tab.hide();
1513                }
1514                else
1515                {
1516                    tab.show();
1517                }
1518
1519                $.each(data, function (index)
1520                {
1521                    var href = 'index.php?m_id=1170'+'&a='+data[index].rid+'#R'+data[index].rid;
1522
1523                    var type = translationsR[data[index].type];
1524                    if(typeof(type) == 'undefined')
1525                        type = '';
1526
1527                    var pageTitle = '<a name="R' + data[index].rid + '"></a><div class="news-title ">' + data[index].title + ' <span class="badge badge-secondary">' + type + '</span></div>';
1528
1529                    var authorLink = 'posted by ' + data[index].name;
1530
1531                    var authorLine = '<div class="author-content">' + authorLink + ' <i class="fa-solid fa-clock"></i> ' + data[index].start_date + (data[index].start_date != data[index].stop_date ? ' - ' + data[index].stop_date : '') + '</div>';
1532
1533                    var share = '<div class="news-share" id="share_' + data[index].rid + '"></div>';
1534
1535                    var pageContent =  '<div style="margin-top: 2rem;"></div>' + '';
1536
1537                    var useCols = (typeof(data[index].observers) != 'undefined' && data[index].observers.length > 1) || (typeof(data[index].sightings) != 'undefined' && Object.keys(data[index].sightings).length > 1);
1538                    if (useCols)
1539                    {
1540                        pageContent += '<div class="row">';
1541                        pageContent += '<div class="col-sm-9">';
1542                    }
1543
1544                    pageContent += '<div id="core-gallery-banner" class="text-center" style="width:auto;padding:0px 0px 0px 3px;margin-bottom: 15px;">' +
1545                        '<em class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>' +
1546                        '</div>' +
1547                        '<div id="gallery_accordion" style="width:auto;margin-left:8px;margin-top:0px;margin-bottom:12px;display:none;">' +
1548                            '<div id="gallery_accordion_content" style="height:100%;display:block;" >' +
1549                                '<div id="gallery_accordion_tab" style="width:100%;height:7px;display:block;margin-bottom:0px;top:-10px;" >' +
1550                                    '<div id="gallery_accordion_tab_pointer" class="bvPanelPanel" style="padding:0;margin:0;width:0;height: 0;border-style: solid;border-width: 0 7.5px 7px 7.5px;border-color:#ffffff;border-bottom-color:transparent;position:relative;"></div>' +
1551                                '</div>' +
1552                                '<div id="gallery_accordion_description" class="bvPanelPanel" style="width:100%;padding:0;padding-top:15px;height:54px;margin-top:0;border-bottom:1px solid black">' +
1553                                    '<div id="gallery_accordion_close_button" class="fa-closebox" onclick="responsive.gallery.toggle_accordion(responsive.gallery.accordion_element_id);"></div>' +
1554                                    '<div id="gallery_accordion_description_content" style="padding-left:12px;min-height:26px;"></div>' +
1555                                '</div>' +
1556                                '<div id="gallery_accordion_medium" class="bvPanelPanel" style="width:100%;text-align:center;margin-top:0;padding:0;padding-top:20px;">' +
1557                                    '<div id="gallery_accordion_medium_player"></div>' +
1558                                    '<div id="gallery_accordion_dg" class="bvPanelPanel"  style="width:100%;padding-top:1rem;clear: both;">' +
1559                                        '<div id="gallery_accordion_dg_media" style="text-align:center;"></div>' +
1560                                    '</div>' +
1561                                    '<div id="gallery_accordion_left_button" style="display:inline-block;float:left;padding:1rem;cursor:pointer;" onclick="navigate_accordion(-1);">' +
1562                                    '<em class="fa fa-chevron-left fa-1x"></em></div>' +
1563                                    '<div id="gallery_accordion_medium_links" style="display:inline-block;"></div>' +
1564                                    '<div id="gallery_accordion_right_button" style="display:inline-block;float:right;padding:1rem;cursor:pointer;" onclick="navigate_accordion(1);">' +
1565                                    '<em class="fa fa-chevron-right fa-1x"></em></div>' +
1566                                    '<div class="clearfix"></div>' +
1567                                '</div>' +
1568
1569                            '</div>' +
1570
1571                        '</div>';
1572
1573                    pageContent +=  '<div class="message-content">' + (data[index].comment ? data[index].comment : '')  + '</div>';
1574
1575                    if (data[index].files && data[index].files.length)
1576                    {
1577                        //Merge by place
1578                        pageContent += '<div class="title text-left">Linked files</div>';
1579                        pageContent += '<div class="container-fluid">';
1580                        for(var f in data[index].files) {
1581                            var file = data[index].files[f];
1582                            var extension = file.filename.split('.').pop();
1583                            var icon = web_image_icons_path + '/' + extension.toLowerCase() + '.gif';
1584                            var comment = data[index].files[f].comment && data[index].files[f].comment  != '' ? data[index].files[f].comment : data[index].files[f].filename;
1585                            pageContent += '<span class="text-bold"><a href="' + web_pdf_path + '/' + file.filename + '"><img src="' + icon + '" alt="' + icon + '" /> ' + comment + '</a></span><br />';
1586                        }
1587                        pageContent += '</div>';
1588                    }
1589
1590                    if (useCols)
1591                    {
1592                        pageContent += '</div>';
1593                        pageContent += '<div class="col-sm-3">';
1594                        if(data[index].observers.length) {
1595                            pageContent += '<div class="title text-center" style="padding-top:0px;">Participants</div>';
1596                            pageContent += '<div class="container-fluid">';
1597                            for (var i = 0; i < data[index].observers.length; i++) {
1598                                pageContent += data[index].observers[i].clean_string + "<br />";
1599                            }
1600                            pageContent += '</div>';
1601                        }
1602
1603                        var places = Object.keys(data[index].sightings);
1604
1605                        if(places.length > 0) {
1606                            //Merge by place
1607                            pageContent += '<div class="title text-center">REPORTS_TEXT_SIGHTINGS</div>';
1608                            pageContent += '<div class="container-fluid">';
1609                            for(var p in places) {
1610                                pageContent += '<h4 class="text-bold">' + places[p] + "</h4><br />";
1611
1612                                for(var i = 0 ; i < data[index].sightings[places[p]].length ; i++) {
1613                                    var s = data[index].sightings[places[p]][i];
1614                                    if(s.species)
1615                                        pageContent += s.number + ' ' + s.species.ENGLISH_NAME + '<br />';
1616                                }
1617                            }
1618                            pageContent += '</div>';
1619                        }
1620                        pageContent += '</div>';
1621                        pageContent += '</div>';
1622                    }
1623
1624                    var pageStart = '<div class="elastic-container" >';
1625
1626                    if (0 != parseInt(data[index].rid))
1627                    {
1628                        pageContent = '<div class="message-content">' + data[index].comment + '</div>';
1629                        var button = '<div class="blurnext"></div><div class="readnext"><a class="alink btn-open-news" href="' + href + '">Show more&nbsp;<em class="fa-solid fa-right-long"></em></a></div>';
1630
1631                        content = pageTitle + authorLine + share + pageContent;
1632
1633                        container.append(pageStart + '<div onclick="location.href=\'' + href + '\';" class="container-next"><div>' + content + '</div></div>' + button + '</div>');
1634
1635                    }
1636                    else
1637                    {
1638                        container.append(pageStart + pageTitle + authorLine + page
1638Content + share + '</div>');
1639
1640                        responsive.gallery.init($("#core-gallery-banner"), 'gallery_report', data[index].rid);
1641                        responsive.gallery.auto_height = true;
1642                                            }
1643
1644                    container.css("height", "auto");
1645                });
1646                return true;
1647            }
1648            reportsQueryEndPage.start();
1649        });
1650
1651
1652
1653        //Override for picture only array.
1654        function toggle_accordion(index) {
1655            $("#core-gallery-banner").css('height', 'auto');
1656            var id = String(index).substr(1);
1657            var action = "close";
1658            if(responsive.gallery.accordion_element_id != index) {
1659                if($("#gallery_accordion").css("display") == "none")
1660                    action = "open";
1661                else
1662                    action = "slide";
1663
1664                var element = null;
1665                //Used for navigation in accordion.
1666                var offset_left = 0;
1667                var offset_right = 0;
1668                $.each(responsive.gallery.elements, function (elt) {
1669                    if(element)
1670                        offset_right++;
1671
1672                    if (responsive.gallery.elements[elt].id == id)
1673                        element = responsive.gallery.elements[elt];
1674
1675                    if(!element)
1676                        offset_left++;
1677                });
1678
1679                if (element == null) {
1680                    $("#gallery_accordion").css("display", "none");
1681                    console.log("No ID matching for : " + index);
1682                    responsive.gallery.accordion_element_id = 0;
1683                    return null;
1684                }
1685                responsive.gallery.accordion_element_id = index;
1686
1687                var comment = element.comment ? element.comment : '';
1688                $("#gallery_accordion_description_content").html(comment);
1689                $("#gallery_accordion_medium_player").html("<img src='"+element.media[0].web_path.replace('small/', '')+"' alt='"+comment+"'/>");
1690                $("#gallery_accordion_dg_media").html(element.author ? "&#9400; " + element.author : '');
1691                $("#medium_" + index).parent().after($("#gallery_accordion"));
1692
1693                //Setting tab position
1694                var left_offset = $("#medium_" + index).position().left - $("#core-gallery-banner").position().left - responsive.gallery.gallery_margin_size + (element.media[0].image.width / 2);
1695                $("#gallery_accordion_tab_pointer").css("left", left_offset + "px");
1696
1697                //Showing/Hidding navigation arrows
1698                if(offset_left == 0) {
1699                    $("#gallery_accordion_left_button").css("display", "none");
1700                }
1701                else {
1702                    $("#gallery_accordion_left_button").css("display", "inline-block");
1703                }
1704
1705                if(offset_right == 0) {
1706                    $("#gallery_accordion_right_button").css("display", "none");
1707                }
1708                else {
1709                    $("#gallery_accordion_right_button").css("display", "inline-block");
1710                }
1711            }
1712            else if($("#gallery_accordion").css("display") == "none") {
1713                action = "open";
1714            }
1715
1716            var time_delay;
1717            if(action != "slide") {
1718                $( "#gallery_accordion").slideToggle(400, function() {});
1719                time_delay = 500;
1720            }
1721            else {
1722                time_delay = 0;
1723            }
1724
1725            var target = "#gallery_accordion";
1726
1727            $('html, body').animate({
1728                scrollTop: $( "#gallery_accordion").prev().offset().top - 10
1729            }, time_delay);
1730        }
1731
1732        function navigate_accordion(direction) {
1733            if(!responsive.gallery.accordion_element_id)
1734                return;
1735
1736            var to_open = null; var before = null;
1737            $.each(responsive.gallery.elements, function (elt) {
1738                if(direction < 0 && ('r' + responsive.gallery.elements[elt].id) == responsive.gallery.accordion_element_id) {
1739                    to_open = 'r' + before.id;
1740                }
1741
1742                if(direction > 0 && before &&  ('r' + before.id) == responsive.gallery.accordion_element_id)
1743                    to_open =  'r' + responsive.gallery.elements[elt].id;
1744
1745                before =  responsive.gallery.elements[elt];
1746            });
1747
1748            if(to_open)
1749                toggle_accordion(to_open);
1750        }
1751        // ]]>
1752    </script>
1752
1753            
1753<script>
1754        //<![CDATA[
1755        function make_specie_string(id_sp, latin_name, species_name, species_name_plur, is_short, is_html, birds_count, taxo_no_result_id, remove_spliters) {
1756            /*Default values if not defined*/
1757            if(typeof(species_name_plur)=='undefined') {
1758                species_name_plur = '';
1759            }
1760            if(typeof(is_short)=='undefined') {
1761                is_short = 0;
1762            }
1763            if(typeof(is_html)=='undefined') {
1764                is_html = 1;
1765            }
1766            if(typeof(birds_count)=='undefined') {
1767                birds_count = '1';
1768            }
1769            if(typeof(taxo_no_result_id)=='undefined') {
1770                taxo_no_result_id = 10000;
1771            }
1772            if(typeof(remove_spliters)=='undefined') {
1773                remove_spliters = 1;
1774            }
1775
1776            
1777            var is_plural = 1;
1778            if (birds_count === '1' || birds_count === '~1' || birds_count === '>1' || birds_count === '&ge;1' || birds_count === '0' || birds_count === '')
1779                is_plural = 0;
1780
1781            if (species_name === '')
1782                species_name = latin_name;
1783
1784            if (species_name_plur === '')
1785                species_name_plur = species_name;
1786
1787            var bird_name = '';
1788            if (is_html)
1789                bird_name += ((birds_count === '0') && (id_sp !== taxo_no_result_id)) ? '<strike>' : '';
1790
1791            bird_name += is_plural ? species_name_plur : species_name;
1792
1793            if(remove_spliters)
1794                bird_name = bird_name.replace(/[|]/g,'');
1795
1796            if (is_html)
1797                bird_name += ((birds_count === '0') && (id_sp !== taxo_no_result_id)) ? '</strike>' : '';
1798
1799            if (is_short)
1800            {
1801                if (!is_html)
1802                    return bird_name;
1803                return 0? "<b><i>" + bird_name + "</i></b>" : "<b>" + bird_name + "</b>";
1804            }
1805            else
1806            {
1807                var latin_name_str = latin_name; //str_replace(" ", "&nbsp;", $latin_name);
1808                if (is_html)
1809                {
1810                    if ((latin_name !== '') && (latin_name !== species_name))
1811                    {
1812                                                var langu_enter = { '1': 'fr',
1813                        };
1814                        var tg = 1;
1815                        if (taxo_no_result_id !== 10000)
1816                        {
1817                            tg = taxo_no_result_id - 10000;
1818                        }
1819                        if (langu_enter[tg] === 'lt') {
1820                            return "<b><i>" + latin_name_str + "</i></b> <span style='font-style: normal;' class='sci_name'>(" + bird_name + ")</span></i>";
1821                        } else {
1822                            return "<b>" + bird_name + "</b> <span class='sci_name'>(" + latin_name_str + ")</span></i>";
1823                        }
1824                                            }
1825                    else
1826                    {
1827                        return "<b><i>" + bird_name + "</i></b>";
1828                    }
1829                }
1830                else
1831                {
1832                    if ((latin_name !== '') && (latin_name !== species_name))
1833                        return  bird_name+" ("+latin_name_str+")";
1834                    else
1835                        return  bird_name;
1836                }
1837            }
1838        }
1839        // ]]>
1840        </script>
1840
1841        
1841<script src="https://cdnfiles1.biolovision.net/common/js/query_ajax_endpage_19.js"></script>
1841
1842
1843<script>
1844//<![CDATA[
1845var obsQueryEndPage;
1846var scroll_positon = 0;
1847var load_sync = 0;
1848var obs_level1_offset = 0;  // Used in rarity map
1849var full_page_sightings = [];
1850var data_n_minus_1 = null;
1851var level_1 = null;
1852var level_2 = null;
1853var level_3 = null;
1854var level_sighting = null;
1855var last_sighting = null;
1856var last_titles_displayed = [];
1857
1858$(function(){
1859        var use_more_btn = $("#observation_content_more").length;
1860
1861    obsQueryEndPage = queryEndPage()
1862    .mp_current_page(0)
1863    .request("index.php?m_id=1351&content=last_observations_by_page&home=1&backlink=skip&p_c=duration&p_cc=-&sp_tg=1&sp_DateSynth=02.10.2026&sp_DChoice=offset&sp_DOffset=5&sp_SChoice=category&sp_Cat[never]=1&sp_Cat[veryrare]=1&sp_Cat[rare]=1&sp_Cat[unusual]=1&sp_Cat[escaped]=0&sp_Cat[common]=0&sp_Cat[verycommon]=0&sp_PChoice=canton&sp_cC=111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000001&sp_project=0&sp_FChoice=list&sp_FGraphFormat=auto&sp_FMapFormat=none&sp_FDisplay=DATE_PLACE_SPECIES&sp_FOrder=ALPHA&sp_FOrderListSpecies=ALPHA&sp_FListSpeciesChoice=DATA&sp_FOrderSynth=ALPHA&sp_FGraphChoice=DATA&sp_DFormat=DESC&sp_FAltScale=250&sp_FAltChoice=DATA&sp_FExportFormat=XLS")
1864    .element_id("#observation_content")
1865    .element_wait_id("#observation_content_wait")
1866    .element_finish_id("#observation_content_finished")
1867    .callback(display_obs)
1868    .checkAllLoadedcallback(is_data_complete)
1869    .load_all(0);
1870
1871	if(use_more_btn) {
1872		obsQueryEndPage.load_more_offset(1)
1873			.load_more_button($("#observation_content_more"));
1874	}
1875
1876        obsQueryEndPage.start();
1877    });
1878
1879function add_icon_reload(id_observation)
1880{
1881    $("span[id_sighting='" + id_observation + "']").css("background-color", "#eeeeee");
1882    $("span[id_sighting='" + id_observation + "'] img").each(function()
1883    {
1884        $(this).css("filter","grayscale(100%)");
1885    });
1886    $("span[id_sighting='" + id_observation + "'] .reload").html("<i class=\"bi bi-refresh ba-spin\" onclick='reloadAllPages(" + id_observation + ")' title=\"Reload\"></i>");
1887}
1888
1889function reloadAllPages(id_triggering_reload)
1890{
1891    //Empty the page
1892    $("#observation_content").html("");
1893    //Start reload
1894    var selector_reload = "span[id_sighting='" + id_triggering_reload + "']";
1895    obsQueryEndPage.reloadAll(selector_reload);
1896}
1897
1898function is_data_complete(data)
1899{
1900    return (typeof(data.data_is_finished)!='undefined' && data.data_is_finished===1)
1901}
1902
1903function reset_display_obs()
1904{
1905    obsQueryEndPage = null;
1906    reset_display_obs_variables();
1907}
1908
1909function reset_display_obs_variables() {
1910    last_titles_displayed = [];
1911    level_1 = null;
1912    level_2 = null;
1913    level_3 = null;
1914    level_sighting = null;
1915    last_sighting = null;
1916}
1917
1918function display_obs(dt)
1919{
1920    txid = dt.txid;
1921    data = dt.data;
1922
1923    if (dt.data_is_finished === -1)
1924        return false;
1925
1926    if(!obsQueryEndPage) {
1927        return false;
1928    }
1929
1930    
1931    var toggle_callback = null;
1932
1933    var container = $('#observation_content');
1934
1935    // Merge last sighting
1936    if(level_sighting && data.length) {
1937        var merged_obs = merge_obs(last_sighting, data[0]);
1938
1939        if(merged_obs) {
1940            level_sighting.remove();
1941            data[0] = merged_obs;
1942        }
1943	}
1944
1945	$.each(data, function (index)
1946	{
1947		var sighting = data[index];
1948
1949		if(typeof(sighting.listTop)!=='undefined' && typeof(sighting.listSubmenu)!=='undefined')
1950		{
1951			var new_level_1 = build_main_title(sighting, toggle_callback, );
1952			if(new_level_1 !== null && level_1 !== null) {
1953				level_1 = new_level_1;
1954				container.append(level_1);
1955			}
1956			else if(new_level_1 !== null) {
1957				// Init
1958				level_1 = new_level_1;
1959				container.append(level_1);
1960			}
1961
1962			var new_level_2 = build_second_title(sighting, toggle_callback);
1963			if(new_level_2 !== null && level_2 !== null) {
1964				level_2 = new_level_2;
1965				level_1.append(level_2);
1966			}
1967			else if(new_level_2 !== null) {
1968				// Init
1969				level_2 = new_level_2;
1970				level_1.append(level_2);
1971			}
1972
1973			level_sighting = build_obs(sighting);
1974			level_3.append(level_sighting);
1975		}
1976	});
1977
1978    //We need to add controls again for all new observations that were created (so that + button can be clicked on extended details)
1979    add_click_controls();
1980    return true;
1981}
1982
1983function buildQueryWithoutFormat(req) {
1984    let strQuery = '';
1985
1986    // -- Panel
1987    strQuery += `&p_c=${encodeURIComponent(req.p_c ?? '')}`;
1988    strQuery += `&p_cc=${encodeURIComponent(req.p_cc ?? '')}`;
1989
1990    strQuery += `&sp_tg=${encodeURIComponent(req.sp_tg ?? '')}`;
1991
1992    strQuery += `&sp_DateSynth=${encodeURIComponent(req.sp_frmDateSynth ?? '')}`;
1993
1994    // -- Période
1995    const dChoice = req.sp_DChoice ?? req.sp_frmDateChoice;
1996
1997    strQuery += `&sp_DChoice=${encodeURIComponent(dChoice ?? '')}`;
1998
1999    switch (dChoice) {
2000        case 'offset':
2001            strQuery += `&sp_DOffset=${encodeURIComponent(req.sp_DOffset ?? req.sp_frmDateOffset ?? '')}`;
2002            break;
2003
2004        case 'range':
2005            strQuery += `&sp_DFrom=${encodeURIComponent(req.sp_DFrom ?? req.sp_frmDateFrom ?? '')}`;
2006            strQuery += `&sp_DTo=${encodeURIComponent(req.sp_DTo ?? req.sp_frmDateTo ?? '')}`;
2007            strQuery += `&sp_DCa=${encodeURIComponent(req.sp_DCa ?? req.sp_frmDateCapture ?? '')}`;
2008            break;
2009
2010        case 'season':
2011            strQuery += `&sp_DSeasonFromDay=${encodeURIComponent(req.sp_DSeasonFromDay ?? req.sp_frmDateSeasonFromDay ?? '')}`;
2012            strQuery += `&sp_DSeasonFromMonth=${encodeURIComponent(req.sp_DSeasonFromMonth ?? req.sp_frmDateSeasonFromMonth ?? '')}`;
2013            strQuery += `&sp_DSeasonToDay=${encodeURIComponent(req.sp_DSeasonToDay ?? req.sp_frmDateSeasonToDay ?? '')}`;
2014            strQuery += `&sp_DSeasonToMonth=${encodeURIComponent(req.sp_DSeasonToMonth ?? req.sp_frmDateSeasonToMonth ?? '')}`;
2015            break;
2016
2017        default:
2018            // "all" ou rien
2019            break;
2020    }
2021
2022    // -- Espèces
2023    const sChoice = req.sp_SChoice ?? req.sp_frmSpeciesChoice;
2024    strQuery += `&sp_SChoice=${encodeURIComponent(sChoice ?? '')}`;
2025
2026    switch (sChoice) {
2027        case 'family':
2028            strQuery += `&sp_Family=${encodeURIComponent(req.sp_Family ?? req.sp_frmFamily ?? '')}`;
2029            break;
2030
2031        case 'species':
2032            strQuery += `&sp_S=${encodeURIComponent(req.sp_S ?? req.sp_frmSpecies ?? '')}`;
2033            break;
2034
2035        case 'category':
2036            if (req.sp_Cat) {
2037                Object.entries(req.sp_Cat).forEach(([k,v]) => {
2038                    strQuery += `&sp_Cat[${k}]=${encodeURIComponent(v)}`;
2039                });
2040            }
2041            break;
2042
2043        case 'status':
2044            strQuery += `&sp_frmStatus=${encodeURIComponent(req.sp_frmStatus ?? '')}`;
2045            strQuery += `&sp_frmStatusParam=${encodeURIComponent(req.sp_frmStatusParam ?? '')}`;
2046            break;
2047
2048        default:
2049            break;
2050    }
2051
2052    // -- Lieux
2053    const pChoice = req.sp_PChoice ?? req.sp_frmPlaceChoice;
2054    strQuery += `&sp_PChoice=${encodeURIComponent(pChoice ?? '')}`;
2055
2056    switch (pChoice) {
2057        case 'place':
2058            strQuery += `&sp_P=${encodeURIComponent(req.sp_P ?? req.sp_frmPlace ?? '')}`;
2059            strQuery += `&sp_Info=${encodeURIComponent(req.sp_Info ?? req.sp_frmInfo ?? '')}`;
2060            break;
2061
2062        case 'commune':
2063            strQuery += `&sp_Commune=${encodeURIComponent(req.sp_Commune ?? req.sp_frmCommune ?? '')}`;
2064            strQuery += `&sp_CommuneCounty=${encodeURIComponent(req.sp_CommuneCounty ?? req.sp_frmCommuneCounty ?? '')}`;
2065            break;
2066
2067        case 'canton':
2068            strQuery += `&sp_cC=${encodeURIComponent(req.sp_cC ?? req.sp_frmCc ?? '')}`;
2069            break;
2070
2071        case 'QR':
2072            strQuery += `&sp_QR=${encodeURIComponent(req.sp_QR ?? req.sp_frmQR ?? '')}`;
2073            break;
2074
2075        case 'coord':
2076            // sp_Coord[N], sp_Coord[W], sp_Coord[S], sp_Coord[E]
2077            if (req.sp_Coord) {
2078                strQuery += `&sp_Coord[N]=${encodeURIComponent(req.sp_Coord.N ?? '')}`;
2079                strQuery += `&sp_Coord[W]=${encodeURIComponent(req.sp_Coord.W ?? '')}`;
2080                strQuery += `&sp_Coord[S]=${encodeURIComponent(req.sp_Coord.S ?? '')}`;
2081                strQuery += `&sp_Coord[E]=${encodeURIComponent(req.sp_Coord.E ?? '')}`;
2082            }
2083            break;
2084
2085        case 'polygon':
2086            strQuery += `&sp_Polygon=${encodeURIComponent(req.sp_Polygon ?? req.sp_frmPolygon ?? '')}`;
2087            break;
2088
2089        case 'grid':
2090            strQuery += `&sp_Grid=${encodeURIComponent(req.sp_Grid ?? req.sp_frmGrid ?? '')}`;
2091            strQuery += `&sp_Grid_Info=${encodeURIComponent(req.sp_Grid_Info ?? req.sp_frmGridInfo ?? '')}`;
2092            break;
2093
2094        default:
2095            break;
2096    }
2097
2098    if (req.sp_AltitudeChoice || req.sp_frmAltitudeChoice) {
2099        strQuery += `&sp_AltitudeChoice=1`;
2100        strQuery += `&sp_AltitudeFrom=${encodeURIComponent(req.sp_AltitudeFrom ?? req.sp_frmAltitudeFrom ?? '')}`;
2101        strQuery += `&sp_AltitudeTo=${encodeURIComponent(req.sp_AltitudeTo ?? req.sp_frmAltitudeTo ?? '')}`;
2102    }
2103
2104    if (req.sp_AtlasCode || req.sp_frmAtlasCode) {
2105        strQuery += '&sp_AtlasCode=1';
2106        const ats = req.sp_Ats ?? req.sp_frmAtlasCodeArray ?? '';
2107        strQuery += `&sp_Ats=${encodeURIComponent(ats)}`;
2108    }
2109
2110    if (req.sp_Comment || req.sp_frmComment) {
2111        strQuery += '&sp_Comment=1';
2112        strQuery += `&sp_CommentValue=${encodeURIComponent(req.sp_CommentValue ?? req.sp_frmCommentValue ?? '')}`;
2113    }
2114
2115    if (req.sp_frmHiddenComment) {
2116        strQuery += '&sp_HiddenComment=1';
2117        strQuery += `&sp_HiddenCommentValue=${encodeURIComponent(req.sp_frmHiddenCommentValue || '')}`;
2118    }
2119
2120    if (req.sp_frmOnlyAllowExport && req.sp_frmOnlyAllowExport !== 0) {
2121        strQuery += `&sp_OnlyAE=${encodeURIComponent(req.sp_frmOnlyAllowExport)}`;
2122    }
2123
2124    if (req.sp_frmOnlyEntity && req.sp_frmOnlyEntity !== 0) {
2125        strQuery += `&sp_EntityE=${encodeURIComponent(req.sp_frmOnlyEntity)}`;
2126    }
2127
2128    if (req.sp_frmOnlyImported) {
2129        strQuery += '&sp_OnlyI=1';
2130    }
2131
2132    if (req.sp_frmImport) {
2133        strQuery += `&sp_I=${encodeURIComponent(req.sp_frmImport)}`;
2134    }
2135
2136    if (req.sp_frmOnlyExported) {
2137        strQuery += '&sp_OnlyE=1';
2138    }
2139    if (req.sp_frmOnlyNotExported) {
2140        strQuery += '&sp_OnlyNE=1';
2141    }
2142
2143    if (req.sp_frmOnlyAdminHidden && req.sp_frmOnlyAdminHidden !== '0') {
2144        strQuery += `&sp_OnlyAH=${encodeURIComponent(req.sp_frmOnlyAdminHidden)}`;
2145    }
2146
2147    if (req.sp_frmOnlyForm) {
2148        strQuery += '&sp_OnlyF=1';
2149    }
2150    if (req.sp_frmForm && req.sp_frmForm !== 0) {
2151        strQuery += `&sp_F=${encodeURIComponent(req.sp_frmForm)}`;
2152    }
2153
2154    if (req.sp_frmOnlyMyData) {
2155        strQuery += '&sp_OnlyMyData=1';
2156        strQuery += `&sp_ObserverName=${encodeURIComponent(req.sp_frmObserverName || '')}`;
2157        strQuery += `&sp_ObserverNameString=${encodeURIComponent(req.sp_frmObserverNameString || '')}`;
2158        strQuery += `&sp_SecondHand=${encodeURIComponent(req.sp_frmSecondHand || '')}`;
2159    }
2160
2161    if (req.sp_frmOnlyWithPicture) {
2162        strQuery += '&sp_OnlyWithPicture=1';
2163    }
2164
2165    if (req.sp_frmOnlyWithSound) {
2166        strQuery += '&sp_OnlyWithSound=1';
2167    }
2168
2169    if (req.sp_frmOnlyWithVideo) {
2170        strQuery += '&sp_OnlyWithVideo=1';
2171    }
2172
2173    if (req.sp_frmOnlySelected && Array.isArray(req.sp_frmOnlySelected)) {
2174        const arr = req.sp_frmOnlySelected.map(v => `sp_OnlySelected[]=${encodeURIComponent(v)}`);
2175        strQuery += '&' + arr.join('&');
2176    }
2177
2178    if (req.sp_frmOnlyNew) {
2179        strQuery += '&sp_OnlyNew=1';
2180    }
2181
2182    if (req.sp_frmOnlyDead) {
2183        strQuery += '&sp_OnlyDead=1';
2184    }
2185
2186    if (req.sp_frmOnlyEchouage) {
2187        strQuery += '&sp_OnlyEchouage=1';
2188    }
2189
2190    if (req.sp_frmOnlyStoc) {
2191        strQuery += `&sp_OnlyStoc=${encodeURIComponent(req.sp_frmOnlyStoc)}`;
2192    }
2193
2194    if (req.sp_frmListType) {
2195        strQuery += `&sp_frmListType=${encodeURIComponent(req.sp_frmListType)}`;
2196    }
2197
2198    if (req.sp_frmIdStoc) {
2199        strQuery += `&sp_IdStoc=${encodeURIComponent(req.sp_frmIdStoc)}`;
2200    }
2201
2202    if (req.sp_frmProject) {
2203        strQuery += `&sp_project=${encodeURIComponent(req.sp_frmProject)}`;
2204    }
2205
2206    if (req.sp_frmOnlyWithRing) {
2207        strQuery += '&sp_OnlyWithRing=1';
2208    }
2209
2210    if (req.sp_frmOnlyWithOffspring) {
2211        strQuery += '&sp_OnlyWithOffspring=1';
2212    }
2213
2214    if (req.sp_frmOnlySample) {
2215        strQuery += '&sp_OnlySample=1';
2216    }
2217
2218    if (req.sp_frmOnlyAgeSex) {
2219        strQuery += '&sp_OnlyAgeSex=1';
2220    }
2221
2222    if (req.sp_frmChiro_acoustic) {
2223        strQuery += '&sp_chiro_acoustic=1';
2224    }
2225    if (req.sp_frmChiro_bio) {
2226        strQuery += '&sp_chiro_bio=1';
2227    }
2228    if (req.sp_frmChiro_telemetry) {
2229        strQuery += '&sp_chiro_telemetry=1';
2230    }
2231    if (req.sp_frmChiro_view) {
2232        strQuery += '&sp_chiro_view=1';
2233    }
2234    if (req.sp_frmChiro_trace) {
2235        strQuery += '&sp_chiro_trace=1';
2236    }
2237
2238    if (req.sp_frmOnlyColony) {
2239        strQuery += '&sp_OnlyColony=1';
2240    }
2241    if (req.sp_frmOnlyColonyExtended) {
2242        strQuery += '&sp_OnlyColonyExtended=1';
2243    }
2244
2245    if (req.sp_frmOnlyWithRarityReport) {
2246        strQuery += '&sp_OnlyWithRarityReport=1';
2247    }
2248
2249    if (req.sp_frmH && typeof req.sp_frmH === 'object') {
2250        for (const [committee, sub] of Object.entries(req.sp_frmH)) {
2251            for (const [status, val] of Object.entries(sub)) {
2252                strQuery += `&sp_H[${committee}][${status}]=${encodeURIComponent(val)}`;
2253            }
2254        }
2255    }
2256
2257    if (req.sp_frmUse_synonyms) {
2258        strQuery += '&spUseSynonyms=1';
2259    }
2260    if (req.sp_frmUse_hybrids) {
2261        strQuery += '&spUseHybrids=1';
2262    }
2263    if (req.sp_frmUse_subspecies) {
2264        strQuery += '&spUseSubspecies=1';
2265    }
2266    if (req.sp_frmUse_variety) {
2267        strQuery += '&spUseVariety=1';
2268    }
2269    if (req.sp_frmUse_multiple_sp) {
2270        strQuery += '&spUseMultipleSpecies=1';
2271    }
2272    if (req.sp_frmUse_determined_sp) {
2273        strQuery += '&spUseDeterminedSpecies=1';
2274    }
2275
2276    return strQuery;
2277}
2278
2279
2280function build_main_title(data, _ )
2281{
2282    // Check if level 1 title is not already displayed
2283    if('level_1' in last_titles_displayed && data.listTop.title == last_titles_displayed['level_1']) {
2284        return null;
2285    }
2286
2287    obs_level1_offset++;  // Used in rarity map
2288    var main_level_1 = $('<div>', {'class': "listContainer"});
2289
2290    // If title level 1 is not displayed, we reset all
2291    last_titles_displayed['level_2_title'] = '';
2292    last_titles_displayed['level_2_href'] = '';
2293    last_titles_displayed['level_1'] = data.listTop.title;
2294
2295    
2296    return main_level_1.append($('<div>', {'class': "listTop"}).html(data.listTop.title)).append($('<div>', {'class' : "obs_level_2_i_content"}));
2297}
2298
2299function build_second_title(data, _) {
2300    if('level_2_title' in last_titles_displayed && data.listSubmenu.title == last_titles_displayed['level_2_title'] && data.listSubmenu.href == last_titles_displayed['level_2_href'])
2301        return null;
2302
2303    var main_content = $('<div>' , {'class': "obs_level_2_i_content", 'style':"display:block"}).append($('<div>', {'class': "obs_level_2_i_container"}));
2304    var listSubmenu = $('<div>', {'class': "listSubmenu"});
2305
2306    if(listSubmenu) {
2307            if(data.listSubmenu.href_ajax)
2308        {
2309            listSubmenu.append(build_ajax_link(data.listSubmenu.title, data.listSubmenu.href, data.listSubmenu.href_ajax));
2310        }
2311        else
2312        {
2313            listSubmenu.append(build_link(data.listSubmenu.title, data.listSubmenu.href));
2314        }
2315        }
2316
2317    level_3 = $('<div>',{'class' : "listObservation"});
2318    last_titles_displayed['level_2_title'] = data.listSubmenu.title;
2319    last_titles_displayed['level_2_href'] = data.listSubmenu.href;
2320
2321    return main_content.append(listSubmenu).append(level_3);
2322}
2323
2324function checkIdSightingExists(id_sighting, s2)
2325{
2326    for (var i = 0; i < s2.opt_observers.length; i++) {
2327        for (var j = 0; j < s2.opt_observers[i].opt_observer_info.length; j++) {
2328            if (s2.opt_observers[i].opt_observer_info[j].id_sighting === id_sighting) {
2329                return true;
2330            }
2331        }
2332    }
2333
2334    return false;
2335}
2336
2337function merge_obs(s1, s2)
2338{
2339    if(s1.listTop.title !== s2.listTop.title)
2340        return false;
2341
2342    if(s1.listSubmenu.title !== s2.listSubmenu.title && s1.listSubmenu.href !== s2.listSubmenu.href)
2343        return false;
2344
2345    if(s1.species_array.latin_name !== s2.species_array.latin_name)
2346        return false;
2347
2348    if (typeof s1.opt_observers !== 'undefined') {
2349        if (checkIdSightingExists(s1.opt_observers[0].opt_observer_info[0].id_sighting, s2)) {
2350            return s2;
2351        }
2352    }
2353
2354    s1.is_hidden = Math.max(s1.is_hidden, s2.is_hidden);
2355    s1.is_admin_hidden = Math.max(s1.is_admin_hidden, s2.is_admin_hidden);
2356    s1.is_new = Math.max(s1.is_new, s2.is_new);
2357    s1.is_second_hand = Math.max(s1.is_second_hand, s2.is_second_hand);
2358    s1.no_link = Math.max(s1.no_link, s2.no_link);
2359    s1.show_transparent = Math.max(s1.show_transparent, s2.show_transparent);
2360    s1.is_favorite = Math.max(s1.is_favorite, s2.is_favorite);
2361    s1.print_incomplete = Math.max(s1.print_incomplete, s2.print_incomplete);
2362
2363    // No need to merge protocol details.
2364    // protocol_name
2365    // protocol_svg
2366    // protocol_show_extended_details
2367
2368    if(s1.admin_hidden_type && s2.admin_hidden_type)
2369    {
2370        if(s1.admin_hidden_type === 'question' || s2.admin_hidden_type === 'question')
2371            s1.admin_hidden_type = 'question';
2372        if(s1.admin_hidden_type === 'refused' || s2.admin_hidden_type === 'refused')
2373            s1.admin_hidden_type = 'refused';
2374    }
2375    else if(s2.admin_hidden_type)
2376        s1.admin_hidden_type = s2.admin_hidden_type;
2377
2378	if(s1.opt_observer_logged_links && s2.opt_observer_logged_links) {
2379		for(var i = 0 ; i < s2.opt_observer_logged_links.length ; i++) {
2380			// Check if link already exists
2381			var link = s2.opt_observer_logged_links[i].href;
2382			var found = false;
2383			for(var j = 0 ; j < s1.opt_observer_logged_links.length ; j++) {
2384				found = found || s1.opt_observer_logged_links[j].href == link;
2385				if(found)
2386					break;
2387			}
2388
2389			if(!found)
2390				s1.opt_observer_logged_links.push(s2.opt_observer_logged_links[i]);
2391		}
2392	}
2393	else if(s2.opt_observer_logged_links)
2394		s1.opt_observer_logged_links = s2.opt_observer_logged_links;
2395
2396    if (typeof s2.opt_observers !== 'undefined') {
2397        for (var i = 0; i < s2.opt_observers.length; i++) {
2398            var id_observer = s2.opt_observers[i].id;
2399            var matched = false;
2400            var same_sight_matched = false; // More chunk just for pictures.
2401
2402            for (var j = 0; j < s1.opt_observers.length; j++) {
2403                if (s1.opt_observers[j].id === id_observer) {
2404
2405                    if (s2.opt_observers[i].opt_observer_info.length === 1) {
2406                        for (var k = 0; k < s1.opt_observers[j].opt_observer_info.length; k++) {
2407                            if (typeof s1.opt_observers[j].opt_observer_info[k] !== 'undefined' && typeof s2.opt_observers[i].opt_observer_info[k] !== 'undefined'
2408                                &&
2409                                s1.opt_observers[j].opt_observer_info[k].id_sighting === s2.opt_observers[i].opt_observer_info[k].id_sighting) {
2410                                same_sight_matched = true;
2411                                break;
2412                            }
2413                        }
2414                    }
2415
2416                    if (!same_sight_matched) {
2417                        s1.opt_observers[j].opt_observer_info = s1.opt_observers[j].opt_observer_info.concat(s2.opt_observers[i].opt_observer_info);
2418                    }
2419
2420                    matched = true;
2421                    break;
2422                }
2423            }
2424
2425            if (!matched) {
2426                s1.opt_observers.push(s2.opt_observers[i]);
2427            }
2428        }
2429    }
2430
2431	// s1 is ref
2432	if(!same_sight_matched) {
2433		if (s1.detail_list && s2.detail_list)
2434			s1.detail_list = s1.detail_list.concat(s2.detail_list);
2435		else if (s2.detail_list)
2436			s1.detail_list = s2.detail_list;
2437
2438		s1.remarks = s1.remarks.concat(s2.remarks);
2439	}
2440    // s1.opt_observers[0].opt_observer_info = s1.opt_observers[0].opt_observer_info.concat(s2.opt_observers[0].opt_observer_info);
2441    s1.print_incomplete = Math.max(s1.print_incomplete, s2.print_incomplete);
2442    if("opt_media_list" in s1 && "opt_media_list" in s2)
2443    s1.opt_media_list = Object.assign({},s1.opt_media_list, s2.opt_media_list);
2444    else if("opt_media_list" in s2)
2445    s1.opt_media_list = s2.opt_media_list;
2446    s1.remarks_hidden = s1.remarks_hidden.concat(s2.remarks_hidden);
2447
2448    s1.birds_count = generate_count_obs(s1.opt_observers, s1);
2449    return s1;
2450}
2451
2452function generate_count_obs(observers, sighting)
2453{
2454    if (typeof observers === 'undefined') {
2455        return '-';
2456    }
2457
2458    var max_count = 0;
2459    var min_count = 1000000000;
2460    var sum_count = {};
2461    var modifier = 0;
2462
2463    for(var i = 0 ; i < observers.length ; i++) {
2464        var id = "" + observers[i].id.toString();
2465        var info = observers[i].opt_observer_info;
2466
2467        for (var j = 0; j < info.length; j++) {
2468                var data = info[j];
2469
2470                if(!(id in sum_count))
2471                sum_count[id] = 0;
2472
2473                sum_count[id] = sum_count[id] + parseInt(data['count']);
2474
2475                switch (data['estimation_code']) {
2476                case 'MINIMUM':
2477                modifier = modifier|1; // 0001b
2478                break;
2479                case 'ESTIMATION':
2480                modifier = modifier|2; // 0010b
2481                break;
2482                case 'NO_VALUE':
2483                modifier = modifier|4; // 0100b
2484                break;
2485                case 'EXACT_VALUE':
2486                modifier = modifier|8; // 1000b
2487                break;
2488            }
2489        }
2490    }
2491
2492    for(var idx in sum_count)
2493    {
2494        var count = sum_count[idx];
2495
2496        if (count <= min_count)
2497            min_count = count;
2498
2499        if (count >= max_count)
2500            max_count = count;
2501    }
2502
2503
2504    if(max_count > 1) {
2505		if("DATE_PLACE_SPECIES" === 'SPECIES_PLACE_DATE' || "DATE_PLACE_SPECIES" === 'PLACE_SPECIES_DATE')
2506			sighting.sighting_detail = make_birds_string(max_count, sighting);
2507		else
2508			sighting.sighting_detail = make_specie_string(sighting.species_array.id, sighting.species_array.latin_name, sighting.species_array.name, sighting.species_array.name_plur, 0, 1, max_count, (sighting.species_array.taxo_group == 1) ? 10000 : (sighting.species_array.taxo_group + 10000), 1);
2509	}
2510
2511    return generate_count_string(modifier, min_count, max_count);
2512}
2513
2514
2515function make_birds_string(birds_count, sighting)
2516{
2517	var ret_s = "";
2518	if (birds_count != '')
2519	{
2520		if (birds_count == '0')
2521			ret_s = ret_s + '<strike>';
2522		else if(birds_count < 2)
2523			ret_s = ret_s + "individual";
2524		else
2525			ret_s = ret_s + "individuals";
2526
2527		if (birds_count == '0')
2528			ret_s = ret_s + '</strike>';
2529	}
2530	else
2531	{
2532		ret_s = "not counted";
2533	}
2534
2535	return ret_s + ",&nbsp;" + sighting.date;
2536}
2537
2538
2539
2540function generate_count_string(modifier, min_count, max_count)
2541{
2542    var modifier_string = '';
2543
2544    switch(modifier)
2545    {
2546        case 1: // 0001b - > - >
2547        case 5: // 0101b - N> - >
2548        case 9: // 1001b - E> - >
2549        case 13: // 1101b - EN> - >
2550            modifier_string = '>';
2551            break;
2552
2553        case 2: // 0010b - ~ - ~
2554        case 3: // 0011b - >~ - ~
2555        case 6: // 0110b - N~ - ~
2556        case 7: // 0111b - N~> - ~
2557        case 10: // 1010b - E~ - ~
2558        case 11: // 1011b - E~> - ~
2559        case 14: // 1110b - EN~ - ~
2560        case 15: // 1111b - EN~> - ~
2561            modifier_string = '~';
2562            break;
2563
2564        case 4: // 0100b - N - N
2565            modifier_string = '×';
2566            break;
2567
2568        case 8: // 1000b - E - E
2569        case 12: // 1100b - EN - E
2570            modifier_string = '';
2571            break;
2572    }
2573
2574
2575    if (min_count == max_count)
2576    {
2577        if (min_count == 0)
2578            if (modifier == 8)
2579                return '0';
2580            else
2581                return modifier_string;
2582        return modifier_string+min_count;
2583    }
2584    else
2585    {
2586        if (min_count == 0)
2587            return modifier_string +max_count;
2588
2589        return modifier_string+min_count+'-'+max_count
2590    }
2591}
2592
2593function build_obs(sighting)
2594{
2595	var ids = [];
2596	    last_sighting = sighting;
2597    sighting.obs_level1_offset = obs_level1_offset; // Used in rarity map
2598
2599    full_page_sightings.push(sighting);
2600
2601    var observation_container = $('<div>',{'class' : "observation_container"});
2602
2603    var before_opt_observer = $('<div>',{'class' : "before_opt_observer"});
2604    var first_images = generate_image(sighting.species_array, sighting.day_number, sighting.is_hidden, !sighting.print_incomplete && sighting.admin_hidden_type == 'incomplete'? 0 : sighting.is_admin_hidden, sighting.is_new, 0, 0, 0, sighting.is_favorite, sighting.protocol_name, sighting.protocol_svg, sighting.admin_hidden_type);
2605    var before_elem = $('<span>',{'class' : "sighting_detail",'style' : "color:"+sighting.rarity_color}).html(first_images+" <span class=\"sighting_count\">"+sighting.birds_count+"</span> ");
2606
2607    var sighting_detail = $('<span>',{'class' : "sighting_detail",'style' : "margin-right:0.2rem;color:"+sighting.rarity_color}).html(sighting.sighting_detail);
2608
2609    // Status icons
2610    before_opt_observer
2611    .append(before_elem)
2612    .append(sighting_detail);
2613
2614        if(typeof(sighting.opt_observer_logged_links)!=='undefined')
2615    {
2616        var obs_links = sighting.opt_observer_logged_links;
2617        $.each(obs_links, function (index)
2618        {
2619            var img_link = obs_links[index];
2620            before_opt_observer.append(build_img_link(img_link.class, img_link.href,img_link.img,img_link.img_title));
2621        });
2622    }
2623    
2624    observation_container.append(before_opt_observer);
2625
2626        //Observer
2627    if(typeof(sighting.opt_observers)!=='undefined')
2628    {
2629        var opt_observers_data = sighting.opt_observers;
2630        var opt_observer_info_container = $('<div>',{'class':'opt_observer'});
2631        $.each(opt_observers_data, function (index)
2632        {
2633            var observer_data = opt_observers_data[index];
2634            if(typeof(observer_data.opt_observer_info)!=='undefined')
2635            opt_observer_info_container.append(build_observer(observer_data.opt_observer_info));
2636        });
2637        observation_container.append(opt_observer_info_container);
2638    }
2639
2640    var after_opt_observer = $('<div>',{'class' : "after_opt_observer"});
2641    
2642    //Images
2643    if(typeof(sighting.opt_media_list)!=='undefined')
2644    {
2645        var container_thumbnails = $('<div>',{'class' : "thumbnail_container"});
2646        for (var mid in sighting.opt_media_list) {
2647            if (sighting.opt_media_list.hasOwnProperty(mid)) {
2648                var container_mid = $('<div>',{
2649                    'id' : "mid_list_"+mid,
2650                    'style' : "width:unset;",
2651                    'class' : "gSmallPhoto",
2652                    'onclick' : "link_sighting_media_details("+mid+")"
2653                });
2654
2655                var currentMediaInfo = sighting.opt_media_list[mid];
2656                container_mid.html(get_visual_js(mid, currentMediaInfo['title'], parseInt(currentMediaInfo['thumbnail_size']) , currentMediaInfo['full_webpath_thumbnail'], 'n', currentMediaInfo['type'] == 'VIDEO' ? 0 : 1, 'media_mid', parseInt(currentMediaInfo['media_is_hidden']),parseInt(currentMediaInfo['png']), currentMediaInfo['code']));
2657                container_thumbnails.append(container_mid);
2658            }
2659        }
2660        after_opt_observer.append(container_thumbnails);
2661        after_opt_observer.append($('<div>',{'style' : "clear:both"}));
2662    }
2663
2664    observation_container.append(after_opt_observer);
2665
2666    	var data_attributes = {};
2667	var data_details = [];
2668    
2669    if (typeof sighting.opt_observers !== 'undefined') {
2670        sighting.opt_observers.forEach(function(opt_observers) {
2671            opt_observers.opt_observer_info.forEach(function (observer) {
2672                data_attributes['data-onfly-' + observer.id_sighting] = 'true';
2673                let tempDiv = $('<div>').html(observer.author_string);
2674                data_details.push({id: observer.id_sighting, observer: tempDiv.text()})
2675            });
2676        })
2677    }
2678
2679	data_attributes['class'] = "onfly_opt_observer";
2680	data_attributes['data-onfly'] = JSON.stringify(data_details);
2681	data_attributes['style'] = 'display:none;';
2682	observation_container.append($('<div>',data_attributes));
2683
2684
2685	return observation_container
2686}
2687
2688function get_id_observation_for_extended_detail(opt_observer)
2689{
2690    var id_obs = get_id_observation(opt_observer);
2691    return id_obs.join('-');
2692}
2693
2694function get_id_observation(opt_observer)
2695{
2696	var id_obs = [];
2697	opt_observer.opt_observer_info.forEach(function(observer) {
2698		id_obs.push(observer.id_sighting);
2699	});
2700	return id_obs;
2701}
2702
2703function build_map_resume(sighting)
2704{
2705    var observation_container = $('<div>',{'class' : "observation_container"});
2706
2707    var before_opt_observer = $('<div>',{'class' : "before_opt_observer"});
2708    before_opt_observer.append($('<span>', {'class' : "text-bold"}).html(sighting.date + " "));
2709    var first_images = generate_image(sighting.species_array, sighting.day_number, sighting.is_hidden, !sighting.print_incomplete && sighting.admin_hidden_type == 'incomplete'? 0 : sighting.is_admin_hidden, sighting.is_new, 0, 0, 0, sighting.is_favorite, sighting.protocol_name, sighting.protocol_svg, sighting.admin_hidden_type);
2710    var before_elem = $('<span>',{'class' : "sighting_detail",'style' : "color:"+sighting.rarity_color}).html(first_images+" "+sighting.birds_count+" <span title=\"" + sighting.species_array.latin_name + "\">" + (sighting.birds_count > 1 ? sighting.species_array.name_plur : sighting.species_array.name) + " </span>");
2711
2712    before_opt_observer.append(before_elem);
2713
2714    if(typeof(sighting.opt_observer_logged_links)!=='undefined')
2715    {
2716        var obs_links = sighting.opt_observer_logged_links;
2717        $.each(obs_links, function (index)
2718        {
2719            var img_link = obs_links[index];
2720            before_opt_observer.append(build_img_link(img_link.class, img_link.href,img_link.img,img_link.img_title));
2721        });
2722    }
2723
2724    observation_container.append(before_opt_observer);
2725
2726    //Observer
2727    if(typeof(sighting.opt_observers)!=='undefined')
2728    {
2729        var opt_observers_data = sighting.opt_observers;
2730        var opt_observer_info_container = $('<div>',{'class':'opt_observer'})
2731        $.each(opt_observers_data, function (index)
2732        {
2733            var observer_data = opt_observers_data[index];
2734            if(typeof(observer_data.opt_observer_info)!=='undefined')
2735                opt_observer_info_container.append(build_observer(observer_data.opt_observer_info));
2736        });
2737        observation_container.append(opt_observer_info_container);
2738    }
2739
2740    var after_opt_observer = $('<div>',{'class' : "after_opt_observer"});
2741    //Extended detail
2742    if(typeof(sighting.opt_extended_details)!=='undefined')
2743    {
2744        var extended_details_data = sighting.opt_extended_details;
2745        $.each(extended_details_data, function (index)
2746        {
2747            var extended_detail = extended_details_data[index];
2748            after_opt_observer.append(build_extended_detail(sighting.id_sighting, extended_detail.color, extended_detail.feature, extended_detail.title));
2749        });
2750    }
2751
2752    //remarks
2753    if(typeof(sighting.remarks)!=='undefined')
2754    {
2755        var remarks_list = sighting.remarks;
2756        $.each(remarks_list, function (index)
2757        {
2758            var remark_data = remarks_list[index];
2759            after_opt_observer.append($('<div>',{'class':'remark'}).html(remark_data.title+remark_data.content));
2760        });
2761    }
2762
2763    //hidden remarks
2764    if(typeof(sighting.remarks_hidden)!=='undefined')
2765    {
2766        var remarks_hidden_list = sighting.remarks_hidden;
2767        $.each(remarks_hidden_list, function (index)
2768        {
2769            var remark_data = remarks_hidden_list[index];
2770            after_opt_observer.append($('<div>',{'class':'hidden_remark'}).html(remark_data.title+remark_data.content));
2771        });
2772    }
2773
2774    //Atlas code
2775    if(typeof(sighting.atlas_list)!=='undefined')
2776    {
2777        var atlas_list = sighting.atlas_list;
2778        $.each(atlas_list, function (index)
2779        {
2780            var atlas_list_data = atlas_list[index];
2781            after_opt_observer.append($('<div>',{'class':'bodynocolor','style':'color:#008000'}).html(atlas_list_data.title+" : "+atlas_list_data.content));
2782        });
2783    }
2784
2785    //Details
2786    if(typeof(sighting.detail_list)!=='undefined')
2787    {
2788        var detail_list = sighting.detail_list;
2789        $.each(detail_list, function (index)
2790        {
2791            var detail_list_data = detail_list[index];
2792            after_opt_observer.append($('<div>',{'class':'bodynocolor'}).html(detail_list_data.title+" : "+detail_list_data.content));
2793        });
2794    }
2795
2796    //Images
2797    if(typeof(sighting.opt_media_list)!=='undefined')
2798    {
2799        var container_thumbnails = $('<div>',{'class' : "thumbnail_container"});
2800        for (var mid in sighting.opt_media_list) {
2801            if (sighting.opt_media_list.hasOwnProperty(mid)) {
2802                var container_mid = $('<div>',{
2803                    'id' : "mid_list_"+mid,
2804                    'style' : "width:unset;",
2805                    'class' : "gSmallPhoto",
2806                    'onclick' : "link_sighting_media_details("+mid+")"
2807                });
2808
2809                var currentMediaInfo = sighting.opt_media_list[mid];
2810
2811                container_mid.html(get_visual_js(mid, currentMediaInfo['title'], parseInt(currentMediaInfo['thumbnail_size']) , currentMediaInfo['full_webpath_thumbnail'], 'n', 1, 'media_mid', parseInt(currentMediaInfo['media_is_hidden']),parseInt(currentMediaInfo['png']), currentMediaInfo['code']));
2812                container_thumbnails.append(container_mid);
2813            }
2814        }
2815        after_opt_observer.append(container_thumbnails);
2816        after_opt_observer.append($('<div>',{'style' : "clear:both"}));
2817    }
2818
2819    observation_container.append(after_opt_observer);
2820
2821    return observation_container;
2822}
2823
2824
2825function handleImageError(image_url, id_div)
2826{
2827    //Image was not loaded
2828    console.log('Image '+image_url+' does not exist.');
2829    $("#w-"+id_div).hide();//hide the waiting button
2830}
2831
2832function handleImageErrorDisplayEmptyImg(img,image_url, id_div)
2833{
2834    //Image was not loaded
2835    console.log('Image '+image_url+' does not exist.');
2836    $("#w-"+id_div).hide();//hide the waiting button
2837    $("#"+id_div).show();//hide the waiting button
2838    img.width = 200;
2839    img.height = 50;
2840}
2841
2842function build_link(title,href)
2843{
2844    return $('<a>',{'href' : href}).html(title);
2845}
2846
2847function build_ajax_link(title, href, href_ajax) {
2848    const link = $('<a>', {'href': href}).html(title);
2849
2850    link.on('click', function(event) {
2851        event.preventDefault(); // Prevent default anchor behavior
2852        if (event.ctrlKey || event.metaKey) {
2853            window.open(href, '_blank');
2854        } else {
2855            detail_ajax_load(href_ajax);
2856        }
2857    });
2858
2859    return link;
2860}
2861
2862function authorHandleLinkClick(event,obsid_code) {
2863    event.preventDefault();
2864    const href = "https://www.ornitho.de/index.php?m_id=53&id="+obsid_code;
2865    const href_ajax = "https://www.ornitho.de/index.php?m_id=1504&ajax=y&backlink=skip&id="+obsid_code;
2866    if (event.ctrlKey || event.metaKey) {
2867        window.open(href, '_blank');
2867 // Open in a new tab if Ctrl/Cmd is pressed
2868    } else {
2869        detail_ajax_load(href_ajax);
2870    }
2871}
2872
2873function build_img_link(iclass, href,src,img_title,onclick)
2874{
2875    if (iclass !== '')
2876    {
2877        if (typeof (href) === 'undefined') {
2878            if (typeof (onclick) === 'undefined')
2879                return $('<em>', {
2880                    'class': iclass,
2881                    'title': img_title
2882                });
2883                else
2884                return $('<em>', {
2885                    'onclick': onclick,
2886                    'class': iclass,
2887                    'title': img_title
2888                });
2889        } else {
2890            if (typeof (onclick) === 'undefined')
2891                return $('<a>', {'class': "alink", 'href': href}).append($('<em>', {
2892                    'class': iclass,
2893                    'title': img_title
2894                }));
2895                else
2896                    return $('<a>', {
2897                        'onclick': onclick,
2898                        'class': "alink",
2899                        'href': href
2900                    }).append($('<em>', {
2901                        'class': iclass,
2902                        'title': img_title
2903                    }));
2904        }
2905    }
2906    else {
2907        if (typeof (href) === 'undefined') {
2908            if (typeof (onclick) === 'undefined')
2909                return $('<img>', {
2910                    'src': src,
2911                    'title': img_title,
2912                    'alt': img_title,
2913                    'style': 'margin-left:4px;vertical-align:bottom'
2914                });
2915                else
2916                return $('<img>', {
2917                    'onclick': onclick,
2918                    'src': src,
2919                    'title': img_title,
2920                    'alt': img_title,
2921                    'style': 'margin-left:4px;vertical-align:bottom;cursor: pointer;'
2922                });
2923        } else {
2924            if (typeof (onclick) === 'undefined')
2925                return $('<a>', {'class': "alink", 'href': href}).append($('<img>', {
2926                    'src': src,
2927                    'title': img_title,
2928                    'alt': img_title,
2929                    'style': 'margin-left:4px;vertical-align:bottom'
2930                }));
2931                else
2932                return $('<a>', {
2933                    'onclick': onclick,
2934                    'class': "alink",
2935                    'href': href
2936                }).append($('<img>', {
2937                    'src': src,
2938                    'title': img_title,
2939                    'alt': img_title,
2940                    'style': 'margin-left:4px;vertical-align:bottom'
2941                }));
2942        }
2943    }
2944}
2945
2946function build_observer(opt_observer_info)
2947{
2948    var opt_observer_info_container = $('<div>',{'class' : "opt_observer_info"});
2949    var observer_html = "";
2950    $.each(opt_observer_info, function (index)
2951    {
2952        var opt_observer_info_i = opt_observer_info[index];
2953        observer_html += "<span id_sighting='" + opt_observer_info_i.id_sighting + "'>[<span class='reload'></span>";
2954        if(typeof(opt_observer_info_i.opt_before_author_image_links)!=='undefined')
2955        {
2956            var bf_author_image_links = opt_observer_info_i.opt_before_author_image_links;
2957            $.each(bf_author_image_links, function (index)
2958            {
2959                var img_link = bf_author_image_links[index];
2960                observer_html += build_img_link(img_link.class, img_link.href,img_link.img,img_link.img_title)[0].outerHTML;
2961            });
2962        }
2963
2964        if(typeof(opt_observer_info_i.opt_count_string)!=='undefined')
2965        {
2966            observer_html += opt_observer_info_i.opt_count_string;
2967        }
2968
2969        if(typeof(opt_observer_info_i.opt_full_time)!=='undefined')
2970        {
2971            observer_html += opt_observer_info_i.opt_full_time;
2972        }
2973
2974        observer_html += " "+ opt_observer_info_i.author_string;
2975
2976        if(typeof(opt_observer_info_i.opt_edit_view_button)!=='undefined')
2977        {
2978            observer_html += opt_observer_info_i.opt_edit_view_button;
2979        }
2980
2981        if(typeof(opt_observer_info_i.opt_delete_button)!=='undefined')
2982        {
2983            observer_html += opt_observer_info_i.opt_delete_button;
2984        }
2985
2986        if(typeof(opt_observer_info_i.opt_after_edit_delete_buttons)!=='undefined')
2987        {
2988            var after_edit_delete_buttons = opt_observer_info_i.opt_after_edit_delete_buttons;
2989            $.each(after_edit_delete_buttons, function (index)
2990            {
2991                var img_link = after_edit_delete_buttons[index];
2992                observer_html += build_img_link(img_link.class, img_link.href,img_link.img,img_link.img_title,img_link.onclick)[0].outerHTML;
2993            });
2994        }
2995
2996        if(typeof(opt_observer_info_i.insert_date)!=='undefined')
2997            observer_html += " ("+opt_observer_info_i.insert_date+")";
2998        observer_html += "]</span><br/>";
2999
3000    });
3001    observer_html += "";
3002    return opt_observer_info_container.html(observer_html);
3003}
3004
3005function build_extended_detail(id, color, type, title)
3006{
3007    var extended_container = $('<div>',{'class':'extended_container'});
3008
3009    var inside_html = '<div style="background-color:'+color+'" class="extended_detail_button" id_feature="'+type+'" id_obs="'+id+'" id="'+type+'_'+id+'">';
3010
3011    inside_html += '<div>';
3012    inside_html += '<em class="plus menu_title_deco fa fa-chevron-right"></em>';
3013    inside_html += '<em style="display:none" class="minus menu_title_deco fa fa-chevron-down"></em>';
3014    inside_html += '<em style="display:none;margin-right:.25rem;" class="imgProcessing fas fa-spin fa-wait"></em>';
3015    inside_html += '<div style="margin-top:4px;">'+title+'</div>';
3016    inside_html += '</div>';
3017    inside_html += '<div class="bodytext" style="margin:5px" id="content_'+type+'_'+id+'"></div>';
3018    inside_html += '</div><div class="clearfix"></div>';
3019
3020    return extended_container.html(inside_html);
3021}
3022
3023function link_sighting_details(id)
3024{
3025    if(load_sync)
3026    {
3027        var link = 'https://www.ornitho.de/index.php?m_id=54&id='+id;
3028        location.href = link;
3029    }
3030    else
3031    {
3032        var link = 'https://www.ornitho.de/index.php?m_id=1370&ajax=y&backlink=skip&id='+id;
3033        detail_ajax_load(link);
3034    }
3035}
3036
3037function link_sighting_media_details(mid)
3038{
3039    var link = 'https://www.ornitho.de/index.php?m_id=1370&ajax=y&backlink=skip&mid='+mid;
3040    detail_ajax_load(link);
3041}
3042
3043function link_sighting_validation_details(id)
3044{
3045    var link = 'https://www.ornitho.de/index.php?m_id=1370&pnl=v&ajax=y&backlink=skip&id='+id;
3046    detail_ajax_load(link);
3047}
3048
3049function detail_ajax_load(link)
3050{
3051    popClick($('<table>',{'id' : "detail_content", 'style' : 'width:100%'}));
3052    $("#detail_content").html('<em class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>');
3053    $("#detail_content").load(link);
3054    scroll_positon = $(document).scrollTop().valueOf();
3055    window.scrollTo(0, 0);
3056}
3057
3058function closeClickPopup()
3059{
3060    $("#popup_name").remove();
3061    $("#fade").remove();
3062    window.scrollTo(0, scroll_positon);
3063    $("#ajaxErrorMessageDisplayInit").attr('id','ajaxErrorMessageDisplay');
3064}
3065
3066function popClick(content) {
3067    var build_main_div = $('<div>', {
3068        id: "popup_name",
3069        'style': "max-width:100rem",
3070        'class': "popup_block"
3071    });
3072
3073    var close_image = $('<div>',{'class' : "fa-closebox", });
3074
3075    //Register click event on close box
3076    close_image.click(function(){
3077        closeClickPopup();
3078    });
3079
3080    var floatDiv = $('<div>', {'style' : 'z-index:1;position:absolute;width:100%'});
3081
3082    //Move error message inside the popup box (so we can see the result)
3083    $("#ajaxErrorMessageDisplay").attr('id','ajaxErrorMessageDisplayInit');
3084    var errorMessageDiv = $('<div>', {'id' : 'ajaxErrorMessageDisplay'});
3085
3086    build_main_div.html(content);
3087
3088    close_image.appendTo(floatDiv);
3089    errorMessageDiv.prependTo(build_main_div);
3090    floatDiv.prependTo(build_main_div);
3091
3092    $('body').append(build_main_div);
3093
3094    var page_margin = parseInt($('#td-full-content').css('margin-left'));
3095
3096    var page_witdh = 800;
3097
3098    var css = {};
3099
3100    if (page_margin === 0) {
3101        page_witdh = $('#td-full-content').width() - 160;
3102        css.top = 80;
3103    }
3104    else {
3105        page_witdh = $('#td-full-content').width() + page_margin;
3106        css.top = 0;
3107        css['margin-left'] = 0;
3108    }
3109
3110    //Faire apparaitre la pop-up et ajouter le bouton de fermeture
3111    $('#popup_name').fadeIn().css({
3112        'width': Number(page_witdh)
3113    });
3114
3115    //Recuperation du margin, qui permettra de centrer la fenetre - on ajuste de 80px en conformite avec le CSS
3116    if (page_margin === 0) {
3117        css.left = "50%";
3118        css.transform = "translate(-50%,0)";
3119    }
3120    else {
3121        //popMargLeft = -5;
3122        css.left = "0%";
3123    }
3124
3125    //css['margin-left'] = -popMargLeft;
3126
3127    //On affecte le margin
3128    $('#popup_name').css(css);
3129
3130    //Effet fade-in du fond opaque
3131    $('body').append('<div id="fade"></div>'); //Ajout du fond opaque noir
3132
3133    //Apparition du fond - .css({'filter' : 'alpha(opacity=80)'}) pour corriger les bogues de IE
3134    $('#fade').css({'filter' : 'alpha(opacity=80)'}).fadeIn();
3135
3136    return false;
3137}
3138
3139function get_visual_js(id_media, alt, final_size, full_web_path, prefix, border, name_prefix, is_hidden, is_png, code)
3140{
3141    var media_string = '';
3142
3143    var search_index = full_web_path.lastIndexOf('/');
3144
3145	if(typeof code !== 'undefined') {
3146		var mname = code;
3147		var div_id = name_prefix + "-list-" + final_size + "-" + mname;
3148	}
3149	else {
3150		var mname = full_web_path.substr(search_index + 1, full_web_path.length - search_index);
3151		var div_id = name_prefix + "-list-" + final_size + "-" + mname.substr(1, mname.indexOf(".") - 1);
3152	}
3153    if (border)
3154    {
3155        media_string += "<div id=\"w-"+div_id+"\" style=\"display:block;width:34px;height:18px;margin:20px auto\">";
3156
3157                media_string += '<em class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>';
3158        
3159        media_string += "</div>";
3160        media_string += "<div id=\""+div_id+"\" style=\"display:none;margin:0 auto\">";
3161        media_string += "<div class=\"container\">";
3162        media_string += is_png? "<div style=\"position:relative;left:0;top:0;background:white\">" : ""; //Because png has transparency if we display a waveform with transparency we don't want to see black shadow from above container -> add white background
3163    }
3164
3165        media_string += "<div style=\"position: relative;\">";
3166    
3167    media_string += "<img ";
3168    media_string += 'class="core-gallery-img" ';
3169
3170    if (border)
3171    {
3172        media_string += " onload=\"document.getElementById('"+div_id+"').style.display='block';";
3173        media_string += " document.getElementById('w-"+div_id+"').style.display='none';";
3174        media_string += " document.getElementById('"+div_id+"').style.height=this.height+'px';";
3175        media_string += " document.getElementById('"+div_id+"').style.width=this.width+'px'; \"";
3176    }
3177    media_string += " onerror=\"handleImageError('"+full_web_path+"','"+div_id+"');\" ";
3178
3179    media_string += " style=\"display:block; margin: 0 auto;\" border=\"0\" title=\""+alt+"\" alt=\""+alt+"\" src=\""+full_web_path+"\" " + (border == 2 ? 'style="padding-top: 5px;"' : '') + "/>";
3180
3181        if(is_hidden)
3182    media_string += "<div class=\""+name_prefix +"_hidden_"+id_media+"\" style=\"position: absolute;top:3px;left:3px;\"><em class=\"fas fa-keylock-red\"></em></div></div>";
3183    else
3184    media_string += "<div class=\""+name_prefix +"_hidden_"+id_media+"\" style=\"display:none;position: absolute;top:3px;left:3px;\"><em class=\"fas fa-keylock-red\"></em></div></div>";
3185    
3186    if (border)
3187    {
3188        media_string += is_png? "</div>":"";
3189        media_string += "</div>";
3190        media_string += "</div>";
3191    }
3192
3193    return media_string;
3194}
3195
3196</script>
vendor: 1 bytes, line 3196
3196
3197<script type="module">
3198    
3199    import {
3200        locale,
3201        addTranslations,
3202        TileComponent,
3203        tr,
3204        notifyError,
3205        notifySuccess
3206    } from 'https://cdnfiles1.biolovision.net/common/components/components_1f6d7283.js';
3207
3208    const dto = {"locale":"en","translations":{"CORE_TEXT_ERROR":"Error","CORE_TEXT_SUCCESS":"Success","PLUS_ONFLY_VERIFICATION_TITLE":"Checking","PLUS_CONFIRMATION_DESC":"Validation of unusual records","PLUS_CONFIRMATION_DISABLED_DESC":"Confirmation is disabled because the observation rating is not high enough.","DISPLAY_PAGE_TEXT_ERROR_VALIDATION_ERROR":"DISPLAY_PAGE_TEXT_ERROR_VALIDATION_ERROR","DISPLAY_PAGE_TEXT_PUBLIC_VALIDATION_SEND_SUCCESS":"The correction has been submitted. Thank you for your participation.","DISPLAY_PAGE_TEXT_VALIDATION_SEND_ERROR":"An error occurred while processing the validation. Please retry."}};
3209
3210    locale.set(dto.locale);
3211    addTranslations(dto.translations, dto.locale);
3212
3213    window.link_sighting_validation_details_fly = function(id) {
3214        if (event && event.ctrlKey) {
3215            window.open("index.php?m_id=54&backlink=skip&id="+id+"&pnl=v", "_blank");
3216            return;
3217        }
3218        let hash = Date.now() + '' + Math.floor(Math.random() * 1000);
3219        let container = $("div[data-onfly-" + id + "='true']");
3220        container.css('margin-left', '3rem');
3221        container.css('margin-top', '0.5rem');
3222        let ids = JSON.parse(container.attr('data-onfly'));
3223        id = ids[0].id;
3224
3225        if (container.length && container.hasClass('onfly_opt_observer')) {
3226            if (container.is(":visible")) {
3227                container.toggle();
3228                return;
3229            }
3230            container.toggle();
3231            container.html('<div id="TileComponent--verification-on-fly--container-' + id + '"></div>');
3232
3233            // Main Accordion container
3234            let close_btn = '<span class="text-clickable" style="position: relative;right: 12px;top: -30px;float: right;" onclick="link_sighting_validation_details_fly('+id+')"><i class="fa-solid fa-circle-xmark"></i></span>';
3235            new TileComponent('TileComponent--verification-on-fly--container-' + id)
3236                .mapProps({
3237                    'title': 'PLUS_ONFLY_VERIFICATION_TITLE',
3238                    'icon': 'fa-solid fa-circle-question',
3239                    'open': 'open'
3240                })
3241                .slot(() => {
3242                    return close_btn + '<div id="TileComponent--verification-on-fly--container-' + id + '--slot"></div>';
3243                })
3244                .translate(dto.translations)
3245                .render();
3246            load_verification_list(ids, hash);
3247        }
3248    }
3249
3250    window.link_gallery_validation_details = function(id)
3251    {
3252        var container = $("#gallery_accordion_validation");
3253        var ids = [{id:id}];
3254        let hash = Date.now() + '' + Math.floor(Math.random() * 1000);
3255        id = ids[0].id;
3256
3257        if (container.length) {
3258            container.attr("data-hash", hash);
3259            container.attr("data-popup", id);
3260
3261            if (container.is(":visible")) {
3262                container.toggle();
3263                return;
3264            }
3265            container.toggle();
3266            container.html('<div id="TileComponent--verification-on-fly--container-' + id + '"></div>');
3267            // Main Accordion container
3268            new TileComponent('TileComponent--verification-on-fly--container-' + id)
3269                .mapProps({
3270                    'title': 'PLUS_ONFLY_VERIFICATION_TITLE',
3271                    'icon': 'fa-solid fa-circle-question',
3272                    'open': 'open'
3273                })
3274                .slot(() => {
3275                    return '<div id="TileComponent--verification-on-fly--container-' + id + '--slot"></div>';
3276                })
3277                .translate(dto.translations)
3278                .render();
3279            load_verification_list(ids, hash);
3280        }
3281        else {
3282            notifyError(tr('DISPLAY_PAGE_TEXT_ERROR_VALIDATION_ERROR'));
3283        }
3284    }
3285
3286    window.link_gallery_public_validation_details = function(id) {
3287        let hash = Date.now() + '' + Math.floor(Math.random() * 1000);
3288        var container = $("#gallery_accordion_validation");
3289        var ids = [{id:id}];
3290        id = ids[0].id;
3291
3292        if (container.length) {
3293            if (container.is(":visible")) {
3294                container.toggle();
3295                return;
3296            }
3297            container.toggle();
3298            container.html('<div id="TileComponent--verification-on-fly--container-' + id + '"></div>');
3299
3300            // Main Accordion container
3301            let close_btn = '<span class="text-clickable" style="position: relative;right: 12px;top: -30px;float: right;" onclick="display_public_validation_accordion('+id+')"><i class="fa-solid fa-circle-xmark"></i></span>';
3302            new TileComponent('TileComponent--verification-on-fly--container-' + id)
3303                .mapProps({
3304                    'title': 'PLUS_ONFLY_VERIFICATION_TITLE',
3305                    'icon': 'fa-solid fa-circle-question',
3306                    'open': 'open'
3307                })
3308                .slot(() => {
3309                    return close_btn + '<div id="TileComponent--verification-on-fly--container-' + id + '--slot"></div>';
3310                })
3311                .translate(dto.translations)
3312                .render();
3313            load_verification_list(ids, hash);
3314        }
3315    }
3316
3317    window.link_sighting_public_validation_details_fly = function(id) {
3318        let hash = Date.now() + '' + Math.floor(Math.random() * 1000);
3319        let container = $("div[data-onfly-" + id + "='true']");
3320        container.css('margin-left', '3rem');
3321        container.css('margin-top', '0.5rem');
3322        let ids = JSON.parse(container.attr('data-onfly'));
3323        id = ids[0].id;
3324
3325        if (container.length && container.hasClass('onfly_opt_observer')) {
3326            if (container.is(":visible")) {
3327                container.toggle();
3328                return;
3329            }
3330            container.toggle();
3331            container.html('<div id="TileComponent--verification-on-fly--container-' + id + '"></div>');
3332
3333            // Main Accordion container
3334            let close_btn = '<span class="text-clickable" style="position: relative;right: 12px;top: -30px;float: right;" onclick="link_sighting_public_validation_details_fly('+id+')"><i class="fa-solid fa-circle-xmark"></i></span>';
3335            new TileComponent('TileComponent--verification-on-fly--container-' + id)
3336                .mapProps({
3337                    'title': 'PLUS_ONFLY_VERIFICATION_TITLE',
3338                    'icon': 'fa-solid fa-circle-question',
3339                    'open': 'open'
3340                })
3341                .slot(() => {
3342                    return close_btn + '<div id="TileComponent--verification-on-fly--container-' + id + '--slot"></div>';
3343                })
3344                .translate(dto.translations)
3345                .render();
3346            load_verification_list(ids, hash);
3347        }
3348    }
3349
3350    window.send_onfly_public_validation = function(form, hash)
3351    {
3352        let id_obs = [];
3353        let id_all_obs = [];
3354        $(".verification--apply-to[data-hash=\""+hash+"\"] input").each(function () {
3355            id_all_obs.push({id:$(this).val()});
3356            if($(this).is(':checked'))
3357                id_obs.push($(this).val());
3358        });
3359
3360        var button = $(form).find($('input[ name="send_validation"]'));
3361        button.prop('disabled', true);
3362
3363        var comment = $(form).find("select[name='VALIDATION_ERROR']").val();
3364        var user_comment = $(form).find("textarea[name='public_validation_comment']").val();
3365
3366        var verif_message = '';
3367                if(comment < 1)
3368            verif_message = "\n\t-You have not write any comment !";
3369                if(id_obs.length < 1)
3370            verif_message = verif_message + "\n\t-No sighting selected";
3371
3372        if(verif_message.length > 1) {
3373            verif_message = "Incomplete form : " + verif_message;
3374            alert(verif_message);
3375            button.prop('disabled', false);
3376            return -1;
3377        }
3378
3379        // Everything is ok let's send this form
3380        $.ajax({
3381            type: "POST",
3382            url: "https://www.ornitho.de/index.php",
3383            data: {
3384                m_id: 1661,
3385                backlink: 'skip',
3386                ids_obs: id_obs,
3387                hash: hash,
3388                id_all_obs: id_all_obs,
3389                comment: comment,
3390                user_comment: user_comment
3391            },
3392            success: function (data) {
3393                button.prop('disabled', false);
3394                load_verification_list(id_all_obs, hash);
3395                for(var i = 0 ; i < id_obs.length ; i++) {
3396                    if(typeof add_icon_reload === 'function')
3397                        add_icon_reload(id_obs[i]);
3398                }
3399                notifySuccess(tr('DISPLAY_PAGE_TEXT_PUBLIC_VALIDATION_SEND_SUCCESS'));
3400            },
3401            error: function (xhr, status) {
3402                button.prop('disabled', false);
3403                notifyError(tr('DISPLAY_PAGE_TEXT_VALIDATION_SEND_ERROR'));
3404            }
3405        });
3406    }
3407
3408
3409    window.load_verification_list = function(ids, hash) {
3410        if(typeof (ids) === 'string' || typeof (ids) === 'number') {
3411            var link ="index.php?m_id=1372&ids="+ids+"&ajax=y&show_verif_panel=1&hash="+hash+"";
3412            $("#verification_list").html('<em class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>');
3413            $("#verification_list").load(link);
3414        }
3415        else {
3416            const ids_str = ids.map(item => item.id);
3417            let link = "index.php?m_id=1372&ids=" + encodeURIComponent(ids_str.join(",")) + "&ajax=y&show_verif_panel=1&hash="+hash+"";
3418            let popup_container = $("#TileComponent--verification--container-"+ids[0].id + "--slot");
3419
3420            if(popup_container.length) {
3421                popup_container
3422                    .html('<em class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>')
3423                    .load(link);
3424
3425                $.ajax({
3426                    type: 'POST',
3427                    url: 'index.php?m_id=1351&backlink=skip&content=admin_hidden_type',
3428                    data: {id: ids[0].id},
3429                    success: function (response) {
3430                        if (response.icon_tab) {
3431                            if (response.icon_tab.length) {
3432                                $("#tabNH5 em").replaceWith(response.icon_tab);
3433                                $("#summary-verification-icon").html(response.icon_summary);
3434                            }
3435                        }
3436                    },
3437                    error: function (xhr, status, error) {
3438                        console.log('error sending error message: ' + error);
3439                    }
3440                });
3441            }
3442            else {
3443                $("#TileComponent--verification-on-fly--container-" + ids[0].id + "--slot")
3444                    .html('<em class="fa-solid fa-spinner fa-spin fa-1x-spin"></em>')
3445                    .load(link);
3446            }
3447        }
3448    }
3449
3450    window.update_apply_to = function(hash) {
3451        let newOids = [];
3452        $(".verification--apply-to[data-hash=\""+hash+"\"] input:checked").each(function () {
3453            newOids.push($(this).val());
3454        });
3455
3456        // Update Gradation
3457        for(var i = 1 ; i < 8 ; i++) {
3458            let g = $("#btn-gradation-" + i + "-" + hash);
3459            if(g.length) {
3460                if(!g.hasClass('not-allowed')) {
3461                    let click = g.attr('onclick');
3462                    let new_onclick = click.replace(/(oids=)[^&]*/, `$1${newOids}`);
3463                    g.attr('onclick', new_onclick);
3464                }
3465            }
3466        }
3467    }
3468</script>
3468
3469
3470             
3470<script>
3471                //<![CDATA[
3472
3473            function print_svg_javascript(svg)
3474            {
3475                var ret_string = '';
3476
3477                if (svg != '')
3478                {
3479                    ret_string += "<div style=\"display:inline-block;vertical-align: middle\"><svg width=\"12\" height=\"12\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"><g>";
3480                    ret_string += svg;
3481                    ret_string += "</g></svg></div>";
3482                }
3483
3484                return ret_string;
3485            }
3486
3487            function generate_image(species_array, day_number, is_hidden, is_admin_hidden, is_new, is_second_hand, no_link, show_transparent, is_favorite, protocol_name, protocol_svg, admin_hidden_type) {
3488                const committees_urls = {"DAK":"https:\/\/www.dda-web.de\/dak\/meldebogen","AKBW":"https:\/\/www.avikombw.de\/","BAK":"https:\/\/www.og-bayern.de\/bak\/","AKBB":"https:\/\/www.abbo-info.de\/nabu\/akbb.php","AKH":"https:\/\/www.hgon.de\/beobachten\/monitoring\/avifaunistische-kommission\/","SKMV":"https:\/\/www.oamv.de\/seltenheiten-ak-m-v.html","AKN":"https:\/\/www.aknb-web.de\/de\/aknb","AKNW":"https:\/\/www.nw-ornithologen.de\/index.php\/aktivitaeten\/avikom","AKRP":"https:\/\/gnor.de\/akrp\/","AKSL":"https:\/\/www.ornithologie-saar.de\/","AKS":"https:\/\/vso-web.de\/avifaunistik\/avifaunistische-kommission-sachsen-aksn\/","AKST":"https:\/\/www.osa-internet.de\/voegel-in-sachsen-anhalt\/seltenheiten-kommission","AKSHH":"https:\/\/www.oagsh.de\/seltenheiten","AKT":"https:\/\/ornithologen-thueringen.de\/avifaunistik\/avifaunistische-kommission","HAK":"https:\/\/www.oag-helgoland.de\/index.php\/hsk-meldebogen\/","AKB":"https:\/\/www.bodensee-ornis.de\/"};
3489                var color = "transparent";
3490                var alt = '' + 'Common species';
3491                var atlas_start = species_array['atlas_start'];
3492                var atlas_end = species_array['atlas_end'];
3493                var category = species_array['category'];
3494                var has_synonyms = 0;
3495
3496                                var ret_string = "";
3497
3498                if (is_admin_hidden !== 0) {
3499                    if(admin_hidden_type === 'refused') {
3500                        ret_string += '<em class="fas fa-check-exclamation" title="The record is incorrect, mark it as invalid"></em>';
3501                    }
3502                    else if(admin_hidden_type === 'incomplete') {
3503                        ret_string += '<em class="fas fa-check-wrench" title="The record is correct, request additional information"></em>';
3504                    }
3505                    else {
3506                        ret_string += '<em class="fas fa-check-question" title="The record is probably wrong, request a modification"></em>';
3507                    }
3508                }
3509
3510                if (is_new !== 0) {
3511                    ret_string += '<em title="New since my last visit" class="fas fa-new"></em>';
3512                }
3513
3514                //Note : alt and title are empty because normally in php we would do a $language->get_string('OBSERVATIONS_TEXT_NAME_' . $protocol_name) but we have access to protocol_name only in javascript but there is no equivalent to $language->get_string in javascript... we should print all the protocols before execution and then print from there? (same for rarity_committee)
3515                if (protocol_name !== '') {
3516                    if (protocol_name === 'full_form') {
3517                        ret_string += '<em class="fas fa-full-list" title="Data coming from an complete observation list"></em>';
3518                    }
3519                    else if  (protocol_name === 'partial_form') {
3520                        ret_string += '<em class="fas fa-partial-list" title="This sighting is part of a partial list"></em>';
3521                    }
3522                    else {
3523                        ret_string += print_svg_javascript(protocol_svg);
3524                    }
3525                }
3526
3527                if (is_second_hand !== 0) {
3528                    ret_string += '<em class="fas fa-second-hand" title="Second-hand data (agreement of observer necessary!)"></em>';
3529                }
3530
3531                if (is_hidden !== 0) {
3532                    ret_string += '<em class="fas fa-keylock-yellow" title="Hidden observation"></em>';
3533                }
3534
3535                if (is_favorite !== 0) {
3536                    ret_string += '<em class="fas fa-ok" title="DISPLAY_PAGE_TEXT_FAVORITE"></em>';
3537                }
3538
3539                if (typeof species_array['rarity_committee'] === 'object') {
3540                    Object.entries(species_array['rarity_committee']).forEac
3540h(([committee, status]) => {
3541                        let color;
3542
3543                        if (committee === 'LHK') {
3544                            color = '#83dafa';
3545                        } else if (['CAVS', 'KF', 'CHN', 'DAK', 'SEO'].includes(committee)) {
3546                            color = '#f7ef18';
3547                        } else {
3548                            color = 'white';
3549                        }
3550
3551
3552                        if(committees_urls[committee] !== undefined)
3553                            ret_string += '<a href= "' + committees_urls[committee] + '" target="_blank">';
3554                        ret_string += `<em class="fas fa-rc" style="--fa-secondary-color:${color}"></em>`;
3555
3556                        if (status === 'ACCEPTED') {
3557                            ret_string += `<em class="fas fa-ok"></em>`;
3558                        } else if (status === 'REJECTED') {
3559                            ret_string += `<em class="fas fa-cancel"></em>`;
3560                        }
3561                        if(committees_urls[committee] !== undefined)
3562                            ret_string += '</a>';
3563                    });
3564                }
3565
3566                                if (category === 'A') {
3567                    color = "red";
3568                    alt = '' + 'Scarce or uncommon species (announce every observation, category A)';
3569                }
3570
3571                if (category === 'B' || category === 'BH') {
3572                    color = "orange";
3573                    alt = '' + 'Less-common to rare breeding bird species for which, if possible, all observations should be reported and for which the number of individuals observed should be stated as precisely as possible with each report (especially during the breeding season; \"ADEBAR species\").  ';
3574                }
3575
3576                if (category === 'H' || category === 'BH') {
3577                    if (day_number <= 46 || day_number >= 334) {
3578                        color = "blue";
3579                        alt = '' + 'Uncommon wintering species (announce at least sightings occurring between 1st December and 15th February, category H)';
3580                    }
3581                }
3582
3583                if (show_transparent !== 0 || color !== 'transparent') {
3584                    ret_string += '<em title="' + alt + '" class="fas fa-category-'+color+'"></em>';
3585                }
3586                
3587                switch(has_synonyms)
3588                {
3589                    case 1:
3590                        ret_string += '<em class="fas fa-synonym" title="Synonymous taxa"></em>';
3591                        break;
3592                    case 2:
3593                        break;
3594                }
3595
3596                return ret_string;
3597            }
3598            // ]]>
3599            </script>
3599
3600                <link rel="stylesheet" type="text/css" href="https://cdnfiles1.biolovision.net/common/js/jscalendar_1_0/calendar-bv-1-4.css"/>
3601		
3601<script src="https://cdnfiles1.biolovision.net/common/js/jscalendar_1_0/calendar_f.js"></script>
3601
3602		
3602<script src="https://cdnfiles1.biolovision.net/common/js/jscalendar_1_0/langu-utf8/calendar-en.js"></script>
3602
3603        
3603<script src="https://cdnfiles1.biolovision.net/common/js/jscalendar_1_0/calendar-setup_new.js"></script>
3603
3604    
3604<script src="https://cdnfiles1.biolovision.net/common/js/d3_6_7_0.min.js" charset="utf-8"></script>
3604
3605    
3605<script src="https://cdnfiles1.biolovision.net/common/js/d3-charts_a55da2f7.js"></script>
3605
3606    
3606<script src="https://cdnfiles1.biolovision.net/common/js/waveform-data_5.js"></script>
3606
3607    
3607<script src="https://cdnfiles1.biolovision.net/common/js/jquery.touchSwipe.1.6.min.js"></script>
3607
3608    
3608<script src="https://cdnfiles1.biolovision.net/common/js/autofilter_utf8_42140533.js"></script>
3608
3609    
3609<script src="https://cdnfiles1.biolovision.net/common/js/toggle_between_fixed_time.js"></script>
3609
3610    
3610<script src="https://cdnfiles1.biolovision.net/common/js/jquery.qtip-3.0.3.min.js"></script>
3610
3611    
3611<script src="https://cdnfiles1.biolovision.net/common/js/sprintf.js"></script>
3611
3612    
3612<script src="https://cdnfiles1.biolovision.net/common/js/XMLHttpRequest_3.js"></script>
3612
3613    
3613<script src="https://cdnfiles1.biolovision.net/common/js/proj4_1.js"></script>
3613
3614    
3614<script src="https://cdnfiles1.biolovision.net/common/js/openlayers_2_13_1_m7.js"></script>
3614
3615    
3615<script src="https://cdnfiles1.biolovision.net/common/js/OL_custom_2_20.js"></script>
3615
3616    
3616<script src="https://cdnfiles1.biolovision.net/common/js/ob_tools_5.js"></script>
3616
3617    
3617<script src="https://cdnfiles1.biolovision.net/common/js/ol_map_obj_a76654a0.js"  ></script>
3617
3618    
3618<script src="https://cdnfiles1.biolovision.net/common/js/mortality_1.js"></script>
3618
3619    
3619<script src="https://cdnfiles1.biolovision.net/common/js/Queue.js"></script>
3619
3620
3621    <link rel="stylesheet" href="https://cdnfiles1.biolovision.net/common/js/jquery.qtip-3.0.3.min.css" type="text/css" />
3622
3623    
3623<script>
3624    // <![CDATA[
3625            d3.timeFormatDefaultLocale({
3626              "decimal": ".",
3627              "thousands": " ",
3628              "grouping": [3],
3629              "currency": ["$", ""],
3630              "dateTime": "%a %b %e %X %Y",
3631              "date": "%m/%d/%Y",
3632              "time": "%H:%M:%S",
3633              "periods": ["AM", "PM"],
3634              "days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
3635              "shortDays": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
3636              "months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
3637              "shortMonths": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
3638            });
3639         
3640    var height = $(window).height() - $(".block-news").offset().top;
3641     $("#news_content").css("height", Math.ceil(height) + "px");
3642
3643    var run_lock = 0;
3644
3645    var first_news = {"timestamp":1790935952,"data":[{"nid":"659","date":"Friday, October 2nd, 2026, 08:00","url":null,"url_text":null,"popup":"0","title":"October Big Day on 10 October 2026: Birding together worldwide","message":"<?xml encoding=\"UTF-8\"><p>\r\n\tOn <strong>10th October<\/strong>, it&rsquo;s that time of year again &ndash; from midnight to midnight, birdwatchers worldwide can take part in the <strong>October Big Day<\/strong>. Whether you&rsquo;re an experienced birdwatcher or just starting out, the October Big Day celebrates birdwatching as a shared activity and citizen science. Last year, nearly 900,000 people took part in the event, collectively recording...","chapeau":"","attached_file":null,"attached_file_text":null,"attached_image":"40259-13083304-1683-3218.jpg","name":"Moritz Meinken","news_type":"avinews","oeid":"30","edit_name":" Anonyme","taxo_name":"","new":0,"protocol_fullname":null,"blur":1},{"nid":"669","date":"Wednesday, September 30th, 2026, 09:30","url":null,"url_text":null,"popup":"0","title":"Influx of Nutcrackers reaches Germany","message":"<?xml encoding=\"UTF-8\"><p style=\"font-size: 12px; letter-spacing: normal;\">\r\n\tTannenh&auml;her br&uuml;ten in Deutschland vor allem in den Alpen sowie in den waldreichen Mittelgebirgen. Aktuell erreicht uns jedoch ein Einflug n&ouml;
3645rdlicher\/sibirischer Tannenh&auml;her der Unterart <em>macrorhynchos<\/em>, sodass auch in der Norddeutschen Tiefebene mit Beobachtungen gerechnet werden kann.<br><span style=\"font-size: 0.75rem; letter-spacing: 0px;\">Ende August begann in Finnland ein erheblicher Einflug von Tannenh&auml;hern &ndash; das st&auml;rkste Auftreten seit mehr als 30 Jahren. Bei Zugplanbeobachtungen am Bottnischen...<\/span>","chapeau":"","attached_file":null,"attached_file_text":null,"attached_image":"TannenhaeherAHoppe-6695.jpg","name":"Christopher K\u00f6nig","news_type":"avinews","oeid":"30","edit_name":" Anonyme","taxo_name":"","new":0,"protocol_fullname":null,"blur":1},{"nid":"667","date":"Monday, September 28th, 2026, 12:00","url":null,"url_text":null,"popup":"0","title":"Vielen Dank f\u00fcr mehr als 1 Million vollst\u00e4ndige Beobachtungslisten!","message":"<?xml encoding=\"UTF-8\"><p style=\"font-size: 12px; letter-spacing: normal;\">\r\n\tAm vergangenen Wochenende war es so weit: die einmillionste vollst&auml;ndige Beobachtungsliste wurde bei ornitho.de gemeldet! Wir freuen uns sehr, dass sich diese Eingabefunktion einer immer gr&ouml;&szlig;eren Beliebtheit erfreut.&nbsp; Damit konnte ein besonderer Meilenstein erreicht und die Zahl der vollst&auml;ndigen Listen innerhalb weniger Jahre verdoppelt werden. Die vollst&auml;ndigen Beobachtungslisten sind ein gewaltiger Datenschatz, welche die Ver&auml;nderungen der Vogelwelt besonders gut abbilden...","chapeau":"","attached_file":null,"attached_file_text":null,"attached_image":"44725-11210807-4772-6394.jpg","name":"Moritz Meinken","news_type":"technews","oeid":"30","edit_name":" Anonyme","taxo_name":"","new":0,"protocol_fullname":null,"blur":1},{"nid":"666","date":"Friday, September 25th, 2026, 16:24","url":null,"url_text":null,"popup":"0","title":"Machen Sie mit bei der bei der europaweiten Erfassung von Goldregenpfeifer, Brachvogel und Kiebitz!","message":"<?xml encoding=\"UTF-8\"><p style=\"font-size: 12px; letter-spacing: normal;\">\r\n\tGoldregenpfeifer und Kiebitze rasten im Gegensatz zu den meisten anderen Limikolen au&szlig;erhalb der Brutzeit gerne auch abseits von Feuchtgebieten in der Agrarlandschaft. Dort werden sie durch die regul&auml;ren Erfassungsprogramme (<em>Wasservogelz&auml;hlung<\/em> sowie <em>G&auml;nse- und Schwanenz&auml;hlung<\/em>) nur l&uuml;ckenhaft erfasst. Seit 2003 finden daher auf Initiative der International <a href=\"https:\/\/www.waderstudygroup.org\/\" style=\"color: rgb(9, 9, 9);\">Wader Study Group<\/a> regelm&auml;&szlig;ige, europaweit abgestimmte Synchronerfassungen rastender Limikolen statt. Am Wochenende <span style=\"font-weight: 600;\">17.\/18....<\/span>","chapeau":"","attached_file":null,"attached_file_text":null,"attached_image":"Bild1-9596.jpg","name":"Moritz Meinken","news_type":"avinews","oeid":"30","edit_name":" Anonyme","taxo_name":"","new":0,"protocol_fullname":null,"blur":1},{"nid":"663","date":"Monday, September 21st, 2026, 08:00","url":null,"url_text":null,"popup":"0","title":"Resting and migrating Cranes (and other species) - please note","message":"<?xml encoding=\"UTF-8\"><p>\r\n\tZu Zehntausenden sammeln sich derzeit die Kraniche in den Rastgebieten im Norden und Osten Deutschlands und treten bald ihren Zug in die &Uuml;berwinterungsgebiete in S&uuml;dwesteuropa an. Vor allem im Westen Deutschlands und in Luxemburg werden dann wieder die weithin h&ouml;rbaren Rufe und beeindruckenden Zugformationen zu sehen sein. Viele Tausend Zug- und Rastbeobachtungen werden in dieser Zeit &uuml;ber <em>ornitho.de<\/em> und <em>ornitho.lu<\/em>...","chapeau":"","attached_file":null,"attached_file_text":null,"attached_image":"KranichMPutze550px-23442-1437-4175.jpg","name":"Moritz Meinken","news_type":"avinews","oeid":"30","edit_name":" Anonyme","taxo_name":"","new":0,"protocol_fullname":null,"blur":1}],"txid":0}
3646    function redisplay_obs(dt)
3647    {
3648        $('#observation_content').html(''); // to force to be empty in case of multiple clic
3649        var ret = display_obs(dt);
3650        run_lock = 0;
3651        return ret;
3652    }
3653
3654    //Override change_taxo function so that we can change taxo without reloading the page
3655    function change_taxo(m_id,id_taxo,param,js_param,obj)
3656    {
3657        $(function()
3658        {
3659            if (!run_lock)
3660            {
3661                run_lock = 1;
3662                reset_display_obs();
3663                obsQueryEndPage = queryEndPage()
3664                                .mp_current_page(1) //use reload to prevent negative value in distance_to_bottom and not loading
3665                                .request("index.php?m_id=1351&content=last_observations_by_page&home=1&backlink=skip&p_c=duration&p_cc=-&sp_DateSynth=02.10.2026&sp_DChoice=offset&sp_DOffset=5&sp_SChoice=category&sp_Cat[never]=1&sp_Cat[veryrare]=1&
3665sp_Cat[rare]=1&sp_Cat[unusual]=1&sp_Cat[escaped]=0&sp_Cat[common]=0&sp_Cat[verycommon]=0&sp_PChoice=canton&sp_cC=111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000001&sp_project=0&sp_FChoice=list&sp_FGraphFormat=auto&sp_FMapFormat=none&sp_FDisplay=DATE_PLACE_SPECIES&sp_FOrder=ALPHA&sp_FOrderListSpecies=ALPHA&sp_FListSpeciesChoice=DATA&sp_FOrderSynth=ALPHA&sp_FGraphChoice=DATA&sp_DFormat=DESC&sp_FAltScale=250&sp_FAltChoice=DATA&sp_FExportFormat=XLS&sp_tg="+id_taxo)
3666                                .element_id("#observation_content")
3667                                .element_wait_id("#observation_content_wait")
3668                                .callback(display_obs)
3669                                .checkAllLoadedcallback(is_data_complete);
3670
3671
3672                $('#observation_content').html('');
3673                $('#observation_content_container_wait').show();
3674                run_lock = 0;
3675
3676                obsQueryEndPage.reloadAll('');//use reload to prevent negative value in distance_to_bottom and not loading
3677
3678                $(obj).parent().find(".bvMenuSubOFF").each(function() {
3679                                $(this).removeClass("bvMenuSubOFF");
3680                                $(this).addClass("bvMenuSub");
3681                            });
3682
3683                $(obj).toggleClass('bvMenuSub bvMenuSubOFF');
3684            }
3685        });
3686    }
3687
3688    
3689    var map_loaded = false;
3690
3691    function showMainPanel(id, count)
3692    {
3693        var mye, myh;
3694
3695        for (i = 1; i<= count; i++)
3696        {
3697            myh = document.getElementById("mainH"+i);
3698
3699            if (myh)
3700            {
3701                if (i == id)
3702                    myh.className = "bvbsPanelOFF";
3703                else
3704                    myh.className = "bvbsPanel";
3705            }
3706        }
3707    }
3708
3709    function add_click_controls()
3710    {
3711        $(".extended_detail_button").click(function()
3712        {
3713            $(this).find(".minus").css("display","none");
3714            $(this).find(".plus").css("display","");
3715            if($("#" + $(this).attr("id_feature") + "_" + $(this).attr("id_obs")).width() == 500)
3716            {
3717                $("#" + $(this).attr("id_feature") + "_" + $(this).attr("id_obs")).animate({
3718                    height: '20px',
3719                    width: '180px'
3720                }, 750 );
3721
3722                $(".clear_" + $(this).attr("id_feature") + "_" + $(this).attr("id_obs")).remove();
3723
3724            }
3725            else
3726            {
3727                $(this).find(".plus").css("display","none");
3728                $(this).find(".minus").css("display","");
3729                $(this).find(".imgProcessing").css("display","");
3730                $.post("index.php?m_id=63&backlink=skip&content=extended_detail&id_obs=" + $(this).attr("id_obs") + "&id_feature=" + $(this).attr("id_feature"),{}, callbackExtDetail);
3731            }
3732
3733        });
3734
3735        function callbackExtDetail(xmlData)
3736        {
3737            var id_content = $(xmlData).find('id_obs').text();
3738            var id_feature = $(xmlData).find('id_feature').text();
3739
3740            var content  = $("content_data", xmlData).text();
3741
3742            $("#" +id_feature + "_" + id_content).before("<div class='clear_" + id_feature + "_" + id_content +"' style='clear:both'></div>");
3743            $("#" +id_feature + "_" + id_content).after("<div class='clear_" + id_feature + "_" + id_content +"' style='clear:both'></div>");
3744            $("#" + id_feature + "_" + id_content).width(500);
3745
3746            $("#content_" + id_feature + "_" + id_content).html(content);
3747
3748            h = $("#content_" + id_feature + "_" + id_content).height() + 30;
3749
3750            $("#" + id_feature + "_" + id_content).animate({
3751                height: h + 'px'
3752            }, 750, function() {$(".imgProcessing").css("display","none");} );
3753        }
3754    }
3755
3756    $(function(){
3757        newsQueryEndPage.callback()(first_news);
3758    });
3759
3760    // ]]>
3761    </script>
3761
3762    
3762<script src="https://cdnfiles1.biolovision.net/common/js/livemap_core_n.js"></script>
3762
3763
3764    
3765</div>    <!-- responsive footer start here -->
3766
3767    </div> <!-- td-page-content -->
3768
3769    </div> <!-- td-full-content -->
3770    <div style="clear:both"></div>
3771    <div class="footer logo-footer">
3772            </div>
3773    </div> <!-- maincontent -->
3774
3775    <div class="clearfix"></div>
3776
3777    <div class="footer copyrightline">
3778                <a class="alink" style="margin-left:0.25rem;margin-right:0.25rem" href="https://www.ornitho.de/index.php?m_id=1121&item=3">Terms and conditions of use</a>
3779                <a class="alink" style="margin-left:0.25rem;margin-right:0.25rem" href="https://www.ornitho.de/index.php?m_id=1129&item=11">Disclaimer / Contact</a>
3780                <a class="alink" style="margin-left:0.25rem;margin-right:0.25rem" href="https://www.ornitho.de/index.php?m_id=1116&item=7">Credits</a>
3781            </div>
3782
3783    <div class="clearfix"></div>
3784
3785
3786    <div style="margin:2rem">The <em>ornitho.de</em> project is supported by the <a href="https://www.dda-web.de/" target="_blank">Federation of German Avifaunists</a> and its member associations and in cooperation with several partner organisations.</div>
3787
3788    <div class="clearfix"></div>
3789
3790    </div> <!-- ornithobody -->
3791    
3791<script src="https://cdnfiles1.biolovision.net/common/js/responsive_f07f475f.js"></script>
3791
3792    
3792<script>
3793        // <![CDATA[
3794        var responsive;
3795        $(function() {
3796            responsive = responsiveBuilder();
3797            responsive.init();
3798
3799            if (window.OLinit){
3800                OLinit();
3801            }
3802
3803            if (window.AEinit){
3804                AEinit();
3805            }
3806
3807            //Page content - problems with details edition on the phone.
3808            var page = $("#td-page-content"), detail_container = $("#detail-container");
3809            if(page.length && detail_container.length) {
3810                if(page.width() < detail_container.width())
3811//				detail_container.width(page.width());
3812                    page.css("overflow", "auto");
3813            }
3814        });
3815        // ]]>
3816    </script>
3816
3817    </body>
3818<!-- responsive footer end here -->
3819    </html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.