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"/> [<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"/> [<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 [<a href="javascript:setComposer()"><fmt:message key="edittags.set"/></a>]</span></th> 207 <th class="ruleTableHeader"><fmt:message key="edittags.album"/> [<a href="javascript:setAlbum()"><fmt:message key="edittags.set"/></a>]</th> 208 <th class="ruleTableHeader"><fmt:message key="edittags.year"/> [<a href="javascript:setYear()"><fmt:message key="edittags.set"/></a>]</th> 209 <th class="ruleTableHeader"><fmt:message key="edittags.mood"/> [<a href="javascript:setMood()"><fmt:message key="edittags.set"/></a>]</th> 210 <th class="ruleTableHeader"><fmt:message key="edittags.genre"/> [<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>