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