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    <script type="text/javascript" src="<c:url value="/dwr/engine.js"/>"></script>
8    <script type="text/javascript" src="<c:url value="/dwr/util.js"/>"></script>
9    <script type="text/javascript" src="<c:url value="/dwr/interface/tagService.js"/>"></script>
10</head>
11<body class="mainframe bgcolor1">
12
13<script type="text/javascript" language="javascript">
14    var index = 0;
15    var fileCount = ${fn:length(model.songs)};
16    function setArtist() {
17        var artist = dwr.util.getValue("artistAll");
18        for (i = 0; i < fileCount; i++) {
19            dwr.util.setValue("artist" + i, artist);
20        }
21    }
22    function setAlbumArtist() {
23        var albumartist = dwr.util.getValue("albumartistAll");
24        for (i = 0; i < fileCount; i++) {
25            dwr.util.setValue("albumArtist" + i, albumartist);
26        }
27    }
28    function setAlbum() {
29        var album = dwr.util.getValue("albumAll");
30        for (i = 0; i < fileCount; i++) {
31            dwr.util.setValue("album" + i, album);
32        }
33    }
34    function setYear() {
35        var year = dwr.util.getValue("yearAll");
36        for (i = 0; i < fileCount; i++) {
37            dwr.util.setValue("year" + i, year);
38        }
39    }
40    function setGenre() {
41        var genre = dwr.util.getValue("genreAll");
42        for (i = 0; i < fileCount; i++) {
43            dwr.util.setValue("genre" + i, genre);
44        }
45    }
46    function setMood() {
47        var mood = dwr.util.getValue("moodAll");
48        for (i = 0; i < fileCount; i++) {
49            dwr.util.setValue("mood" + i, mood);
50        }
51    }
52    function setComposer() {
53        var composer = dwr.util.getValue("composerAll");
54        for (i = 0; i < fileCount; i++) {
55            dwr.util.setValue("composer" + i, composer);
56        }
57    }
58    function suggestTitle() {
59        for (i = 0; i < fileCount; i++) {
60            var title = dwr.util.getValue("suggestedTitle" + i);
61            dwr.util.setValue("title" + i, title);
62        }
63    }
64    function resetTitle() {
65        for (i = 0; i < fileCount; i++) {
66            var title = dwr.util.getValue("originalTitle" + i);
67            dwr.util.setValue("title" + i, title);
68        }
69    }
70    function suggestTrack() {
71        for (i = 0; i < fileCount; i++) {
72            var track = dwr.util.getValue("suggestedTrack" + i);
73            dwr.util.setValue("track" + i, track);
74        }
75    }
76    function resetTrack() {
77        for (i = 0; i < fileCount; i++) {
78            var track = dwr.util.getValue("originalTrack" + i);
79            dwr.util.setValue("track" + i, track);
80        }
81    }
82    function updateTags() {
83        document.getElementById("save").disabled = true;
84        index = 0;
85        dwr.util.setValue("errors", "");
86        for (i = 0; i < fileCount; i++) {
87            dwr.util.setValue("status" + i, "");
88        }
89        updateNextTag();
90    }
91    function updateNextTag() {
92        var id = dwr.util.getValue("id" + index);
93        var artist = dwr.util.getValue("artist" + index);
94        var albumartist = dwr.util.getValue("albumArtist" + index);
95        var track = dwr.util.getValue("track" + index);
96        var album = dwr.util.getValue("album" + index);
97        var title = dwr.util.getValue("title" + index);
98        var year = dwr.util.getValue("year" + index);
99        var mood = dwr.util.getValue("mood" + index);
100        var genre = dwr.util.getValue("genre" + index);
101        var rank = dwr.util.getValue("rank" + index);
102        var bpm = dwr.util.getValue("bpm" + index);
103        var composer = dwr.util.getValue("composer" + index);
104
105        dwr.util.setValue("status" + index, "<fmt:message key="edittags.working"/>");
106        tagService.setTags(id, track, artist, albumartist, album, title, year, mood, genre, rank, bpm, composer, setTagsCallback);
107    }
108    function setTagsCallback(result) {
109        var message;
110        if (result == "SKIPPED") {
111            message = "<fmt:message key="edittags.skipped"/>";
112        } else if (result == "UPDATED") {
113            message = "<b><fmt:message key="edittags.updated"/></b>";
114        } else {
115            message = "<div class='warning'><fmt:message key="edittags.error"/></div>"
116            var errors = dwr.util.getValue("errors");
117            errors += "<br>" + result + "<br>";
118            dwr.util.setValue("errors", errors, { escapeHtml:false });
119        }
120        dwr.util.setValue("status" + index, message, { escapeHtml:false });
121        index++;
122        if (index < fileCount) {
123            updateNextTag();
124        } else {
125            document.getElementById("save").disabled = false;
126        }
127    }
128
129    function hideAlbumArtist() {
130        <c:forEach items="${model.songs}" var="song" varStatus="loopStatus">
131        jQuery("#albumArtistCell${loopStatus.count - 1}").stop(1,1).fadeOut(600);
132        </c:forEach>
133        jQuery("#albumartistAll").stop(1,1).fadeOut(600);
134        jQuery("#albumartistHeader").stop(1,1).fadeOut(600);
135        jQuery("#albumartistTableHeader2").stop(1,1).fadeOut(600);
136        jQuery("#albumartistTableHeader1").stop(1,1).fadeOut(600);
137        jQuery("#buttonHide").hide();
138        jQuery("#buttonShow").show();
139    }
140
141    function showAlbumArtist() {
142        jQuery("#buttonShow").hide();
143        jQuery("#buttonHide").show();
144        jQuery("#albumartistTableHeader1").stop(1,1).fadeIn(400);
145        jQuery("#albumartistTableHeader2").stop(1,1).fadeIn(400);
146        jQuery("#albumartistHeader").stop(1,1).fadeIn(400);
147        jQuery("#albumartistAll").stop(1,1).fadeIn(400);
148        <c:forEach items="${model.songs}" var="song" varStatus="loopStatus">
149        jQuery("#albumArtistCell${loopStatus.count - 1}").stop(1,1).fadeIn(600);
150        </c:forEach>
151    }
152
153    function hideComposer() {
154        jQuery("#composerAll").stop(1,1).fadeOut(600);
155        <c:forEach items="${model.songs}" var="song" varStatus="loopStatus">
156        jQuery("#composerCell${loopStatus.count - 1}").stop(1,1).fadeOut(600);
157        </c:forEach>
158        jQuery("#composerTableHeader2").stop(1,1).fadeOut(600);
159        jQuery("#composerTableHeader1").stop(1,1).fadeOut(600);
160        jQuery("#composerHeader").stop(1,1).fadeOut(600);
161        jQuery("#buttonHideComposer").hide();
162        jQuery("#buttonShowComposer").show();
163
164    }
165
166    function showComposer() {
167        jQuery("#buttonShowComposer").hide();
168        jQuery("#buttonHideComposer").show();
169        jQuery("#composerTableHeader1").stop(1,1).fadeIn(400);
170        jQuery("#composerTableHeader2").stop(1,1).fadeIn(400);
171        jQuery("#composerHeader").stop(1,1).fadeIn(400);
172        jQuery("#composerAll").stop(1,1).fadeIn(400);
173        <c:forEach items="${model.songs}" var="song" varStatus="loopStatus">
174        jQuery("#composerCell${loopStatus.count - 1}").stop(1,1).fadeIn(600);
175        </c:forEach>
176    }
177</script>
178
179<h1><fmt:message key="edittags.title"/></h1><br>
180
181<c:choose>
182    <c:when test="${model.type eq 'playlist'}">
183        <madsonic:url value="playlist.view" var="backUrl"><madsonic:param name="id" value="${model.id}"/></madsonic:url>
184    </c:when>
185    <c:otherwise>
186        <madsonic:url value="main.view" var="backUrl"><madsonic:param name="id" value="${model.id}"/></madsonic:url>
187    </c:otherwise>
188</c:choose>
189
190<div class="back" style="display:inline-table;"><a href="${backUrl}"><fmt:message key="common.back"/></a></div>
191
192<p style="display:inline-table;"><input type="submit" id="save" value="<fmt:message key="common.save"/>" onclick="javascript:updateTags()"/></p>
193
194<button id="buttonShow" onclick="showAlbumArtist()">show Albumartist</button>
195<button id="buttonHide" onclick="hideAlbumArtist()" style="display:none">hide Albumartist</button>
196
197<button id="buttonShowComposer" onclick="showComposer()">show Composer</button>
198<button id="buttonHideComposer" onclick="hideComposer()" style="display:none">hide Composer</button>
199
200<table class="editor ruleTable indent">
201    <tr>
202        <th class="ruleTableHeader"><fmt:message key="edittags.track"/></th>
203        <th class="ruleTableHeader"><fmt:message key="edittags.songtitle"/></th>
204        <th class="ruleTableHeader"><fmt:message key="edittags.artist"/>&nbsp;[<a href="javascript:setArtist()"><fmt:message key="edittags.set"/></a>]</th>
205        <th class="ruleTableHeader" id="albumartistTableHeader1" style="display:none"><span id="albumartistHeader" style="display:none"><fmt:message key="edittags.albumartist"/>&nbsp;[<a href="javascript:setAlbumArtist()"><fmt:message key="edittags.set"/></a>]</span></th>
206        <th class="ruleTableHeader" id="composerTableHeader1" style="display:none"><span id="composerHeader" style="display:none">Composer&nbsp;[<a href="javascript:setComposer()"><fmt:message key="edittags.set"/></a>]</span></th>
207        <th class="ruleTableHeader"><fmt:message key="edittags.album"/>&nbsp;[<a href="javascript:setAlbum()"><fmt:message key="edittags.set"/></a>]</th>
208        <th class="ruleTableHeader"><fmt:message key="edittags.year"/>&nbsp;[<a href="javascript:setYear()"><fmt:message key="edittags.set"/></a>]</th>
209        <th class="ruleTableHeader"><fmt:message key="edittags.mood"/>&nbsp;[<a href="javascript:setMood()"><fmt:message key="edittags.set"/></a>]</th>
210        <th class="ruleTableHeader"><fmt:message key="edittags.genre"/>&nbsp;[<a href="javascript:setGenre()"><fmt:message key="edittags.set"/></a>]</th>
211		<th class="ruleTableHeader" style="white-space: nowrap">Rank</th>
212		<th class="ruleTableHeader" style="white-space: nowrap">BPM</th>
213        <th class="ruleTableHeader" width="60"><fmt:message key="edittags.status"/></th>
214    </tr>
215    <tr>
216        <th class="ruleTableHeader"><a href="javascript:suggestTrack()"><fmt:message key="edittags.suggest.short"/></a> |
217            <a href="javascript:resetTrack()"><fmt:message key="edittags.reset.short"/></a></th>
218        <th class="ruleTableHeader"><a href="javascript:suggestTitle()"><fmt:message key="edittags.suggest"/></a> |
219            <a href="javascript:resetTitle()"><fmt:message key="edittags.reset"/></a></th>
220        <th class="ruleTableHeader" style="white-space: nowrap"><input type="text" name="artistAll" size="25" onKeyPress="dwr.util.onReturn(event, setArtist)" value="${model.defaultArtist}"/></th>
221        <th class="ruleTableHeader" id="albumartistTableHeader2" style="display:none;white-space: nowrap"><input type="text" id ="albumartistAll" name="albumartistAll" size="25" onKeyPress="dwr.util.onReturn(event, setAlbumArtist)" value="${model.defaultAlbumArtist}"/></th>
222        <th class="ruleTableHeader" id="composerTableHeader2" style="display:none;white-space: nowrap"><input type="text" id ="composerAll" name="composerAll" size="25" onKeyPress="dwr.util.onReturn(event, setComposer)" value="${model.defaultArtist}"/></th>
223        <th class="ruleTableHeader" style="white-space: nowrap"><input type="text" name="albumAll" size="35" onKeyPress="dwr.util.onReturn(event, setAlbum)" value="${model.defaultAlbum}"/></th>
224        <th class="ruleTableHeader" style="white-space: nowrap"><input type="text" name="yearAll" size="5" onKeyPress="dwr.util.onReturn(event, setYear)" value="${model.defaultYear}"/></th>
225        <th class="ruleTableHeader" style="white-space: nowrap">
226            <select name="moodAll" style="width:8em">
227                <option value=""/>
228                <c:forEach items="${model.allMoods}" var="mood">
229                    <option ${mood eq model.defaultMood ? "selected" : ""} value="${mood}">${mood}</option>
230                </c:forEach>
231            </select>
232        </th>
233        <th class="ruleTableHeader" style="white-space: nowrap">
234            <select name="genreAll" style="width:8em">
235                <option value=""/>
236                <c:forEach items="${model.allGenres}" var="genre">
237                    <option ${genre eq model.defaultGenre ? "selected" : ""} value="${genre}">${genre}</option>
238                </c:forEach>
239            </select>
240        </th>
241        <th class="ruleTableHeader"/>
242        <th class="ruleTableHeader"/>
243        <th class="ruleTableHeader"/>
244    </tr>
245
246    <c:forEach items="${model.songs}" var="song" varStatus="loopStatus">
247        <tr>
248          <td colspan="12" align="left" valign="middle" class="ruleTableCellHeader highlight" title="${song.fileName}"><strong>${song.fileName}</strong></td>
249        </tr>
250        <tr>
251<!--        <str:truncateNicely lower="45" upper="45" var="fileName">${song.fileName}</str:truncateNicely> -->
252
253            <input type="hidden" name="id${loopStatus.count - 1}" value="${song.id}"/>
254            <input type="hidden" name="suggestedTitle${loopStatus.count - 1}" value="${song.suggestedTitle}"/>
255            <input type="hidden" name="originalTitle${loopStatus.count - 1}" value="${song.title}"/>
256            <input type="hidden" name="suggestedTrack${loopStatus.count - 1}" value="${song.suggestedTrack}"/>
257            <input type="hidden" name="originalTrack${loopStatus.count - 1}" value="${song.track}"/>
258            <td nowrap="nowrap" class="ruleTableCell"><input type="text" size="1" name="track${loopStatus.count - 1}" value="${song.track}"/></td>
259            <td class="ruleTableCell"><input type="text" size="45" name="title${loopStatus.count - 1}" value="${song.title}"/></td>
260            <td class="ruleTableCell"><input type="text" size="25" name="artist${loopStatus.count - 1}" value="${song.artist}"/></td>
261            <td class="ruleTableCell" id="albumArtistCell${loopStatus.count - 1}" style="display:none;"><input type="text" size="25" name="albumArtist${loopStatus.count - 1}" value="${song.albumArtist}"/></td>
262            <td class="ruleTableCell" id="composerCell${loopStatus.count - 1}" style="display:none;"><input type="text" size="25" name="composer${loopStatus.count - 1}" value="${song.composer}"/></td>
263            <td class="ruleTableCell" ><input type="text" size="35" name="album${loopStatus.count - 1}" value="${song.album}"/></td>
264            <td class="ruleTableCell"><input type="text" size="5"  name="year${loopStatus.count - 1}" value="${song.year}"/></td>
265            <td class="ruleTableCell"><input type="text" name="mood${loopStatus.count - 1}" value="${song.mood}" style="width:8em"/></td>
266            <td class="ruleTableCell"><input type="text" name="genre${loopStatus.count - 1}" value="${song.genre}" style="width:8em"/></td>
267            <td class="ruleTableCell"><input type="text" size="3" name="rank${loopStatus.count - 1}" value="${song.rank}" style="width:3em"/></td>
268            <td class="ruleTableCell"><input type="text" size="5" name="bpm${loopStatus.count - 1}" value="${song.bpm}" style="width:5em"/></td>
269            <td class="ruleTableCell"><div id="status${loopStatus.count - 1}"/></td>
270        </tr>
271    </c:forEach>
272
273</table>
274
275<!--<p><input type="submit" id="save" value="<fmt:message key="common.save"/>" onclick="javascript:updateTags()"/></p>-->
276
277<div class="warning" id="errors"/>
278
279</body>
280</html>