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>&nbsp;<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>