2018-06-21 21:29:49 +00:00
var $jscomp = $jscomp || { } ; $jscomp . scope = { } ; $jscomp . ASSUME _ES5 = ! 1 ; $jscomp . ASSUME _NO _NATIVE _MAP = ! 1 ; $jscomp . ASSUME _NO _NATIVE _SET = ! 1 ; $jscomp . defineProperty = $jscomp . ASSUME _ES5 || "function" == typeof Object . defineProperties ? Object . defineProperty : function ( a , b , c ) { a != Array . prototype && a != Object . prototype && ( a [ b ] = c . value ) } ; $jscomp . getGlobal = function ( a ) { return "undefined" != typeof window && window === a ? a : "undefined" != typeof global && null != global ? global : a } ; $jscomp . global = $jscomp . getGlobal ( this ) ; $jscomp . SYMBOL _PREFIX = "jscomp_symbol_" ;
$jscomp . initSymbol = function ( ) { $jscomp . initSymbol = function ( ) { } ; $jscomp . global . Symbol || ( $jscomp . global . Symbol = $jscomp . Symbol ) } ; $jscomp . Symbol = function ( ) { var a = 0 ; return function ( b ) { return $jscomp . SYMBOL _PREFIX + ( b || "" ) + a ++ } } ( ) ;
$jscomp . initSymbolIterator = function ( ) { $jscomp . initSymbol ( ) ; var a = $jscomp . global . Symbol . iterator ; a || ( a = $jscomp . global . Symbol . iterator = $jscomp . global . Symbol ( "iterator" ) ) ; "function" != typeof Array . prototype [ a ] && $jscomp . defineProperty ( Array . prototype , a , { configurable : ! 0 , writable : ! 0 , value : function ( ) { return $jscomp . arrayIterator ( this ) } } ) ; $jscomp . initSymbolIterator = function ( ) { } } ; $jscomp . arrayIterator = function ( a ) { var b = 0 ; return $jscomp . iteratorPrototype ( function ( ) { return b < a . length ? { done : ! 1 , value : a [ b ++ ] } : { done : ! 0 } } ) } ;
2018-07-03 21:46:07 +00:00
$jscomp . iteratorPrototype = function ( a ) { $jscomp . initSymbolIterator ( ) ; a = { next : a } ; a [ $jscomp . global . Symbol . iterator ] = function ( ) { return this } ; return a } ; $jscomp . makeIterator = function ( a ) { $jscomp . initSymbolIterator ( ) ; var b = a [ Symbol . iterator ] ; return b ? b . call ( a ) : $jscomp . arrayIterator ( a ) } ; $jscomp . arrayFromIterator = function ( a ) { for ( var b , c = [ ] ; ! ( b = a . next ( ) ) . done ; ) c . push ( b . value ) ; return c } ; $jscomp . arrayFromIterable = function ( a ) { return a instanceof Array ? a : $jscomp . arrayFromIterator ( $jscomp . makeIterator ( a ) ) } ;
2018-10-29 20:57:10 +00:00
$jscomp . polyfill = function ( a , b , c , d ) { if ( b ) { c = $jscomp . global ; a = a . split ( "." ) ; for ( d = 0 ; d < a . length - 1 ; d ++ ) { var e = a [ d ] ; e in c || ( c [ e ] = { } ) ; c = c [ e ] } a = a [ a . length - 1 ] ; d = c [ a ] ; b = b ( d ) ; b != d && null != b && $jscomp . defineProperty ( c , a , { configurable : ! 0 , writable : ! 0 , value : b } ) } } ; $jscomp . polyfill ( "Object.is" , function ( a ) { return a ? a : function ( a , c ) { return a === c ? 0 !== a || 1 / a === 1 / c : a !== a && c !== c } } , "es6" , "es3" ) ;
2018-12-03 20:11:34 +00:00
$jscomp . polyfill ( "Array.prototype.includes" , function ( a ) { return a ? a : function ( a , c ) { var d = this ; d instanceof String && ( d = String ( d ) ) ; var b = d . length ; c = c || 0 ; for ( 0 > c && ( c = Math . max ( c + b , 0 ) ) ; c < b ; c ++ ) { var f = d [ c ] ; if ( f === a || Object . is ( f , a ) ) return ! 0 } return ! 1 } } , "es7" , "es3" ) ;
2018-10-29 20:57:10 +00:00
$jscomp . checkStringArgs = function ( a , b , c ) { if ( null == a ) throw new TypeError ( "The 'this' value for String.prototype." + c + " must not be null or undefined" ) ; if ( b instanceof RegExp ) throw new TypeError ( "First argument to String.prototype." + c + " must not be a regular expression" ) ; return a + "" } ; $jscomp . polyfill ( "String.prototype.includes" , function ( a ) { return a ? a : function ( a , c ) { return - 1 !== $jscomp . checkStringArgs ( this , a , "includes" ) . indexOf ( a , c || 0 ) } } , "es6" , "es3" ) ;
2019-01-17 17:06:12 +00:00
$jscomp . polyfill ( "String.prototype.repeat" , function ( a ) { return a ? a : function ( a ) { var b = $jscomp . checkStringArgs ( this , null , "repeat" ) ; if ( 0 > a || 1342177279 < a ) throw new RangeError ( "Invalid count value" ) ; a |= 0 ; for ( var d = "" ; a ; ) if ( a & 1 && ( d += b ) , a >>>= 1 ) b += b ; return d } } , "es6" , "es3" ) ; $jscomp . owns = function ( a , b ) { return Object . prototype . hasOwnProperty . call ( a , b ) } ;
$jscomp . assign = "function" == typeof Object . assign ? Object . assign : function ( a , b ) { for ( var c = 1 ; c < arguments . length ; c ++ ) { var d = arguments [ c ] ; if ( d ) for ( var e in d ) $jscomp . owns ( d , e ) && ( a [ e ] = d [ e ] ) } return a } ; $jscomp . polyfill ( "Object.assign" , function ( a ) { return a || $jscomp . assign } , "es6" , "es3" ) ;
2019-01-21 20:35:51 +00:00
var socket , lastSong = "" , lastSongObj = { } , lastState , currentSong = { } , playstate = "" , settingsLock = ! 1 , settingsParsed = ! 1 , settingsNew = { } , settings = { } , alertTimeout , progressTimer , deferredPrompt , dragEl , playlistEl , websocketConnected = ! 1 , websocketTimer = null , appInited = ! 1 , app = { apps : { Playback : { state : "0/-/-/" , scrollPos : 0 } , Queue : { active : "Current" , tabs : { Current : { state : "0/any/-/" , scrollPos : 0 } , LastPlayed : { state : "0/any/-/" , scrollPos : 0 } } } , Browse : { active : "Database" , tabs : { Filesystem : { state : "0/-/-/" , scrollPos : 0 } , Playlists : { active : "All" ,
views : { All : { state : "0/-/-/" , scrollPos : 0 } , Detail : { state : "0/-/-/" , scrollPos : 0 } } } , Database : { active : "AlbumArtist" , views : { } } } } , Search : { state : "0/any/-/" , scrollPos : 0 } } , current : { app : "Playback" , tab : void 0 , view : void 0 , page : 0 , filter : "" , search : "" , sort : "" , scrollPos : 0 } , last : { app : void 0 , tab : void 0 , view : void 0 , filter : "" , search : "" , sort : "" , scrollPos : 0 } } , domCache = { } ; domCache . navbarBottomBtns = document . getElementById ( "navbar-bottom" ) . getElementsByTagName ( "div" ) ; domCache . navbarBottomBtnsLen = domCache . navbarBottomBtns . length ;
domCache . cardHeaderBrowse = document . getElementById ( "cardHeaderBrowse" ) . getElementsByTagName ( "a" ) ; domCache . cardHeaderBrowseLen = domCache . cardHeaderBrowse . length ; domCache . cardHeaderQueue = document . getElementById ( "cardHeaderQueue" ) . getElementsByTagName ( "a" ) ; domCache . cardHeaderQueueLen = domCache . cardHeaderQueue . length ; domCache . counter = document . getElementById ( "counter" ) ; domCache . volumePrct = document . getElementById ( "volumePrct" ) ; domCache . volumeControl = document . getElementById ( "volumeControl" ) ;
domCache . volumeMenu = document . getElementById ( "volumeMenu" ) ; domCache . btnsPlay = document . getElementsByClassName ( "btnPlay" ) ; domCache . btnsPlayLen = domCache . btnsPlay . length ; domCache . btnPrev = document . getElementById ( "btnPrev" ) ; domCache . btnNext = document . getElementById ( "btnNext" ) ; domCache . progressBar = document . getElementById ( "progressBar" ) ; domCache . volumeBar = document . getElementById ( "volumeBar" ) ; domCache . outputs = document . getElementById ( "outputs" ) ; domCache . btnAdd = document . getElementById ( "nav-add2homescreen" ) ;
domCache . currentCover = document . getElementById ( "currentCover" ) ; domCache . currentTitle = document . getElementById ( "currentTitle" ) ; domCache . btnVoteUp = document . getElementById ( "btnVoteUp" ) ; domCache . btnVoteDown = document . getElementById ( "btnVoteDown" ) ; domCache . badgeQueueItems = document . getElementById ( "badgeQueueItems" ) ; domCache . searchstr = document . getElementById ( "searchstr" ) ; domCache . searchCrumb = document . getElementById ( "searchCrumb" ) ;
2018-11-05 23:13:22 +00:00
var modalConnectionError = new Modal ( document . getElementById ( "modalConnectionError" ) , { backdrop : "static" , keyboard : ! 1 } ) , modalSettings = new Modal ( document . getElementById ( "modalSettings" ) ) , modalAbout = new Modal ( document . getElementById ( "modalAbout" ) ) , modalSavequeue = new Modal ( document . getElementById ( "modalSaveQueue" ) ) , modalSongDetails = new Modal ( document . getElementById ( "modalSongDetails" ) ) , modalAddToPlaylist = new Modal ( document . getElementById ( "modalAddToPlaylist" ) ) , modalRenamePlaylist = new Modal ( document . getElementById ( "modalRenamePlaylist" ) ) ,
2019-01-18 14:57:45 +00:00
modalUpdateDB = new Modal ( document . getElementById ( "modalUpdateDB" ) ) , modalSaveSmartPlaylist = new Modal ( document . getElementById ( "modalSaveSmartPlaylist" ) ) , modalDeletePlaylist = new Modal ( document . getElementById ( "modalDeletePlaylist" ) ) , modalHelp = new Modal ( document . getElementById ( "modalHelp" ) ) , modalAppInit = new Modal ( document . getElementById ( "modalAppInit" ) , { backdrop : "static" , keyboard : ! 1 } ) , dropdownMainMenu , dropdownVolumeMenu = new Dropdown ( document . getElementById ( "volumeMenu" ) ) , collapseDBupdate = new Collapse ( document . getElementById ( "navDBupdate" ) ) ;
2018-11-15 22:09:20 +00:00
function appPrepare ( a ) { if ( app . current . app != app . last . app || app . current . tab != app . last . tab || app . current . view != app . last . view ) { for ( var b = 0 ; b < domCache . navbarBottomBtnsLen ; b ++ ) domCache . navbarBottomBtns [ b ] . classList . remove ( "active" ) ; document . getElementById ( "cardPlayback" ) . classList . add ( "hide" ) ; document . getElementById ( "cardQueue" ) . classList . add ( "hide" ) ; document . getElementById ( "cardBrowse" ) . classList . add ( "hide" ) ; document . getElementById ( "cardSearch" ) . classList . add ( "hide" ) ; for ( b = 0 ; b < domCache . cardHeaderBrowseLen ; b ++ ) domCache . cardHeaderBrowse [ b ] . classList . remove ( "active" ) ;
for ( b = 0 ; b < domCache . cardHeaderQueueLen ; b ++ ) domCache . cardHeaderQueue [ b ] . classList . remove ( "active" ) ; document . getElementById ( "cardQueueCurrent" ) . classList . add ( "hide" ) ; document . getElementById ( "cardQueueLastPlayed" ) . classList . add ( "hide" ) ; document . getElementById ( "cardBrowsePlaylists" ) . classList . add ( "hide" ) ; document . getElementById ( "cardBrowseDatabase" ) . classList . add ( "hide" ) ; document . getElementById ( "cardBrowseFilesystem" ) . classList . add ( "hide" ) ; document . getElementById ( "card" + app . current . app ) . classList . remove ( "hide" ) ;
document . getElementById ( "nav" + app . current . app ) && document . getElementById ( "nav" + app . current . app ) . classList . add ( "active" ) ; void 0 != app . current . tab && ( document . getElementById ( "card" + app . current . app + app . current . tab ) . classList . remove ( "hide" ) , document . getElementById ( "card" + app . current . app + "Nav" + app . current . tab ) . classList . add ( "active" ) ) ; scrollTo ( a ) } ( a = document . getElementById ( app . current . app + ( void 0 == app . current . tab ? "" : app . current . tab ) + ( void 0 == app . current . view ? "" : app . current . view ) + "List" ) ) && a . classList . add ( "opacity05" ) }
2018-09-20 17:05:26 +00:00
function appGoto ( a , b , c , d ) { var e = document . body . scrollTop ? document . body . scrollTop : document . documentElement . scrollTop ; void 0 != app . apps [ app . current . app ] . scrollPos ? app . apps [ app . current . app ] . scrollPos = e : void 0 != app . apps [ app . current . app ] . tabs [ app . current . tab ] . scrollPos ? app . apps [ app . current . app ] . tabs [ app . current . tab ] . scrollPos = e : void 0 != app . apps [ app . current . app ] . tabs [ app . current . tab ] . views [ app . current . view ] . scrollPos && ( app . apps [ app . current . app ] . tabs [ app . current . tab ] . views [ app . current . view ] . scrollPos = e ) ; app . apps [ a ] . tabs ?
( void 0 == b && ( b = app . apps [ a ] . active ) , app . apps [ a ] . tabs [ b ] . views ? ( void 0 == c && ( c = app . apps [ a ] . tabs [ b ] . active ) , a = "/" + a + "/" + b + "/" + c + "!" + ( void 0 == d ? app . apps [ a ] . tabs [ b ] . views [ c ] . state : d ) ) : a = "/" + a + "/" + b + "!" + ( void 0 == d ? app . apps [ a ] . tabs [ b ] . state : d ) ) : a = "/" + a + "!" + ( void 0 == d ? app . apps [ a ] . state : d ) ; location . hash = a }
2019-01-21 20:35:51 +00:00
function appRoute ( ) { if ( 0 == settingsParsed ) appInitStart ( ) ; else { var a ; if ( a = decodeURI ( location . hash ) . match ( /^#\/(\w+)\/?(\w+)?\/?(\w+)?!((\d+)\/([^\/]+)\/([^\/]+)\/(.*))$/ ) ) { app . current . app = a [ 1 ] ; app . current . tab = a [ 2 ] ; app . current . view = a [ 3 ] ; app . apps [ app . current . app ] . state ? ( app . apps [ app . current . app ] . state = a [ 4 ] , app . current . scrollPos = app . apps [ app . current . app ] . scrollPos ) : app . apps [ app . current . app ] . tabs [ app . current . tab ] . state ? ( app . apps [ app . current . app ] . tabs [ app . current . tab ] . state = a [ 4 ] , app . apps [ app . current . app ] . active =
app . current . tab , app . current . scrollPos = app . apps [ app . current . app ] . tabs [ app . current . tab ] . scrollPos ) : app . apps [ app . current . app ] . tabs [ app . current . tab ] . views [ app . current . view ] . state && ( app . apps [ app . current . app ] . tabs [ app . current . tab ] . views [ app . current . view ] . state = a [ 4 ] , app . apps [ app . current . app ] . active = app . current . tab , app . apps [ app . current . app ] . tabs [ app . current . tab ] . active = app . current . view , app . current . scrollPos = app . apps [ app . current . app ] . tabs [ app . current . tab ] . views [ app . current . view ] . scrollPos ) ; app . current . page =
parseInt ( a [ 5 ] ) ; app . current . filter = a [ 6 ] ; app . current . sort = a [ 7 ] ; app . current . search = a [ 8 ] ; appPrepare ( app . current . scrollPos ) ; if ( "Playback" == app . current . app ) sendAPI ( { cmd : "MPD_API_PLAYER_CURRENT_SONG" } , songChange ) ; else if ( "Queue" == app . current . app && "Current" == app . current . tab ) selectTag ( "searchqueuetags" , "searchqueuetagsdesc" , app . current . filter ) , getQueue ( ) ; else if ( "Queue" == app . current . app && "LastPlayed" == app . current . tab ) sendAPI ( { cmd : "MPD_API_QUEUE_LAST_PLAYED" , data : { offset : app . current . page } } , parseLastPlayed ) ;
else if ( "Browse" == app . current . app && "Playlists" == app . current . tab && "All" == app . current . view ) sendAPI ( { cmd : "MPD_API_PLAYLIST_LIST" , data : { offset : app . current . page , filter : app . current . filter } } , parsePlaylists ) , doSetFilterLetter ( "BrowsePlaylistsFilter" ) ; else if ( "Browse" == app . current . app && "Playlists" == app . current . tab && "Detail" == app . current . view ) sendAPI ( { cmd : "MPD_API_PLAYLIST_CONTENT_LIST" , data : { offset : app . current . page , filter : app . current . filter , uri : app . current . search } } , parsePlaylists ) , doSetFilterLetter ( "BrowsePlaylistsFilter" ) ;
else if ( "Browse" == app . current . app && "Database" == app . current . tab ) "" != app . current . search ? ( sendAPI ( { cmd : "MPD_API_DATABASE_TAG_ALBUM_LIST" , data : { offset : app . current . page , filter : app . current . filter , search : app . current . search , tag : app . current . view } } , parseListDBtags ) , doSetFilterLetter ( "BrowseDatabaseFilter" ) ) : ( sendAPI ( { cmd : "MPD_API_DATABASE_TAG_LIST" , data : { offset : app . current . page , filter : app . current . filter , tag : app . current . view } } , parseListDBtags ) , doSetFilterLetter ( "BrowseDatabaseFilter" ) , selectTag ( "BrowseDatabaseByTagDropdown" ,
"btnBrowseDatabaseByTag" , app . current . view ) ) ; else if ( "Browse" == app . current . app && "Filesystem" == app . current . tab ) { sendAPI ( { cmd : "MPD_API_DATABASE_FILESYSTEM_LIST" , data : { offset : app . current . page , path : app . current . search ? app . current . search : "/" , filter : app . current . filter } } , parseFilesystem ) ; app . current . search ? ( document . getElementById ( "BrowseFilesystemAddAllSongs" ) . removeAttribute ( "disabled" ) , document . getElementById ( "BrowseFilesystemAddAllSongsBtn" ) . removeAttribute ( "disabled" ) ) : ( document . getElementById ( "BrowseFilesystemAddAllSongs" ) . setAttribute ( "disabled" ,
2019-01-17 17:06:12 +00:00
"disabled" ) , document . getElementById ( "BrowseFilesystemAddAllSongsBtn" ) . setAttribute ( "disabled" , "disabled" ) ) ; var b = '<li class="breadcrumb-item"><a data-uri="">root</a></li>' , c = app . current . search . split ( "/" ) , d = c . length , e = "" ; for ( a = 0 ; a < d ; a ++ ) { if ( d - 1 == a ) { b += '<li class="breadcrumb-item active">' + c [ a ] + "</li>" ; break } e += c [ a ] ; b += '<li class="breadcrumb-item"><a data-uri="' + e + '">' + c [ a ] + "</a></li>" ; e += "/" } a = document . getElementById ( "BrowseBreadcrumb" ) ; a . innerHTML = b ; b = a . getElementsByTagName ( "a" ) ; c = b . length ; for ( a =
2019-01-21 20:35:51 +00:00
0 ; a < c ; a ++ ) b [ a ] . addEventListener ( "click" , function ( ) { appGoto ( "Browse" , "Filesystem" , void 0 , "0/" + app . current . filter + "/" + app . current . sort + "/" + this . getAttribute ( "data-uri" ) ) } , ! 1 ) ; doSetFilterLetter ( "BrowseFilesystemFilter" ) } else if ( "Search" == app . current . app ) { domCache . searchstr . focus ( ) ; if ( settings . featAdvsearch ) { b = "" ; c = app . current . search . substring ( 1 , app . current . search . length - 1 ) . split ( " AND " ) ; for ( a = 0 ; a < c . length - 1 ; a ++ ) d = c [ a ] . substring ( 1 , c [ a ] . length - 1 ) , b += '<button data-filter="' + encodeURI ( d ) + '" class="btn btn-light mr-2">' +
d + '<span class="ml-2 badge badge-secondary">×</span></button>' ; domCache . searchCrumb . innerHTML = b ; "" == domCache . searchstr . value && 1 <= c . length && ( a = c [ c . length - 1 ] . substring ( 1 , c [ c . length - 1 ] . length - 1 ) , b = a . substring ( a . indexOf ( "'" ) + 1 , a . length - 1 ) , domCache . searchstr . value != b && ( domCache . searchCrumb . innerHTML += '<button data-filter="' + encodeURI ( a ) + '" class="btn btn-light mr-2">' + a + '<span href="#" class="ml-2 badge badge-secondary">×</span></button>' ) , a = a . substring ( a . indexOf ( " " ) + 1 ) , a = a . substring ( 0 , a . indexOf ( " " ) ) ,
"" == a && ( a = "contains" ) , document . getElementById ( "searchMatch" ) . value = a ) } else "" == domCache . searchstr . value && "" != app . current . search && ( domCache . searchstr . value = app . current . search ) ; app . last . app != app . current . app && "" != app . current . search && ( a = settings [ "cols" + app . current . app ] . length , a -- , document . getElementById ( "SearchList" ) . getElementsByTagName ( "tbody" ) [ 0 ] . innerHTML = '<tr><td><span class="material-icons">search</span></td><td colspan="' + a + '">Searching...</td></tr>' ) ; 2 <= domCache . searchstr . value . length || 0 < domCache . searchCrumb . children . length ?
settings . featAdvsearch ? ( a = app . current . sort , b = ! 1 , "-" == a ? ( a = settings . tags . includes ( "Title" ) ? "Title" : "-" , document . getElementById ( "SearchList" ) . setAttribute ( "data-sort" , a ) ) : 0 == a . indexOf ( "-" ) && ( b = ! 0 , a = a . substring ( 1 ) ) , sendAPI ( { cmd : "MPD_API_DATABASE_SEARCH_ADV" , data : { plist : "" , offset : app . current . page , sort : a , sortdesc : b , expression : app . current . search } } , parseSearch ) ) : sendAPI ( { cmd : "MPD_API_DATABASE_SEARCH" , data : { plist : "" , offset : app . current . page , filter : app . current . filter , searchstr : app . current . search } } , parseSearch ) :
( document . getElementById ( "SearchList" ) . getElementsByTagName ( "tbody" ) [ 0 ] . innerHTML = "" , document . getElementById ( "searchAddAllSongs" ) . setAttribute ( "disabled" , "disabled" ) , document . getElementById ( "searchAddAllSongsBtn" ) . setAttribute ( "disabled" , "disabled" ) , document . getElementById ( "panel-heading-search" ) . innerText = "" , document . getElementById ( "cardFooterSearch" ) . innerText = "" , document . getElementById ( "SearchList" ) . classList . remove ( "opacity05" ) , setPagination ( 0 , 0 ) ) ; selectTag ( "searchtags" , "searchtagsdesc" , app . current . filter ) } else appGoto ( "Playback" ) ;
app . last . app = app . current . app ; app . last . tab = app . current . tab ; app . last . view = app . current . view } else appGoto ( "Playback" ) } }
function appInitStart ( ) { appInited = ! 1 ; document . getElementsByTagName ( "header" ) [ 0 ] . classList . add ( "hide" ) ; document . getElementsByTagName ( "main" ) [ 0 ] . classList . add ( "hide" ) ; document . getElementsByTagName ( "footer" ) [ 0 ] . classList . add ( "hide" ) ; document . getElementById ( "appInitSettings" ) . classList . add ( "unvisible" ) ; document . getElementById ( "appInitWebsocket" ) . classList . add ( "unvisible" ) ; document . getElementById ( "appInitApply" ) . classList . add ( "unvisible" ) ; modalAppInit . show ( ) ; getSettings ( ) ; appInitWait ( ) }
function appInitWait ( ) { setTimeout ( function ( ) { 1 == settingsParsed && 1 == websocketConnected ? ( document . getElementById ( "appInitWebsocket" ) . classList . remove ( "unvisible" ) , appInit ( ) , document . getElementById ( "appInitApply" ) . classList . remove ( "unvisible" ) , document . getElementsByTagName ( "header" ) [ 0 ] . classList . remove ( "hide" ) , document . getElementsByTagName ( "main" ) [ 0 ] . classList . remove ( "hide" ) , document . getElementsByTagName ( "footer" ) [ 0 ] . classList . remove ( "hide" ) , modalAppInit . hide ( ) , appInited = ! 0 ) : ( 1 == settingsParsed && ( document . getElementById ( "appInitSettings" ) . classList . remove ( "unvisible" ) ,
2019-01-17 17:06:12 +00:00
webSocketConnect ( ) ) , appInitWait ( ) ) } , 500 ) }
function appInit ( ) { domCache . volumeBar . value = 0 ; document . getElementById ( "btnChVolumeDown" ) . addEventListener ( "click" , function ( a ) { a . stopPropagation ( ) } , ! 1 ) ; document . getElementById ( "btnChVolumeUp" ) . addEventListener ( "click" , function ( a ) { a . stopPropagation ( ) } , ! 1 ) ; domCache . volumeBar . addEventListener ( "click" , function ( a ) { a . stopPropagation ( ) } , ! 1 ) ; domCache . volumeBar . addEventListener ( "change" , function ( a ) { sendAPI ( { cmd : "MPD_API_PLAYER_VOLUME_SET" , data : { volume : domCache . volumeBar . value } } ) } , ! 1 ) ; domCache . progressBar . value =
0 ; domCache . progressBar . addEventListener ( "change" , function ( a ) { currentSong && 0 <= currentSong . currentSongId && sendAPI ( { cmd : "MPD_API_PLAYER_SEEK" , data : { songid : currentSong . currentSongId , seek : Math . ceil ( domCache . progressBar . value / 1E3 * currentSong . totalTime ) } } ) } , ! 1 ) ; document . getElementById ( "navDBupdate" ) . addEventListener ( "click" , function ( a ) { a . stopPropagation ( ) ; a . preventDefault ( ) ; a = this . getElementsByTagName ( "span" ) [ 0 ] ; a . innerText = "keyboard_arrow_right" == a . innerText ? "keyboard_arrow_down" : "keyboard_arrow_right" } ,
! 1 ) ; document . getElementById ( "volumeMenu" ) . parentNode . addEventListener ( "show.bs.dropdown" , function ( ) { sendAPI ( { cmd : "MPD_API_PLAYER_OUTPUT_LIST" } , parseOutputs ) } ) ; document . getElementById ( "modalAbout" ) . addEventListener ( "shown.bs.modal" , function ( ) { sendAPI ( { cmd : "MPD_API_DATABASE_STATS" } , parseStats ) } ) ; document . getElementById ( "modalAddToPlaylist" ) . addEventListener ( "shown.bs.modal" , function ( ) { document . getElementById ( "addStreamFrm" ) . classList . contains ( "hide" ) ? document . getElementById ( "addToPlaylistPlaylist" ) . focus ( ) :
document . getElementById ( "streamUrl" ) . focus ( ) } ) ; document . getElementById ( "modalHelp" ) . addEventListener ( "show.bs.modal" , function ( ) { var a = "" , b ; for ( b in keymap ) if ( void 0 == keymap [ b ] . req || 1 == settings [ keymap [ b ] . req ] ) a += '<tr><td><div class="key' + ( keymap [ b ] . key && 1 < keymap [ b ] . key . length ? " material-icons material-icons-small" : "" ) + '">' + ( void 0 != keymap [ b ] . key ? keymap [ b ] . key : b ) + "</div></td><td>" + keymap [ b ] . desc + "</td></tr>" ; document . getElementById ( "tbodyShortcuts" ) . innerHTML = a } ) ; document . getElementById ( "modalUpdateDB" ) . addEventListener ( "hidden.bs.modal" ,
function ( ) { document . getElementById ( "updateDBprogress" ) . classList . remove ( "updateDBprogressAnimate" ) } ) ; document . getElementById ( "modalSaveQueue" ) . addEventListener ( "shown.bs.modal" , function ( ) { var a = document . getElementById ( "saveQueueName" ) ; a . focus ( ) ; a . value = "" ; a . classList . remove ( "is-invalid" ) ; document . getElementById ( "saveQueueFrm" ) . classList . remove ( "was-validated" ) } ) ; document . getElementById ( "modalSettings" ) . addEventListener ( "shown.bs.modal" , function ( ) { getSettings ( ) ; document . getElementById ( "settingsFrm" ) . classList . remove ( "was-validated" ) ;
document . getElementById ( "inputCrossfade" ) . classList . remove ( "is-invalid" ) ; document . getElementById ( "inputMixrampdb" ) . classList . remove ( "is-invalid" ) ; document . getElementById ( "inputMixrampdelay" ) . classList . remove ( "is-invalid" ) } ) ; document . getElementById ( "selectJukeboxMode" ) . addEventListener ( "change" , function ( ) { var a = this . options [ this . selectedIndex ] . value ; 0 == a || 2 == a ? ( document . getElementById ( "inputJukeboxQueueLength" ) . setAttribute ( "disabled" , "disabled" ) , document . getElementById ( "selectJukeboxPlaylist" ) . setAttribute ( "disabled" ,
"disabled" ) ) : 1 == a && ( document . getElementById ( "inputJukeboxQueueLength" ) . removeAttribute ( "disabled" ) , document . getElementById ( "selectJukeboxPlaylist" ) . removeAttribute ( "disabled" ) ) } ) ; document . getElementById ( "addToPlaylistPlaylist" ) . addEventListener ( "change" , function ( a ) { "New Playlist" == this . options [ this . selectedIndex ] . text ? ( document . getElementById ( "addToPlaylistNewPlaylistDiv" ) . classList . remove ( "hide" ) , document . getElementById ( "addToPlaylistNewPlaylist" ) . focus ( ) ) : document . getElementById ( "addToPlaylistNewPlaylistDiv" ) . classList . add ( "hide" ) } ,
! 1 ) ; addFilterLetter ( "BrowseFilesystemFilterLetters" ) ; addFilterLetter ( "BrowseDatabaseFilterLetters" ) ; addFilterLetter ( "BrowsePlaylistsFilterLetters" ) ; document . getElementById ( "syscmds" ) . addEventListener ( "click" , function ( a ) { "A" == a . target . nodeName && parseCmd ( a , a . target . getAttribute ( "data-href" ) ) } , ! 1 ) ; for ( var a = document . querySelectorAll ( "[data-href]" ) , b = a . length , c = 0 ; c < b ; c ++ ) a [ c ] . classList . add ( "clickable" ) , a [ c ] . addEventListener ( "click" , function ( a ) { parseCmd ( a , this . getAttribute ( "data-href" ) ) } , ! 1 ) ; a = document . getElementsByClassName ( "pages" ) ;
b = a . length ; for ( c = 0 ; c < b ; c ++ ) a [ c ] . addEventListener ( "click" , function ( a ) { "BUTTON" == a . target . nodeName && gotoPage ( a . target . getAttribute ( "data-page" ) ) } , ! 1 ) ; document . getElementById ( "cardPlaybackTags" ) . addEventListener ( "click" , function ( a ) { "H4" == a . target . nodeName && gotoBrowse ( a . target ) } , ! 1 ) ; document . getElementById ( "modalSongDetails" ) . getElementsByTagName ( "tbody" ) [ 0 ] . addEventListener ( "click" , function ( a ) { "A" == a . target . nodeName ? void 0 != a . target . parentNode . getAttribute ( "data-tag" ) && ( modalSongDetails . hide ( ) , a . preventDefault ( ) ,
gotoBrowse ( a . target ) ) : "BUTTON" == a . target . nodeName && a . target . getAttribute ( "data-href" ) && parseCmd ( a , a . target . getAttribute ( "data-href" ) ) } , ! 1 ) ; document . getElementById ( "outputs" ) . addEventListener ( "click" , function ( a ) { "BUTTON" == a . target . nodeName && a . stopPropagation ( ) ; sendAPI ( { cmd : "MPD_API_PLAYER_TOGGLE_OUTPUT" , data : { output : a . target . getAttribute ( "data-output-id" ) , state : a . target . classList . contains ( "active" ) ? 0 : 1 } } ) ; toggleBtn ( a . target . id ) } , ! 1 ) ; document . getElementById ( "QueueCurrentList" ) . addEventListener ( "click" ,
function ( a ) { "TD" == a . target . nodeName ? sendAPI ( { cmd : "MPD_API_PLAYER_PLAY_TRACK" , data : { track : a . target . parentNode . getAttribute ( "data-trackid" ) } } ) : "A" == a . target . nodeName && showMenu ( a . target , a ) } , ! 1 ) ; document . getElementById ( "QueueLastPlayedList" ) . addEventListener ( "click" , function ( a ) { "A" == a . target . nodeName && showMenu ( a . target , a ) } , ! 1 ) ; document . getElementById ( "BrowseFilesystemList" ) . addEventListener ( "click" , function ( a ) { if ( "TD" == a . target . nodeName ) switch ( a . target . parentNode . getAttribute ( "data-type" ) ) { case "dir" : appGoto ( "Browse" ,
2019-01-21 20:35:51 +00:00
"Filesystem" , void 0 , "0/" + app . current . filter + "/" + app . current . sort + "/" + decodeURI ( a . target . parentNode . getAttribute ( "data-uri" ) ) ) ; break ; case "song" : appendQueue ( "song" , decodeURI ( a . target . parentNode . getAttribute ( "data-uri" ) ) , a . target . parentNode . getAttribute ( "data-name" ) ) ; break ; case "plist" : appendQueue ( "plist" , decodeURI ( a . target . parentNode . getAttribute ( "data-uri" ) ) , a . target . parentNode . getAttribute ( "data-name" ) ) } else "A" == a . target . nodeName && showMenu ( a . target , a ) } , ! 1 ) ; document . getElementById ( "BrowsePlaylistsAllList" ) . addEventListener ( "click" ,
2019-01-17 17:06:12 +00:00
function ( a ) { "TD" == a . target . nodeName ? appendQueue ( "plist" , decodeURI ( a . target . parentNode . getAttribute ( "data-uri" ) ) , a . target . parentNode . getAttribute ( "data-name" ) ) : "A" == a . target . nodeName && showMenu ( a . target , a ) } , ! 1 ) ; document . getElementById ( "BrowsePlaylistsDetailList" ) . addEventListener ( "click" , function ( a ) { "TD" == a . target . nodeName ? appendQueue ( "plist" , decodeURI ( a . target . parentNode . getAttribute ( "data-uri" ) ) , a . target . parentNode . getAttribute ( "data-name" ) ) : "A" == a . target . nodeName && showMenu ( a . target , a ) } , ! 1 ) ; document . getElementById ( "BrowseDatabaseTagList" ) . addEventListener ( "click" ,
2019-01-21 20:35:51 +00:00
function ( a ) { "TD" == a . target . nodeName && appGoto ( "Browse" , "Database" , app . current . view , "0/-/-/" + a . target . parentNode . getAttribute ( "data-uri" ) ) } , ! 1 ) ; document . getElementById ( "SearchList" ) . addEventListener ( "click" , function ( a ) { "TD" == a . target . nodeName ? appendQueue ( "song" , decodeURI ( a . target . parentNode . getAttribute ( "data-uri" ) ) , a . target . parentNode . getAttribute ( "data-name" ) ) : "A" == a . target . nodeName && showMenu ( a . target , a ) } , ! 1 ) ; document . getElementById ( "BrowseFilesystemAddAllSongsDropdown" ) . addEventListener ( "click" ,
function ( a ) { "BUTTON" == a . target . nodeName && ( "Add all to queue" == a . target . innerText ? addAllFromBrowse ( ) : "Add all to playlist" == a . target . innerText && showAddToPlaylist ( app . current . search ) ) } , ! 1 ) ; document . getElementById ( "searchAddAllSongsDropdown" ) . addEventListener ( "click" , function ( a ) { "BUTTON" == a . target . nodeName && ( "Add all to queue" == a . target . innerText ? addAllFromSearchPlist ( "queue" ) : "Add all to playlist" == a . target . innerText ? showAddToPlaylist ( "SEARCH" ) : "Save as smart playlist" == a . target . innerText && saveSearchAsSmartPlaylist ( ) ) } ,
2019-01-17 17:06:12 +00:00
! 1 ) ; document . getElementById ( "BrowseDatabaseAddAllSongsDropdown" ) . addEventListener ( "click" , function ( a ) { "BUTTON" == a . target . nodeName && ( "Add all to queue" == a . target . innerText ? addAllFromBrowseDatabasePlist ( "queue" ) : "Add all to playlist" == a . target . innerText && showAddToPlaylist ( "DATABASE" ) ) } , ! 1 ) ; document . getElementById ( "searchtags" ) . addEventListener ( "click" , function ( a ) { "BUTTON" == a . target . nodeName && ( app . current . filter = a . target . getAttribute ( "data-tag" ) , search ( domCache . searchstr . value ) ) } , ! 1 ) ; document . getElementById ( "searchqueuestr" ) . addEventListener ( "keyup" ,
2019-01-21 20:35:51 +00:00
function ( a ) { "Escape" == a . key ? this . blur ( ) : appGoto ( app . current . app , app . current . tab , app . current . view , "0/" + app . current . filter + "/" + app . current . sort + "/" + this . value ) } , ! 1 ) ; document . getElementById ( "searchqueuetags" ) . addEventListener ( "click" , function ( a ) { "BUTTON" == a . target . nodeName && appGoto ( app . current . app , app . current . tab , app . current . view , app . current . page + "/" + a . target . getAttribute ( "data-tag" ) + "/" + app . current . sort + "/" + app . current . search ) } , ! 1 ) ; a = "QueueCurrentColsDropdown BrowseFilesystemColsDropdown SearchColsDropdown BrowsePlaylistsDetailColsDropdown BrowseDatabaseColsDropdown PlaybackColsDropdown QueueLastPlayedColsDropdown" . split ( " " ) ;
2019-01-17 17:06:12 +00:00
for ( c = 0 ; c < a . length ; c ++ ) document . getElementById ( a [ c ] ) . addEventListener ( "click" , function ( a ) { "INPUT" == a . target . nodeName && a . stopPropagation ( ) } , ! 1 ) ; document . getElementById ( "search" ) . addEventListener ( "submit" , function ( ) { return ! 1 } , ! 1 ) ; document . getElementById ( "searchqueue" ) . addEventListener ( "submit" , function ( ) { return ! 1 } , ! 1 ) ; domCache . searchstr . addEventListener ( "keyup" , function ( a ) { if ( "Escape" == a . key ) this . blur ( ) ; else if ( "Enter" == a . key && settings . featAdvsearch ) if ( "" != this . value ) { a = document . getElementById ( "searchMatch" ) ;
var b = document . createElement ( "button" ) ; b . classList . add ( "btn" , "btn-light" , "mr-2" ) ; b . setAttribute ( "data-filter" , encodeURI ( app . current . filter + " " + a . options [ a . selectedIndex ] . value + " '" + this . value + "'" ) ) ; b . innerHTML = app . current . filter + " " + a . options [ a . selectedIndex ] . value + " '" + this . value + '\'<span class="ml-2 badge badge-secondary">×</span>' ; this . value = "" ; domCache . searchCrumb . appendChild ( b ) } else search ( this . value ) ; else search ( this . value ) } , ! 1 ) ; domCache . searchCrumb . addEventListener ( "click" , function ( a ) { a . preventDefault ( ) ;
a . stopPropagation ( ) ; if ( "SPAN" == a . target . nodeName ) a . target . parentNode . remove ( ) , search ( "" ) ; else if ( "BUTTON" == a . target . nodeName ) { var b = decodeURI ( a . target . getAttribute ( "data-filter" ) ) ; domCache . searchstr . value = b . substring ( b . indexOf ( "'" ) + 1 , b . length - 1 ) ; var c = b . substring ( 0 , b . indexOf ( " " ) ) ; selectTag ( "searchtags" , "searchtagsdesc" , c ) ; b = b . substring ( b . indexOf ( " " ) + 1 ) ; b = b . substring ( 0 , b . indexOf ( " " ) ) ; document . getElementById ( "searchMatch" ) . value = b ; a . target . remove ( ) ; search ( domCache . searchstr . value ) } } , ! 1 ) ; document . getElementById ( "searchMatch" ) . addEventListener ( "change" ,
2019-01-21 20:35:51 +00:00
function ( a ) { search ( domCache . searchstr . value ) } , ! 1 ) ; document . getElementById ( "SearchList" ) . getElementsByTagName ( "tr" ) [ 0 ] . addEventListener ( "click" , function ( a ) { if ( settings . featAdvsearch && "TH" == a . target . nodeName ) { var b = a . target . getAttribute ( "data-col" ) ; if ( "Duration" != b ) { var c = app . current . sort , d = ! 0 ; if ( c == b || c == "-" + b ) 0 == c . indexOf ( "-" ) ? ( d = ! 0 , c . substring ( 1 ) ) : d = ! 1 ; 0 == d ? ( c = "-" + b , d = ! 0 ) : ( d = ! 1 , c = b ) ; for ( var h = document . getElementById ( "SearchList" ) . getElementsByClassName ( "sort-dir" ) , l = 0 ; l < h . length ; l ++ ) h [ l ] . remove ( ) ;
app . current . sort = c ; a . target . innerHTML = b + '<span class="sort-dir material-icons pull-right">' + ( 1 == d ? "arrow_drop_up" : "arrow_drop_down" ) + "</span>" ; appGoto ( app . current . app , app . current . tab , app . current . view , app . current . page + "/" + app . current . filter + "/" + app . current . sort + "/" + app . current . search ) } } } , ! 1 ) ; document . getElementById ( "BrowseDatabaseByTagDropdown" ) . addEventListener ( "click" , function ( a ) { "BUTTON" == a . target . nodeName && appGoto ( app . current . app , app . current . tab , a . target . getAttribute ( "data-tag" ) , "0/" + app . current . filter +
"/" + app . current . sort + "/" + app . current . search ) } , ! 1 ) ; document . getElementsByTagName ( "body" ) [ 0 ] . addEventListener ( "click" , function ( a ) { hideMenu ( ) } , ! 1 ) ; dragAndDropTable ( "QueueCurrentList" ) ; dragAndDropTable ( "BrowsePlaylistsDetailList" ) ; dragAndDropTableHeader ( "QueueCurrent" ) ; dragAndDropTableHeader ( "QueueLastPlayed" ) ; dragAndDropTableHeader ( "Search" ) ; dragAndDropTableHeader ( "BrowseFilesystem" ) ; dragAndDropTableHeader ( "BrowsePlaylistsDetail" ) ; window . addEventListener ( "hashchange" , appRoute , ! 1 ) ; window . addEventListener ( "focus" ,
function ( ) { sendAPI ( { cmd : "MPD_API_PLAYER_STATE" } , parseState ) } , ! 1 ) ; document . addEventListener ( "keydown" , function ( a ) { if ( "INPUT" != a . target . tagName && "SELECT" != a . target . tagName && ! a . ctrlKey && ! a . altKey ) { var b = keymap [ a . key ] ; b && "function" === typeof window [ b . cmd ] && ( void 0 == keymap [ a . key ] . req || 1 == settings [ keymap [ a . key ] . req ] ) && parseCmd ( a , b ) } } , ! 1 ) ; "serviceWorker" in navigator && "https" == document . URL . substring ( 0 , 5 ) && window . addEventListener ( "load" , function ( ) { navigator . serviceWorker . register ( "/sw.min.js" , { scope : "/" } ) . then ( function ( a ) { console . log ( "ServiceWorker registration successful with scope: " ,
a . scope ) ; a . update ( ) } , function ( a ) { console . log ( "ServiceWorker registration failed: " , a ) } ) } ) ; window . addEventListener ( "beforeinstallprompt" , function ( a ) { a . preventDefault ( ) ; deferredPrompt = a } ) ; window . addEventListener ( "beforeinstallprompt" , function ( a ) { a . preventDefault ( ) ; deferredPrompt = a ; domCache . btnAdd . classList . remove ( "hide" ) } ) ; domCache . btnAdd . addEventListener ( "click" , function ( a ) { domCache . btnAdd . classList . add ( "hide" ) ; deferredPrompt . prompt ( ) ; deferredPrompt . userChoice . then ( function ( a ) { "accepted" === a . outcome ?
console . log ( "User accepted the A2HS prompt" ) : console . log ( "User dismissed the A2HS prompt" ) ; deferredPrompt = null } ) } ) ; window . addEventListener ( "appinstalled" , function ( a ) { console . log ( "myMPD installed as app" ) } ) ; window . addEventListener ( "beforeunload" , function ( ) { socket . onclose = function ( ) { } ; socket . close ( ) ; websocketConnected = ! 1 } ) }
2018-12-03 20:11:34 +00:00
function parseCmd ( a , b ) { a . preventDefault ( ) ; a = b ; "string" == typeof b && ( a = JSON . parse ( b ) ) ; if ( "function" === typeof window [ a . cmd ] ) switch ( a . cmd ) { case "sendAPI" : sendAPI . apply ( null , $jscomp . arrayFromIterable ( a . options ) ) ; break ; default : window [ a . cmd ] . apply ( null , $jscomp . arrayFromIterable ( a . options ) ) } }
2019-01-21 20:35:51 +00:00
function search ( a ) { if ( settings . featAdvsearch ) { for ( var b = "(" , c = domCache . searchCrumb . children , d = 0 ; d < c . length ; d ++ ) b += "(" + decodeURI ( c [ d ] . getAttribute ( "data-filter" ) ) + ")" , "" != a && ( b += " AND " ) ; "" != a ? ( c = document . getElementById ( "searchMatch" ) , b += "(" + app . current . filter + " " + c . options [ c . selectedIndex ] . value + " '" + a + "'))" ) : b += ")" ; 2 >= b . length && ( b = "" ) ; appGoto ( "Search" , void 0 , void 0 , "0/" + app . current . filter + "/" + app . current . sort + "/" + encodeURI ( b ) ) } else appGoto ( "Search" , void 0 , void 0 , "0/" + app . current . filter + "/" + app . current . sort +
"/" + a ) }
function dragAndDropTable ( a ) { var b = document . getElementById ( a ) . getElementsByTagName ( "tbody" ) [ 0 ] ; b . addEventListener ( "dragstart" , function ( a ) { "TR" == a . target . nodeName && ( a . target . classList . add ( "opacity05" ) , a . dataTransfer . setDragImage ( a . target , 0 , 0 ) , a . dataTransfer . effectAllowed = "move" , a . dataTransfer . setData ( "Text" , a . target . getAttribute ( "id" ) ) , dragEl = a . target . cloneNode ( ! 0 ) ) } , ! 1 ) ; b . addEventListener ( "dragleave" , function ( a ) { a . preventDefault ( ) ; if ( "TR" == dragEl . nodeName ) { var b = a . target ; "TD" == a . target . nodeName && ( b =
a . target . parentNode ) ; "TR" == b . nodeName && b . classList . remove ( "dragover" ) } } , ! 1 ) ; b . addEventListener ( "dragover" , function ( a ) { a . preventDefault ( ) ; if ( "TR" == dragEl . nodeName ) { for ( var c = b . getElementsByClassName ( "dragover" ) , e = c . length , f = 0 ; f < e ; f ++ ) c [ f ] . classList . remove ( "dragover" ) ; c = a . target ; "TD" == a . target . nodeName && ( c = a . target . parentNode ) ; "TR" == c . nodeName && c . classList . add ( "dragover" ) ; a . dataTransfer . dropEffect = "move" } } , ! 1 ) ; b . addEventListener ( "dragend" , function ( a ) { a . preventDefault ( ) ; if ( "TR" == dragEl . nodeName ) { for ( var c =
2018-10-29 20:57:10 +00:00
b . getElementsByClassName ( "dragover" ) , e = c . length , f = 0 ; f < e ; f ++ ) c [ f ] . classList . remove ( "dragover" ) ; document . getElementById ( a . dataTransfer . getData ( "Text" ) ) && document . getElementById ( a . dataTransfer . getData ( "Text" ) ) . classList . remove ( "opacity05" ) } } , ! 1 ) ; b . addEventListener ( "drop" , function ( c ) { c . stopPropagation ( ) ; c . preventDefault ( ) ; if ( "TR" == dragEl . nodeName ) { var d = c . target ; "TD" == c . target . nodeName && ( d = c . target . parentNode ) ; var e = document . getElementById ( c . dataTransfer . getData ( "Text" ) ) . getAttribute ( "data-songpos" ) ,
2018-11-15 22:09:20 +00:00
f = d . getAttribute ( "data-songpos" ) ; document . getElementById ( c . dataTransfer . getData ( "Text" ) ) . remove ( ) ; dragEl . classList . remove ( "opacity05" ) ; b . insertBefore ( dragEl , d ) ; c = b . getElementsByClassName ( "dragover" ) ; d = c . length ; for ( var g = 0 ; g < d ; g ++ ) c [ g ] . classList . remove ( "dragover" ) ; document . getElementById ( a ) . classList . add ( "opacity05" ) ; "Queue" == app . current . app && "Current" == app . current . tab ? sendAPI ( { cmd : "MPD_API_QUEUE_MOVE_TRACK" , data : { from : e , to : f } } ) : "Browse" == app . current . app && "Playlists" == app . current . tab && "Detail" == app . current . view &&
playlistMoveTrack ( e , f ) } } , ! 1 ) }
function dragAndDropTableHeader ( a ) { if ( document . getElementById ( a + "List" ) ) var b = document . getElementById ( a + "List" ) . getElementsByTagName ( "tr" ) [ 0 ] ; else b = a . getElementsByTagName ( "tr" ) [ 0 ] , a = "BrowseDatabase" ; b . addEventListener ( "dragstart" , function ( a ) { "TH" == a . target . nodeName && ( a . target . classList . add ( "opacity05" ) , a . dataTransfer . setDragImage ( a . target , 0 , 0 ) , a . dataTransfer . effectAllowed = "move" , a . dataTransfer . setData ( "Text" , a . target . getAttribute ( "data-col" ) ) , dragEl = a . target . cloneNode ( ! 0 ) ) } , ! 1 ) ; b . addEventListener ( "dragleave" ,
function ( a ) { a . preventDefault ( ) ; "TH" == dragEl . nodeName && "TH" == a . target . nodeName && a . target . classList . remove ( "dragover-th" ) } , ! 1 ) ; b . addEventListener ( "dragover" , function ( a ) { a . preventDefault ( ) ; if ( "TH" == dragEl . nodeName ) { for ( var c = b . getElementsByClassName ( "dragover-th" ) , e = c . length , f = 0 ; f < e ; f ++ ) c [ f ] . classList . remove ( "dragover-th" ) ; "TH" == a . target . nodeName && a . target . classList . add ( "dragover-th" ) ; a . dataTransfer . dropEffect = "move" } } , ! 1 ) ; b . addEventListener ( "dragend" , function ( a ) { a . preventDefault ( ) ; if ( "TH" == dragEl . nodeName ) { for ( var c =
b . getElementsByClassName ( "dragover-th" ) , e = c . length , f = 0 ; f < e ; f ++ ) c [ f ] . classList . remove ( "dragover-th" ) ; this . querySelector ( "[data-col=" + a . dataTransfer . getData ( "Text" ) + "]" ) && this . querySelector ( "[data-col=" + a . dataTransfer . getData ( "Text" ) + "]" ) . classList . remove ( "opacity05" ) } } , ! 1 ) ; b . addEventListener ( "drop" , function ( c ) { c . stopPropagation ( ) ; c . preventDefault ( ) ; if ( "TH" == dragEl . nodeName ) { this . querySelector ( "[data-col=" + c . dataTransfer . getData ( "Text" ) + "]" ) . remove ( ) ; dragEl . classList . remove ( "opacity05" ) ; b . insertBefore ( dragEl ,
c . target ) ; c = b . getElementsByClassName ( "dragover-th" ) ; for ( var d = c . length , e = 0 ; e < d ; e ++ ) c [ e ] . classList . remove ( "dragover-th" ) ; document . getElementById ( a + "List" ) ? ( document . getElementById ( a + "List" ) . classList . add ( "opacity05" ) , saveCols ( a ) ) : saveCols ( a , this . parentNode . parentNode ) } } , ! 1 ) } function playlistMoveTrack ( a , b ) { sendAPI ( { cmd : "MPD_API_PLAYLIST_MOVE_TRACK" , data : { plist : app . current . search , from : a , to : b } } ) }
2019-01-21 20:35:51 +00:00
function webSocketConnect ( ) { var a = getWsUrl ( ) ; socket = new WebSocket ( a ) ; try { socket . onopen = function ( ) { console . log ( "Websocket is connected" ) } , socket . onmessage = function ( b ) { try { var c = JSON . parse ( b . data ) } catch ( d ) { console . log ( "Invalid JSON data received: " + b . data ) } switch ( c . type ) { case "welcome" : websocketConnected = ! 0 ; showNotification ( "Connected to myMPD: " + a , "" , "" , "success" ) ; modalConnectionError . hide ( ) ; appRoute ( ) ; sendAPI ( { cmd : "MPD_API_PLAYER_STATE" } , parseState ) ; break ; case "update_state" : parseState ( c ) ; break ; case "disconnected" : showNotification ( "Lost connection to myMPD: " +
a , "" , "" , "danger" ) ; break ; case "update_queue" : "Queue" === app . current . app && getQueue ( ) ; sendAPI ( { cmd : "MPD_API_PLAYER_STATE" } , parseState ) ; break ; case "update_options" : getSettings ( ) ; break ; case "update_outputs" : sendAPI ( { cmd : "MPD_API_PLAYER_OUTPUT_LIST" } , parseOutputs ) ; break ; case "update_started" : updateDBstarted ( ! 1 ) ; break ; case "update_database" : case "update_finished" : updateDBfinished ( c . type ) ; break ; case "update_volume" : parseVolume ( c ) ; break ; case "update_stored_playlist" : "Browse" == app . current . app && "Playlists" ==
app . current . tab && "All" == app . current . view ? sendAPI ( { cmd : "MPD_API_PLAYLIST_LIST" , data : { offset : app . current . page , filter : app . current . filter } } , parsePlaylists ) : "Browse" == app . current . app && "Playlists" == app . current . tab && "Detail" == app . current . view && sendAPI ( { cmd : "MPD_API_PLAYLIST_CONTENT_LIST" , data : { offset : app . current . page , filter : app . current . filter , uri : app . current . search } } , parsePlaylists ) ; break ; case "error" : showNotification ( c . data , "" , "" , "danger" ) } } , socket . onclose = function ( ) { console . log ( "Websocket is disconnected" ) ;
1 == appInited && modalConnectionError . show ( ) ; websocketConnected = ! 1 ; null != websocketTimer && clearTimeout ( websocketTimer ) ; websocketTimer = setTimeout ( function ( ) { console . log ( "Reconnecting websocket" ) ; webSocketConnect ( ) } , 3E3 ) } } catch ( b ) { alert ( "Error: " + b ) } } function getWsUrl ( ) { var a = window . location . hostname , b = window . location . protocol , c = window . location . port ; a = ( "https:" == b ? "wss://" : "ws://" ) + a + ( "" != c ? ":" + c : "" ) + "/ws" ; return document . getElementById ( "wsUrl" ) . innerText = a }
2018-08-22 12:06:22 +00:00
function parseStats ( a ) { document . getElementById ( "mpdstats_artists" ) . innerText = a . data . artists ; document . getElementById ( "mpdstats_albums" ) . innerText = a . data . albums ; document . getElementById ( "mpdstats_songs" ) . innerText = a . data . songs ; document . getElementById ( "mpdstats_dbPlaytime" ) . innerText = beautifyDuration ( a . data . dbPlaytime ) ; document . getElementById ( "mpdstats_playtime" ) . innerText = beautifyDuration ( a . data . playtime ) ; document . getElementById ( "mpdstats_uptime" ) . innerText = beautifyDuration ( a . data . uptime ) ; var b = new Date ( 1E3 *
2018-12-03 20:11:34 +00:00
a . data . dbUpdated ) ; document . getElementById ( "mpdstats_dbUpdated" ) . innerText = b . toUTCString ( ) ; document . getElementById ( "mympdVersion" ) . innerText = a . data . mympdVersion ; document . getElementById ( "mpdVersion" ) . innerText = a . data . mpdVersion ; document . getElementById ( "libmpdclientVersion" ) . innerText = a . data . libmpdclientVersion } function toggleBtn ( a , b ) { if ( a = document . getElementById ( a ) ) void 0 == b && ( b = a . classList . contains ( "active" ) ? 0 : 1 ) , 1 == b || 1 == b ? a . classList . add ( "active" ) : a . classList . remove ( "active" ) }
2018-11-15 22:09:20 +00:00
function filterCols ( a ) { var b = settings . tags . slice ( ) ; 0 == settings . featTags && b . push ( "Title" ) ; b . push ( "Duration" ) ; "colsQueueCurrent" == a || "colsBrowsePlaylistsDetail" == a || "colsQueueLastPlayed" == a ? b . push ( "Pos" ) : "colsBrowseFilesystem" == a && b . push ( "Type" ) ; "colsQueueLastPlayed" == a && b . push ( "LastPlayed" ) ; for ( var c = [ ] , d = 0 ; d < settings [ a ] . length ; d ++ ) b . includes ( settings [ a ] [ d ] ) && c . push ( settings [ a ] [ d ] ) ; settings [ a ] = c }
2019-01-21 20:35:51 +00:00
function parseSettings ( ) { toggleBtn ( "btnRandom" , settings . random ) ; toggleBtn ( "btnConsume" , settings . consume ) ; toggleBtn ( "btnSingle" , settings . single ) ; toggleBtn ( "btnRepeat" , settings . repeat ) ; toggleBtn ( "btnAutoPlay" , settings . autoPlay ) ; void 0 != settings . crossfade ? ( document . getElementById ( "inputCrossfade" ) . removeAttribute ( "disabled" ) , document . getElementById ( "inputCrossfade" ) . value = settings . crossfade ) : document . getElementById ( "inputCrossfade" ) . setAttribute ( "disabled" , "disabled" ) ; void 0 != settings . mixrampdb ? ( document . getElementById ( "inputMixrampdb" ) . removeAttribute ( "disabled" ) ,
2019-01-17 17:06:12 +00:00
document . getElementById ( "inputMixrampdb" ) . value = settings . mixrampdb ) : document . getElementById ( "inputMixrampdb" ) . setAttribute ( "disabled" , "disabled" ) ; void 0 != settings . mixrampdelay ? ( document . getElementById ( "inputMixrampdelay" ) . removeAttribute ( "disabled" ) , document . getElementById ( "inputMixrampdelay" ) . value = settings . mixrampdelay ) : document . getElementById ( "inputMixrampdelay" ) . setAttribute ( "disabled" , "disabled" ) ; document . getElementById ( "selectReplaygain" ) . value = settings . replaygain ; var a = document . getElementById ( "btnnotifyWeb" ) ;
2018-12-24 15:42:38 +00:00
notificationsSupported ( ) ? settings . notificationWeb ? ( toggleBtn ( "btnnotifyWeb" , settings . notificationWeb ) , Notification . requestPermission ( function ( a ) { "permission" in Notification || ( Notification . permission = a ) ; "granted" === a ? toggleBtn ( "btnnotifyWeb" , 1 ) : ( toggleBtn ( "btnnotifyWeb" , 0 ) , settings . notificationWeb = ! 0 ) } ) ) : toggleBtn ( "btnnotifyWeb" , 0 ) : ( a . setAttribute ( "disabled" , "disabled" ) , toggleBtn ( "btnnotifyWeb" , 0 ) ) ; toggleBtn ( "btnnotifyPage" , settings . notificationPage ) ; var b = "featStickers featSmartpls featPlaylists featTags featLocalplayer featSyscmds featCoverimage featAdvsearch" . split ( " " ) ;
2019-01-28 22:18:36 +00:00
document . documentElement . style . setProperty ( "--mympd-coverimagesize" , settings . coverimagesize + "px" ) ; document . documentElement . style . setProperty ( "--mympd-backgroundcolor" , settings . backgroundcolor ) ; for ( var c = 0 ; c < b . length ; c ++ ) { var d = document . getElementsByClassName ( b [ c ] ) , e = d . length , f = 1 == settings [ b [ c ] ] ? "" : "none" ; for ( a = 0 ; a < e ; a ++ ) d [ a ] . style . display = f } if ( 0 == settings . featTags ) app . apps . Browse . active = "Filesystem" , app . apps . Search . state = "0/filename/-/" , app . apps . Queue . state = "0/filename/-/" , settings . colsQueueCurrent =
[ "Pos" , "Title" , "Duration" ] , settings . colsQueueLastPlayed = [ "Pos" , "Title" , "LastPlayed" ] , settings . colsSearch = [ "Title" , "Duration" ] , settings . colsBrowseFilesystem = [ "Type" , "Title" , "Duration" ] , settings . colsBrowseDatabase = [ "Track" , "Title" , "Duration" ] , settings . colsPlayback = [ ] ; else { b = "" ; for ( a = 0 ; a < settings . colsPlayback . length ; a ++ ) b += '<div id="current' + settings . colsPlayback [ a ] + '" data-tag="' + settings . colsPlayback [ a ] + '" data-name="' + encodeURI ( lastSongObj . data ? lastSongObj . data [ settings . colsPlayback [ a ] ] : "" ) + '"><small>' +
2019-01-21 20:35:51 +00:00
settings . colsPlayback [ a ] + "</small><h4" , settings . browsetags . includes ( settings . colsPlayback [ a ] ) && ( b += ' class="clickable"' ) , b += ">" + ( lastSongObj . data ? lastSongObj . data [ settings . colsPlayback [ a ] ] : "" ) + "</h4></div>" ; document . getElementById ( "cardPlaybackTags" ) . innerHTML = b } 1 == settings . mixramp ? document . getElementsByClassName ( "mixramp" ) [ 0 ] . style . display = "" : document . getElementsByClassName ( "mixramp" ) [ 0 ] . style . display = "none" ; ! settings . tags . includes ( "AlbumArtist" ) && settings . featTags && ( settings . tags . includes ( "Artist" ) ?
app . apps . Browse . tabs . Database . active = "Artist" : app . apps . Browse . tabs . Database . active = settings . tags [ 0 ] ) ; settings . tags . includes ( "Title" ) && ( app . apps . Search . state = "0/any/Title/" ) ; document . getElementById ( "selectJukeboxMode" ) . value = settings . jukeboxMode ; document . getElementById ( "inputJukeboxQueueLength" ) . value = settings . jukeboxQueueLength ; 0 == settings . jukeboxMode || 2 == settings . jukeboxMode ? ( document . getElementById ( "inputJukeboxQueueLength" ) . setAttribute ( "disabled" , "disabled" ) , document . getElementById ( "selectJukeboxPlaylist" ) . setAttribute ( "disabled" ,
"disabled" ) ) : 1 == settings . jukeboxMode && ( document . getElementById ( "inputJukeboxQueueLength" ) . removeAttribute ( "disabled" ) , document . getElementById ( "selectJukeboxPlaylist" ) . removeAttribute ( "disabled" ) ) ; settings . featPlaylists ? ( playlistEl = "selectJukeboxPlaylist" , sendAPI ( { cmd : "MPD_API_PLAYLIST_LIST" , data : { offset : 0 , filter : "-" } } , getAllPlaylists ) ) : document . getElementById ( "selectJukeboxPlaylist" ) . innerHTML = "<option>Database</option>" ; settings . tags . sort ( ) ; settings . searchtags . sort ( ) ; settings . browsetags . sort ( ) ; filterCols ( "colsSearch" ) ;
filterCols ( "colsQueueCurrent" ) ; filterCols ( "colsQueueLastPlayed" ) ; filterCols ( "colsBrowsePlaylistsDetail" ) ; filterCols ( "colsBrowseFilesystem" ) ; filterCols ( "colsBrowseDatabase" ) ; filterCols ( "colsPlayback" ) ; settings . featLocalplayer && ( "" == settings . streamurl ? ( settings . mpdstream = "http://" , settings . mpdstream = "127.0.0.1" == settings . mpdhost || "localhost" == settings . mpdhost ? settings . mpdstream + window . location . hostname : settings . mpdstream + settings . mpdhost , settings . mpdstream += ":" + settings . streamport + "/" ) : settings . mpdstream =
settings . streamurl ) ; addTagList ( "BrowseDatabaseByTagDropdown" , "browsetags" ) ; addTagList ( "searchqueuetags" , "searchtags" ) ; addTagList ( "searchtags" , "searchtags" ) ; for ( a = 0 ; a < settings . tags . length ; a ++ ) app . apps . Browse . tabs . Database . views [ settings . tags [ a ] ] = { state : "0/-/-/" , scrollPos : 0 } ; if ( settings . featSyscmds ) { document . getElementById ( "mainMenuDropdown" ) ; b = "" ; c = settings . syscmdList . length ; if ( 0 < c ) for ( b = '<div class="dropdown-divider"></div>' , a = 0 ; a < c ; a ++ ) b += '<a class="dropdown-item text-light bg-dark" href="#" data-href=\'{"cmd": "execSyscmd", "options": ["' +
settings . syscmdList [ a ] + "\"]}'>" + settings . syscmdList [ a ] + "</a>" ; document . getElementById ( "syscmds" ) . innerHTML = b } else document . getElementById ( "syscmds" ) . innerHTML = "" ; dropdownMainMenu = new Dropdown ( document . getElementById ( "mainMenu" ) ) ; setCols ( "QueueCurrent" ) ; setCols ( "Search" ) ; setCols ( "QueueLastPlayed" ) ; setCols ( "BrowseFilesystem" ) ; setCols ( "BrowsePlaylistsDetail" ) ; setCols ( "BrowseDatabase" , ".tblAlbumTitles" ) ; setCols ( "Playback" ) ; "Queue" == app . current . app && "Current" == app . current . tab ? getQueue ( ) : "Queue" == app . current . app &&
"LastPlayed" == app . current . tab ? appRoute ( ) : "Search" == app . current . app ? appRoute ( ) : "Browse" == app . current . app && "Filesystem" == app . current . tab ? appRoute ( ) : "Browse" == app . current . app && "Playlists" == app . current . tab && "Detail" == app . current . view ? appRoute ( ) : "Browse" == app . current . app && "Database" == app . current . tab && "" != app . current . search && appRoute ( ) ; settingsParsed = ! 0 }
2018-11-15 22:09:20 +00:00
function setCols ( a , b ) { var c = "" , d = settings . tags . slice ( ) ; 0 == settings . featTags && d . push ( "Title" ) ; d . push ( "Duration" ) ; "QueueCurrent" != a && "BrowsePlaylistsDetail" != a && "QueueLastPlayed" != a || d . push ( "Pos" ) ; "BrowseFilesystem" == a && d . push ( "Type" ) ; "QueueLastPlayed" == a && d . push ( "LastPlayed" ) ; d . sort ( ) ; for ( var e = 0 ; e < d . length ; e ++ ) if ( "Playback" != a || "Title" != d [ e ] ) c += '<div class="form-check"><input class="form-check-input" type="checkbox" value="1" name="' + d [ e ] + '"' , settings [ "cols" + a ] . includes ( d [ e ] ) && ( c += "checked" ) , c += '><label class="form-check-label text-light" for="' +
2019-01-21 20:35:51 +00:00
d [ e ] + '"> ' + d [ e ] + "</label></div>" ; document . getElementById ( a + "ColsDropdown" ) . firstChild . innerHTML = c ; d = app . current . sort ; "Search" == a && "0/any/Title/" == app . apps . Search . state && ( d = settings . tags . includes ( "Title" ) ? "Title" : 0 == settings . featTags ? "Filename" : "-" ) ; if ( "Playback" != a ) { c = "" ; for ( e = 0 ; e < settings [ "cols" + a ] . length ; e ++ ) { var f = settings [ "cols" + a ] [ e ] ; c += '<th draggable="true" data-col="' + f + '">' ; if ( "Track" == f || "Pos" == f ) f = "#" ; c += f ; "Search" != a || f != d && "-" + f != d || ( f = ! 1 , 0 == app . current . sort . indexOf ( "-" ) && ( f =
! 0 ) , c += '<span class="sort-dir material-icons pull-right">' + ( 1 == f ? "arrow_drop_up" : "arrow_drop_down" ) + "</span>" ) ; c += "</th>" } c += "<th></th>" ; if ( void 0 == b ) document . getElementById ( a + "List" ) . getElementsByTagName ( "tr" ) [ 0 ] . innerHTML = c ; else for ( a = document . querySelectorAll ( b ) , e = 0 ; e < a . length ; e ++ ) a [ e ] . getElementsByTagName ( "tr" ) [ 0 ] . innerHTML = c } } function getSettings ( ) { 0 == settingsLock && ( settingsLock = ! 0 , sendAPI ( { cmd : "MYMPD_API_SETTINGS_GET" } , getMpdSettings ) ) }
function getMpdSettings ( a ) { settingsNew = a . data ; sendAPI ( { cmd : "MPD_API_SETTINGS_GET" } , joinSettings ) } function joinSettings ( a ) { for ( var b in a . data ) settingsNew [ b ] = a . data [ b ] ; settings = Object . assign ( { } , settingsNew ) ; settingsLock = ! 1 ; parseSettings ( ) }
2018-11-04 18:34:46 +00:00
function saveCols ( a , b ) { var c = document . getElementById ( a + "ColsDropdown" ) . firstChild . getElementsByTagName ( "input" ) ; var d = void 0 == b ? document . getElementById ( a + "List" ) . getElementsByTagName ( "tr" ) [ 0 ] : "string" == typeof b ? document . querySelector ( b ) . getElementsByTagName ( "tr" ) [ 0 ] : b . getElementsByTagName ( "tr" ) [ 0 ] ; for ( b = 0 ; b < c . length ; b ++ ) { var e = d . querySelector ( "[data-col=" + c [ b ] . name + "]" ) ; 0 == c [ b ] . checked ? e && e . remove ( ) : e || ( e = document . createElement ( "th" ) , e . innerText = c [ b ] . name , e . setAttribute ( "data-col" , c [ b ] . name ) , d . appendChild ( e ) ) } a =
2019-01-17 17:06:12 +00:00
{ cmd : "MYMPD_API_COLS_SAVE" , data : { table : "cols" + a , cols : [ ] } } ; c = d . getElementsByTagName ( "th" ) ; for ( b = 0 ; b < c . length ; b ++ ) ( d = c [ b ] . getAttribute ( "data-col" ) ) && a . data . cols . push ( d ) ; sendAPI ( a , getSettings ) }
function saveColsPlayback ( a ) { for ( var b = document . getElementById ( a + "ColsDropdown" ) . firstChild . getElementsByTagName ( "input" ) , c = document . getElementById ( "cardPlaybackTags" ) , d = 0 ; d < b . length ; d ++ ) { var e = document . getElementById ( "current" + b [ d ] . name ) ; 0 == b [ d ] . checked ? e && e . remove ( ) : e || ( e = document . createElement ( "div" ) , e . innerHTML = "<small>" + b [ d ] . name + "</small><h4></h4>" , e . setAttribute ( "id" , "current" + b [ d ] . name ) , e . setAttribute ( "data-tag" , b [ d ] . name ) , c . appendChild ( e ) ) } a = { cmd : "MYMPD_API_COLS_SAVE" , data : { table : "cols" +
a , cols : [ ] } } ; c = c . getElementsByTagName ( "div" ) ; for ( d = 0 ; d < c . length ; d ++ ) ( b = c [ d ] . getAttribute ( "data-tag" ) ) && a . data . cols . push ( b ) ; sendAPI ( a , getSettings ) }
2018-11-04 18:34:46 +00:00
function parseOutputs ( a ) { for ( var b = "" , c = a . data . outputs . length , d = 0 ; d < c ; d ++ ) b += '<button id="btnOutput' + a . data . outputs [ d ] . id + '" data-output-id="' + a . data . outputs [ d ] . id + '" class="btn btn-secondary btn-block' , 1 == a . data . outputs [ d ] . state && ( b += " active" ) , b += '"><span class="material-icons float-left">volume_up</span> ' + a . data . outputs [ d ] . name + "</button>" ; domCache . outputs . innerHTML = b }
2018-12-03 20:11:34 +00:00
function setCounter ( a , b , c ) { currentSong . totalTime = b ; currentSong . elapsedTime = c ; currentSong . currentSongId = a ; var d = Math . floor ( b / 60 ) , e = b - 60 * d , f = Math . floor ( c / 60 ) , g = c - 60 * f ; domCache . progressBar . value = Math . floor ( 1E3 * c / b ) ; b = f + ":" + ( 10 > g ? "0" : "" ) + g + " / " + d + ":" + ( 10 > e ? "0" : "" ) + e ; domCache . counter . innerText = b ; if ( lastState && lastState . data . currentSongId != a && ( c = document . getElementById ( "queueTrackId" + lastState . data . currentSongId ) ) ) { if ( d = c . querySelector ( "[data-col=Duration]" ) ) d . innerText = c . getAttribute ( "data-duration" ) ;
2018-10-29 20:57:10 +00:00
if ( d = c . querySelector ( "[data-col=Pos]" ) ) d . classList . remove ( "material-icons" ) , d . innerText = c . getAttribute ( "data-songpos" ) ; c . classList . remove ( "font-weight-bold" ) } if ( c = document . getElementById ( "queueTrackId" + a ) ) { if ( d = c . querySelector ( "[data-col=Duration]" ) ) d . innerText = b ; ( d = c . querySelector ( "[data-col=Pos]" ) ) && ! d . classList . contains ( "material-icons" ) && ( d . classList . add ( "material-icons" ) , d . innerText = "play_arrow" ) ; c . classList . add ( "font-weight-bold" ) } progressTimer && clearTimeout ( progressTimer ) ; "play" == playstate &&
( progressTimer = setTimeout ( function ( ) { currentSong . elapsedTime ++ ; setCounter ( currentSong . currentSongId , currentSong . totalTime , currentSong . elapsedTime ) } , 1E3 ) ) }
2018-09-20 17:05:26 +00:00
function parseState ( a ) { if ( JSON . stringify ( a ) !== JSON . stringify ( lastState ) ) { if ( 1 == a . data . state ) { for ( var b = 0 ; b < domCache . btnsPlayLen ; b ++ ) domCache . btnsPlay [ b ] . innerText = "play_arrow" ; playstate = "stop" } else if ( 2 == a . data . state ) { for ( b = 0 ; b < domCache . btnsPlayLen ; b ++ ) domCache . btnsPlay [ b ] . innerText = "pause" ; playstate = "play" } else { for ( b = 0 ; b < domCache . btnsPlayLen ; b ++ ) domCache . btnsPlay [ b ] . innerText = "play_arrow" ; playstate = "pause" } - 1 == a . data . nextSongPos && 0 == settings . jukeboxMode ? domCache . btnNext . setAttribute ( "disabled" , "disabled" ) :
2018-11-15 22:09:20 +00:00
domCache . btnNext . removeAttribute ( "disabled" ) ; 0 >= a . data . songPos ? domCache . btnPrev . setAttribute ( "disabled" , "disabled" ) : domCache . btnPrev . removeAttribute ( "disabled" ) ; if ( 0 == a . data . queueLength ) for ( b = 0 ; b < domCache . btnsPlayLen ; b ++ ) domCache . btnsPlay [ b ] . setAttribute ( "disabled" , "disabled" ) ; else for ( b = 0 ; b < domCache . btnsPlayLen ; b ++ ) domCache . btnsPlay [ b ] . removeAttribute ( "disabled" ) ; domCache . badgeQueueItems . innerText = a . data . queueLength ; parseVolume ( a ) ; setCounter ( a . data . currentSongId , a . data . totalTime , a . data . elapsedTime ) ;
2019-01-18 14:57:45 +00:00
lastState && lastState . data . currentSongId == a . data . currentSongId || sendAPI ( { cmd : "MPD_API_PLAYER_CURRENT_SONG" } , songChange ) ; if ( "-1" == a . data . songPos ) { domCache . currentTitle . innerText = "Not playing" ; domCache . currentCover . style . backgroundImage = "" ; var c = document . getElementById ( "cardPlaybackTags" ) . getElementsByTagName ( "h4" ) ; for ( b = 0 ; b < c . length ; b ++ ) c [ b ] . innerText = "" } "Queue" == app . current . app && "LastPlayed" == app . current . tab && sendAPI ( { cmd : "MPD_API_QUEUE_LAST_PLAYED" , data : { offset : app . current . page } } , parseLastPlayed ) ;
2018-12-03 20:11:34 +00:00
lastState = a } } function parseVolume ( a ) { - 1 == a . data . volume ? ( domCache . volumePrct . innerText = "Volumecontrol disabled" , domCache . volumeControl . classList . add ( "hide" ) ) : ( domCache . volumeControl . classList . remove ( "hide" ) , domCache . volumePrct . innerText = a . data . volume + " %" , domCache . volumeMenu . innerText = 0 == a . data . volume ? "volume_off" : 50 > a . data . volume ? "volume_down" : "volume_up" ) ; domCache . volumeBar . value = a . data . volume }
2018-10-15 20:14:19 +00:00
function getQueue ( ) { 2 <= app . current . search . length ? sendAPI ( { cmd : "MPD_API_QUEUE_SEARCH" , data : { filter : app . current . filter , offset : app . current . page , searchstr : app . current . search } } , parseQueue ) : sendAPI ( { cmd : "MPD_API_QUEUE_LIST" , data : { offset : app . current . page } } , parseQueue ) }
2018-11-15 22:09:20 +00:00
function parseQueue ( a ) { 0 < a . totalTime && a . totalEntities <= settings . maxElementsPerPage ? document . getElementById ( "cardFooterQueue" ) . innerText = a . totalEntities + " " + ( 1 < a . totalEntities ? "Songs" : "Song" ) + " \u2013 " + beautifyDuration ( a . totalTime ) : 0 < a . totalEntities ? document . getElementById ( "cardFooterQueue" ) . innerText = a . totalEntities + " " + ( 1 < a . totalEntities ? "Songs" : "Song" ) : document . getElementById ( "cardFooterQueue" ) . innerText = "" ; var b = a . data . length , c = document . getElementById ( "QueueCurrentList" ) ; c . setAttribute ( "data-version" ,
a . queueVersion ) ; c = c . getElementsByTagName ( "tbody" ) [ 0 ] ; for ( var d = c . getElementsByTagName ( "tr" ) , e = 0 ; e < b ; e ++ ) { var f = Math . floor ( a . data [ e ] . Duration / 60 ) , g = a . data [ e ] . Duration - 60 * f ; a . data [ e ] . Duration = f + ":" + ( 10 > g ? "0" : "" ) + g ; a . data [ e ] . Pos ++ ; f = document . createElement ( "tr" ) ; f . setAttribute ( "draggable" , "true" ) ; f . setAttribute ( "data-trackid" , a . data [ e ] . id ) ; f . setAttribute ( "id" , "queueTrackId" + a . data [ e ] . id ) ; f . setAttribute ( "data-songpos" , a . data [ e ] . Pos ) ; f . setAttribute ( "data-duration" , a . data [ e ] . Duration ) ; f . setAttribute ( "data-uri" ,
a . data [ e ] . uri ) ; g = "" ; for ( var h = 0 ; h < settings . colsQueueCurrent . length ; h ++ ) g += '<td data-col="' + settings . colsQueueCurrent [ h ] + '">' + a . data [ e ] [ settings . colsQueueCurrent [ h ] ] + "</td>" ; g += '<td data-col="Action"><a href="#" class="material-icons color-darkgrey">playlist_add</a></td>' ; f . innerHTML = g ; e < d . length ? d [ e ] . replaceWith ( f ) : c . append ( f ) } for ( e = d . length - 1 ; e >= b ; e -- ) d [ e ] . remove ( ) ; d = settings . colsQueueCurrent . length ; d -- ; "queuesearch" == a . type && 0 == b ? c . innerHTML = '<tr><td><span class="material-icons">error_outline</span></td><td colspan="' +
2018-12-03 20:11:34 +00:00
d + '">No results, please refine your search!</td></tr>' : "queue" == a . type && 0 == b && ( c . innerHTML = '<tr><td><span class="material-icons">error_outline</span></td><td colspan="' + d + '">Empty queue</td></tr>' ) ; setPagination ( a . totalEntities , a . returnedEntities ) ; document . getElementById ( "QueueCurrentList" ) . classList . remove ( "opacity05" ) }
2018-11-15 22:09:20 +00:00
function parseLastPlayed ( a ) { document . getElementById ( "cardFooterQueue" ) . innerText = a . totalEntities + " Songs" ; var b = a . data . length , c = document . getElementById ( "QueueLastPlayedList" ) ; c . setAttribute ( "data-version" , a . queueVersion ) ; c = c . getElementsByTagName ( "tbody" ) [ 0 ] ; for ( var d = c . getElementsByTagName ( "tr" ) , e = 0 ; e < b ; e ++ ) { var f = Math . floor ( a . data [ e ] . Duration / 60 ) , g = a . data [ e ] . Duration - 60 * f ; a . data [ e ] . Duration = f + ":" + ( 10 > g ? "0" : "" ) + g ; a . data [ e ] . LastPlayed = ( new Date ( 1E3 * a . data [ e ] . LastPlayed ) ) . toUTCString ( ) ; f = document . createElement ( "tr" ) ;
f . setAttribute ( "data-songpos" , a . data [ e ] . Pos + 1 ) ; f . setAttribute ( "data-uri" , a . data [ e ] . uri ) ; f . setAttribute ( "data-name" , a . data [ e ] . Title ) ; f . setAttribute ( "data-type" , "song" ) ; g = "" ; for ( var h = 0 ; h < settings . colsQueueLastPlayed . length ; h ++ ) g += '<td data-col="' + settings . colsQueueLastPlayed [ h ] + '">' + a . data [ e ] [ settings . colsQueueLastPlayed [ h ] ] + "</td>" ; g += '<td data-col="Action"><a href="#" class="material-icons color-darkgrey">playlist_add</a></td>' ; f . innerHTML = g ; e < d . length ? d [ e ] . replaceWith ( f ) : c . append ( f ) } for ( e = d . length -
2018-12-03 20:11:34 +00:00
1 ; e >= b ; e -- ) d [ e ] . remove ( ) ; d = settings . colsQueueLastPlayed . length ; d -- ; 0 == b && ( c . innerHTML = '<tr><td><span class="material-icons">error_outline</span></td><td colspan="' + d + '">Empty list</td></tr>' ) ; setPagination ( a . totalEntities , a . returnedEntities ) ; document . getElementById ( "QueueLastPlayedList" ) . classList . remove ( "opacity05" ) }
function parseSearch ( a ) { - 1 < a . totalEntities ? ( document . getElementById ( "panel-heading-search" ) . innerText = a . totalEntities + " Songs found" , document . getElementById ( "cardFooterSearch" ) . innerText = a . totalEntities + " Songs found" ) : a . returnedEntities + app . current . page < settings . maxElementsPerPage ? ( document . getElementById ( "panel-heading-search" ) . innerText = a . returnedEntities + " Songs found" , document . getElementById ( "cardFooterSearch" ) . innerText = a . returnedEntities + " Songs found" ) : ( document . getElementById ( "panel-heading-search" ) . innerHTML =
"≥ " + settings . maxElementsPerPage + " Songs found" , document . getElementById ( "cardFooterSearch" ) . innerHTML = "≥ " + settings . maxElementsPerPage + " Songs found" ) ; 0 < a . returnedEntities ? ( document . getElementById ( "searchAddAllSongs" ) . removeAttribute ( "disabled" ) , document . getElementById ( "searchAddAllSongsBtn" ) . removeAttribute ( "disabled" ) ) : ( document . getElementById ( "searchAddAllSongs" ) . setAttribute ( "disabled" , "disabled" ) , document . getElementById ( "searchAddAllSongsBtn" ) . setAttribute ( "disabled" , "disabled" ) ) ; parseFilesystem ( a ) }
2018-11-15 22:09:20 +00:00
function parseFilesystem ( a ) { var b = app . current . app + ( "Filesystem" == app . current . tab ? app . current . tab : "" ) , c = settings [ "cols" + b ] . length ; c -- ; for ( var d = a . data . length , e = document . getElementById ( app . current . app + ( void 0 == app . current . tab ? "" : app . current . tab ) + "List" ) . getElementsByTagName ( "tbody" ) [ 0 ] , f = e . getElementsByTagName ( "tr" ) , g = 0 ; g < d ; g ++ ) { var h = encodeURI ( a . data [ g ] . uri ) , l = document . createElement ( "tr" ) ; l . setAttribute ( "data-type" , a . data [ g ] . Type ) ; l . setAttribute ( "data-uri" , h ) ; "song" == a . data [ g ] . Type ? l . setAttribute ( "data-name" ,
2018-12-03 20:11:34 +00:00
a . data [ g ] . Title ) : l . setAttribute ( "data-name" , a . data [ g ] . name ) ; switch ( a . data [ g ] . Type ) { case "dir" : case "smartpls" : case "plist" : h = "" ; for ( var k = 0 ; k < settings [ "cols" + b ] . length ; k ++ ) h += '<td data-col="' + settings [ "cols" + b ] [ k ] + '">' , "Type" == settings [ "cols" + b ] [ k ] ? h = "dir" == a . data [ g ] . Type ? h + '<span class="material-icons">folder_open</span>' : h + ( '<span class="material-icons">' + ( "smartpls" == a . data [ g ] . Type ? "queue_music" : "list" ) + "</span>" ) : "Title" == settings [ "cols" + b ] [ k ] && ( h += a . data [ g ] . name ) , h += "</td>" ; h += '<td data-col="Action"><a href="#" class="material-icons color-darkgrey">playlist_add</a></td>' ;
2018-11-15 22:09:20 +00:00
l . innerHTML = h ; break ; case "song" : h = Math . floor ( a . data [ g ] . Duration / 60 ) ; k = a . data [ g ] . Duration - 60 * h ; a . data [ g ] . Duration = h + ":" + ( 10 > k ? "0" : "" ) + k ; h = "" ; for ( k = 0 ; k < settings [ "cols" + b ] . length ; k ++ ) h += '<td data-col="' + settings [ "cols" + b ] [ k ] + '">' , h = "Type" == settings [ "cols" + b ] [ k ] ? h + '<span class="material-icons">music_note</span>' : h + a . data [ g ] [ settings [ "cols" + b ] [ k ] ] , h += "</td>" ; h += '<td data-col="Action"><a href="#" class="material-icons color-darkgrey">playlist_add</a></td>' ; l . innerHTML = h } g < f . length ? f [ g ] . replaceWith ( l ) : e . append ( l ) } for ( g =
2018-12-03 20:11:34 +00:00
f . length - 1 ; g >= d ; g -- ) f [ g ] . remove ( ) ; setPagination ( a . totalEntities , a . returnedEntities ) ; 0 == d && ( e . innerHTML = '<tr><td><span class="material-icons">error_outline</span></td><td colspan="' + c + '">No results</td></tr>' ) ; document . getElementById ( app . current . app + ( void 0 == app . current . tab ? "" : app . current . tab ) + "List" ) . classList . remove ( "opacity05" ) ; document . getElementById ( "cardFooterBrowse" ) . innerText = a . totalEntities + " Entries" }
2018-11-15 22:09:20 +00:00
function parsePlaylists ( a ) { "All" == app . current . view ? ( document . getElementById ( "BrowsePlaylistsAllList" ) . classList . remove ( "hide" ) , document . getElementById ( "BrowsePlaylistsDetailList" ) . classList . add ( "hide" ) , document . getElementById ( "btnBrowsePlaylistsAll" ) . parentNode . classList . add ( "hide" ) , document . getElementById ( "btnPlaylistClear" ) . parentNode . classList . add ( "hide" ) , document . getElementById ( "BrowsePlaylistsDetailColsBtn" ) . parentNode . classList . add ( "hide" ) ) : ( - 1 < a . uri . indexOf ( "." ) || 1 == a . smartpls ? ( document . getElementById ( "BrowsePlaylistsDetailList" ) . setAttribute ( "data-ro" ,
"true" ) , document . getElementById ( "btnPlaylistClear" ) . parentNode . classList . add ( "hide" ) ) : ( document . getElementById ( "BrowsePlaylistsDetailList" ) . setAttribute ( "data-ro" , "false" ) , document . getElementById ( "btnPlaylistClear" ) . parentNode . classList . remove ( "hide" ) ) , document . getElementById ( "BrowsePlaylistsDetailList" ) . setAttribute ( "data-uri" , a . uri ) , 1 == a . smartpls ? document . getElementById ( "BrowsePlaylistsDetailList" ) . getElementsByTagName ( "caption" ) [ 0 ] . innerHTML = "Smart playlist: " + a . uri + '<small class="pull-right">' +
a . totalEntities + " Songs </small>" : document . getElementById ( "BrowsePlaylistsDetailList" ) . getElementsByTagName ( "caption" ) [ 0 ] . innerHTML = "Playlist: " + a . uri + '<small class="pull-right">' + a . totalEntities + " Songs </small>" , document . getElementById ( "BrowsePlaylistsDetailList" ) . classList . remove ( "hide" ) , document . getElementById ( "BrowsePlaylistsAllList" ) . classList . add ( "hide" ) , document . getElementById ( "btnBrowsePlaylistsAll" ) . parentNode . classList . remove ( "hide" ) , settings . featTags && document . getElementById ( "BrowsePlaylistsDetailColsBtn" ) . parentNode . classList . remove ( "hide" ) ) ;
2018-12-03 20:11:34 +00:00
var b = a . data . length , c = document . getElementById ( app . current . app + app . current . tab + app . current . view + "List" ) . getElementsByTagName ( "tbody" ) [ 0 ] , d = c . getElementsByTagName ( "tr" ) ; if ( "All" == app . current . view ) { for ( var e = 0 ; e < b ; e ++ ) { var f = encodeURI ( a . data [ e ] . uri ) , g = new Date ( 1E3 * a . data [ e ] . last _modified ) , h = document . createElement ( "tr" ) ; h . setAttribute ( "data-uri" , f ) ; h . setAttribute ( "data-type" , a . data [ e ] . Type ) ; h . setAttribute ( "data-name" , a . data [ e ] . name ) ; h . innerHTML = '<td data-col="Type"><span class="material-icons">' + ( "smartpls" ==
a . data [ e ] . Type ? "queue_music" : "list" ) + "</span></td><td>" + a . data [ e ] . name + "</td><td>" + g . toUTCString ( ) + '</td><td data-col="Action"><a href="#" class="material-icons color-darkgrey">playlist_add</a></td>' ; e < d . length ? d [ e ] . replaceWith ( h ) : c . append ( h ) } document . getElementById ( "cardFooterBrowse" ) . innerText = a . totalEntities + " Playlists" } else if ( "Detail" == app . current . view ) { for ( e = 0 ; e < b ; e ++ ) { f = encodeURI ( a . data [ e ] . uri ) ; h = document . createElement ( "tr" ) ; 0 == a . smartpls && h . setAttribute ( "draggable" , "true" ) ; h . setAttribute ( "id" ,
"playlistTrackId" + a . data [ e ] . Pos ) ; h . setAttribute ( "data-type" , a . data [ e ] . Type ) ; h . setAttribute ( "data-uri" , f ) ; h . setAttribute ( "data-name" , a . data [ e ] . Title ) ; h . setAttribute ( "data-songpos" , a . data [ e ] . Pos ) ; f = Math . floor ( a . data [ e ] . Duration / 60 ) ; g = a . data [ e ] . Duration - 60 * f ; a . data [ e ] . Duration = f + ":" + ( 10 > g ? "0" : "" ) + g ; f = "" ; for ( g = 0 ; g < settings . colsBrowsePlaylistsDetail . length ; g ++ ) f += '<td data-col="' + settings . colsBrowsePlaylistsDetail [ g ] + '">' + a . data [ e ] [ settings . colsBrowsePlaylistsDetail [ g ] ] + "</td>" ; f += '<td data-col="Action"><a href="#" class="material-icons color-darkgrey">playlist_add</a></td>' ;
h . innerHTML = f ; e < d . length ? d [ e ] . replaceWith ( h ) : c . append ( h ) } document . getElementById ( "cardFooterBrowse" ) . innerText = a . totalEntities + " Songs" } for ( e = d . length - 1 ; e >= b ; e -- ) d [ e ] . remove ( ) ; setPagination ( a . totalEntities , a . returnedEntities ) ; 0 == b && ( a = settings [ "cols" + list ] . length , a -- , c . innerHTML = "All" == app . current . view ? '<tr><td><span class="material-icons">error_outline</span></td><td colspan="' + a + '">No playlists found.</td></tr>' : '<tr><td><span class="material-icons">error_outline</span></td><td colspan="' + a + '">Empty playlist.</td></tr>' ) ;
2018-11-15 22:09:20 +00:00
document . getElementById ( app . current . app + app . current . tab + app . current . view + "List" ) . classList . remove ( "opacity05" ) }
2018-11-04 18:34:46 +00:00
function parseListDBtags ( a ) { scrollTo ( 0 ) ; if ( "" != app . current . search ) { document . getElementById ( "BrowseDatabaseAlbumList" ) . classList . remove ( "hide" ) ; document . getElementById ( "BrowseDatabaseTagList" ) . classList . add ( "hide" ) ; document . getElementById ( "btnBrowseDatabaseByTag" ) . parentNode . classList . add ( "hide" ) ; document . getElementById ( "btnBrowseDatabaseTag" ) . parentNode . classList . remove ( "hide" ) ; document . getElementById ( "BrowseDatabaseAddAllSongs" ) . parentNode . parentNode . classList . remove ( "hide" ) ; document . getElementById ( "BrowseDatabaseColsBtn" ) . parentNode . classList . remove ( "hide" ) ;
2018-11-15 22:09:20 +00:00
document . getElementById ( "btnBrowseDatabaseTag" ) . innerHTML = "« " + app . current . view ; document . getElementById ( "BrowseDatabaseAlbumListCaption" ) . innerHTML = "<h2>" + a . searchtagtype + ": " + a . searchstr + "</h2><hr/>" ; document . getElementById ( "cardFooterBrowse" ) . innerText = a . totalEntities + " Entries" ; for ( var b = a . data . length , c = document . getElementById ( "BrowseDatabaseAlbumList" ) , d = c . getElementsByClassName ( "card" ) , e = 0 ; e < b ; e ++ ) { var f = genId ( a . data [ e ] . value ) , g = document . createElement ( "div" ) ; g . classList . add ( "card" , "ml-4" ,
"mr-4" , "mb-4" , "w-100" ) ; g . setAttribute ( "id" , "card" + f ) ; g . setAttribute ( "data-album" , encodeURI ( a . data [ e ] . value ) ) ; var h = '<div class="card-header"><span id="albumartist' + f + '"></span> – ' + a . data [ e ] . value + '</div> <div class="card-body"><div class="row">' ; settings . featCoverimage && ( h += ' <div class="col-md-auto"><a class="card-img-left"></a></div>' ) ; h += ' <div class="col"><table class="tblAlbumTitles table table-sm table-hover" id="tbl' + f + '"><thead><tr></tr></thead><tbody></tbody></table></div> </div></div></div>' ;
2018-12-03 20:11:34 +00:00
g . innerHTML = h ; e < d . length ? d [ e ] . replaceWith ( g ) : c . append ( g ) ; "IntersectionObserver" in window ? createListTitleObserver ( document . getElementById ( "card" + f ) ) : sendAPI ( { cmd : "MPD_API_DATABASE_TAG_ALBUM_TITLE_LIST" , data : { album : a . data [ e ] . value , search : app . current . search , tag : app . current . view } } , parseListTitles ) } for ( e = d . length - 1 ; e >= b ; e -- ) d [ e ] . remove ( ) ; setPagination ( a . totalEntities , a . returnedEntities ) ; setCols ( "BrowseDatabase" , ".tblAlbumTitles" ) ; a = document . querySelectorAll ( ".tblAlbumTitles" ) ; for ( e = 0 ; e < a . length ; e ++ ) dragAndDropTableHeader ( a [ e ] ) ;
2018-11-15 22:09:20 +00:00
document . getElementById ( "BrowseDatabaseAlbumList" ) . classList . remove ( "opacity05" ) } else { document . getElementById ( "BrowseDatabaseAlbumList" ) . classList . add ( "hide" ) ; document . getElementById ( "BrowseDatabaseTagList" ) . classList . remove ( "hide" ) ; document . getElementById ( "btnBrowseDatabaseByTag" ) . parentNode . classList . remove ( "hide" ) ; document . getElementById ( "BrowseDatabaseAddAllSongs" ) . parentNode . parentNode . classList . add ( "hide" ) ; document . getElementById ( "BrowseDatabaseColsBtn" ) . parentNode . classList . add ( "hide" ) ; document . getElementById ( "btnBrowseDatabaseTag" ) . parentNode . classList . add ( "hide" ) ;
document . getElementById ( "BrowseDatabaseTagListCaption" ) . innerText = app . current . view ; document . getElementById ( "cardFooterBrowse" ) . innerText = a . totalEntities + " Tags" ; b = a . data . length ; c = document . getElementById ( app . current . app + app . current . tab + "TagList" ) . getElementsByTagName ( "tbody" ) [ 0 ] ; d = c . getElementsByTagName ( "tr" ) ; for ( e = 0 ; e < b ; e ++ ) f = encodeURI ( a . data [ e ] . value ) , g = document . createElement ( "tr" ) , g . setAttribute ( "data-uri" , f ) , g . innerHTML = '<td data-col="Type"><span class="material-icons">album</span></td><td>' + a . data [ e ] . value +
2018-12-03 20:11:34 +00:00
"</td>" , e < d . length ? d [ e ] . replaceWith ( g ) : c . append ( g ) ; for ( e = d . length - 1 ; e >= b ; e -- ) d [ e ] . remove ( ) ; setPagination ( a . totalEntities , a . returnedEntities ) ; 0 == b && ( c . innerHTML = '<tr><td><span class="material-icons">error_outline</span></td><td>No entries found.</td></tr>' ) ; document . getElementById ( "BrowseDatabaseTagList" ) . classList . remove ( "opacity05" ) } } function createListTitleObserver ( a ) { ( new IntersectionObserver ( getListTitles , { root : null , rootMargin : "0px" } ) ) . observe ( a ) }
2018-11-04 18:34:46 +00:00
function getListTitles ( a , b ) { a . forEach ( function ( a ) { 0 < a . intersectionRatio && ( b . unobserve ( a . target ) , a = decodeURI ( a . target . getAttribute ( "data-album" ) ) , sendAPI ( { cmd : "MPD_API_DATABASE_TAG_ALBUM_TITLE_LIST" , data : { album : a , search : app . current . search , tag : app . current . view } } , parseListTitles ) ) } ) }
function parseListTitles ( a ) { var b = genId ( a . Album ) , c = document . getElementById ( "card" + b ) , d = c . getElementsByTagName ( "tbody" ) [ 0 ] , e = c . querySelector ( ".card-header" ) ; e . setAttribute ( "data-uri" , encodeURI ( a . data [ 0 ] . uri . replace ( /\/[^\/]+$/ , "" ) ) ) ; e . setAttribute ( "data-name" , a . Album ) ; e . setAttribute ( "data-type" , "dir" ) ; e . addEventListener ( "click" , function ( a ) { showMenu ( this , a ) } , ! 1 ) ; e . classList . add ( "clickable" ) ; if ( c = c . getElementsByTagName ( "a" ) [ 0 ] ) c . style . backgroundImage = 'url("' + a . cover + '")' , c . setAttribute ( "data-uri" , encodeURI ( a . data [ 0 ] . uri . replace ( /\/[^\/]+$/ ,
"" ) ) ) , c . setAttribute ( "data-name" , a . Album ) , c . setAttribute ( "data-type" , "dir" ) , c . addEventListener ( "click" , function ( a ) { showMenu ( this , a ) } , ! 1 ) ; document . getElementById ( "albumartist" + b ) . innerText = a . AlbumArtist ; b = "" ; c = a . data . length ; for ( e = 0 ; e < c ; e ++ ) { if ( a . data [ e ] . Duration ) { var f = Math . floor ( a . data [ e ] . Duration / 60 ) , g = a . data [ e ] . Duration - 60 * f ; a . data [ e ] . Duration = f + ":" + ( 10 > g ? "0" : "" ) + g } b += '<tr data-type="song" data-name="' + a . data [ e ] . Title + '" data-uri="' + encodeURI ( a . data [ e ] . uri ) + '">' ; for ( f = 0 ; f < settings . colsBrowseDatabase . length ; f ++ ) b +=
'<td data-col="' + settings . colsBrowseDatabase [ f ] + '">' + a . data [ e ] [ settings . colsBrowseDatabase [ f ] ] + "</td>" ; b += '<td data-col="Action"><a href="#" class="material-icons color-darkgrey">playlist_add</a></td></tr>' } d . innerHTML = b ; d . parentNode . addEventListener ( "click" , function ( a ) { "TD" == a . target . nodeName ? appendQueue ( "song" , decodeURI ( a . target . parentNode . getAttribute ( "data-uri" ) ) , a . target . parentNode . getAttribute ( "data-name" ) ) : "A" == a . target . nodeName && showMenu ( a . target , a ) } , ! 1 ) }
2018-12-03 20:11:34 +00:00
function setPagination ( a , b ) { var c = app . current . app + ( void 0 == app . current . tab ? "" : app . current . tab ) , d = Math . ceil ( a / settings . maxElementsPerPage ) ; 0 == d && ( d = 1 ) ; for ( var e = [ "PaginationTop" , "PaginationBottom" ] , f = 0 ; 2 > f ; f ++ ) { document . getElementById ( c + e [ f ] + "Page" ) . innerText = app . current . page / settings . maxElementsPerPage + 1 + " / " + d ; if ( 1 < d ) { document . getElementById ( c + e [ f ] + "Page" ) . removeAttribute ( "disabled" ) ; for ( var g = "" , h = 0 ; h < d ; h ++ ) g += '<button data-page="' + h * settings . maxElementsPerPage + '" type="button" class="mr-1 mb-1 btn-sm btn btn-secondary">' +
( h + 1 ) + "</button>" ; document . getElementById ( c + e [ f ] + "Pages" ) . innerHTML = g ; document . getElementById ( c + e [ f ] + "Page" ) . classList . remove ( "nodropdown" ) } else - 1 == a ? ( document . getElementById ( c + e [ f ] + "Page" ) . setAttribute ( "disabled" , "disabled" ) , document . getElementById ( c + e [ f ] + "Page" ) . innerText = app . current . page / settings . maxElementsPerPage + 1 ) : document . getElementById ( c + e [ f ] + "Page" ) . setAttribute ( "disabled" , "disabled" ) , document . getElementById ( c + e [ f ] + "Page" ) . classList . add ( "nodropdown" ) ; a > app . current . page + settings . maxElementsPerPage ||
- 1 == a && b >= settings . maxElementsPerPage ? ( document . getElementById ( c + e [ f ] + "Next" ) . removeAttribute ( "disabled" ) , document . getElementById ( c + e [ f ] ) . classList . remove ( "hide" ) , document . getElementById ( c + "ButtonsBottom" ) . classList . remove ( "hide" ) ) : ( document . getElementById ( c + e [ f ] + "Next" ) . setAttribute ( "disabled" , "disabled" ) , document . getElementById ( c + e [ f ] ) . classList . add ( "hide" ) , document . getElementById ( c + "ButtonsBottom" ) . classList . add ( "hide" ) ) ; 0 < app . current . page ? ( document . getElementById ( c + e [ f ] + "Prev" ) . removeAttribute ( "disabled" ) ,
document . getElementById ( c + e [ f ] ) . classList . remove ( "hide" ) , document . getElementById ( c + "ButtonsBottom" ) . classList . remove ( "hide" ) ) : document . getElementById ( c + e [ f ] + "Prev" ) . setAttribute ( "disabled" , "disabled" ) } } function appendQueue ( a , b , c ) { switch ( a ) { case "song" : case "dir" : sendAPI ( { cmd : "MPD_API_QUEUE_ADD_TRACK" , data : { uri : b } } ) ; showNotification ( '"' + c + '" added' , "" , "" , "success" ) ; break ; case "plist" : sendAPI ( { cmd : "MPD_API_QUEUE_ADD_PLAYLIST" , data : { plist : b } } ) , showNotification ( '"' + c + '" added' , "" , "" , "success" ) } }
function appendAfterQueue ( a , b , c , d ) { switch ( a ) { case "song" : sendAPI ( { cmd : "MPD_API_QUEUE_ADD_TRACK_AFTER" , data : { uri : b , to : c } } ) , showNotification ( '"' + d + '" added to pos ' + c , "" , "" , "success" ) } } function replaceQueue ( a , b , c ) { switch ( a ) { case "song" : case "dir" : sendAPI ( { cmd : "MPD_API_QUEUE_REPLACE_TRACK" , data : { uri : b } } ) ; showNotification ( '"' + c + '" replaced' , "" , "" , "success" ) ; break ; case "plist" : sendAPI ( { cmd : "MPD_API_QUEUE_REPLACE_PLAYLIST" , data : { plist : b } } ) , showNotification ( '"' + c + '" replaced' , "" , "" , "success" ) } }
2019-01-21 20:35:51 +00:00
function clickTitle ( ) { var a = decodeURI ( domCache . currentTitle . getAttribute ( "data-uri" ) ) ; "" != a && songDetails ( a ) } function gotoBrowse ( a ) { var b = a . parentNode . getAttribute ( "data-tag" ) ; a = decodeURI ( a . parentNode . getAttribute ( "data-name" ) ) ; "" != b && "" != a && "-" != a && settings . browsetags . includes ( b ) && appGoto ( "Browse" , "Database" , b , "0/-/-/" + a ) } function songDetails ( a ) { sendAPI ( { cmd : "MPD_API_DATABASE_SONGDETAILS" , data : { uri : a } } , parseSongDetails ) ; modalSongDetails . show ( ) }
2018-11-15 22:09:20 +00:00
function parseSongDetails ( a ) { var b = document . getElementById ( "modalSongDetails" ) ; b . getElementsByClassName ( "album-cover" ) [ 0 ] . style . backgroundImage = 'url("' + a . data . cover + '")' ; b . getElementsByTagName ( "h1" ) [ 0 ] . innerText = a . data . Title ; for ( var c = "" , d = 0 ; d < settings . tags . length ; d ++ ) c += "<tr><th>" + settings . tags [ d ] + '</th><td data-tag="' + settings . tags [ d ] + '" data-name="' + encodeURI ( a . data [ settings . tags [ d ] ] ) + '">' , c = settings . browsetags . includes ( settings . tags [ d ] ) ? c + ( '<a class="text-success" href="#">' + a . data [ settings . tags [ d ] ] +
"</a>" ) : c + a . data [ settings . tags [ d ] ] , c += "</td></tr>" ; var e = a . data . Duration ; d = Math . floor ( e / 60 ) ; e -= 60 * d ; c += "<tr><th>Duration</th><td>" + ( d + ":" + ( 10 > e ? "0" : "" ) + e ) + "</td></tr>" ; c = settings . featLibrary ? c + ( '<tr><th>Filename</th><td><a class="text-success" href="/library/' + encodeURI ( a . data . uri ) + '">' + a . data . uri + "</a></td></tr>" ) : c + ( "<tr><th>Filename</th><td>" + a . data . uri + "</td></tr>" ) ; 1 == settings . featStickers && ( c += '<tr><th colspan="2">Statistics</th></tr><tr><th>Play count</th><td>' + a . data . playCount + "</td></tr><tr><th>Skip count</th><td>" +
a . data . skipCount + "</td></tr><tr><th>Last played</th><td>" + ( 0 == a . data . lastPlayed ? "never" : ( new Date ( 1E3 * a . data . lastPlayed ) ) . toUTCString ( ) ) + '</td></tr><tr><th>Like</th><td><div class="btn-group btn-group-sm"><button title="Dislike song" id="btnVoteDown2" data-href=\'{"cmd": "voteSong", "options": [0]}\' class="btn btn-sm btn-light material-icons">thumb_down</button><button title="Like song" id="btnVoteUp2" data-href=\'{"cmd": "voteSong", "options": [2]}\' class="btn btn-sm btn-light material-icons">thumb_up</button></div></td></tr>' ) ;
2019-01-21 20:35:51 +00:00
b . getElementsByTagName ( "tbody" ) [ 0 ] . innerHTML = c ; setVoteSongBtns ( a . data . like , a . data . uri ) } function execSyscmd ( a ) { sendAPI ( { cmd : "MYMPD_API_SYSCMD" , data : { cmd : a } } ) } function playlistDetails ( a ) { document . getElementById ( "BrowsePlaylistsAllList" ) . classList . add ( "opacity05" ) ; appGoto ( "Browse" , "Playlists" , "Detail" , "0/-/-/" + a ) } function removeFromPlaylist ( a , b ) { b -- ; sendAPI ( { cmd : "MPD_API_PLAYLIST_RM_TRACK" , data : { uri : a , track : b } } ) ; document . getElementById ( "BrowsePlaylistsDetailList" ) . classList . add ( "opacity05" ) }
2018-11-15 22:09:20 +00:00
function playlistClear ( ) { var a = document . getElementById ( "BrowsePlaylistsDetailList" ) . getAttribute ( "data-uri" ) ; sendAPI ( { cmd : "MPD_API_PLAYLIST_CLEAR_AND_LIST" , data : { uri : a } } ) ; document . getElementById ( "BrowsePlaylistsDetailList" ) . classList . add ( "opacity05" ) }
2018-10-01 20:18:08 +00:00
function getAllPlaylists ( a ) { var b = a . data . length , c = "" ; 0 == a . offset && ( "addToPlaylistPlaylist" == playlistEl ? c = "<option></option><option>New Playlist</option>" : "selectJukeboxPlaylist" == playlistEl && ( c = "<option>Database</option>" ) ) ; for ( var d = 0 ; d < b ; d ++ ) c += "<option" , "selectJukeboxPlaylist" == playlistEl && a . data [ d ] . uri == settings . jukeboxPlaylist && ( c += " selected" ) , c += ">" + a . data [ d ] . uri + "</option>" ; 0 == a . offset ? document . getElementById ( playlistEl ) . innerHTML = c : document . getElementById ( playlistEl ) . innerHTML += c ; a . totalEntities >
a . returnedEntities && ( a . offset += settings . maxElementsPerPage , sendAPI ( { cmd : "MPD_API_PLAYLIST_LIST" , data : { offset : a . offset , filter : "-" } } , getAllPlaylists ) ) } function updateSmartPlaylists ( ) { sendAPI ( { cmd : "MPD_API_SMARTPLS_UPDATE_ALL" } ) }
2018-12-03 20:11:34 +00:00
function voteSong ( a ) { var b = decodeURI ( domCache . currentTitle . getAttribute ( "data-uri" ) ) ; "" != b && ( 2 == a && domCache . btnVoteUp . classList . contains ( "active-fg-green" ) ? a = 1 : 0 == a && domCache . btnVoteDown . classList . contains ( "active-fg-red" ) && ( a = 1 ) , sendAPI ( { cmd : "MPD_API_LIKE" , data : { uri : b , like : a } } ) , setVoteSongBtns ( a , b ) ) }
2018-11-15 22:09:20 +00:00
function setVoteSongBtns ( a , b ) { domCache . btnVoteUp2 = document . getElementById ( "btnVoteUp2" ) ; domCache . btnVoteDown2 = document . getElementById ( "btnVoteDown2" ) ; "" == b || 0 == b . indexOf ( "http://" ) || 0 == b . indexOf ( "https://" ) ? ( domCache . btnVoteUp . setAttribute ( "disabled" , "disabled" ) , domCache . btnVoteDown . setAttribute ( "disabled" , "disabled" ) , domCache . btnVoteUp2 && ( domCache . btnVoteUp2 . setAttribute ( "disabled" , "disabled" ) , domCache . btnVoteDown2 . setAttribute ( "disabled" , "disabled" ) ) ) : ( domCache . btnVoteUp . removeAttribute ( "disabled" ) ,
domCache . btnVoteDown . removeAttribute ( "disabled" ) , domCache . btnVoteUp2 && ( domCache . btnVoteUp2 . removeAttribute ( "disabled" ) , domCache . btnVoteDown2 . removeAttribute ( "disabled" ) ) ) ; 0 == a ? ( domCache . btnVoteUp . classList . remove ( "active-fg-green" ) , domCache . btnVoteDown . classList . add ( "active-fg-red" ) , domCache . btnVoteUp2 && ( domCache . btnVoteUp2 . classList . remove ( "active-fg-green" ) , domCache . btnVoteDown2 . classList . add ( "active-fg-red" ) ) ) : 1 == a ? ( domCache . btnVoteUp . classList . remove ( "active-fg-green" ) , domCache . btnVoteDown . classList . remove ( "active-fg-red" ) ,
domCache . btnVoteUp2 && ( domCache . btnVoteUp2 . classList . remove ( "active-fg-green" ) , domCache . btnVoteDown2 . classList . remove ( "active-fg-red" ) ) ) : 2 == a && ( domCache . btnVoteUp . classList . add ( "active-fg-green" ) , domCache . btnVoteDown . classList . remove ( "active-fg-red" ) , domCache . btnVoteUp2 && ( domCache . btnVoteUp2 . classList . add ( "active-fg-green" ) , domCache . btnVoteDown2 . classList . remove ( "active-fg-red" ) ) ) }
2018-08-05 22:02:29 +00:00
function toggleAddToPlaylistFrm ( ) { var a = document . getElementById ( "toggleAddToPlaylistBtn" ) ; toggleBtn ( "toggleAddToPlaylistBtn" ) ; a . classList . contains ( "active" ) ? ( document . getElementById ( "addToPlaylistFrm" ) . classList . remove ( "hide" ) , document . getElementById ( "addStreamFooter" ) . classList . add ( "hide" ) , document . getElementById ( "addToPlaylistFooter" ) . classList . remove ( "hide" ) ) : ( document . getElementById ( "addToPlaylistFrm" ) . classList . add ( "hide" ) , document . getElementById ( "addStreamFooter" ) . classList . remove ( "hide" ) , document . getElementById ( "addToPlaylistFooter" ) . classList . add ( "hide" ) ) }
2018-10-01 20:18:08 +00:00
function saveSearchAsSmartPlaylist ( ) { parseSmartPlaylist ( { type : "smartpls" , data : { playlist : "" , type : "search" , tag : app . current . filter , searchstr : app . current . search } } ) }
function parseSmartPlaylist ( a ) { var b = document . getElementById ( "saveSmartPlaylistName" ) ; b . value = a . data . playlist ; b . classList . remove ( "is-invalid" ) ; document . getElementById ( "saveSmartPlaylistType" ) . value = a . data . type ; document . getElementById ( "saveSmartPlaylistFrm" ) . classList . remove ( "was-validated" ) ; document . getElementById ( "saveSmartPlaylistSearch" ) . classList . add ( "hide" ) ; document . getElementById ( "saveSmartPlaylistSticker" ) . classList . add ( "hide" ) ; document . getElementById ( "saveSmartPlaylistNewest" ) . classList . add ( "hide" ) ;
2018-10-29 20:57:10 +00:00
var c ; settings . featTags && ( c = '<option value="any">Any Tag</option>' ) ; c += '<option value="filename">Filename</option>' ; for ( var d = 0 ; d < settings . searchtags . length ; d ++ ) c += '<option value="' + settings . searchtags [ d ] + '">' + settings . searchtags [ d ] + "</option>" ; document . getElementById ( "selectSaveSmartPlaylistTag" ) . innerHTML = c ; "search" == a . data . type ? ( document . getElementById ( "saveSmartPlaylistSearch" ) . classList . remove ( "hide" ) , document . getElementById ( "selectSaveSmartPlaylistTag" ) . value = a . data . tag , document . getElementById ( "inputSaveSmartPlaylistSearchstr" ) . value =
2018-12-03 20:11:34 +00:00
a . data . searchstr , settings . featAdvsearch ? ( document . getElementById ( "selectSaveSmartPlaylistTag" ) . parentNode . classList . add ( "hide" ) , document . getElementById ( "inputSaveSmartPlaylistSearchstr" ) . parentNode . classList . replace ( "col-md-6" , "col-md-12" ) ) : ( document . getElementById ( "selectSaveSmartPlaylistTag" ) . parentNode . classList . remove ( "hide" ) , document . getElementById ( "inputSaveSmartPlaylistSearchstr" ) . parentNode . classList . replace ( "col-md-12" , "col-md-6" ) ) ) : "sticker" == a . data . type ? ( document . getElementById ( "saveSmartPlaylistSticker" ) . classList . remove ( "hide" ) ,
document . getElementById ( "selectSaveSmartPlaylistSticker" ) . value = a . data . sticker , document . getElementById ( "inputSaveSmartPlaylistStickerMaxentries" ) . value = a . data . maxentries ) : "newest" == a . data . type && ( document . getElementById ( "saveSmartPlaylistNewest" ) . classList . remove ( "hide" ) , a = a . data . timerange / 24 / 60 / 60 , document . getElementById ( "inputSaveSmartPlaylistNewestTimerange" ) . value = a ) ; modalSaveSmartPlaylist . show ( ) ; b . focus ( ) }
function chkInt ( a , b ) { if ( "" != a . value . replace ( /\d/g , "" ) ) return a . classList . add ( "is-invalid" ) , b . classList . add ( "was-validated" ) , ! 1 ; a . classList . remove ( "is-invalid" ) ; return ! 0 }
function saveSmartPlaylist ( ) { var a = document . getElementById ( "saveSmartPlaylistName" ) . value , b = document . getElementById ( "saveSmartPlaylistType" ) . value , c = a . replace ( /[\w\-]/g , "" ) , d = document . getElementById ( "saveSmartPlaylistFrm" ) ; if ( "" != a && "" == c ) { if ( "search" == b ) d = document . getElementById ( "selectSaveSmartPlaylistTag" ) , d = d . options [ d . selectedIndex ] . value , settings . featAdvsearch && ( d = "expression" ) , c = document . getElementById ( "inputSaveSmartPlaylistSearchstr" ) . value , sendAPI ( { cmd : "MPD_API_SMARTPLS_SAVE" , data : { type : b ,
playlist : a , tag : d , searchstr : c } } ) ; else if ( "sticker" == b ) { c = document . getElementById ( "selectSaveSmartPlaylistSticker" ) ; c = c . options [ c . selectedIndex ] . value ; var e = document . getElementById ( "inputSaveSmartPlaylistStickerMaxentries" ) ; if ( ! chkInt ( e , d ) ) return ; sendAPI ( { cmd : "MPD_API_SMARTPLS_SAVE" , data : { type : b , playlist : a , sticker : c , maxentries : e . value } } ) } else if ( "newest" == b ) { c = document . getElementById ( "inputSaveSmartPlaylistNewestTimerange" ) ; if ( ! chkInt ( c , d ) ) return ; d = 86400 * parseInt ( c . value ) ; sendAPI ( { cmd : "MPD_API_SMARTPLS_SAVE" ,
data : { type : b , playlist : a , timerange : d } } ) } else { document . getElementById ( "saveSmartPlaylistType" ) . classList . add ( "is-invalid" ) ; return } modalSaveSmartPlaylist . hide ( ) ; showNotification ( "Saved smart playlist " + a , "" , "" , "success" ) } else document . getElementById ( "saveSmartPlaylistName" ) . classList . add ( "is-invalid" ) , d . classList . add ( "was-validated" ) }
2018-08-27 19:48:07 +00:00
function showAddToPlaylist ( a ) { document . getElementById ( "addToPlaylistUri" ) . value = a ; document . getElementById ( "addToPlaylistPlaylist" ) . innerHTML = "" ; document . getElementById ( "addToPlaylistNewPlaylist" ) . value = "" ; document . getElementById ( "addToPlaylistNewPlaylistDiv" ) . classList . add ( "hide" ) ; document . getElementById ( "addToPlaylistFrm" ) . classList . remove ( "was-validated" ) ; document . getElementById ( "addToPlaylistNewPlaylist" ) . classList . remove ( "is-invalid" ) ; toggleBtn ( "toggleAddToPlaylistBtn" , 0 ) ; var b = document . getElementById ( "streamUrl" ) ;
b . focus ( ) ; b . value = "" ; b . classList . remove ( "is-invalid" ) ; document . getElementById ( "addStreamFrm" ) . classList . remove ( "was-validated" ) ; "stream" != a ? ( document . getElementById ( "addStreamFooter" ) . classList . add ( "hide" ) , document . getElementById ( "addStreamFrm" ) . classList . add ( "hide" ) , document . getElementById ( "addToPlaylistFooter" ) . classList . remove ( "hide" ) , document . getElementById ( "addToPlaylistFrm" ) . classList . remove ( "hide" ) , document . getElementById ( "addToPlaylistLabel" ) . innerText = "Add to playlist" ) : ( document . getElementById ( "addStreamFooter" ) . classList . remove ( "hide" ) ,
2018-10-29 20:57:10 +00:00
document . getElementById ( "addStreamFrm" ) . classList . remove ( "hide" ) , document . getElementById ( "addToPlaylistFooter" ) . classList . add ( "hide" ) , document . getElementById ( "addToPlaylistFrm" ) . classList . add ( "hide" ) , document . getElementById ( "addToPlaylistLabel" ) . innerText = "Add Stream" ) ; modalAddToPlaylist . show ( ) ; settings . featPlaylists && ( playlistEl = "addToPlaylistPlaylist" , sendAPI ( { cmd : "MPD_API_PLAYLIST_LIST" , data : { offset : 0 , filter : "-" } } , getAllPlaylists ) ) }
2018-09-29 23:03:00 +00:00
function addToPlaylist ( ) { var a = document . getElementById ( "addToPlaylistUri" ) . value ; if ( "stream" == a && ( a = document . getElementById ( "streamUrl" ) . value , "" == a || - 1 == a . indexOf ( "http" ) ) ) { document . getElementById ( "streamUrl" ) . classList . add ( "is-invalid" ) ; document . getElementById ( "addStreamFrm" ) . classList . add ( "was-validated" ) ; return } var b = document . getElementById ( "addToPlaylistPlaylist" ) ; b = b . options [ b . selectedIndex ] . text ; if ( "New Playlist" == b ) { b = document . getElementById ( "addToPlaylistNewPlaylist" ) . value ; var c = b . replace ( /[\w\-]/g ,
2018-09-11 20:13:55 +00:00
"" ) ; if ( "" == b || "" != c ) { document . getElementById ( "addToPlaylistNewPlaylist" ) . classList . add ( "is-invalid" ) ; document . getElementById ( "addToPlaylistFrm" ) . classList . add ( "was-validated" ) ; return } } "" != b ? ( "SEARCH" == a ? addAllFromSearchPlist ( b ) : "DATABASE" == a ? addAllFromBrowseDatabasePlist ( b ) : sendAPI ( { cmd : "MPD_API_PLAYLIST_ADD_TRACK" , data : { uri : a , plist : b } } ) , modalAddToPlaylist . hide ( ) ) : ( document . getElementById ( "addToPlaylistPlaylist" ) . classList . add ( "is-invalid" ) , document . getElementById ( "addToPlaylistFrm" ) . classList . add ( "was-validated" ) ) }
2018-08-27 19:48:07 +00:00
function addStream ( ) { var a = document . getElementById ( "streamUrl" ) . value ; "" != a && 0 == a . indexOf ( "http" ) ? ( sendAPI ( { cmd : "MPD_API_QUEUE_ADD_TRACK" , data : { uri : a } } ) , modalAddToPlaylist . hide ( ) , showNotification ( "Added stream " + a + "to queue" , "" , "" , "success" ) ) : ( document . getElementById ( "streamUrl" ) . classList . add ( "is-invalid" ) , document . getElementById ( "addStreamFrm" ) . classList . add ( "was-validated" ) ) }
2018-07-24 22:52:59 +00:00
function showRenamePlaylist ( a ) { document . getElementById ( "renamePlaylistFrm" ) . classList . remove ( "was-validated" ) ; document . getElementById ( "renamePlaylistTo" ) . classList . remove ( "is-invalid" ) ; modalRenamePlaylist . show ( ) ; document . getElementById ( "renamePlaylistFrom" ) . value = a ; document . getElementById ( "renamePlaylistTo" ) . value = "" }
2018-10-15 20:14:19 +00:00
function renamePlaylist ( ) { var a = document . getElementById ( "renamePlaylistFrom" ) . value , b = document . getElementById ( "renamePlaylistTo" ) . value , c = b . replace ( /[\w\-]/g , "" ) ; "" != b && b != a && "" == c ? ( sendAPI ( { cmd : "MPD_API_PLAYLIST_RENAME" , data : { from : a , to : b } } ) , modalRenamePlaylist . hide ( ) ) : ( document . getElementById ( "renamePlaylistTo" ) . classList . add ( "is-invalid" ) , document . getElementById ( "renamePlaylistFrm" ) . classList . add ( "was-validated" ) ) }
2018-10-01 20:18:08 +00:00
function showSmartPlaylist ( a ) { sendAPI ( { cmd : "MPD_API_SMARTPLS_GET" , data : { playlist : a } } , parseSmartPlaylist ) } function dirname ( a ) { return a . replace ( /\/[^\/]*$/ , "" ) } function b64EncodeUnicode ( a ) { return btoa ( encodeURIComponent ( a ) . replace ( /%([0-9A-F]{2})/g , function ( a , c ) { return String . fromCharCode ( "0x" + c ) } ) ) } function b64DecodeUnicode ( a ) { return decodeURIComponent ( atob ( a ) . split ( "" ) . map ( function ( a ) { return "%" + ( "00" + a . charCodeAt ( 0 ) . toString ( 16 ) ) . slice ( - 2 ) } ) . join ( "" ) ) }
function addMenuItem ( a , b ) { return '<a class="dropdown-item" href="#" data-href=\'' + b64EncodeUnicode ( JSON . stringify ( a ) ) + "'>" + b + "</a>" } function hideMenu ( ) { var a = document . querySelector ( "[data-popover]" ) ; a && ( new Popover ( a , { } ) , a . Popover . hide ( ) , a . removeAttribute ( "data-popover" ) ) }
2018-10-29 20:57:10 +00:00
function showMenu ( a , b ) { b . preventDefault ( ) ; b . stopPropagation ( ) ; hideMenu ( ) ; if ( ! a . getAttribute ( "data-init" ) ) { b = a . getAttribute ( "data-type" ) ; var c = decodeURI ( a . getAttribute ( "data-uri" ) ) , d = a . getAttribute ( "data-name" ) , e = 0 ; if ( null == b || null == c ) b = a . parentNode . parentNode . getAttribute ( "data-type" ) , c = decodeURI ( a . parentNode . parentNode . getAttribute ( "data-uri" ) ) , d = a . parentNode . parentNode . getAttribute ( "data-name" ) ; lastState && ( e = lastState . data . nextSongPos ) ; var f = "" ; "Browse" == app . current . app && "Filesystem" == app . current . tab ||
"Search" == app . current . app || "Browse" == app . current . app && "Database" == app . current . tab ? ( f += addMenuItem ( { cmd : "appendQueue" , options : [ b , c , d ] } , "Append to queue" ) + ( "song" == b ? addMenuItem ( { cmd : "appendAfterQueue" , options : [ b , c , e , d ] } , "Add after current playing song" ) : "" ) + addMenuItem ( { cmd : "replaceQueue" , options : [ b , c , d ] } , "Replace queue" ) + ( "plist" != b && "smartpls" != b && settings . featPlaylists ? addMenuItem ( { cmd : "showAddToPlaylist" , options : [ c ] } , "Add to playlist" ) : "" ) + ( "song" == b ? addMenuItem ( { cmd : "songDetails" , options : [ c ] } ,
"Songdetails" ) : "" ) + ( "plist" == b || "smartpls" == b ? addMenuItem ( { cmd : "playlistDetails" , options : [ c ] } , "View playlist" ) : "" ) , "Search" == app . current . app && ( c = dirname ( c ) , f += '<div class="dropdown-divider"></div><a class="dropdown-item" id="advancedMenuLink" data-toggle="collapse" href="#advancedMenu"><span class="material-icons material-icons-small-left">keyboard_arrow_right</span>Album actions</a><div class="collapse" id="advancedMenu">' + addMenuItem ( { cmd : "appendQueue" , options : [ b , c , d ] } , "Append to queue" ) + addMenuItem ( { cmd : "appendAfterQueue" ,
options : [ b , c , e , d ] } , "Add after current playing song" ) + addMenuItem ( { cmd : "replaceQueue" , options : [ b , c , d ] } , "Replace queue" ) + ( settings . featPlaylists ? addMenuItem ( { cmd : "showAddToPlaylist" , options : [ c ] } , "Add to playlist" ) : "" ) + "</div>" ) ) : "Browse" == app . current . app && "Playlists" == app . current . tab && "All" == app . current . view ? f += addMenuItem ( { cmd : "appendQueue" , options : [ b , c , d ] } , "Append to queue" ) + addMenuItem ( { cmd : "replaceQueue" , options : [ b , c , d ] } , "Replace queue" ) + ( "smartpls" == b ? addMenuItem ( { cmd : "playlistDetails" , options : [ c ] } ,
2018-12-03 20:11:34 +00:00
"View playlist" ) : addMenuItem ( { cmd : "playlistDetails" , options : [ c ] } , "Edit playlist" ) ) + ( "smartpls" == b ? addMenuItem ( { cmd : "showSmartPlaylist" , options : [ c ] } , "Edit smart playlist" ) : "" ) + addMenuItem ( { cmd : "showRenamePlaylist" , options : [ c ] } , "Rename playlist" ) + addMenuItem ( { cmd : "showDelPlaylist" , options : [ c ] } , "Delete playlist" ) : "Browse" == app . current . app && "Playlists" == app . current . tab && "Detail" == app . current . view ? ( e = document . getElementById ( "BrowsePlaylistsDetailList" ) , f += addMenuItem ( { cmd : "appendQueue" , options : [ b , c , d ] } ,
"Append to queue" ) + addMenuItem ( { cmd : "replaceQueue" , options : [ b , c , d ] } , "Replace queue" ) + ( "false" == e . getAttribute ( "data-ro" ) ? addMenuItem ( { cmd : "removeFromPlaylist" , options : [ e . getAttribute ( "data-uri" ) , a . parentNode . parentNode . getAttribute ( "data-songpos" ) ] } , "Remove" ) : "" ) + addMenuItem ( { cmd : "showAddToPlaylist" , options : [ c ] } , "Add to playlist" ) + ( - 1 == c . indexOf ( "http" ) ? addMenuItem ( { cmd : "songDetails" , options : [ c ] } , "Songdetails" ) : "" ) ) : "Queue" == app . current . app && "Current" == app . current . tab ? f += addMenuItem ( { cmd : "delQueueSong" ,
2018-11-15 22:09:20 +00:00
options : [ "single" , a . parentNode . parentNode . getAttribute ( "data-trackid" ) ] } , "Remove" ) + addMenuItem ( { cmd : "delQueueSong" , options : [ "range" , 0 , a . parentNode . parentNode . getAttribute ( "data-songpos" ) ] } , "Remove all upwards" ) + addMenuItem ( { cmd : "delQueueSong" , options : [ "range" , parseInt ( a . parentNode . parentNode . getAttribute ( "data-songpos" ) ) - 1 , - 1 ] } , "Remove all downwards" ) + ( - 1 == c . indexOf ( "http" ) ? addMenuItem ( { cmd : "songDetails" , options : [ c ] } , "Songdetails" ) : "" ) : "Queue" == app . current . app && "LastPlayed" == app . current . tab && ( f +=
addMenuItem ( { cmd : "appendQueue" , options : [ b , c , d ] } , "Append to queue" ) + addMenuItem ( { cmd : "replaceQueue" , options : [ b , c , d ] } , "Replace queue" ) + addMenuItem ( { cmd : "showAddToPlaylist" , options : [ c ] } , "Add to playlist" ) + ( - 1 == c . indexOf ( "http" ) ? addMenuItem ( { cmd : "songDetails" , options : [ c ] } , "Songdetails" ) : "" ) ) ; new Popover ( a , { trigger : "click" , delay : 0 , dismissible : ! 0 , template : '<div class="popover" role="tooltip"><div class="arrow"></div><div class="popover-content">' + f + "</div></div>" } ) ; b = a . Popover ; a . setAttribute ( "data-init" ,
"true" ) ; a . addEventListener ( "shown.bs.popover" , function ( a ) { a . target . setAttribute ( "data-popover" , "true" ) ; document . getElementsByClassName ( "popover-content" ) [ 0 ] . addEventListener ( "click" , function ( a ) { a . preventDefault ( ) ; a . stopPropagation ( ) ; if ( "A" == a . target . nodeName ) { var b = a . target . getAttribute ( "data-href" ) ; b && ( b = JSON . parse ( b64DecodeUnicode ( b ) ) , parseCmd ( a , b ) , hideMenu ( ) ) } } , ! 1 ) ; if ( a = document . getElementById ( "advancedMenuLink" ) ) a . addEventListener ( "click" , function ( a ) { a = this . getElementsByTagName ( "span" ) [ 0 ] ; a . innerText =
"keyboard_arrow_right" == a . innerText ? "keyboard_arrow_down" : "keyboard_arrow_right" } , ! 1 ) , new Collapse ( a ) } , ! 1 ) ; b . show ( ) } }
2018-09-20 17:05:26 +00:00
function sendAPI ( a , b ) { var c = new XMLHttpRequest ; c . open ( "POST" , "/api" , ! 0 ) ; c . setRequestHeader ( "Content-type" , "application/json" ) ; c . onreadystatechange = function ( ) { if ( 4 == c . readyState ) if ( "" != c . responseText ) { var d = JSON . parse ( c . responseText ) ; "error" == d . type ? ( showNotification ( "Error" , d . data , d . data , "danger" ) , console . log ( "Error: " + d . data ) ) : "result" == d . type && "ok" != d . data ? showNotification ( d . data , "" , "" , "success" ) : void 0 != b && "function" == typeof b && b ( d ) } else console . log ( "Empty response for request: " + JSON . stringify ( a ) ) } ;
2018-09-23 21:56:00 +00:00
c . send ( JSON . stringify ( a ) ) } function openLocalPlayer ( ) { window . open ( "/player.html#" + settings . mpdstream , "LocalPlayer" ) } function updateDB ( ) { sendAPI ( { cmd : "MPD_API_DATABASE_UPDATE" } ) ; updateDBstarted ( ! 0 ) } function rescanDB ( ) { sendAPI ( { cmd : "MPD_API_DATABASE_RESCAN" } ) ; updateDBstarted ( ! 0 ) }
2018-08-27 19:48:07 +00:00
function updateDBstarted ( a ) { 1 == a ? ( document . getElementById ( "updateDBfinished" ) . innerText = "" , document . getElementById ( "updateDBfooter" ) . classList . add ( "hide" ) , updateDBprogress . style . width = "20px" , updateDBprogress . style . marginLeft = "-20px" , modalUpdateDB . show ( ) , document . getElementById ( "updateDBprogress" ) . classList . add ( "updateDBprogressAnimate" ) ) : showNotification ( "Database update started" , "" , "" , "success" ) }
function updateDBfinished ( a ) { document . getElementById ( "modalUpdateDB" ) . classList . contains ( "show" ) ? ( "update_database" == a ? document . getElementById ( "updateDBfinished" ) . innerText = "Database successfully updated." : "update_finished" == a && ( document . getElementById ( "updateDBfinished" ) . innerText = "Database update finished." ) , a = document . getElementById ( "updateDBprogress" ) , a . classList . remove ( "updateDBprogressAnimate" ) , a . style . width = "100%" , a . style . marginLeft = "0px" , document . getElementById ( "updateDBfooter" ) . classList . remove ( "hide" ) ) :
"update_database" == a ? showNotification ( "Database successfully updated." , "" , "" , "success" ) : "update_finished" == a && showNotification ( "Database update finished." , "" , "" , "success" ) } function clickPlay ( ) { "play" != playstate ? sendAPI ( { cmd : "MPD_API_PLAYER_PLAY" } ) : sendAPI ( { cmd : "MPD_API_PLAYER_PAUSE" } ) } function clickStop ( ) { sendAPI ( { cmd : "MPD_API_PLAYER_STOP" } ) } function clickPrev ( ) { sendAPI ( { cmd : "MPD_API_PLAYER_PREV" } ) } function clickNext ( ) { sendAPI ( { cmd : "MPD_API_PLAYER_NEXT" } ) }
2018-10-15 20:14:19 +00:00
function delQueueSong ( a , b , c ) { "range" == a ? sendAPI ( { cmd : "MPD_API_QUEUE_RM_RANGE" , data : { start : b , end : c } } ) : "single" == a && sendAPI ( { cmd : "MPD_API_QUEUE_RM_TRACK" , data : { track : b } } ) } function showDelPlaylist ( a ) { document . getElementById ( "deletePlaylist" ) . value = a ; modalDeletePlaylist . show ( ) } function delPlaylist ( ) { var a = document . getElementById ( "deletePlaylist" ) . value ; sendAPI ( { cmd : "MPD_API_PLAYLIST_RM" , data : { uri : a } } ) ; modalDeletePlaylist . hide ( ) }
2018-10-01 20:18:08 +00:00
function confirmSettings ( ) { var a = ! 0 , b = document . getElementById ( "inputCrossfade" ) ; if ( ! b . getAttribute ( "disabled" ) ) { var c = parseInt ( b . value ) ; isNaN ( c ) ? ( b . classList . add ( "is-invalid" ) , a = ! 1 ) : b . value = c } b = document . getElementById ( "inputJukeboxQueueLength" ) ; c = parseInt ( b . value ) ; isNaN ( c ) ? ( b . classList . add ( "is-invalid" ) , a = ! 1 ) : 0 < c ? b . value = c : ( b . classList . add ( "is-invalid" ) , a = ! 1 ) ; settings . mixramp && ( b = document . getElementById ( "inputMixrampdb" ) , b . getAttribute ( "disabled" ) || ( c = parseFloat ( b . value ) , isNaN ( c ) ? ( b . classList . add ( "is-invalid" ) ,
2019-01-17 17:06:12 +00:00
a = ! 1 ) : b . value = c ) , b = document . getElementById ( "inputMixrampdelay" ) , b . getAttribute ( "disabled" ) || ( "nan" == b . value && ( b . value = "-1" ) , c = parseFloat ( b . value ) , isNaN ( c ) ? ( b . classList . add ( "is-invalid" ) , a = ! 1 ) : b . value = c ) ) ; 1 == a ? ( a = document . getElementById ( "selectReplaygain" ) , c = document . getElementById ( "selectJukeboxPlaylist" ) , b = document . getElementById ( "selectJukeboxMode" ) , sendAPI ( { cmd : "MYMPD_API_SETTINGS_SET" , data : { consume : document . getElementById ( "btnConsume" ) . classList . contains ( "active" ) ? 1 : 0 , random : document . getElementById ( "btnRandom" ) . classList . contains ( "active" ) ?
2018-10-01 20:18:08 +00:00
1 : 0 , single : document . getElementById ( "btnSingle" ) . classList . contains ( "active" ) ? 1 : 0 , repeat : document . getElementById ( "btnRepeat" ) . classList . contains ( "active" ) ? 1 : 0 , replaygain : a . options [ a . selectedIndex ] . value , crossfade : document . getElementById ( "inputCrossfade" ) . value , mixrampdb : 1 == settings . mixramp ? document . getElementById ( "inputMixrampdb" ) . value : settings . mixrampdb , mixrampdelay : 1 == settings . mixramp ? document . getElementById ( "inputMixrampdelay" ) . value : settings . mixrampdelay , notificationWeb : document . getElementById ( "btnnotifyWeb" ) . classList . contains ( "active" ) ?
2019-01-21 20:35:51 +00:00
! 0 : ! 1 , notificationPage : document . getElementById ( "btnnotifyPage" ) . classList . contains ( "active" ) ? ! 0 : ! 1 , jukeboxMode : b . options [ b . selectedIndex ] . value , jukeboxPlaylist : c . options [ c . selectedIndex ] . value , jukeboxQueueLength : document . getElementById ( "inputJukeboxQueueLength" ) . value , autoPlay : document . getElementById ( "btnAutoPlay" ) . classList . contains ( "active" ) ? ! 0 : ! 1 } } , getSettings ) , modalSettings . hide ( ) ) : document . getElementById ( "settingsFrm" ) . classList . add ( "was-validated" ) }
2018-12-03 20:11:34 +00:00
function addAllFromBrowseFilesystem ( ) { sendAPI ( { cmd : "MPD_API_QUEUE_ADD_TRACK" , data : { uri : app . current . search } } ) ; showNotification ( "Added all songs" , "" , "" , "success" ) }
function addAllFromSearchPlist ( a ) { var b = parseInt ( document . getElementById ( "panel-heading-search" ) . innerText ) ; ! isNaN ( b ) && 0 < b && ( settings . featAdvsearch ? sendAPI ( { cmd : "MPD_API_DATABASE_SEARCH_ADV" , data : { plist : a , sort : "" , sortdesc : ! 1 , expression : app . current . search , offset : 0 } } ) : sendAPI ( { cmd : "MPD_API_DATABASE_SEARCH" , data : { plist : a , filter : app . current . filter , searchstr : app . current . search , offset : 0 } } ) , showNotification ( "Added " + b + " songs from search to " + a , "" , "" , "success" ) ) }
2018-09-11 20:13:55 +00:00
function addAllFromBrowseDatabasePlist ( a ) { 2 <= app . current . search . length && ( sendAPI ( { cmd : "MPD_API_DATABASE_SEARCH" , data : { plist : a , filter : app . current . view , searchstr : app . current . search , offset : 0 } } ) , showNotification ( "Added songs from database selection to " + a , "" , "" , "success" ) ) } function scrollTo ( a ) { document . body . scrollTop = a ; document . documentElement . scrollTop = a }
2019-01-21 20:35:51 +00:00
function gotoPage ( a ) { switch ( a ) { case "next" : app . current . page += settings . maxElementsPerPage ; break ; case "prev" : app . current . page -= settings . maxElementsPerPage ; 0 > app . current . page && ( app . current . page = 0 ) ; break ; default : app . current . page = a } appGoto ( app . current . app , app . current . tab , app . current . view , app . current . page + "/" + app . current . filter + "/" + app . current . sort + "/" + app . current . search ) }
2018-09-29 23:03:00 +00:00
function saveQueue ( ) { var a = document . getElementById ( "saveQueueName" ) . value , b = a . replace ( /[\w\-]/g , "" ) ; "" != a && "" == b ? ( sendAPI ( { cmd : "MPD_API_QUEUE_SAVE" , data : { plist : a } } ) , modalSavequeue . hide ( ) ) : ( alert ( b ) , document . getElementById ( "saveQueueName" ) . classList . add ( "is-invalid" ) , document . getElementById ( "saveQueueFrm" ) . classList . add ( "was-validated" ) ) }
2018-09-20 17:05:26 +00:00
function showNotification ( a , b , c , d ) { 1 == settings . notificationWeb && ( b = new Notification ( a , { icon : "assets/favicon.ico" , body : b } ) , setTimeout ( function ( a ) { a . close ( ) } , 3E3 , b ) ) ; 1 == settings . notificationPage && ( document . getElementById ( "alertBox" ) ? b = document . getElementById ( "alertBox" ) : ( b = document . createElement ( "div" ) , b . setAttribute ( "id" , "alertBox" ) , b . addEventListener ( "click" , function ( ) { hideNotification ( ) } , ! 1 ) ) , b . classList . remove ( "alert-success" , "alert-danger" ) , b . classList . add ( "alert" , "alert-" + d ) , b . innerHTML = "<div><strong>" +
2018-08-22 12:06:22 +00:00
a + "</strong><br/>" + c + "</div>" , document . getElementsByTagName ( "main" ) [ 0 ] . append ( b ) , document . getElementById ( "alertBox" ) . classList . add ( "alertBoxActive" ) , alertTimeout && clearTimeout ( alertTimeout ) , alertTimeout = setTimeout ( function ( ) { hideNotification ( ) } , 3E3 ) ) } function hideNotification ( ) { document . getElementById ( "alertBox" ) && ( document . getElementById ( "alertBox" ) . classList . remove ( "alertBoxActive" ) , setTimeout ( function ( ) { var a = document . getElementById ( "alertBox" ) ; a && a . remove ( ) } , 600 ) ) }
2018-07-19 17:57:53 +00:00
function notificationsSupported ( ) { return "Notification" in window }
2018-11-05 23:13:22 +00:00
function songChange ( a ) { if ( "error" != a . type && "result" != a . type ) { var b = a . data . Title + a . data . Artist + a . data . Album + a . data . uri + a . data . currentSongId ; if ( lastSong != b ) { var c = "" , d = "" , e = "myMPD: " ; domCache . currentCover . style . backgroundImage = 'url("' + a . data . cover + '")' ; "undefined" != typeof a . data . Artist && 0 < a . data . Artist . length && "-" != a . data . Artist && ( c += a . data . Artist , d += a . data . Artist , e += a . data . Artist + " - " ) ; "undefined" != typeof a . data . Album && 0 < a . data . Album . length && "-" != a . data . Album && ( c += " - " + a . data . Album , d += "<br/>" + a . data . Album ) ;
"undefined" != typeof a . data . Title && 0 < a . data . Title . length ? ( e += a . data . Title , domCache . currentTitle . innerText = a . data . Title , domCache . currentTitle . setAttribute ( "data-uri" , encodeURI ( a . data . uri ) ) ) : ( domCache . currentTitle . innerText = "" , domCache . currentTitle . setAttribute ( "data-uri" , "" ) ) ; document . title = e ; 1 == settings . featStickers && setVoteSongBtns ( a . data . like , a . data . uri ) ; for ( e = 0 ; e < settings . colsPlayback . length ; e ++ ) { var f = document . getElementById ( "current" + settings . colsPlayback [ e ] ) ; f . getElementsByTagName ( "h4" ) [ 0 ] . innerText =
a . data [ settings . colsPlayback [ e ] ] ; f . setAttribute ( "data-name" , encodeURI ( a . data [ settings . colsPlayback [ e ] ] ) ) } if ( e = document . getElementById ( "queueTrackId" + a . data . currentSongId ) ) e . getElementsByTagName ( "td" ) [ 1 ] . innerText = a . data . Title ; "play" == playstate && showNotification ( a . data . Title , c , d , "success" ) ; lastSong = b ; lastSongObj = a } } }
2018-09-20 17:05:26 +00:00
function doSetFilterLetter ( a ) { var b = document . getElementById ( a + "Letters" ) . getElementsByClassName ( "active" ) [ 0 ] ; b && b . classList . remove ( "active" ) ; b = app . current . filter ; "0" == b && ( b = "#" ) ; document . getElementById ( a ) . innerText = "Filter" + ( "-" != b ? ": " + b : "" ) ; if ( "-" != b ) { a = document . getElementById ( a + "Letters" ) . getElementsByTagName ( "button" ) ; for ( var c = a . length , d = 0 ; d < c ; d ++ ) if ( a [ d ] . innerText == b ) { a [ d ] . classList . add ( "active" ) ; break } } }
2018-07-19 19:35:54 +00:00
function addFilterLetter ( a ) { for ( var b = '<button class="mr-1 mb-1 btn btn-sm btn-secondary material-icons material-icons-small">delete</button><button class="mr-1 mb-1 btn btn-sm btn-secondary">#</button>' , c = 65 ; 90 >= c ; c ++ ) b += '<button class="mr-1 mb-1 btn-sm btn btn-secondary">' + String . fromCharCode ( c ) + "</button>" ; a = document . getElementById ( a ) ; a . innerHTML = b ; a . addEventListener ( "click" , function ( a ) { switch ( a . target . innerText ) { case "delete" : b = "-" ; break ; case "#" : b = "0" ; break ; default : b = a . target . innerText } appGoto ( app . current . app ,
2019-01-21 20:35:51 +00:00
app . current . tab , app . current . view , "0/" + b + "/" + app . current . sort + "/" + app . current . search ) } , ! 1 ) } function selectTag ( a , b , c ) { a = document . getElementById ( a ) ; var d = a . querySelector ( ".active" ) ; d && d . classList . remove ( "active" ) ; if ( d = a . querySelector ( "[data-tag=" + c + "]" ) ) d . classList . add ( "active" ) , document . getElementById ( b ) . innerText = d . innerText }
2018-10-29 20:57:10 +00:00
function addTagList ( a , b ) { var c = "" ; "searchtags" == b && ( 1 == settings . featTags && ( c += '<button type="button" class="btn btn-secondary btn-sm btn-block" data-tag="any">Any Tag</button>' ) , c += '<button type="button" class="btn btn-secondary btn-sm btn-block" data-tag="filename">Filename</button>' ) ; for ( var d = 0 ; d < settings [ b ] . length ; d ++ ) c += '<button type="button" class="btn btn-secondary btn-sm btn-block" data-tag="' + settings [ b ] [ d ] + '">' + settings [ b ] [ d ] + "</button>" ; document . getElementById ( a ) . innerHTML = c }
2019-01-21 20:35:51 +00:00
function gotoTagList ( ) { appGoto ( app . current . app , app . current . tab , app . current . view , "0/-/-/" ) } function openModal ( a ) { window [ a ] . show ( ) } function openDropdown ( a ) { window [ a ] . toggle ( ) } function focusSearch ( ) { "Queue" == app . current . app ? document . getElementById ( "searchqueuestr" ) . focus ( ) : "Search" == app . current . app ? domCache . searchstr . focus ( ) : appGoto ( "Search" ) }
2019-01-17 17:06:12 +00:00
function chVolume ( a ) { a = parseInt ( domCache . volumeBar . value ) + a ; 0 > a ? a = 0 : 100 < a && ( a = 100 ) ; domCache . volumeBar . value = a ; sendAPI ( { cmd : "MPD_API_PLAYER_VOLUME_SET" , data : { volume : a } } ) } function beautifyDuration ( a ) { var b = Math . floor ( a / 86400 ) , c = Math . floor ( a / 3600 ) - 24 * b , d = Math . floor ( a / 60 ) - 60 * c - 1440 * b ; a = a - 86400 * b - 3600 * c - 60 * d ; return ( 0 < b ? b + "\u2009d " : "" ) + ( 0 < c ? c + "\u2009h " + ( 10 > d ? "0" : "" ) : "" ) + d + "\u2009m " + ( 10 > a ? "0" : "" ) + a + "\u2009s" } function genId ( a ) { return "id" + a . replace ( /[^\w\-]/g , "" ) } appInitStart ( ) ;