1<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="iso-8859-1"%> 2 3<html><head> 4 <%@ include file="head.jsp" %> 5 <%@ include file="jquery.jsp" %> 6 7 <c:choose> 8 <c:when test="${model.customScrollbar}"> 9 <link href="<c:url value="/style/customScrollbar.css"/>" rel="stylesheet"> 10 <script type="text/javascript" src="<c:url value="/script/jquery.mousewheel.min.js"/>"></script> 11 <script type="text/javascript" src="<c:url value="/script/jquery.mCustomScrollbar.concat.min.js"/>"></script> 12 </c:when> 13 <c:otherwise> 14 <link href="<c:url value="/style/customScrollbarAuto.css"/>" rel="stylesheet"> 15 </c:otherwise> 16 </c:choose> 17 18 19 <script type="text/javascript" src="<c:url value="/dwr/util.js"/>"></script> 20 <script type="text/javascript" src="<c:url value="/dwr/engine.js"/>"></script> 21 <script type="text/javascript" src="<c:url value="/dwr/interface/starService.js"/>"></script> 22 <script type="text/javascript" src="<c:url value="/dwr/interface/lovedTrackService.js"/>"></script> 23 <script type="text/javascript" src="<c:url value="/dwr/interface/playlistService.js"/>"></script> 24 25 <script type="text/javascript" language="javascript"> 26 27 function init() { 28 dwr.engine.setErrorHandler(null); 29 30 $("#dialog-select-playlist").dialog({resizable: true, width:450, height: 350, modal: false, autoOpen: false, 31 buttons: { 32 "<fmt:message key="common.cancel"/>": function() { 33 $(this).dialog("close"); 34 } 35 }}); 36 } 37 38 function toggleStar(mediaFileId, element) { 39 starService.star(mediaFileId, !$(element).hasClass("fa-star")); 40 $(element).toggleClass("fa-star fa-star-o starred"); 41 } 42 43 function toggleLoved(mediaFileId, element) { 44 lovedTrackService.love(mediaFileId, !$(element).hasClass("fa-heart")); 45 $(element).toggleClass("fa-heart fa-heart-o loved"); 46 } 47 48 function actionSelected(id) { 49 50 if (id == "top") { 51 return; 52 } else if (id == "savePlaylist") { 53 onSaveLovedPlaylist(); 54 } else if (id == "selectAll") { 55 selectAll(true); 56 } else if (id == "selectNone") { 57 selectAll(false); 58 } else if (id == "appendPlaylist") { 59 onAppendPlaylist(); 60 } else if (id == "saveasPlaylist") { 61 onSaveasPlaylist(); 62 } 63 $("#moreActions").prop("selectedIndex", 0); 64 } 65 66 function getSelectedIndexes() { 67 var result = ""; 68 for (var i = 0; i < ${fn:length(model.loved)}; i++) { 69 var checkbox = $("#songIndex" + i); 70 if (checkbox != null && checkbox.is(":checked")) { 71 result += "i=" + i + "&"; 72 } 73 } 74 return result; 75 } 76 77 function selectAll(b) { 78 for (var i = 0; i < ${fn:length(model.loved)}; i++) { 79 var checkbox = $("#songIndex" + i); 80 if (checkbox != null) { 81 if (b) { 82 checkbox.attr("checked", "checked"); 83 } else { 84 checkbox.removeAttr("checked"); 85 } 86 } 87 } 88 } 89 90 function onAppendPlaylist() { 91 playlistService.getWritablePlaylists(playlistCallback); 92 } 93 94 function playlistCallback(playlists) { 95 96 $("#dialog-select-playlist-list").empty(); 97 for (var i = 0; i < playlists.length; i++) { 98 var playlist = playlists[i]; 99 $("<p class='dense'><b><a href='#' onclick='appendPlaylist(" + playlist.id + ")'>" + playlist.name + "</a></b></p>").appendTo("#dialog-select-playlist-list"); 100 } 101 $("#dialog-select-playlist").dialog("open"); 102 } 103 104 function appendPlaylist(playlistId) { 105 $("#dialog-select-playlist").dialog("close"); 106 107 var mediaFileIds = new Array(); 108 109 for (var i = 0; i < ${fn:length(model.loved)}; i++) { 110 111 var checkbox = $("#songIndex" + i); 112 if (checkbox && checkbox.is(":checked")) { 113 mediaFileIds.push($("#songId" + i).html()); 114 } 115 } 116 playlistService.appendToPlaylist(playlistId, mediaFileIds, function (){ 117 //parent.left.updatePlaylists(); 118 $().toastmessage("showSuccessToast", "append to Playlist"); 119 }); 120 } 121 122 function onSavePlaylist() { 123 124 selectAll(true); 125 126 var mediaFileIds = new Array(); 127 128 for (var i = 0; i < ${fn:length(model.loved)}; i++) { 129 130 var checkbox = $("#songIndex" + i); 131 if (checkbox && checkbox.is(":checked")) { 132 mediaFileIds.push($("#songId" + i).html()); 133 } 134 } 135 playlistService.savePlaylist(mediaFileIds, function (){ 136 //parent.left.updatePlaylists(); 137 $().toastmessage("showSuccessToast", "<fmt:message key="playlist.toast.saveasplaylist"/>"); 138 }); 139 } 140 141 142 function onSaveLovedPlaylist() { 143 144 selectAll(true); 145 var mediaFileIds = new Array(); 146 for (var i = 0; i < ${fn:length(model.loved)}; i++) { 147 var checkbox = $("#songIndex" + i); 148 if (checkbox && checkbox.is(":checked")) { 149 mediaFileIds.push($("#songId" + i).html()); 150 } 151 } 152 153 // playlistService.saveLovedPlaylist(mediaFileIds, function (){ 154 // parent.left.updatePlaylists(); 155 // $().toastmessage("showSuccessToast", "<fmt:message key="playlist.toast.saveasplaylist"/>"); 156 // }); 157 158 playlistService.createPlaylistForMain(mediaFileIds, null, function (playlistId) { 159 // parent.left.updatePlaylists(); 160 parent.main.location.href = "playlist.view?id=" + playlistId; 161 $().toastmessage("showSuccessToast", "<fmt:message key="playlist.toast.saveasplaylist"/>"); 162 }); 163 164 } 165 166 function onSaveasPlaylist() { 167 168 var mediaFileIds = new Array(); 169 for (var i = 0; i < ${fn:length(model.loved)}; i++) { 170 var checkbox = $("#songIndex" + i); 171 if (checkbox && checkbox.is(":checked")) { 172 mediaFileIds.push($("#songId" + i).html()); 173 } 174 } 175 playlistService.savePlaylist(mediaFileIds, function (){ 176 //parent.left.updatePlaylists(); 177 $().toastmessage("showSuccessToast", "<fmt:message key="playlist.toast.saveasplaylist"/>"); 178 }); 179 } 180</script> 181</head> 182<body class="mainframe bgcolor1" onload="init();"> 183 184<!-- content block --> 185 186<div id="content_main" class="content_main"> 187<!-- CONTENT --> 188 189<h1> 190 <img src="<spring:theme code="starOnImage"/>" width="32" alt=""> 191 <fmt:message key="loved.title"/> 192</h1> 193 194<br> 195 <c:if test="${empty model.loved}"> 196 <p><em><fmt:message key="loved.empty"/></em></p> 197 </c:if> 198 199 <h2> 200 <select id="moreActions" onchange="actionSelected(this.options[selectedIndex].id);" style="margin-bottom:1.0em"> 201 <option id="top" selected="selected"><fmt:message key="main.more"/></option> 202 <optgroup label="all Loved Songs"/> 203 <option id="savePlaylist"><fmt:message key="playlist.save"/></option> 204 <optgroup label="<fmt:message key="main.more.selection"/>"/> 205 <option id="selectAll"><fmt:message key="playlist.more.selectall"/></option> 206 <option id="selectNone"><fmt:message key="playlist.more.selectnone"/></option> 207 <option id="appendPlaylist"><fmt:message key="playlist.append"/></option> 208 <option id="saveasPlaylist"><fmt:message key="playlist.save"/></option> 209 </select> 210 </h2> 211 <p> 212 <i class="fa fa-chevron-right icon control"></i> <a href="loved.view?"><fmt:message key="common.refresh"/></a> 213 </p> 214 215 <h1 style="border-top: 1px dotted #666;"></h1> 216 217 <table class="music" style="border-collapse:collapse;margin-top:5px;"> 218 <c:forEach items="${model.loved}" var="song" varStatus="loopStatus"> 219 220 <madsonic:url value="/main.view" var="mainUrl"> 221 <madsonic:param name="path" value="${song.parentPath}"/> 222 </madsonic:url> 223 <tr> 224 225 <td ${loopStatus.count % 2 == 1 ? "class='fit bgcolor2'" : "class='fit'"} style="padding-left:2px;"> 226 <c:import url="coverArtThumb.jsp"> 227 <c:param name="albumId" value="${song.id}"/> 228 <c:param name="auth" value="${song.hash}"/> 229 <c:param name="artistName" value="${song.name}"/> 230 <c:param name="coverArtSize" value="50"/> 231 <c:param name="scale" value="0.5"/> 232 <c:param name="showLink" value="true"/> 233 <c:param name="showZoom" value="false"/> 234 <c:param name="showChange" value="false"/> 235 <c:param name="showArtist" value="false"/> 236 <c:param name="typArtist" value="true"/> 237 <c:param name="appearAfter" value="5"/> 238 </c:import> 239 </td> 240 241 <td ${loopStatus.count % 2 == 1 ? "class='fit bgcolor2'" : "class='fit'"} style="padding-left:0.5em;padding-right:0em"> 242 243 <c:import url="playAddDownload.jsp"> 244 <c:param name="id" value="${song.id}"/> 245 <c:param name="playEnabled" value="${model.user.streamRole and not model.partyMode and model.buttonVisibility.playVisible}"/> 246 <c:param name="playAddEnabled" value="${model.user.streamRole and not model.partyMode and model.buttonVisibility.playAddVisible}"/> 247 <c:param name="playMoreEnabled" value="${model.user.streamRole and not model.partyMode and model.buttonVisibility.playMoreVisible}"/> 248 <c:param name="addEnabled" value="${model.user.streamRole and (not model.partyMode or not song.directory) and model.buttonVisibility.addContextVisible}"/> 249 <c:param name="addNextEnabled" value="${model.user.streamRole and (not model.partyMode or not song.directory) and model.buttonVisibility.addNextVisible}"/> 250 <c:param name="addLastEnabled" value="${model.user.streamRole and (not model.partyMode or not song.directory) and model.buttonVisibility.addLastVisible}"/> 251 <c:param name="downloadEnabled" value="${model.user.downloadRole and not model.partyMode and model.buttonVisibility.downloadVisible}"/> 252 <c:param name="loveEnabled" value="${model.buttonVisibility.lovedVisible}"/> 253 <c:param name="loved" value="${not empty song.lovedDate}"/> 254 <c:param name="starEnabled" value="${model.buttonVisibility.starredVisible}"/> 255 <c:param name="starred" value="${not empty song.starredDate}"/> 256 <c:param name="video" value="${song.video and model.player.web}"/> 257 <c:param name="asTable" value="false"/> 258 </c:import> 259 </td> 260 261 <td ${loopStatus.count % 2 == 1 ? "class='fit bgcolor2'" : "class='fit'"} style="padding-left:1em;padding-right:1.0em;max-width:15px;"> 262 <input type="checkbox" class="checkbox" id="songIndex${loopStatus.count - 1}"> 263 <span id="songId${loopStatus.count - 1}" style="display:none">${song.id}</span> 264 </td> 265 266 <td ${loopStatus.count % 2 == 1 ? "class='bgcolor2'" : "class=''"} style="padding-left:1em;padding-right:1em"> 267 ${song.title} 268 </td> 269 <td ${loopStatus.count % 2 == 1 ? "class='bgcolor2'" : "class=''"} style="padding-right:1em"> 270 <a href="${mainUrl}"><span class="detail">${song.albumName}</span></a> 271 </td> 272 <td ${loopStatus.count % 2 == 1 ? "class='bgcolor2'" : ""} style="padding-right:1em"> 273 <span class="detail">${song.artist}</span> 274 </td> 275 </tr> 276 </c:forEach> 277 </table> 278 279<div id="dialog-select-playlist" title="<fmt:message key="main.addtoplaylist.title"/>" style="display: none;"> 280 <p><fmt:message key="main.addtoplaylist.text"/></p> 281 <div id="dialog-select-playlist-list"></div> 282</div> 283 284<!-- CONTENT --> 285</div> 286 287<c:if test="${model.customScrollbar}"> 288 289 <script> 290 (function($){ 291 $(window).load(function(){ 292 293 $("#content_main").mCustomScrollbar({ 294 axis:"y", 295 scrollInertia:600, /*scrolling inertia: integer (milliseconds)*/ 296 mouseWheel:true, /*mousewheel support: boolean*/ 297 mouseWheelPixels:"auto", /*mousewheel pixels amount: integer, "auto"*/ 298 autoDraggerLength:true, /*auto-adjust scrollbar dragger length: boolean*/ 299 autoHideScrollbar:false, /*auto-hide scrollbar when idle*/ 300 alwaysShowScrollbar:true, 301 scrollButtons:{ enable:true, /*scroll buttons support: boolean*/ 302 scrollType:"continuous", /*scroll buttons scrolling type: "continuous", "pixels"*/ 303 scrollSpeed:"auto", /*scroll buttons continuous scrolling speed: integer, "auto"*/ 304 scrollAmount:40 /*scroll buttons pixels scroll amount: integer (pixels)*/}, 305 theme:"${model.customScrollbarTheme}", 306 scrollbarPosition:"inside" 307 }); 308 }); 309 })(jQuery); 310 </script> 311</c:if> 312</body> 313</html>