1.9.8 - 4.7beta1 updates

This commit is contained in:
Trevor Squillario 2012-05-21 19:31:51 -04:00
parent e6f5c3a34d
commit b0fe42ef3c
14 changed files with 395 additions and 11881 deletions

BIN
images/albumdefault_25.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 776 B

BIN
images/albumdefault_50.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 973 B

View file

@ -3,17 +3,31 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Subsonic - MiniSub</title> <title>Subsonic - MiniSub</title>
<link href="images/subsonic_32x32.ico" rel="shortcut icon" /> <link href="images/subsonic_32x32.ico" rel="shortcut icon" />
<link rel="icon" href="images/subsonic_48x48.png" sizes="48x48"/>
<link rel="icon" href="images/subsonic_32x32.png" sizes="32x32"/>
<link rel="icon" href="images/subsonic_48x48.png" sizes="48x48" />
<link rel="icon" href="images/subsonic_32x32.png" sizes="32x32" />
<link href="style/Style.css" rel="stylesheet" type="text/css" /> <link href="style/Style.css" rel="stylesheet" type="text/css" />
<link href="js/fancybox/jquery.fancybox-1.3.4.css" rel="stylesheet" type="text/css" /> <link href="js/fancybox/jquery.fancybox-1.3.4.css" rel="stylesheet" type="text/css" />
<link href="js/contextMenu/jquery.contextMenu.css" rel="stylesheet" type="text/css" /> <script src="js/plugins/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="js/require-jquery.js" data-main="js/main"></script> <script src="js/plugins/jquery.base64.js" type="text/javascript"></script>
<script src="js/plugins/jquery.shuffle.js" type="text/javascript"></script>
<script src="js/plugins/jquery.cookie.js" type="text/javascript"></script>
<script src="js/plugins/jquery.dateFormat-1.0.js" type="text/javascript"></script>
<script src="js/plugins/jquery.disable.text.select.pack.js" type="text/javascript"></script>
<script src="js/plugins/jquery.hotkeys.js" type="text/javascript"></script>
<script src="js/plugins/jquery.linkify-1.0-min.js" type="text/javascript"></script>
<script src="js/plugins/jquery.periodic.js" type="text/javascript"></script>
<script src="js/plugins/jquery.scrollTo-1.4.2-min.js" type="text/javascript"></script>
<script src="js/sm/soundmanager2-jsmin.js" type="text/javascript"></script>
<script src="js/fancybox/jquery.fancybox-1.3.4.pack.js" type="text/javascript"></script>
<script src="js/libs/api.js" type="text/javascript"></script>
<script src="js/libs/utils.js" type="text/javascript"></script>
<script src="js/libs/chat.js" type="text/javascript"></script>
<script src="js/libs/generators.js" type="text/javascript"></script>
<script src="js/libs/player.js" type="text/javascript"></script>
<script src="js/app.js" type="text/javascript"></script>
<script src="js/ui-ready.js" type="text/javascript"></script>
<script src="js/ui-load.js" type="text/javascript"></script>
</head> </head>
<body> <body>
@ -36,6 +50,7 @@
<a href="#" class="button" id="action_IncreaseWidth" title="Increase Width"><img src="images/plus_8x8.png" /></a> <a href="#" class="button" id="action_IncreaseWidth" title="Increase Width"><img src="images/plus_8x8.png" /></a>
</div> </div>
<div class="subactions floatleft"> <div class="subactions floatleft">
<div id="songactions">
<a href="#" class="button" id="action_SelectAll" title="Select All">All</a> <a href="#" class="button" id="action_SelectAll" title="Select All">All</a>
<a href="#" class="button" id="action_SelectNone" title="Select None">None</a> <a href="#" class="button" id="action_SelectNone" title="Select None">None</a>
<a href="#" class="button" id="action_AddToPlaylist" title="Add Selected To Playlist">+ Playlist</a> <a href="#" class="button" id="action_AddToPlaylist" title="Add Selected To Playlist">+ Playlist</a>
@ -43,7 +58,13 @@
<a href="#" class="button" id="action_AddToCurrent" title="Add Selected To Current Playlist">+ Current</a> <a href="#" class="button" id="action_AddToCurrent" title="Add Selected To Current Playlist">+ Current</a>
<a href="#" class="button" id="action_AddAllToCurrent" title="Add All to Current Playlist">+All</a> <a href="#" class="button" id="action_AddAllToCurrent" title="Add All to Current Playlist">+All</a>
<a href="#" class="button" id="action_PlayAlbum" title="Play Album"><img src="images/play_gl_6x8.png" /></a> <a href="#" class="button" id="action_PlayAlbum" title="Play Album"><img src="images/play_gl_6x8.png" /></a>
<input type="text" id="Search" class="medium" /><a href="#" class="button" id="action_Search" title="Search"><img src="images/magnifying_glass_alt_12x12.png" /></a> </div>
<input type="text" id="Search" class="medium" />
<select id="SearchType" name="SearchType">
<option value="song">Song</option>
<option value="album">Album</option>
</select>
<a href="#" class="button" id="action_Search" title="Search"><img src="images/magnifying_glass_alt_12x12.png" /></a>
</div> </div>
<div id="Albums" class="lgsection floatleft"> <div id="Albums" class="lgsection floatleft">
<div class="loading"></div> <div class="loading"></div>
@ -91,11 +112,12 @@
</div> </div>
<div id="tabPlaylists" class="tabcontent"> <div id="tabPlaylists" class="tabcontent">
<div class="actions floatleft"> <div class="actions floatleft">
<a href="#" class="button" id="action_NewPlaylist" onclick="newPlaylist(); return false;" title="New Playlist">+ New</a> <a href="#" class="button" id="action_RefreshPlaylists" title="Refresh Playlists"><img src="images/reload_9x11.png" /></a>
<a href="#" class="button" id="action_DeletePlaylist" title="Delete Playlist">Delete</a>
<a href="#" class="button" id="action_SavePlaylist" title="Save Playlist">Save</a>
</div> </div>
<div class="subactions floatleft"> <div class="subactions floatleft">
<a href="#" class="button" id="action_NewPlaylist" onclick="newPlaylist(); return false;" title="New Playlist">+ New</a>
<a href="#" class="button" id="action_DeletePlaylist" title="Delete Selected Playlist">Delete</a>
<a href="#" class="button" id="action_SavePlaylist" title="Save Playlist">Save</a>
<a href="#" class="button" id="action_ShufflePlaylist" title="Shuffle Playlist"><img src="images/fork_11x12.png" /></a> <a href="#" class="button" id="action_ShufflePlaylist" title="Shuffle Playlist"><img src="images/fork_11x12.png" /></a>
<a href="#" class="button" id="action_RemoveSongs" title="Remove selected song(s) from playlist">Remove Song(s)</a> <a href="#" class="button" id="action_RemoveSongs" title="Remove selected song(s) from playlist">Remove Song(s)</a>
</div> </div>
@ -165,8 +187,20 @@
<div class="clear"></div> <div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="ScrollTitle" name="ScrollTitle" value="1" title="Scroll the Title Once"/></div> <div class="inputwrap"><input type="checkbox" id="ScrollTitle" name="ScrollTitle" value="1" title="Scroll the Title Once"/></div>
<label for="ScrollTitle">Scroll Title</label> <label for="ScrollTitle">Scroll Title</label>
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="Debug" name="Debug" value="1" title="Enable Debug Mode (Events will be logged to the Javascript Console)"/></div>
<label for="Debug">Debug Mode</label>
</div> </div>
</div> </div>
<div id="donate" class="subsection floatleft">
<h3 class="title">Buy me a beer! I'd like that :)</h3>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="VMTENRSJWQ234">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
</div>
<div class="clear"></div> <div class="clear"></div>
<div class="subsection floatleft"> <div class="subsection floatleft">
<h3 class="title">Change Log</h3> <h3 class="title">Change Log</h3>
@ -176,6 +210,16 @@
<span class="changes"></span> <span class="changes"></span>
</li> </li>
--> -->
<li class="log"><span class="version">5/21/2012 - 1.9.8</span>
<span class="changes">Support for 4.7beta1 in preparation for next full release</span>
<span class="changes">Ability to download Playlist or Song</span>
<span class="changes">Playing a song from a Playlist or Album will add the rest of the songs to the Current Playlist</span>
<span class="changes">Clicking an album takes you to the album (helpful from a playlist)</span>
<span class="changes">Added ability to search Albums or Songs</span>
<span class="changes">Ability to create new Playlist from any selected songs</span>
<span class="changes">Change track position while playing (lost after switch to SM2)</span>
<span class="changes">Added song rating to Player</span>
</li>
<li class="log"><span class="version">4/3/2012 - 1.9.4</span> <li class="log"><span class="version">4/3/2012 - 1.9.4</span>
<span class="changes">URL Querystring support for setting of variables</span> <span class="changes">URL Querystring support for setting of variables</span>
<span class="changes">Added legacy support for Subsonic 4.5</span> <span class="changes">Added legacy support for Subsonic 4.5</span>
@ -258,6 +302,7 @@
<li id="songdetails_song" class="song"></li> <li id="songdetails_song" class="song"></li>
<li id="songdetails_artist" class="album"></li> <li id="songdetails_artist" class="album"></li>
</ul> </ul>
<div class="rate"><a id="songdetails_rate" class="rate" href="" title="Add To Favorites"></a></div>
<div class="vertshade"></div> <div class="vertshade"></div>
</div> </div>
</div> </div>

View file

@ -3,6 +3,13 @@ var debug = false;
var audio; var audio;
var hostURL = location.href; var hostURL = location.href;
var baseURL; var baseURL;
var version;
//Sound manager
soundManager.url = 'js/sm/swf';
soundManager.preferFlash = false;
soundManager.debugMode = false;
//soundManager.useHTML5Audio = true;
// Set auth cookies if specified in URL on launch // Set auth cookies if specified in URL on launch
var u = getParameterByName('u'); var u = getParameterByName('u');
@ -38,7 +45,7 @@ var version = '1.6.0';
function loadTabContent(tab) { function loadTabContent(tab) {
switch (tab) { switch (tab) {
case '#tabLibrary': case '#tabLibrary':
console.log("TAG LIBRARY"); if (debug) { console.log("TAG LIBRARY"); }
if ($.cookie('MusicFolders')) { if ($.cookie('MusicFolders')) {
loadArtists($.cookie('MusicFolders'), false); loadArtists($.cookie('MusicFolders'), false);
} else { } else {
@ -47,12 +54,12 @@ function loadTabContent(tab) {
getMusicFolders(); getMusicFolders();
break; break;
case '#tabCurrent': case '#tabCurrent':
console.log("TAG CURRENT"); if (debug) { console.log("TAG CURRENT"); }
var header = generateSongHeaderHTML(); var header = generateSongHeaderHTML();
$("#CurrentPlaylistContainer thead").html(header); $("#CurrentPlaylistContainer thead").html(header);
break; break;
case '#tabPlaylists': case '#tabPlaylists':
console.log("TAG PLAYLIST"); if (debug) { console.log("TAG PLAYLIST"); }
loadPlaylists(); loadPlaylists();
break; break;
case '#tabPreferences': case '#tabPreferences':

View file

@ -1,59 +0,0 @@
/* Generic context menu styles */
.contextMenu {
position: absolute;
width: 115px;
z-index: 99999;
border: solid 1px #DEDEDE;
background: #fff;
padding: 0px;
margin: 0px;
display: none;
}
.contextMenu LI {
list-style: none;
padding: 0px;
margin: 0px;
}
.contextMenu A {
color: #333;
text-decoration: none;
display: block;
line-height: 20px;
height: 20px;
background-position: 9px center;
background-repeat: no-repeat;
outline: none;
padding: 3px 5px;
padding-left: 32px;
font-size: 16px;
font-variant: small-caps;
}
.contextMenu LI.hover A {
color: #FFF;
background-color: #3399FF;
}
.contextMenu LI.disabled A {
color: #AAA;
cursor: default;
}
.contextMenu LI.hover.disabled A {
background-color: transparent;
}
.contextMenu LI.separator {
border-top: solid 1px #CCC;
}
/*
Adding Icons
You can add icons to the context menu by adding
classes to the respective LI element(s)
*/
.contextMenu LI.download A { background-image: url(../../images/download_gd_12x16.png); }

View file

@ -1,209 +0,0 @@
// jQuery Context Menu Plugin
//
// Version 1.01
//
// Cory S.N. LaViska
// A Beautiful Site (http://abeautifulsite.net/)
//
// More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/
//
// Terms of Use
//
// This plugin is dual-licensed under the GNU General Public License
// and the MIT License and is copyright A Beautiful Site, LLC.
//
if (jQuery) (function () {
$.extend($.fn, {
contextMenu: function (o, callback) {
// Defaults
if (o.menu == undefined) return false;
if (o.inSpeed == undefined) o.inSpeed = 150;
if (o.outSpeed == undefined) o.outSpeed = 75;
// 0 needs to be -1 for expected results (no fade)
if (o.inSpeed == 0) o.inSpeed = -1;
if (o.outSpeed == 0) o.outSpeed = -1;
// Loop each context menu
$(this).live("mousedown", function (e) {
var el = $(this);
var offset = $(el).offset();
// Add contextMenu class
$('#' + o.menu).addClass('contextMenu');
var evt = e;
evt.stopPropagation();
$(this).mouseup(function (e) {
e.stopPropagation();
var srcElement = $(this);
$(this).unbind('mouseup');
if (evt.button == 2) {
// Hide context menus that may be showing
$(".contextMenu").hide();
// Get this context menu
var menu = $('#' + o.menu);
if ($(el).hasClass('disabled')) return false;
// Detect mouse position
var d = {}, x, y;
if (self.innerHeight) {
d.pageYOffset = self.pageYOffset;
d.pageXOffset = self.pageXOffset;
d.innerHeight = self.innerHeight;
d.innerWidth = self.innerWidth;
} else if (document.documentElement &&
document.documentElement.clientHeight) {
d.pageYOffset = document.documentElement.scrollTop;
d.pageXOffset = document.documentElement.scrollLeft;
d.innerHeight = document.documentElement.clientHeight;
d.innerWidth = document.documentElement.clientWidth;
} else if (document.body) {
d.pageYOffset = document.body.scrollTop;
d.pageXOffset = document.body.scrollLeft;
d.innerHeight = document.body.clientHeight;
d.innerWidth = document.body.clientWidth;
}
(e.pageX) ? x = e.pageX : x = e.clientX + d.scrollLeft;
(e.pageY) ? y = e.pageY : y = e.clientY + d.scrollTop;
// Show the menu
//$(document).unbind('click');
$(menu).css({ top: y, left: x }).fadeIn(o.inSpeed);
// Hover events
$(menu).find('A').mouseover(function () {
$(menu).find('LI.hover').removeClass('hover');
$(this).parent().addClass('hover');
}).mouseout(function () {
$(menu).find('LI.hover').removeClass('hover');
});
// Keyboard
$(document).keypress(function (e) {
switch (e.keyCode) {
case 38: // up
if ($(menu).find('LI.hover').size() == 0) {
$(menu).find('LI:last').addClass('hover');
} else {
$(menu).find('LI.hover').removeClass('hover').prevAll('LI:not(.disabled)').eq(0).addClass('hover');
if ($(menu).find('LI.hover').size() == 0) $(menu).find('LI:last').addClass('hover');
}
break;
case 40: // down
if ($(menu).find('LI.hover').size() == 0) {
$(menu).find('LI:first').addClass('hover');
} else {
$(menu).find('LI.hover').removeClass('hover').nextAll('LI:not(.disabled)').eq(0).addClass('hover');
if ($(menu).find('LI.hover').size() == 0) $(menu).find('LI:first').addClass('hover');
}
break;
case 13: // enter
$(menu).find('LI.hover A').trigger('click');
break;
case 27: // esc
$(document).trigger('click');
break
}
});
// When items are selected
$('#' + o.menu).find('A').unbind('click');
$('#' + o.menu).find('LI:not(.disabled) A').click(function () {
//$(document).unbind('click').unbind('keypress');
$(".contextMenu").hide();
// Callback
if (callback) callback($(this).attr('href').substr(1), $(srcElement), { x: x - offset.left, y: y - offset.top, docX: x, docY: y });
return false;
});
// Hide bindings
setTimeout(function () { // Delay for Mozilla
$(document).click(function () {
//$(document).unbind('click').unbind('keypress');
$(menu).fadeOut(o.outSpeed);
return false;
});
}, 0);
}
});
// Disable text selection
if ($.browser.mozilla) {
$('#' + o.menu).each(function () { $(this).css({ 'MozUserSelect': 'none' }); });
} else if ($.browser.msie) {
$('#' + o.menu).each(function () { $(this).bind('selectstart.disableTextSelect', function () { return false; }); });
} else {
$('#' + o.menu).each(function () { $(this).bind('mousedown.disableTextSelect', function () { return false; }); });
}
// Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome)
$(el).add($('UL.contextMenu')).bind('contextmenu', function () { return false; });
});
return $(this);
},
// Disable context menu items on the fly
disableContextMenuItems: function (o) {
if (o == undefined) {
// Disable all
$(this).find('LI').addClass('disabled');
return ($(this));
}
$(this).each(function () {
if (o != undefined) {
var d = o.split(',');
for (var i = 0; i < d.length; i++) {
$(this).find('A[href="' + d[i] + '"]').parent().addClass('disabled');
}
}
});
return ($(this));
},
// Enable context menu items on the fly
enableContextMenuItems: function (o) {
if (o == undefined) {
// Enable all
$(this).find('LI.disabled').removeClass('disabled');
return ($(this));
}
$(this).each(function () {
if (o != undefined) {
var d = o.split(',');
for (var i = 0; i < d.length; i++) {
$(this).find('A[href="' + d[i] + '"]').parent().removeClass('disabled');
}
}
});
return ($(this));
},
// Disable context menu(s)
disableContextMenu: function () {
$(this).each(function () {
$(this).addClass('disabled');
});
return ($(this));
},
// Enable context menu(s)
enableContextMenu: function () {
$(this).each(function () {
$(this).removeClass('disabled');
});
return ($(this));
},
// Destroy context menu(s)
destroyContextMenu: function () {
// Destroy specified context menus
$(this).each(function () {
// Disable action
$(this).unbind('mousedown').unbind('mouseup');
});
return ($(this));
}
});
})(jQuery);

View file

@ -1,5 +1,5 @@
function loadArtists(id, refresh) { function loadArtists(id, refresh) {
console.log("LOAD ARTISTS"); if (debug) { console.log("LOAD ARTISTS"); }
if (refresh) { if (refresh) {
$('#ArtistContainer').empty(); $('#ArtistContainer').empty();
} }
@ -11,7 +11,7 @@ function loadArtists(id, refresh) {
} else { } else {
url = baseURL + '/getIndexes.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp'; url = baseURL + '/getIndexes.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp';
} }
console.log(url); if (debug) { console.log(url); }
var content = $('#ArtistContainer').html(); var content = $('#ArtistContainer').html();
if (content === "") { if (content === "") {
// Load Artist List // Load Artist List
@ -20,13 +20,16 @@ function loadArtists(id, refresh) {
method: 'GET', method: 'GET',
dataType: 'jsonp', dataType: 'jsonp',
timeout: 10000, timeout: 10000,
done: function() { console.log("DONE!"); }, done: function () { if (debug) { console.log("DONE!"); } },
error: function() { console.log("ERROR!"); }, error: function () { if (debug) { console.log("ERROR!"); } },
success: function (data) { success: function (data) {
console.log("SUCCESS"); if (debug) { console.log("SUCCESS"); }
if (data["subsonic-response"].status === 'ok') { if (data["subsonic-response"].status === 'ok') {
var indexlist, indexname; var indexlist, indexname;
if (data["subsonic-response"].version != '') {
version = data["subsonic-response"].version;
}
// There is a bug in the API that doesn't return a JSON array for one artist // There is a bug in the API that doesn't return a JSON array for one artist
var indexes = []; var indexes = [];
if (data["subsonic-response"].indexes.index.length > 0) { if (data["subsonic-response"].indexes.index.length > 0) {
@ -110,6 +113,7 @@ function getMusicFolders() {
}); });
} }
function getAlbums(id, action, appendto) { function getAlbums(id, action, appendto) {
$('.first').trigger('click');
$.ajax({ $.ajax({
url: baseURL + '/getMusicDirectory.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&id=' + id, url: baseURL + '/getMusicDirectory.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&id=' + id,
method: 'GET', method: 'GET',
@ -163,6 +167,7 @@ function getAlbums(id, action, appendto) {
} }
if (appendto === '#AlbumRows' && isDir === false) { if (appendto === '#AlbumRows' && isDir === false) {
header = generateSongHeaderHTML(); header = generateSongHeaderHTML();
$('#songactions').show();
} }
$("#AlbumHeader").html(header); $("#AlbumHeader").html(header);
if (action === 'autoplay') { if (action === 'autoplay') {
@ -343,29 +348,44 @@ function search(type, query) {
success: function (data) { success: function (data) {
if (data["subsonic-response"].searchResult2 !== "") { if (data["subsonic-response"].searchResult2 !== "") {
$("#AlbumRows").empty(); $("#AlbumRows").empty();
var header = generateSongHeaderHTML(); var header;
$("#AlbumHeader").html(header);
// There is a bug in the API that doesn't return a JSON array for one artist
var children = []; var children = [];
if (type === 'song') {
header = generateSongHeaderHTML();
if (data["subsonic-response"].searchResult2.song !== undefined) {
if (data["subsonic-response"].searchResult2.song.length > 0) { if (data["subsonic-response"].searchResult2.song.length > 0) {
children = data["subsonic-response"].searchResult2.song; children = data["subsonic-response"].searchResult2.song;
} else { } else {
children[0] = data["subsonic-response"].searchResult2.song; children[0] = data["subsonic-response"].searchResult2.song;
} }
}
var rowcolor; }
var albumhtml; if (type === 'album') {
header = generateAlbumHeaderHTML();
if (data["subsonic-response"].searchResult2.album !== undefined) {
if (data["subsonic-response"].searchResult2.album.length > 0) {
children = data["subsonic-response"].searchResult2.album;
} else {
children[0] = data["subsonic-response"].searchResult2.album;
}
}
}
$("#AlbumHeader").html(header);
$.each(children, function (i, child) { $.each(children, function (i, child) {
if (i % 2 === 0) { if (i % 2 === 0) {
rowcolor = 'even'; rowcolor = 'even';
} else { } else {
rowcolor = 'odd'; rowcolor = 'odd';
} }
isDir = child.isDir;
if (isDir === true) {
albumhtml = generateAlbumHTML(rowcolor, child.id, child.parent, child.coverArt, child.title, child.artist, child.userRating);
} else {
var track; var track;
if (child.track === undefined) { track = "&nbsp;"; } else { track = child.track; } if (child.track === undefined) { track = "&nbsp;"; } else { track = child.track; }
var time = secondsToTime(child.duration); var time = secondsToTime(child.duration);
albumhtml = generateSongHTML(rowcolor, child.id, child.parent, track, child.title, child.artist, child.album, child.coverArt, child.userRating, time['m'], time['s']); albumhtml = generateSongHTML(rowcolor, child.id, child.parent, track, child.title, child.artist, child.album, child.coverArt, child.userRating, time['m'], time['s']);
}
$(albumhtml).appendTo("#AlbumRows"); $(albumhtml).appendTo("#AlbumRows");
}); });
} }
@ -374,6 +394,7 @@ function search(type, query) {
} }
function loadPlaylists(refresh) { function loadPlaylists(refresh) {
if (debug) { console.log("LOAD PLAYLISTS"); }
if (refresh) { if (refresh) {
$('#PlaylistContainer').empty(); $('#PlaylistContainer').empty();
} }
@ -400,6 +421,7 @@ function loadPlaylists(refresh) {
html += '<li id=\"' + playlist.id + '\" class=\"item\">'; html += '<li id=\"' + playlist.id + '\" class=\"item\">';
html += '<span>' + playlist.name + '</span>'; html += '<span>' + playlist.name + '</span>';
html += '<div class=\"floatright\"><a class=\"play\" href=\"\" title=\"Play\"></a></div>'; html += '<div class=\"floatright\"><a class=\"play\" href=\"\" title=\"Play\"></a></div>';
html += '<div class=\"floatright\"><a class=\"download\" href=\"\" title=\"Download\"></a></div>';
html += '<div class=\"floatright\"><a class=\"add\" href=\"\" title=\"Add To Current Playlist\"></a></div>'; html += '<div class=\"floatright\"><a class=\"add\" href=\"\" title=\"Add To Current Playlist\"></a></div>';
html += '</li>'; html += '</li>';
$(html).appendTo("#PlaylistContainer"); $(html).appendTo("#PlaylistContainer");
@ -425,6 +447,11 @@ function loadPlaylistsForMenu(menu) {
} else { } else {
playlists[0] = data["subsonic-response"].playlists.playlist; playlists[0] = data["subsonic-response"].playlists.playlist;
} }
if (menu === 'submenu_AddCurrentToPlaylist') {
$("<a href=\"#\" onclick=\"javascript:addToPlaylist('new', 'current'); return false;\">+ New</a><br />").appendTo("#" + menu);
} else {
$("<a href=\"#\" onclick=\"javascript:addToPlaylist('new', ''); return false;\">+ New</a><br />").appendTo("#" + menu);
}
$.each(playlists, function (i, playlist) { $.each(playlists, function (i, playlist) {
if (menu === 'submenu_AddCurrentToPlaylist') { if (menu === 'submenu_AddCurrentToPlaylist') {
$("<a href=\"#\" onclick=\"javascript:addToPlaylist('" + playlist.id + "', 'current'); return false;\">" + playlist.name + "</a><br />").appendTo("#" + menu); $("<a href=\"#\" onclick=\"javascript:addToPlaylist('" + playlist.id + "', 'current'); return false;\">" + playlist.name + "</a><br />").appendTo("#" + menu);
@ -432,6 +459,7 @@ function loadPlaylistsForMenu(menu) {
$("<a href=\"#\" onclick=\"javascript:addToPlaylist('" + playlist.id + "', ''); return false;\">" + playlist.name + "</a><br />").appendTo("#" + menu); $("<a href=\"#\" onclick=\"javascript:addToPlaylist('" + playlist.id + "', ''); return false;\">" + playlist.name + "</a><br />").appendTo("#" + menu);
} }
}); });
//$("<a href=\"#\" onclick=\"javascript:addToPlaylist('new'); return false;\">+ New Playlist</a><br />").appendTo("#submenu"); //$("<a href=\"#\" onclick=\"javascript:addToPlaylist('new'); return false;\">+ New Playlist</a><br />").appendTo("#submenu");
} }
}); });
@ -534,12 +562,13 @@ function addToPlaylist(playlistid, from) {
} }
}); });
} else { } else {
var reply = prompt("Choose a name for your new playlist.", "");
$.ajax({ $.ajax({
type: 'GET', type: 'GET',
url: baseURL + '/createPlaylist.view', url: baseURL + '/createPlaylist.view',
dataType: 'jsonp', dataType: 'jsonp',
timeout: 10000, timeout: 10000,
data: { u: username, p: passwordenc, v: version, c: applicationName, f: "jsonp", name: 'New Playlist', songId: selected }, data: { u: username, p: passwordenc, v: version, c: applicationName, f: "jsonp", name: "" + reply + "", songId: selected },
beforeSend: function (req) { beforeSend: function (req) {
req.setRequestHeader('Authorization', auth); req.setRequestHeader('Authorization', auth);
}, },
@ -576,12 +605,25 @@ function addToCurrent(addAll) {
} }
} }
} }
function downloadItem(id) { function downloadItem(id, type) {
var url;
if (type == 'item' && id) {
reqDownload = 'id=' + id;
}
if (type == 'playlist' && id) {
reqDownload = 'playlistUtf8Hex=' + id;
}
if (reqDownload) {
url = baseURL + '/download.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&' + reqDownload;
window.location = url;
}
/* 20120520 OwnCloud Merge
var url; var url;
if (id) { if (id) {
url = baseURL + '/download.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&id=' + id; url = baseURL + '/download.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&id=' + id;
window.location = url; window.location = url;
} }
*/
/* /*
$('table.songlist tr.selected').each(function (index) { $('table.songlist tr.selected').each(function (index) {
id = $(this).attr('childid'); id = $(this).attr('childid');

View file

@ -1,9 +0,0 @@
function auth()
{
$('#Username').val($.cookie('username'));
$('#Password').val($.cookie('password'));
$('#AutoAlbumSize').val($.cookie('AutoAlbumSize'));
$('#AutoPlaylistSize').val($.cookie('AutoPlaylistSize'));
$('#Server').val($.cookie('Server'));
$('#ApplicationName').val($.cookie('ApplicationName'));
}

View file

@ -15,7 +15,11 @@ function generateAlbumHTML(rowcolor, childid, parentid, coverart, title, artist,
html += '<a class=\"rate\" href=\"\" title=\"Add To Favorites\"></a>'; html += '<a class=\"rate\" href=\"\" title=\"Add To Favorites\"></a>';
} }
html += '</td>'; html += '</td>';
if (coverart == undefined) {
html += '<td class=\"albumart\"><img src=\"images/albumdefault_50.jpg\" /></td>';
} else {
html += '<td class=\"albumart\"><img src=\"' + baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&size=50&id=' + coverart + '\" /></td>'; html += '<td class=\"albumart\"><img src=\"' + baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&size=50&id=' + coverart + '\" /></td>';
}
html += '<td class=\"album\">' + title + '</td>'; html += '<td class=\"album\">' + title + '</td>';
html += '<td class=\"artist\">' + artist + '</td>'; html += '<td class=\"artist\">' + artist + '</td>';
html += '</tr>'; html += '</tr>';
@ -32,6 +36,7 @@ function generateSongHTML(rowcolor, childid, parentid, track, title, artist, alb
html += '<td class=\"itemactions\"><a class=\"add\" href=\"\" title=\"Add To Current Playlist\"></a>'; html += '<td class=\"itemactions\"><a class=\"add\" href=\"\" title=\"Add To Current Playlist\"></a>';
html += '<a class=\"remove\" href=\"\" title=\"Remove\"></a>'; html += '<a class=\"remove\" href=\"\" title=\"Remove\"></a>';
html += '<a class=\"play\" href=\"\" title=\"Play\"></a>'; html += '<a class=\"play\" href=\"\" title=\"Play\"></a>';
html += '<a class=\"download\" href=\"\" title=\"Download\"></a>';
if (rating === 5) { if (rating === 5) {
html += '<a class=\"favorite\" href=\"\" title=\"Favorite\"></a>'; html += '<a class=\"favorite\" href=\"\" title=\"Favorite\"></a>';
} else { } else {
@ -41,7 +46,13 @@ function generateSongHTML(rowcolor, childid, parentid, track, title, artist, alb
html += '<td class=\"track\">' + track + '</td>'; html += '<td class=\"track\">' + track + '</td>';
html += '<td class=\"title\">' + title + '</td>'; html += '<td class=\"title\">' + title + '</td>';
html += '<td class=\"artist\">' + artist + '</td>'; html += '<td class=\"artist\">' + artist + '</td>';
html += '<td class=\"album\">' + album + '<img src=\"' + baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&size=25&id=' + coverart + '\" /></td>'; var coverartSrc;
if (coverart == undefined) {
coverartSrc = 'images/albumdefault_25.jpg';
} else {
coverartSrc = baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&size=25&id=' + coverart;
}
html += '<td class=\"album\"><a href="javascript:getAlbums(\'' + parentid + '\',\'\',\'#AlbumRows\')">' + album + '<img src=\"' + coverartSrc + '\" /></a></td>';
html += '<td class=\"time\">' + m + ':' + s + '</td>'; html += '<td class=\"time\">' + m + ':' + s + '</td>';
html += '</tr>'; html += '</tr>';
return html; return html;

View file

@ -9,7 +9,7 @@ function playSong(el, songid, albumid) {
req.setRequestHeader('Authorization', auth); req.setRequestHeader('Authorization', auth);
}, },
success: function (data) { success: function (data) {
var title, artist, album; var title, artist, album, rating;
if (data["subsonic-response"].directory !== undefined) { if (data["subsonic-response"].directory !== undefined) {
// There is a bug in the API that doesn't return a JSON array for one artist // There is a bug in the API that doesn't return a JSON array for one artist
var children = []; var children = [];
@ -19,20 +19,34 @@ function playSong(el, songid, albumid) {
children[0] = data["subsonic-response"].directory.child; children[0] = data["subsonic-response"].directory.child;
} }
$.each(children, function (i, child) { $.each(children, function (i, child) {
if (child.id === songid) { if (child.id == songid) {
title = child.title; title = child.title;
artist = child.artist; artist = child.artist;
album = child.album; album = child.album;
coverart = child.coverArt; coverart = child.coverArt;
rating = child.userRating;
} }
}); });
} }
if (rating == 5) {
$('#songdetails_rate').attr('class', 'favorite');
} else {
$('#songdetails_rate').attr('class', 'rate');
}
$('#songdetails_song').html(title); $('#songdetails_song').html(title);
$('#songdetails_song').attr('parentid', albumid); $('#songdetails_song').attr('parentid', albumid);
$('#songdetails_song').attr('childid', songid); $('#songdetails_song').attr('childid', songid);
$('#songdetails_artist').html(artist + ' - ' + album); $('#songdetails_artist').html(artist + ' - ' + album);
$('#coverartimage').attr('href', baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&id=' + coverart); var coverartSrc, coverartFullSrc;
$('#coverartimage img').attr('src', baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&size=50&id=' + coverart); if (coverart == undefined) {
coverartSrc = 'images/albumdefault_50.jpg';
coverartFullSrc = '';
} else {
coverartSrc = baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&size=50&id=' + coverart;
coverartFullSrc = baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&id=' + coverart;
}
$('#coverartimage').attr('href', coverartFullSrc);
$('#coverartimage img').attr('src', coverartSrc);
$('#playermiddle').css('visibility', 'visible'); $('#playermiddle').css('visibility', 'visible');
$('#songdetails').css('visibility', 'visible'); $('#songdetails').css('visibility', 'visible');
// SoundManager Initialize // SoundManager Initialize
@ -40,21 +54,26 @@ function playSong(el, songid, albumid) {
if (audio) { if (audio) {
soundManager.destroySound('audio'); soundManager.destroySound('audio');
} }
soundManager.onready(function () {
if (debug) {
console.log("SM HTML5 STATUS");
$.each(soundManager.html5, function (key, value) {
console.log(key + ': ' + value);
});
}
audio = soundManager.createSound({ audio = soundManager.createSound({
id: 'audio', id: 'audio',
url: baseURL + '/stream.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&id=' + songid + '&salt=' + salt, url: baseURL + '/stream.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&id=' + songid + '&salt=' + salt,
stream: true, stream: true,
whileloading: function () { whileloading: function () {
if (debug) { if (debug) { console.log('loaded:' + this.bytesLoaded + ' total:' + this.bytesTotal); }
console.log('loaded:' + this.bytesLoaded + ' total:' + this.bytesTotal);
}
var percent = this.bytesLoaded / this.bytesTotal; var percent = this.bytesLoaded / this.bytesTotal;
var scrubber = $('#audio_wrapper0').find(".scrubber"); var scrubber = $('#audio_wrapper0').find(".scrubber");
var loaded = $('#audio_wrapper0').find(".loaded"); var loaded = $('#audio_wrapper0').find(".loaded");
loaded.css('width', (scrubber.get(0).offsetWidth * percent) + 'px'); loaded.css('width', (scrubber.get(0).offsetWidth * percent) + 'px');
}, },
whileplaying: function () { whileplaying: function () {
//console.log('position:' + this.position + ' duration:' + this.duration); if (debug) { console.log('position:' + this.position + ' duration:' + this.duration); }
var percent = this.position / this.duration; var percent = this.position / this.duration;
var scrubber = $('#audio_wrapper0').find(".scrubber"); var scrubber = $('#audio_wrapper0').find(".scrubber");
var progress = $('#audio_wrapper0').find(".progress"); var progress = $('#audio_wrapper0').find(".progress");
@ -68,6 +87,7 @@ function playSong(el, songid, albumid) {
// Scrobble song once percentage is reached // Scrobble song once percentage is reached
if (!scrobbled && p > 30 && (percent > 0.5 || p > 480)) { if (!scrobbled && p > 30 && (percent > 0.5 || p > 480)) {
if (debug) { console.log("LAST.FM SCROBBLE"); }
scrobbleSong(true); scrobbleSong(true);
} }
}, },
@ -77,6 +97,15 @@ function playSong(el, songid, albumid) {
dm = Math.floor(dp / 60), dm = Math.floor(dp / 60),
ds = Math.floor(dp % 60); ds = Math.floor(dp % 60);
duration.html((dm < 10 ? '0' : '') + dm + ':' + (ds < 10 ? '0' : '') + ds); duration.html((dm < 10 ? '0' : '') + dm + ':' + (ds < 10 ? '0' : '') + ds);
var scrubber = $('#audio_wrapper0').find(".scrubber");
scrubber.unbind("click");
scrubber.click(function (e) {
var x = (e.pageX - this.offsetLeft) / scrubber.width();
var position = Math.round(dp * 1000 * x);
audio.play({
position: position
});
});
}, },
onfinish: function () { onfinish: function () {
var next = $('#CurrentPlaylistContainer tr.playing').next(); var next = $('#CurrentPlaylistContainer tr.playing').next();
@ -84,6 +113,7 @@ function playSong(el, songid, albumid) {
} }
}); });
audio.play('audio'); audio.play('audio');
});
$('table.songlist tr.song').removeClass('playing'); $('table.songlist tr.song').removeClass('playing');
$(el).addClass('playing'); $(el).addClass('playing');
@ -93,7 +123,7 @@ function playSong(el, songid, albumid) {
scrobbled = false; scrobbled = false;
if ($.cookie('EnableNotifications')) { if ($.cookie('EnableNotifications')) {
showNotification(baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&size=50&id=' + coverart, toHTML.un(title), toHTML.un(artist + ' - ' + album)); showNotification(coverartSrc, toHTML.un(title), toHTML.un(artist + ' - ' + album));
} }
if ($.cookie('ScrollTitle')) { if ($.cookie('ScrollTitle')) {
scrollTitle(toHTML.un(artist) + ' - ' + toHTML.un(title)); scrollTitle(toHTML.un(artist) + ' - ' + toHTML.un(title));

View file

@ -1,39 +0,0 @@
require(["jquery", "sm/soundmanager2-jsmin", "plugins/jquery.scrollTo-1.4.2-min", "plugins/jquery.disable.text.select.pack",
"plugins/jquery.cookie", "plugins/jquery.base64", "plugins/jquery.dateFormat-1.0", "plugins/jquery.periodic", "plugins/jquery.shuffle",
"fancybox/jquery.fancybox-1.3.4.pack",
"plugins/jquery.linkify-1.0-min", "libs/utils", "libs/api", "libs/generators", "libs/chat", "libs/player", "app", "ui-load", "ui-ready"
], function($) {
$(function() {
//Sound manager
soundManager.url = 'js/sm/swf';
soundManager.preferFlash = false;
soundManager.debugMode = false;
//soundManager.flashVersion = 9; // optional: shiny features (default = 8)
//soundManager.useFlashBlock = false; // optionally, enable when you're ready to dive in
//User config staff
$('#Username').val($.cookie('username'));
$('#Password').val($.cookie('password'));
$('#AutoAlbumSize').val($.cookie('AutoAlbumSize'));
$('#AutoPlaylistSize').val($.cookie('AutoPlaylistSize'));
$('#Server').val($.cookie('Server'));
$('#ApplicationName').val($.cookie('ApplicationName'));
if ($.cookie('HideAZ')) {
$('#HideAZ').attr('checked', true);
} else {
$('#HideAZ').attr('checked', false);
}
if ($.cookie('EnableNotifications')) {
$('#EnableNotifications').attr('checked', true);
} else {
$('#EnableNotifications').attr('checked', false);
}
if ($.cookie('ScrollTitle')) {
$('#ScrollTitle').attr('checked', true);
} else {
$('#ScrollTitle').attr('checked', false);
}
});
});

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,35 @@
$(document).ready(function () { $(document).ready(function () {
//User config staff
$('#Username').val($.cookie('username'));
$('#Password').val($.cookie('password'));
$('#AutoAlbumSize').val($.cookie('AutoAlbumSize'));
$('#AutoPlaylistSize').val($.cookie('AutoPlaylistSize'));
$('#Server').val($.cookie('Server'));
$('#ApplicationName').val($.cookie('ApplicationName'));
// Set Preferences defaults
if ($.cookie('HideAZ')) {
$('#HideAZ').attr('checked', true);
} else {
$('#HideAZ').attr('checked', false);
}
if ($.cookie('EnableNotifications')) {
$('#EnableNotifications').attr('checked', true);
} else {
$('#EnableNotifications').attr('checked', false);
}
if ($.cookie('ScrollTitle')) {
$('#ScrollTitle').attr('checked', true);
} else {
$('#ScrollTitle').attr('checked', false);
}
if ($.cookie('Debug')) {
$('#Debug').attr('checked', true);
debug = true;
} else {
$('#Debug').attr('checked', false);
}
// Tabs // Tabs
$(".tabcontent").hide(); //Hide all content $(".tabcontent").hide(); //Hide all content
if (!$.cookie('username') && !$.cookie('password') && !$.cookie('Server')) { if (!$.cookie('username') && !$.cookie('password') && !$.cookie('Server')) {
@ -113,7 +144,7 @@
}); });
$('tr.album a.download').live('click', function (event) { $('tr.album a.download').live('click', function (event) {
var itemid = $(this).parent().parent().attr('childid'); var itemid = $(this).parent().parent().attr('childid');
downloadItem(itemid); downloadItem(itemid, 'item');
return false; return false;
}); });
$('tr.album a.rate').live('click', function (event) { $('tr.album a.rate').live('click', function (event) {
@ -177,7 +208,36 @@
$('table.songlist tr.song a.play').live('click', function (event) { $('table.songlist tr.song a.play').live('click', function (event) {
var songid = $(this).parent().parent().attr('childid'); var songid = $(this).parent().parent().attr('childid');
var albumid = $(this).parent().parent().attr('parentid'); var albumid = $(this).parent().parent().attr('parentid');
if (!$('#tabCurrent').is(':visible')) {
$('#CurrentPlaylistContainer tbody').empty();
var track = $(this).parent().parent();
$(track).clone().appendTo('#CurrentPlaylistContainer');
id = 0;
count = 0;
while (id !== undefined) {
track = track.next();
id = $(track).attr('childid');
$(track).clone().appendTo('#CurrentPlaylistContainer');
count++;
}
updateMessage(count + ' Song(s) Added');
var firstsong = $('#CurrentPlaylistContainer tr.song:first');
songid = $(firstsong).attr('childid');
albumid = $(firstsong).attr('parentid');
playSong(firstsong, songid, albumid);
} else {
playSong($(this).parent().parent(), songid, albumid); playSong($(this).parent().parent(), songid, albumid);
}
/* 20120520 OwnCloud Merge
var songid = $(this).parent().parent().attr('childid');
var albumid = $(this).parent().parent().attr('parentid');
playSong($(this).parent().parent(), songid, albumid);
*/
return false;
});
$('table.songlist tr.song a.download').live('click', function (event) {
var itemid = $(this).parent().parent().attr('childid');
downloadItem(itemid, 'item');
return false; return false;
}); });
$('table.songlist tr.song a.add').live('click', function (event) { $('table.songlist tr.song a.add').live('click', function (event) {
@ -282,7 +342,8 @@
}); });
$('#action_Search').click(function () { $('#action_Search').click(function () {
var query = $('#Search').val(); var query = $('#Search').val();
search('song', query); var type = $('#SearchType').val();
search(type, query);
$('#Search').val(""); $('#Search').val("");
return false; return false;
}); });
@ -347,10 +408,19 @@
getPlaylist($(this).parent().parent().attr("id"), 'autoplay', '#CurrentPlaylistContainer tbody'); getPlaylist($(this).parent().parent().attr("id"), 'autoplay', '#CurrentPlaylistContainer tbody');
return false; return false;
}); });
$('#PlaylistContainer li.item a.download').live('click', function (event) {
var itemid = $(this).parent().parent().attr('id');
downloadItem(itemid, 'playlist');
return false;
});
$('#PlaylistContainer li.item a.add').live('click', function () { $('#PlaylistContainer li.item a.add').live('click', function () {
getPlaylist($(this).parent().parent().attr("id"), '', '#CurrentPlaylistContainer tbody'); getPlaylist($(this).parent().parent().attr("id"), '', '#CurrentPlaylistContainer tbody');
return false; return false;
}); });
$('#action_RefreshPlaylists').click(function () {
loadPlaylists(true);
return false;
});
$('#action_DeletePlaylist').click(function () { $('#action_DeletePlaylist').click(function () {
if ($('#PlaylistContainer li.selected').length > 0) { if ($('#PlaylistContainer li.selected').length > 0) {
if (confirmDelete()) { if (confirmDelete()) {
@ -408,6 +478,20 @@
'hideOnContentClick': true, 'hideOnContentClick': true,
'type': 'image' 'type': 'image'
}); });
$('#songdetails a.rate').live('click', function (event) {
var itemid = $('#songdetails_song').attr('childid');
rateSong(itemid, 5);
$(this).removeClass('rate');
$(this).addClass('favorite');
return false;
});
$('#songdetails a.favorite').live('click', function (event) {
var itemid = $('#songdetails_song').attr('childid');
rateSong(itemid, 0);
$(this).removeClass('favorite');
$(this).addClass('rate');
return false;
});
// Side Bar Click Events // Side Bar Click Events
$('#action_ToggleSideBar').live('click', function () { $('#action_ToggleSideBar').live('click', function () {
@ -480,6 +564,12 @@
$.cookie('ScrollTitle', '1', { expires: 365 }); $.cookie('ScrollTitle', '1', { expires: 365 });
} }
}); });
$('#Debug').live('click', function () {
if ($('#Debug').is(':checked')) {
$.cookie('Debug', '1', { expires: 365 });
debug = true;
}
});
$('input#Password').keydown(function (e) { $('input#Password').keydown(function (e) {
var unicode = e.charCode ? e.charCode : e.keyCode; var unicode = e.charCode ? e.charCode : e.keyCode;
if (unicode == 13) { if (unicode == 13) {

View file

@ -274,6 +274,18 @@ ul.mainlist li.item a.play:hover
{ {
background: url('../images/play_6x8.png') no-repeat 6px center #DEECFB; background: url('../images/play_6x8.png') no-repeat 6px center #DEECFB;
} }
ul.mainlist li.item a.download
{
float: left;
width: 20px;
height: 18px;
display: block;
background: url('../images/download_gl_9x12.png') no-repeat 5px center;
}
ul.mainlist li.item a.download:hover
{
background: url('../images/download_gd_9x12.png') no-repeat 5px center #DEECFB;
}
ul.mainlist li.item a.add ul.mainlist li.item a.add
{ {
width: 20px; width: 20px;
@ -456,6 +468,15 @@ table.songlist tr.song td.album
padding: 0; padding: 0;
line-height: 31px; line-height: 31px;
} }
table.songlist tr.song td.album a
{
color: #829FC0;
text-decoration: none;
}
table.songlist tr.song td.album a:hover
{
text-decoration: underline;
}
table.songlist tr.song td.album img table.songlist tr.song td.album img
{ {
border: 1px solid #DEDEDE; border: 1px solid #DEDEDE;
@ -484,6 +505,18 @@ table.songlist tr.song a.play:hover
{ {
background: url('../images/play_6x8.png') no-repeat 7px center #DEECFB; background: url('../images/play_6x8.png') no-repeat 7px center #DEECFB;
} }
table.songlist tr.song a.download
{
float: left;
width: 20px;
height: 20px;
display: block;
background: url('../images/download_gl_9x12.png') no-repeat 5px center;
}
table.songlist tr.song a.download:hover
{
background: url('../images/download_gd_9x12.png') no-repeat 5px center #DEECFB;
}
table.songlist tr.song a.add table.songlist tr.song a.add
{ {
float: left; float: left;
@ -537,6 +570,10 @@ table.songlist tr.selected td:first-child
{ {
background: url('../images/check_8x7.png') 10px 16px no-repeat; background: url('../images/check_8x7.png') 10px 16px no-repeat;
} }
table.songlist tr.selected td.album a
{
color: #f2f2f2;
}
/* tablesorter style */ /* tablesorter style */
table.tablesorter { table.tablesorter {
font-family:arial; font-family:arial;
@ -624,6 +661,11 @@ background-color: #8dbdd8;
margin: 4px 0 0 0; margin: 4px 0 0 0;
padding: 0 0 0 5px; padding: 0 0 0 5px;
} }
#songactions
{
display: none;
float: left;
}
.submenu .submenu
{ {
position: absolute; position: absolute;
@ -773,7 +815,7 @@ background-color: #8dbdd8;
.audiojs .scrubber .audiojs .scrubber
{ {
height: 2px; height: 2px;
margin: 26px 5px 0px 5px; margin: 28px 5px 0px 5px;
float: none; float: none;
width: auto; width: auto;
position: relative; position: relative;
@ -852,7 +894,7 @@ background-color: #8dbdd8;
} }
#songdetails #songdetails
{ {
width: 250px; width: 280px;
margin: 0 8px; margin: 0 8px;
float: left; float: left;
visibility: hidden; visibility: hidden;
@ -891,6 +933,26 @@ background-color: #8dbdd8;
text-align: right; text-align: right;
width: 37px; width: 37px;
} }
#songdetails a.rate
{
float: left;
height: 60px;
width: 30px;
display: block;
background: url('../images/star_wo_12x12.png') 10px center no-repeat;
}
#songdetails a.rate:hover
{
background: url('../images/star_lgo_12x12.png') 10px center no-repeat;
}
#songdetails a.favorite
{
float: left;
height: 60px;
width: 30px;
display: block;
background: url('../images/star_yo_12x12.png') 10px center no-repeat;
}
.vertshade { .vertshade {
position: relative; position: relative;
top: 0; top: 0;
@ -952,7 +1014,13 @@ span.code
font-family:"Courier New",Courier,mono; font-family:"Courier New",Courier,mono;
font-size: 11px; font-size: 11px;
} }
#donate
{
text-align: center;
background: #f2f2f2;
border: 1px solid #E0E0E0;
padding: 10px;
}
/* Button Style */ /* Button Style */
@ -998,12 +1066,6 @@ input
font-size: 14px; font-size: 14px;
padding: 5px; padding: 5px;
} }
input.medium
{
border: 1px solid #DCDCDC;
width: 110px;
margin: 0 5px;
}
input.large input.large
{ {
border: 1px solid #DCDCDC; border: 1px solid #DCDCDC;
@ -1022,6 +1084,12 @@ input.chat
width: 150px; width: 150px;
margin: 5px; margin: 5px;
} }
input#Search
{
border: 1px solid #DCDCDC;
width: 110px;
margin: 0 0 0 5px;
}
select select
{ {
font-family: Calibri, Arial, Verdana; font-family: Calibri, Arial, Verdana;
@ -1029,6 +1097,10 @@ select
margin: 5px; margin: 5px;
border: 1px solid #d6d6d6; border: 1px solid #d6d6d6;
} }
select#SearchType
{
margin: 0;
}
select#MusicFolders select#MusicFolders
{ {
width: 94%; width: 94%;