1<?php
2/* vim:set softtabstop=4 shiftwidth=4 expandtab: */
3/**
4 *
5 * LICENSE: GNU Affero General Public License, version 3 (AGPL-3.0-or-later)
6 * Copyright 2001 - 2020 Ampache.org
7 *
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU Affero General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU Affero General Public License for more details.
17 *
18 * You should have received a copy of the GNU Affero General Public License
19 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
20 *
21 */
22
23use Ampache\Config\AmpConfig;
24use Ampache\Repository\Model\Preference;
25use Ampache\Repository\Model\User;
26use Ampache\Module\Authorization\Access;
27use Ampache\Module\Api\Ajax;
28use Ampache\Module\System\AutoUpdate;
29use Ampache\Module\System\Core;
30use Ampache\Module\Util\AjaxUriRetrieverInterface;
31use Ampache\Module\Util\Mailer;
32use Ampache\Module\Util\Ui;
33use Ampache\Repository\PrivateMessageRepositoryInterface;
34
35$web_path          = AmpConfig::get('web_path');
36$htmllang          = str_replace("_", "-", AmpConfig::get('lang'));
37$location          = get_location();
38$_SESSION['login'] = false;
39$cookie_string     = (make_bool(AmpConfig::get('cookie_secure')))
40    ? "expires: 30, path: '/', secure: true, samesite: 'Strict'"
41    : "expires: 30, path: '/', samesite: 'Strict'";
42// strings for the main page and templates
43$t_home      = T_('Home');
44$t_play      = T_('Play');
45$t_artists   = T_('Artists');
46$t_a_artists = T_('Album Artists');
47$t_albums    = T_('Albums');
48$t_playlists = T_('Playlists');
49$t_genres    = T_('Genres');
50$t_favorites = T_('Favorites');
51$t_upload    = T_('Upload');
52$t_logout    = T_('Log out');
53
54global $dic;
55
56$ajaxUriRetriever = $dic->get(AjaxUriRetrieverInterface::class);
57?>
58<!DOCTYPE html>
59<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $htmllang; ?>" lang="<?php echo $htmllang; ?>" dir="<?php echo is_rtl(AmpConfig::get('lang')) ? 'rtl' : 'ltr';?>">
60    <head>
61        <!-- Propelled by Ampache | ampache.org -->
62        <link rel="search" type="application/opensearchdescription+xml" title="<?php echo scrub_out(AmpConfig::get('site_title')); ?>" href="<?php echo $web_path; ?>/search.php?action=descriptor" />
63        <?php
64            if (AmpConfig::get('use_rss')) { ?>
65        <link rel="alternate" type="application/rss+xml" title="<?php echo T_('Now Playing'); ?>" href="<?php echo $web_path; ?>/rss.php" />
66        <link rel="alternate" type="application/rss+xml" title="<?php echo T_('Recently Played'); ?>" href="<?php echo $web_path; ?>/rss.php?type=recently_played" />
67        <link rel="alternate" type="application/rss+xml" title="<?php echo T_('Newest Albums'); ?>" href="<?php echo $web_path; ?>/rss.php?type=latest_album" />
68        <link rel="alternate" type="application/rss+xml" title="<?php echo T_('Newest Artists'); ?>" href="<?php echo $web_path; ?>/rss.php?type=latest_artist" />
69        <?php
70                if (AmpConfig::get('sociable')) { ?>
71        <link rel="alternate" type="application/rss+xml" title="<?php echo T_('Newest Shouts'); ?>" href="<?php echo $web_path; ?>/rss.php?type=latest_shout" />
72        <?php
73                }
74            } ?>
75        <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=<?php echo AmpConfig::get('site_charset'); ?>" />
76        <meta name="viewport" content="width=device-width, initial-scale=1.0">
77        <title><?php echo scrub_out(AmpConfig::get('site_title')); ?> - <?php echo $location['title']; ?></title>
78
79        <?php require_once Ui::find_template('stylesheets.inc.php'); ?>
80
81        <link rel="stylesheet" href="<?php echo $web_path; ?>/lib/modules/jquery-ui-ampache/jquery-ui.min.css" type="text/css" media="screen" />
82        <link rel="stylesheet" href="<?php echo $web_path; ?>/lib/components/jstree/dist/themes/default/style.min.css" type="text/css" media="screen" />
83        <link rel="stylesheet" href="<?php echo $web_path; ?>/lib/components/tag-it/css/jquery.tagit.css" type="text/css" media="screen" />
84        <link rel="stylesheet" href="<?php echo $web_path; ?>/lib/modules/rhinoslider/css/rhinoslider-1.05.css" type="text/css" media="screen" />
85        <link rel="stylesheet" href="<?php echo $web_path; ?>/lib/components/datetimepicker/jquery.datetimepicker.css" type="text/css" media="screen" />
86        <link rel="stylesheet" href="<?php echo $web_path; ?>/lib/components/jQuery-contextMenu/dist/jquery.contextMenu.min.css" type="text/css" media="screen" />
87
88        <script src="<?php echo $web_path; ?>/lib/components/jquery/jquery.min.js"></script>
89        <script src="<?php echo $web_path; ?>/lib/components/jquery-ui/jquery-ui.min.js"></script>
90        <script src="<?php echo $web_path; ?>/lib/components/prettyphoto/js/jquery.prettyPhoto.js"></script>
91        <script src="<?php echo $web_path; ?>/lib/components/tag-it/js/tag-it.js"></script>
92        <script src="<?php echo $web_path; ?>/lib/components/js-cookie/js-cookie-built.js"></script>
93        <script src="<?php echo $web_path; ?>/lib/components/jscroll/jquery.jscroll.min.js" defer></script>
94        <script src="<?php echo $web_path; ?>/lib/components/jquery-qrcode/jquery-qrcode-built.js" defer></script>
95        <script src="<?php echo $web_path; ?>/lib/modules/rhinoslider/js/rhinoslider-1.05.min.js" defer></script>
96        <script src="<?php echo $web_path; ?>/lib/components/responsive-elements/responsive-elements.js"></script>
97        <script src="<?php echo $web_path; ?>/lib/components/datetimepicker/jquery.datetimepicker.js" defer></script>
98        <script src="<?php echo $web_path; ?>/lib/components/jQuery-Knob/js/jquery.knob.js" defer></script>
99        <script src="<?php echo $web_path; ?>/lib/components/jQuery-File-Upload/js/jquery.iframe-transport.js" defer></script>
100        <script src="<?php echo $web_path; ?>/lib/components/jQuery-File-Upload/js/jquery.fileupload.js" defer></script>
101        <script src="<?php echo $web_path; ?>/lib/components/jQuery-contextMenu/dist/jquery.contextMenu.js"></script>
102        <script src="<?php echo $web_path; ?>/lib/javascript/base.js" defer></script>
103        <script src="<?php echo $web_path; ?>/lib/javascript/ajax.js" defer></script>
104        <script src="<?php echo $web_path; ?>/lib/javascript/tools.js" defer></script>
105
106        <script>
107            $(document).ready(function(){
108                $("a[rel^='prettyPhoto']").prettyPhoto({social_tools:false});
109                <?php if (AmpConfig::get('geolocation')) { ?>
110                    geolocate_user();
111                <?php
112        } ?>
113            });
114
115            // Using the following workaround to set global variable available from any javascript script.
116            var jsAjaxUrl = "<?php echo $ajaxUriRetriever->getAjaxUri(); ?>";
117            var jsWebPath = "<?php echo $web_path; ?>";
118            var jsAjaxServer = "<?php echo $ajaxUriRetriever->getAjaxServerUri(); ?>";
119            var jsSaveTitle = "<?php echo T_('Save') ?>";
120            var jsCancelTitle = "<?php echo T_('Cancel') ?>";
121        </script>
122
123        <?php
124        if (AmpConfig::get('ajax_load')) {
125            $iframed = true; ?>
126        <script src="<?php echo $web_path; ?>/lib/javascript/dynamicpage.js"></script>
127        <?php require_once Ui::find_template('show_html5_player_headers.inc.php'); ?>
128        <script>
129            function NavigateTo(url)
130            {
131                window.location.hash = url.substring(jsWebPath.length + 1);
132            }
133
134            function getCurrentPage()
135            {
136                if (window.location.hash.length > 0) {
137                    var wpage = window.location.hash.substring(1);
138                    if (wpage !== 'prettyPhoto') {
139                        return btoa(wpage);
140                    } else {
141                        return "";
142                    }
143                }
144
145                return btoa(window.location.href.substring(jsWebPath.length + 1));
146            }
147        </script>
148        <?php
149        } else { ?>
150        <script>
151            function NavigateTo(url)
152            {
153                window.location.href = url;
154            }
155
156            function getCurrentPage()
157            {
158                return btoa(window.location.href);
159            }
160        </script>
161        <?php
162        } ?>
163        <script>
164            $.widget( "custom.catcomplete", $.ui.autocomplete, {
165                _renderItem: function( ul, item ) {
166                        var itemhtml = "";
167                        if (item.link !== '') {
168                            itemhtml += "<a href='" + item.link + "'>";
169                        } else {
170                            itemhtml += "<a>";
171                        }
172                        if (item.image !== '') {
173                            itemhtml += "<img src='" + item.image + "' class='searchart' alt='' />";
174                        }
175                        itemhtml += "<span class='searchitemtxt'>" + item.label + ((item.rels === '') ? "" : " - " + item.rels) + "</span>";
176                        itemhtml += "</a>";
177
178                        return $( "<li class='ui-menu-item'>" )
179                            .data("ui-autocomplete-item", item)
180                            .append( itemhtml + "</li>")
181                            .appendTo( ul );
182                },
183                _renderMenu: function( ul, items ) {
184                    var that = this, currentType = "";
185                    $.each( items, function( index, item ) {
186                        if (item.type !== currentType) {
187                            $( "<li class='ui-autocomplete-category'>")
188                                .data("ui-autocomplete-item", item)
189                                .append( item.type + "</li>" )
190                                .appendTo( ul );
191
192                            currentType = item.type;
193                        }
194                        that._renderItem( ul, item );
195                    });
196                }
197            });
198
199            $(function() {
200                var minSearchChars = 2;
201                $( "#searchString" )
202                    // don't navigate away from the field on tab when selecting an item
203                    .bind( "keydown", function( event ) {
204                        if ( event.keyCode === $.ui.keyCode.TAB && $( this ).data( "custom-catcomplete" ).widget().is(":visible") ) {
205                            event.preventDefault();
206                        }
207                    })
208                    // reopen previous search results
209                    .bind( "click", function( event ) {
210                        if ($( this ).val().length >= minSearchChars) {
211                            $( this ).data( "custom-catcomplete" ).search();
212                        }
213                    })
214                    .catcomplete({
215                        source: function( request, response ) {
216                            $.getJSON( jsAjaxUrl, {
217                                page: 'search',
218                                action: 'search',
219                                target: $('#searchStringRule').val(),
220                                search: request.term,
221                                xoutput: 'json'
222                            }, response );
223                        },
224                        search: function() {
225                            // custom minLength
226                            if ($( this ).val().length < minSearchChars) {
227                                return false;
228                            }
229                        },
230                        focus: function() {
231                            // prevent value inserted on focus
232                            return false;
233                        },
234                        select: function( event, ui ) {
235                            if (event.keyCode === $.ui.keyCode.ENTER) {
236                                NavigateTo(ui.item.link);
237                            }
238
239                            return false;
240                        }
241                    });
242            });
243        </script>
244        <script>
245            var lastaction = new Date().getTime();
246            var refresh_slideshow_interval=<?php if (Preference::exists('flickr_api_key')) {
247            echo AmpConfig::get('slideshow_time');
248        } else {
249            echo 0;
250        } ?>;
251            var iSlideshow = null;
252            var tSlideshow = null;
253            function init_slideshow_check()
254            {
255                if (refresh_slideshow_interval > 0) {
256                    if (tSlideshow != null) {
257                        clearTimeout(tSlideshow);
258                    }
259                    tSlideshow = window.setTimeout(function(){init_slideshow_refresh();}, refresh_slideshow_interval * 1000);
260                }
261            }
262            function swap_slideshow()
263            {
264                if (iSlideshow == null) {
265                    init_slideshow_refresh();
266                } else {
267                    stop_slideshow();
268                }
269            }
270            function init_slideshow_refresh()
271            {
272                if ($("#webplayer").is(":visible")) {
273                    clearTimeout(tSlideshow);
274                    tSlideshow = null;
275
276                    $("#aslideshow").height($(document).height())
277                      .css({'display': 'inline'});
278
279                    iSlideshow = true;
280                    refresh_slideshow();
281                }
282            }
283            function refresh_slideshow()
284            {
285                if (iSlideshow != null) {
286                    <?php echo Ajax::action('?page=index&action=slideshow', ''); ?>;
287                } else {
288                    init_slideshow_check();
289                }
290            }
291            function stop_slideshow()
292            {
293                if (iSlideshow != null) {
294                    iSlideshow = null;
295                    $("#aslideshow").css({'display': 'none'});
296                }
297            }
298            function update_action()
299            {
300                lastaction = new Date().getTime();
301                stop_slideshow();
302                init_slideshow_check();
303            }
304            $(document).mousemove(function(e) {
305                if (iSlideshow == null) {
306                    update_action();
307                }
308            });
309            $(document).ready(function() {
310                init_slideshow_check();
311            });
312        </script>
313    </head>
314    <body id="main-page">
315        <div id="aslideshow">
316            <div id="aslideshow_container">
317                <div id="fslider"></div>
318                <div id="fslider_script"></div>
319            </div>
320        </div>
321        <script>
322            $("#aslideshow").click(function(e) {
323                if (!$(e.target).hasClass('rhino-btn')) {
324                    update_action();
325                }
326            });
327        </script>
328
329        <?php
330            if (AmpConfig::get('libitem_contextmenu')) { ?>
331        <script>
332            function libitem_action(item, action)
333            {
334                var iinfo = item.attr('id').split('_', 2);
335                var object_type = iinfo[0];
336                var object_id = iinfo[1];
337
338                if (action !== undefined && action !== '') {
339                    ajaxPut(jsAjaxUrl + action + '&object_type=' + object_type + '&object_id=' + object_id);
340                } else {
341                    showPlaylistDialog(this, object_type, object_id);
342                }
343            }
344
345            $.contextMenu({
346                selector: ".libitem_menu",
347                items: {
348                    play: {name: "<?php echo $t_play ?>", callback: function(key, opt){ libitem_action(opt.$trigger, '?page=stream&action=directplay'); }},
349                    play_next: {name: "<?php echo T_('Play next') ?>", callback: function(key, opt){ libitem_action(opt.$trigger, '?page=stream&action=directplay&playnext=true'); }},
350                    play_last: {name: "<?php echo T_('Play last') ?>", callback: function(key, opt){ libitem_action(opt.$trigger, '?page=stream&action=directplay&append=true'); }},
351                    add_tmp_playlist: {name: "<?php echo T_('Add to Temporary Playlist') ?>", callback: function(key, opt){ libitem_action(opt.$trigger, '?action=basket'); }},
352                    add_playlist: {name: "<?php echo T_('Add to playlist') ?>", callback: function(key, opt){ libitem_action(opt.$trigger, ''); }}
353                }
354            });
355        </script>
356
357        <?php
358            } ?>
359
360        <!-- rfc3514 implementation -->
361        <div id="rfc3514" style="display:none;">0x0</div>
362        <div id="notification" class="notification-out"><?php echo Ui::get_icon('info', T_('Information')); ?><span id="notification-content"></span></div>
363        <div id="maincontainer">
364            <div id="header" class="header-<?php echo AmpConfig::get('ui_fixed') ? 'fixed' : 'float'; ?>"><!-- This is the header -->
365                <h1 id="headerlogo">
366                  <a href="<?php echo $web_path; ?>/index.php">
367                    <img src="<?php echo Ui::get_logo_url(); ?>" title="<?php echo scrub_out(AmpConfig::get('site_title')); ?>" alt="<?php echo scrub_out(AmpConfig::get('site_title')); ?>" />
368                  </a>
369                </h1>
370                <div id="headerbox">
371                    <?php
372                        Ui::show_box_top('', 'box box_headerbox');
373                        require_once Ui::find_template('show_search_bar.inc.php');
374                        if (User::is_registered()) {
375                            require_once Ui::find_template('show_playtype_switch.inc.php'); ?>
376                        <span id="loginInfo">
377                            <a href="<?php echo $web_path; ?>/stats.php?action=show_user&user_id=<?php echo Core::get_global('user')->id; ?>"><?php echo Core::get_global('user')->fullname; ?></a>
378                        <?php
379                            if (AmpConfig::get('sociable')) { ?>
380                            <a href="<?php echo $web_path; ?>/browse.php?action=pvmsg" title="<?php echo T_('New messages'); ?>">(<?php global $dic; echo $dic->get(PrivateMessageRepositoryInterface::class)->getUnreadCount((Core::get_global('user')->getId())); ?>)</a>
381                        <?php
382                            } ?>
383                        </span>
384                    <?php
385                        } else { ?>
386                        <span id="loginInfo">
387                            <a href="<?php echo $web_path; ?>/login.php?force_display=1" class="nohtml"><?php echo T_('Login'); ?></a>
388                        <?php
389                            if (AmpConfig::get('allow_public_registration') && Mailer::is_mail_enabled()) { ?>
390                                / <a href="<?php echo $web_path; ?>/register.php" class="nohtml"><?php echo T_('Register'); ?></a>
391                        <?php
392                            } ?>
393                        </span>
394                    <?php
395                        } ?>
396                    <?php if (AmpConfig::get('ajax_load') && (!isset($_SESSION['login']) || !$_SESSION['login'])) { ?>
397                        <div id="rightbar-minimize">
398                            <a href="javascript:ToggleRightbarVisibility();"><?php echo Ui::get_icon('minimize', T_('Show/Hide Playlist')); ?></a>
399                        </div>
400                    <?php } ?>
401                    <?php Ui::show_box_bottom(); ?>
402                </div> <!-- End headerbox -->
403            </div><!-- End header -->
404
405            <?php
406                if (AmpConfig::get('topmenu')) { ?>
407            <div id="topmenu_container" class="topmenu_container-<?php echo AmpConfig::get('ui_fixed') ? 'fixed' : 'float'; ?>">
408                <div class="topmenu_item">
409                    <a href="<?php echo $web_path ?>/index.php">
410                        <?php echo Ui::get_image('topmenu-home', $t_home); ?>
411                        <span><?php echo $t_home ?></span>
412                    </a>
413                </div>
414                <div class="topmenu_item">
415                    <a href="<?php echo $web_path ?>/browse.php?action=album_artist">
416                        <?php echo Ui::get_image('topmenu-artist', $t_artists); ?>
417                        <span><?php echo $t_artists ?></span>
418                    </a>
419                </div>
420                <div class="topmenu_item">
421                    <a href="<?php echo $web_path ?>/browse.php?action=playlist">
422                        <?php echo Ui::get_image('topmenu-playlist', $t_playlists); ?>
423                        <span><?php echo $t_playlists ?></span>
424                    </a>
425                </div>
426                <div class="topmenu_item">
427                    <a href="<?php echo $web_path ?>/browse.php?action=tag&type=song">
428                        <?php echo Ui::get_image('topmenu-tagcloud', $t_genres); ?>
429                        <span><?php echo $t_genres ?></span>
430                    </a>
431                </div>
432
433                <?php
434                    if (AmpConfig::get('userflags') && Access::check('interface', 25)) { ?>
435                <div class="topmenu_item">
436                    <a href="<?php echo $web_path ?>/stats.php?action=userflag">
437                        <?php echo Ui::get_image('topmenu-favorite', $t_favorites); ?>
438                        <span><?php echo $t_favorites ?></span>
439                    </a>
440                </div>
441
442                <?php
443                    }
444                    if (AmpConfig::get('allow_upload') && Access::check('interface', 25)) { ?>
445                <div class="topmenu_item">
446                    <a href="<?php echo $web_path ?>/upload.php">
447                        <?php echo Ui::get_image('topmenu-upload', $t_upload); ?>
448                        <span><?php echo $t_upload ?></span>
449                    </a>
450                </div>
451
452                <?php
453                    } ?>
454
455            </div>
456
457            <?php
458                }
459                $isCollapsed = ((AmpConfig::get('sidebar_light') && $_COOKIE['sidebar_state'] != "expanded") || $_COOKIE['sidebar_state'] == "collapsed"); ?>
460
461            <div id="sidebar" class="sidebar-<?php echo AmpConfig::get('ui_fixed') ? 'fixed' : 'float'; ?>">
462                <div id="sidebar-header" class="<?php echo $isCollapsed ? 'sidebar-header-collapsed' : ''; ?>" >
463                    <span id="sidebar-header-content"></span>
464                </div>
465                <div id="sidebar-content" class="<?php echo $isCollapsed ? 'sidebar-content-collapsed' : ''; ?>" >
466                    <?php require_once Ui::find_template('sidebar.inc.php'); ?>
467                </div>
468                <div id="sidebar-content-light" class="<?php echo $isCollapsed ? 'sidebar-content-light-collapsed' : ''; ?>" >
469                    <?php require_once Ui::find_template('sidebar.light.inc.php'); ?>
470                </div>
471            </div>
472            <!-- Handle collapsed visibility -->
473            <script>
474            $('#sidebar-header').click(function(){
475                var newstate = "collapsed";
476                if ($('#sidebar-header').hasClass("sidebar-header-collapsed")) {
477                    newstate = "expanded";
478                }
479
480                if (newstate != "expanded") {
481                    $("#content").addClass("content-left-wild", 600);
482                } else {
483                    $("#content").removeClass("content-left-wild", 1000);
484                }
485
486                $('#sidebar').hide(500, function() {
487                    if (newstate == "expanded") {
488                        $('#sidebar-content-light').removeClass("sidebar-content-light-collapsed");
489                        $('#sidebar-content').removeClass("sidebar-content-collapsed");
490                        $('#sidebar-header').removeClass("sidebar-header-collapsed");
491                    } else {
492                        $('#sidebar-content').addClass("sidebar-content-collapsed");
493                        $('#sidebar-header').addClass("sidebar-header-collapsed");
494                        $('#sidebar-content-light').addClass("sidebar-content-light-collapsed");
495                    }
496
497                    $('#sidebar').show(500);
498                });
499
500                Cookies.set('sidebar_state', newstate, {<?php echo $cookie_string ?>});
501            });
502            </script>
503            <div id="rightbar" class="rightbar-fixed">
504                <?php require_once Ui::find_template('rightbar.inc.php'); ?>
505            </div>
506
507            <!-- Tiny little div, used to cheat the system -->
508            <div id="ajax-loading"><?php echo T_('Loading') . ' . . .'; ?></div>
509            <div id="util_div" style="display:none;"></div>
510            <iframe name="util_iframe" id="util_iframe" style="display:none;" src="<?php echo $web_path; ?>/util.php"></iframe>
511
512            <div id="content" class="content-<?php echo AmpConfig::get('ui_fixed') ? (AmpConfig::get('topmenu') ? 'fixed-topmenu' : 'fixed') : 'float'; ?> <?php echo(($count_temp_playlist || AmpConfig::get('play_type') == 'localplay') ? '' : 'content-right-wild'); echo $isCollapsed ? ' content-left-wild' : ''; ?>">
513
514                <?php
515                    if (Access::check('interface', 100)) {
516                        echo '<div id=update_notify>';
517                        //if (!AmpConfig::get('hide_ampache_messages', false)) {
518                        //    AutoUpdate::show_ampache_message();
519                        //}
520                        if (AmpConfig::get('autoupdate') && AutoUpdate::is_update_available()) {
521                            AutoUpdate::show_new_version();
522                            echo '<br />';
523                        }
524                        $count_temp_playlist = count(Core::get_global('user')->playlist->get_items());
525
526                        if (AmpConfig::get('int_config_version') > AmpConfig::get('config_version')) { ?>
527                            <div class="fatalerror">
528                                <?php echo T_('Your Ampache config file is out of date!'); ?>
529                                <br />
530                                <a class="nohtml" href="<?php echo $web_path; ?>/admin/system.php?action=write_config"><?php echo T_('Update your current config file automatically'); ?></a> |
531                                <a class="nohtml" href="<?php echo $web_path; ?>/admin/system.php?action=generate_config"><?php echo T_('Download a copy of the new version'); ?></a>
532                            </div>
533                <?php
534                        }
535                        echo '</div>';
536                    }
537                if (AmpConfig::get("ajax_load")) {
538                    require Ui::find_template('show_web_player_embedded.inc.php');
539                } // load the web_player early to make sure the browser doesn't block audio playback?>
540                <div id="guts">
541