aboutsummaryrefslogtreecommitdiff
path: root/subsonic-site
diff options
context:
space:
mode:
authorScott Jackson <daneren2005@gmail.com>2012-07-02 21:24:02 -0700
committerScott Jackson <daneren2005@gmail.com>2012-07-02 21:24:02 -0700
commita1a18f77a50804e0127dfa4b0f5240c49c541184 (patch)
tree19a38880afe505beddb5590379a8134d7730a277 /subsonic-site
parentb61d787706979e7e20f4c3c4f93c1f129d92273f (diff)
downloaddsub-a1a18f77a50804e0127dfa4b0f5240c49c541184.tar.gz
dsub-a1a18f77a50804e0127dfa4b0f5240c49c541184.tar.bz2
dsub-a1a18f77a50804e0127dfa4b0f5240c49c541184.zip
Initial Commit
Diffstat (limited to 'subsonic-site')
-rw-r--r--subsonic-site/pom.xml16
-rw-r--r--subsonic-site/src/main/webapp/WEB-INF/web.xml13
-rw-r--r--subsonic-site/src/main/webapp/ad.jsp6
-rw-r--r--subsonic-site/src/main/webapp/adwords-android.jsp45
-rw-r--r--subsonic-site/src/main/webapp/android-donation.jsp88
-rw-r--r--subsonic-site/src/main/webapp/api-addChatMessage.jsp28
-rw-r--r--subsonic-site/src/main/webapp/api-changePassword.jsp35
-rw-r--r--subsonic-site/src/main/webapp/api-createPlaylist.jsp39
-rw-r--r--subsonic-site/src/main/webapp/api-createShare.jsp41
-rw-r--r--subsonic-site/src/main/webapp/api-createUser.jsp112
-rw-r--r--subsonic-site/src/main/webapp/api-deletePlaylist.jsp27
-rw-r--r--subsonic-site/src/main/webapp/api-deleteShare.jsp25
-rw-r--r--subsonic-site/src/main/webapp/api-deleteUser.jsp28
-rw-r--r--subsonic-site/src/main/webapp/api-download.jsp28
-rw-r--r--subsonic-site/src/main/webapp/api-getAlbum.jsp29
-rw-r--r--subsonic-site/src/main/webapp/api-getAlbumList.jsp44
-rw-r--r--subsonic-site/src/main/webapp/api-getAlbumList2.jsp42
-rw-r--r--subsonic-site/src/main/webapp/api-getArtist.jsp29
-rw-r--r--subsonic-site/src/main/webapp/api-getArtists.jsp15
-rw-r--r--subsonic-site/src/main/webapp/api-getAvatar.jsp27
-rw-r--r--subsonic-site/src/main/webapp/api-getChatMessages.jsp28
-rw-r--r--subsonic-site/src/main/webapp/api-getCoverArt.jsp34
-rw-r--r--subsonic-site/src/main/webapp/api-getIndexes.jsp35
-rw-r--r--subsonic-site/src/main/webapp/api-getLicense.jsp17
-rw-r--r--subsonic-site/src/main/webapp/api-getLyrics.jsp35
-rw-r--r--subsonic-site/src/main/webapp/api-getMusicDirectory.jsp32
-rw-r--r--subsonic-site/src/main/webapp/api-getMusicFolders.jsp15
-rw-r--r--subsonic-site/src/main/webapp/api-getNowPlaying.jsp15
-rw-r--r--subsonic-site/src/main/webapp/api-getPlaylist.jsp28
-rw-r--r--subsonic-site/src/main/webapp/api-getPlaylists.jsp29
-rw-r--r--subsonic-site/src/main/webapp/api-getPodcasts.jsp28
-rw-r--r--subsonic-site/src/main/webapp/api-getRandomSongs.jsp52
-rw-r--r--subsonic-site/src/main/webapp/api-getShares.jsp14
-rw-r--r--subsonic-site/src/main/webapp/api-getSong.jsp29
-rw-r--r--subsonic-site/src/main/webapp/api-getStarred.jsp14
-rw-r--r--subsonic-site/src/main/webapp/api-getStarred2.jsp14
-rw-r--r--subsonic-site/src/main/webapp/api-getUser.jsp29
-rw-r--r--subsonic-site/src/main/webapp/api-getVideos.jsp15
-rw-r--r--subsonic-site/src/main/webapp/api-jukeboxControl.jsp60
-rw-r--r--subsonic-site/src/main/webapp/api-ping.jsp14
-rw-r--r--subsonic-site/src/main/webapp/api-scrobble.jsp34
-rw-r--r--subsonic-site/src/main/webapp/api-search.jsp65
-rw-r--r--subsonic-site/src/main/webapp/api-search2.jsp65
-rw-r--r--subsonic-site/src/main/webapp/api-search3.jsp65
-rw-r--r--subsonic-site/src/main/webapp/api-setRating.jsp33
-rw-r--r--subsonic-site/src/main/webapp/api-star.jsp41
-rw-r--r--subsonic-site/src/main/webapp/api-stream.jsp59
-rw-r--r--subsonic-site/src/main/webapp/api-unstar.jsp41
-rw-r--r--subsonic-site/src/main/webapp/api-updatePlaylist.jsp64
-rw-r--r--subsonic-site/src/main/webapp/api-updateShare.jsp37
-rw-r--r--subsonic-site/src/main/webapp/api.jsp425
-rw-r--r--subsonic-site/src/main/webapp/apps.jsp650
-rw-r--r--subsonic-site/src/main/webapp/banner.jsp103
-rw-r--r--subsonic-site/src/main/webapp/changelog.jsp1011
-rw-r--r--subsonic-site/src/main/webapp/demo.jsp55
-rw-r--r--subsonic-site/src/main/webapp/documentation.jsp66
-rw-r--r--subsonic-site/src/main/webapp/donate.jsp26
-rw-r--r--subsonic-site/src/main/webapp/download-subsonic.jsp19
-rw-r--r--subsonic-site/src/main/webapp/download.jsp165
-rw-r--r--subsonic-site/src/main/webapp/download2.jsp45
-rw-r--r--subsonic-site/src/main/webapp/faq.jsp57
-rw-r--r--subsonic-site/src/main/webapp/favicon.icobin0 -> 1150 bytes
-rw-r--r--subsonic-site/src/main/webapp/features.jsp226
-rw-r--r--subsonic-site/src/main/webapp/footer.jsp11
-rw-r--r--subsonic-site/src/main/webapp/forum.jsp3
-rw-r--r--subsonic-site/src/main/webapp/getting-started.jsp175
-rw-r--r--subsonic-site/src/main/webapp/google-translate.jsp9
-rw-r--r--subsonic-site/src/main/webapp/header.jsp18
-rw-r--r--subsonic-site/src/main/webapp/hosting.jsp91
-rw-r--r--subsonic-site/src/main/webapp/inc/css/banner.css104
-rw-r--r--subsonic-site/src/main/webapp/inc/css/style.css345
-rw-r--r--subsonic-site/src/main/webapp/inc/img/air.pngbin0 -> 1589 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/android.pngbin0 -> 4032 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/appstore.pngbin0 -> 2811 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/available_on_appstore.pngbin0 -> 10081 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/android-video.pngbin0 -> 40397 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/apps.pngbin0 -> 225880 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/apps.xcfbin0 -> 813795 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/banner-01.jpgbin0 -> 65070 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/banner-bg.gifbin0 -> 4094 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/car.pngbin0 -> 258554 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/iphone.pngbin0 -> 25818 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/isub1.pngbin0 -> 39807 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/next-hover.pngbin0 -> 1569 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/next.pngbin0 -> 1492 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/prev-hover.pngbin0 -> 1583 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/prev.pngbin0 -> 1528 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/screenshot.pngbin0 -> 109736 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/video.pngbin0 -> 288813 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/banner/wp7.pngbin0 -> 66308 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/blackberry.pngbin0 -> 3889 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/body-bg.gifbin0 -> 370 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/button-download.pngbin0 -> 2846 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/change-password-small.pngbin0 -> 6437 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/change-password.pngbin0 -> 28840 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/chumby.pngbin0 -> 3631 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/content-bg.gifbin0 -> 509 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/donate.pngbin0 -> 1036 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/download-fedora.pngbin0 -> 1007 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/download-linux.pngbin0 -> 866 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/download-mac.pngbin0 -> 552 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/download-ubuntu.pngbin0 -> 719 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/download-windows.pngbin0 -> 1017 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/download_small.gifbin0 -> 313 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/closebox.pngbin0 -> 1910 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/spacer.gifbin0 -> 43 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-fill.pngbin0 -> 134 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-l.pngbin0 -> 310 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-r.pngbin0 -> 290 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow1.pngbin0 -> 310 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow2.pngbin0 -> 164 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow3.pngbin0 -> 368 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow4.pngbin0 -> 178 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow5.pngbin0 -> 180 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow6.pngbin0 -> 428 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow7.pngbin0 -> 186 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow8.pngbin0 -> 426 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-1.pngbin0 -> 1882 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-10.pngbin0 -> 1892 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-11.pngbin0 -> 1901 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-12.pngbin0 -> 1902 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-2.pngbin0 -> 1893 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-3.pngbin0 -> 1922 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-4.pngbin0 -> 1890 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-5.pngbin0 -> 1938 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-6.pngbin0 -> 1927 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-7.pngbin0 -> 1898 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-8.pngbin0 -> 1910 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-9.pngbin0 -> 1901 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/amy-small.pngbin0 -> 22455 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/amy.pngbin0 -> 136659 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/avatar-small.pngbin0 -> 16135 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/avatar.pngbin0 -> 38811 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/bbc.pngbin0 -> 897 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/extras.pngbin0 -> 5493 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/extras.xcfbin0 -> 21405 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/flac.pngbin0 -> 6082 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/itunes.pngbin0 -> 9047 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/lame.pngbin0 -> 6634 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/lame.png.origbin0 -> 6634 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/last-fm.pngbin0 -> 2158 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/logon-small.pngbin0 -> 7002 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/logon.pngbin0 -> 15407 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/media-support.pngbin0 -> 40814 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/media-support.xcfbin0 -> 64150 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/mp3.pngbin0 -> 18814 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/mp3.png.origbin0 -> 18814 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/nrk.pngbin0 -> 2040 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/personal-settings-small.pngbin0 -> 13076 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/personal-settings.pngbin0 -> 7461 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/podcast.pngbin0 -> 3250 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/shoutcast.pngbin0 -> 8265 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/shoutcast.png.origbin0 -> 8265 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/wap-small.pngbin0 -> 23306 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/wap.pngbin0 -> 83573 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/wikipedia.pngbin0 -> 5617 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/wikipedia.png.origbin0 -> 16462 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/winamp.pngbin0 -> 40578 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/winamp.png.origbin0 -> 40578 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/wmp.pngbin0 -> 42662 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/features/wmp.png.origbin0 -> 42662 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/footer.gifbin0 -> 5338 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/gettingstarted/license.pngbin0 -> 44025 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/gettingstarted/license_thumb.pngbin0 -> 88683 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders.pngbin0 -> 38957 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders_thumb.pngbin0 -> 106793 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/gigapros.pngbin0 -> 1840 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/gpl.pngbin0 -> 2986 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/header.gifbin0 -> 2251 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/home-rollover.gifbin0 -> 1791 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/itemcontentborder.gifbin0 -> 65 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/mac-appstore.jpgbin0 -> 6717 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/mac-installer-small.pngbin0 -> 23561 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/mac-installer.pngbin0 -> 75268 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/merchandise.pngbin0 -> 20488 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/mpa-nominee.pngbin0 -> 10428 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/paypal.gifbin0 -> 2127 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/ripserver-small.pngbin0 -> 6830 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/ripserver.pngbin0 -> 18375 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen01.pngbin0 -> 209029 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen02.pngbin0 -> 352778 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen03.pngbin0 -> 97498 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen05.pngbin0 -> 743820 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen06.pngbin0 -> 118009 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen07.pngbin0 -> 194749 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen08.pngbin0 -> 140362 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen09.pngbin0 -> 140191 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen10.pngbin0 -> 139752 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen11.pngbin0 -> 196900 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen12.pngbin0 -> 102123 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen13.pngbin0 -> 178352 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen14.pngbin0 -> 114613 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen15.pngbin0 -> 115140 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen16.pngbin0 -> 112808 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen17.pngbin0 -> 482545 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen18.pngbin0 -> 209911 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen19.pngbin0 -> 352106 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen20.pngbin0 -> 417249 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen21.pngbin0 -> 338262 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen22.pngbin0 -> 181565 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen23.pngbin0 -> 115985 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen24.pngbin0 -> 224079 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen25.pngbin0 -> 119445 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen26.pngbin0 -> 51974 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen27.pngbin0 -> 180693 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen28.pngbin0 -> 361945 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen29.pngbin0 -> 30897 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen30.pngbin0 -> 73600 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen31.pngbin0 -> 100196 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen32.pngbin0 -> 81977 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen33.pngbin0 -> 37987 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen34.pngbin0 -> 107142 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen35.pngbin0 -> 218136 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen36.pngbin0 -> 45077 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen37.pngbin0 -> 266136 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen38.pngbin0 -> 280620 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen39.pngbin0 -> 66566 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen40.pngbin0 -> 334178 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen41.pngbin0 -> 26309 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen42.pngbin0 -> 228047 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen43.pngbin0 -> 34464 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen44.pngbin0 -> 39845 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/screen45.pngbin0 -> 29265 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb01.pngbin0 -> 39427 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb02.pngbin0 -> 52858 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb03.pngbin0 -> 23919 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb05.pngbin0 -> 83024 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb06.pngbin0 -> 30336 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb07.pngbin0 -> 28877 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb08.pngbin0 -> 39843 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb09.pngbin0 -> 40084 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb10.pngbin0 -> 38347 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb11.pngbin0 -> 43291 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb12.pngbin0 -> 26359 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb13.pngbin0 -> 40783 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb14.pngbin0 -> 28876 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb15.pngbin0 -> 29549 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb16.pngbin0 -> 32605 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb17.pngbin0 -> 44071 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb18.pngbin0 -> 42192 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb19.pngbin0 -> 42864 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb20.pngbin0 -> 41571 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb21.pngbin0 -> 37146 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb22.pngbin0 -> 28286 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb23.pngbin0 -> 24979 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb24.pngbin0 -> 36146 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb25.pngbin0 -> 27858 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb27.pngbin0 -> 52753 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb28.pngbin0 -> 87617 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb29.pngbin0 -> 11576 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb30.pngbin0 -> 25612 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb31.pngbin0 -> 30137 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb33.pngbin0 -> 39381 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb35.pngbin0 -> 89884 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb36.pngbin0 -> 61584 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb37.pngbin0 -> 48708 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb38.pngbin0 -> 135325 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb39.pngbin0 -> 26633 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb40.pngbin0 -> 86109 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb41.pngbin0 -> 7605 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb42.pngbin0 -> 62084 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb43.pngbin0 -> 42038 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb44.pngbin0 -> 30622 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/screenshots/thumb45.pngbin0 -> 24059 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/search.pngbin0 -> 1267 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/sindre.jpegbin0 -> 1978 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/star.pngbin0 -> 547 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/subsonic-forum.pngbin0 -> 8506 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/subsonic-shop.jpegbin0 -> 18328 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/subsonic-tshirt.pngbin0 -> 119589 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/subsonic.pngbin0 -> 14302 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/top.gifbin0 -> 68 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/topnav-div.gifbin0 -> 263 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/topnav-hover.gifbin0 -> 504 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/topnav.gifbin0 -> 5356 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/ubuntu.pngbin0 -> 1262 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/windows-installer-small.pngbin0 -> 8516 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/windows-installer.pngbin0 -> 18267 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/windows-marketplace.pngbin0 -> 2676 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/windows7.pngbin0 -> 1977 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/zazeen-ad.gifbin0 -> 35430 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/img/zazeen.gifbin0 -> 3993 bytes
-rw-r--r--subsonic-site/src/main/webapp/inc/js/FancyZoom.js761
-rw-r--r--subsonic-site/src/main/webapp/inc/js/FancyZoomHTML.js318
-rw-r--r--subsonic-site/src/main/webapp/inc/js/jquery-1.4.4.min.js167
-rw-r--r--subsonic-site/src/main/webapp/inc/video/subsonic-medium.jpgbin0 -> 60689 bytes
-rw-r--r--subsonic-site/src/main/webapp/index.html10
-rw-r--r--subsonic-site/src/main/webapp/index.jsp120
-rw-r--r--subsonic-site/src/main/webapp/installation.jsp278
-rw-r--r--subsonic-site/src/main/webapp/libraries.jsp48
-rw-r--r--subsonic-site/src/main/webapp/menu.jsp32
-rw-r--r--subsonic-site/src/main/webapp/merchandise.jsp7
-rw-r--r--subsonic-site/src/main/webapp/paypal-landing.jsp36
-rw-r--r--subsonic-site/src/main/webapp/quotes.jsp55
-rw-r--r--subsonic-site/src/main/webapp/redirect-expired.jsp104
-rw-r--r--subsonic-site/src/main/webapp/ripserver.jsp8
-rw-r--r--subsonic-site/src/main/webapp/robots.txt2
-rw-r--r--subsonic-site/src/main/webapp/screenshots.jsp67
-rw-r--r--subsonic-site/src/main/webapp/search.jsp4
-rw-r--r--subsonic-site/src/main/webapp/subsonic-ad.jsp51
-rw-r--r--subsonic-site/src/main/webapp/tracking.jsp9
-rw-r--r--subsonic-site/src/main/webapp/transcoding.jsp92
-rw-r--r--subsonic-site/src/main/webapp/translate-subsonic.jsp6
-rw-r--r--subsonic-site/src/main/webapp/translate.jsp65
-rw-r--r--subsonic-site/src/main/webapp/tutorial.jsp8
-rw-r--r--subsonic-site/src/main/webapp/zazeen-ad.jsp12
306 files changed, 7622 insertions, 0 deletions
diff --git a/subsonic-site/pom.xml b/subsonic-site/pom.xml
new file mode 100644
index 00000000..6606620a
--- /dev/null
+++ b/subsonic-site/pom.xml
@@ -0,0 +1,16 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>net.sourceforge.subsonic</groupId>
+ <artifactId>subsonic-site</artifactId>
+ <packaging>war</packaging>
+ <name>Subsonic Site</name>
+
+ <parent>
+ <groupId>net.sourceforge.subsonic</groupId>
+ <artifactId>subsonic</artifactId>
+ <version>4.7.beta2</version>
+ </parent>
+
+</project>
diff --git a/subsonic-site/src/main/webapp/WEB-INF/web.xml b/subsonic-site/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 00000000..7cd15a49
--- /dev/null
+++ b/subsonic-site/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app id="subsonic-site" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+ <display-name>Subsonic Site</display-name>
+
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
+
+</web-app> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/ad.jsp b/subsonic-site/src/main/webapp/ad.jsp
new file mode 100644
index 00000000..e89a43ed
--- /dev/null
+++ b/subsonic-site/src/main/webapp/ad.jsp
@@ -0,0 +1,6 @@
+<div class="bottomspace">
+
+ <a href="http://media.fastclick.net/w/click.here?sid=45886&m=7&c=1" target="_blank">
+ <img src="http://media.fastclick.net/w/get.media?sid=45886&m=7&tp=9&d=s&c=1" width="180" height="150" border="1" class="img-center"></a>
+
+</div>
diff --git a/subsonic-site/src/main/webapp/adwords-android.jsp b/subsonic-site/src/main/webapp/adwords-android.jsp
new file mode 100644
index 00000000..795dc39e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/adwords-android.jsp
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html
+PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Subsonic &raquo; Free Music Streamer</title>
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/reset/reset.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/fonts/fonts.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/grid/grid.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/base/base.css">
+ <%@ include file="tracking.jsp" %>
+</head>
+<body>
+
+<h1>Subsonic Music Streamer</h1>
+<p>
+ Stream and download music from your home computer to Android, iPhone and Windows Phone.
+ All your music - anywhere, anytime! Never sync again.
+ Supports most audio formats, including mp3, ogg, aac, flac, wma.
+</p>
+
+<p>
+ Supports streaming, downloading, playlists, album art, searching and automatic conversion to lower bitrates.
+ For improved performance, music you have listened to is cached on the phone.
+ An offline mode is also available for when you are outside 3G/Wi-Fi coverage.
+</p>
+
+<p>
+ Server software is available for Windows, Mac and Linux.
+</p>
+
+<p>
+ For more information, visit <a href="http://www.subsonic.org/">subsonic.org</a>, or download the Subsonic app from
+ Android Market or Apple App Store. The app is by default connected to a demo server so you can try it out without installing the
+ Subsonic server software on your home computer.
+</p>
+
+<a href="inc/img/screenshots/screen12.png"><img src="inc/img/screenshots/thumb12.png" alt=""/></a>
+<a href="inc/img/screenshots/screen13.png"><img src="inc/img/screenshots/thumb13.png" alt=""/></a>
+<a href="inc/img/screenshots/screen14.png"><img src="inc/img/screenshots/thumb14.png" alt=""/></a>
+<a href="inc/img/screenshots/screen15.png"><img src="inc/img/screenshots/thumb15.png" alt=""/></a>
+
+</body>
+</html> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/android-donation.jsp b/subsonic-site/src/main/webapp/android-donation.jsp
new file mode 100644
index 00000000..831d7b5c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/android-donation.jsp
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Subsonic &raquo; Free Music Streamer</title>
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/reset/reset.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/fonts/fonts.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/grid/grid.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/base/base.css">
+</head>
+<body>
+
+<h1><img src="inc/img/donate.png" alt="" style="vertical-align:middle; padding-right:0.25em"/>Love Subsonic?</h1>
+
+<p>
+ Please support continued development and maintenance by giving a donation.
+</p>
+
+<p>
+ As a donor you get the following benefits:
+</p>
+<ul>
+ <li>Stream music to Android, iPhone and Windows Phone.</li>
+ <li>Video streaming.</li>
+ <li>A personal web address for your Subsonic server (<em>yourname</em>.subsonic.org).</li>
+ <li>No ads in the Subsonic web interface.</li>
+ <li>Free access to new premium features.</li>
+</ul>
+
+<p>
+ The suggested donation amount is <b>&euro;20</b>, but you can give any amount you like.
+</p>
+
+<p>
+ Click one of the buttons to go to PayPal where you can pay by credit card or by using your PayPal account.
+ Once the donation is processed, you will receive a license key by email.
+</p>
+
+<table>
+ <tr>
+ <td style="border:none;">
+ <table>
+ <tr>
+ <td style="border:none;padding:0;padding:0"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3RTGWJRNAW2PU"><img src="inc/img/paypal.gif" alt=""/></a> </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;border:none;padding:0">&euro;10</td>
+ </tr>
+ </table>
+ </td>
+ <td style="border:none;">
+ <table>
+ <tr>
+ <td style="border:none;padding:0"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=UCUUB2TYE4PGN"><img src="inc/img/paypal.gif" alt=""/></a> </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;border:none;padding:0">&euro;20</td>
+ </tr>
+ </table>
+ </td>
+ <td style="border:none;">
+ <table>
+ <tr>
+ <td style="border:none;padding:0"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3M6TFHWEPSU44"><img src="inc/img/paypal.gif" alt=""/></a> </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;border:none;padding:0">&euro;25</td>
+ </tr>
+ </table>
+ </td>
+ <td style="border:none;">
+ <table>
+ <tr>
+ <td style="border:none;padding:0"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5KP7LPQU77UAS"><img src="inc/img/paypal.gif" alt=""/></a> </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;border:none;padding:0">&euro;30</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+
+<p>
+ For more information, please visit <a href="http://subsonic.org/">subsonic.org</a>
+</p>
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/api-addChatMessage.jsp b/subsonic-site/src/main/webapp/api-addChatMessage.jsp
new file mode 100644
index 00000000..1d9d01dc
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-addChatMessage.jsp
@@ -0,0 +1,28 @@
+<h2 class="div"><a name="addChatMessage"></a>addChatMessage</h2>
+
+<p>
+ <code>http://your-server/rest/addChatMessage.view</code>
+ <br>Since <a href="#versions">1.2.0</a>
+</p>
+
+<p>
+ Adds a message to the chat log.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>message</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The chat message.</td>
+ </tr>
+</table>
+
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-changePassword.jsp b/subsonic-site/src/main/webapp/api-changePassword.jsp
new file mode 100644
index 00000000..a7fcb039
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-changePassword.jsp
@@ -0,0 +1,35 @@
+<h2 class="div"><a name="changePassword"></a>changePassword</h2>
+
+<p>
+ <code>http://your-server/rest/changePassword.view</code>
+ <br>Since <a href="#versions">1.1.0</a>
+</p>
+
+<p>
+ Changes the password of an existing Subsonic user, using the following parameters.
+ You can only change your own password unless you have admin privileges.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>username</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The name of the user which should change its password.</td>
+ </tr>
+ <tr>
+ <td><code>password</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The new password of the new user, either in clear text of hex-encoded (see above).</td>
+ </tr>
+</table>
+
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-createPlaylist.jsp b/subsonic-site/src/main/webapp/api-createPlaylist.jsp
new file mode 100644
index 00000000..dd39f0cd
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-createPlaylist.jsp
@@ -0,0 +1,39 @@
+<h2 class="div"><a name="createPlaylist"></a>createPlaylist</h2>
+
+<p>
+ <code>http://your-server/rest/createPlaylist.view</code>
+ <br>Since <a href="#versions">1.2.0</a>
+</p>
+
+<p>
+ Creates (or updates) a playlist.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>playlistId</code></td>
+ <td>Yes (if updating)</td>
+ <td></td>
+ <td>The playlist ID.</td>
+ </tr>
+ <tr>
+ <td><code>name</code></td>
+ <td>Yes (if creating)</td>
+ <td></td>
+ <td>The human-readable name of the playlist.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>songId</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>ID of a song in the playlist. Use one <code>songId</code> parameter for each song in the playlist.</td>
+ </tr>
+</table>
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-createShare.jsp b/subsonic-site/src/main/webapp/api-createShare.jsp
new file mode 100644
index 00000000..bc9d4115
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-createShare.jsp
@@ -0,0 +1,41 @@
+<h2 class="div"><a name="createShare"></a>createShare</h2>
+<p>
+ <code>http://your-server/rest/createShare.view</code>
+ <br>Since <a href="#versions">1.6.0</a>
+</p>
+<p>
+ Creates a public URL that can be used by anyone to stream music or video from the Subsonic server. The URL is short and
+ suitable for posting on Facebook, Twitter etc. Note: The user must be authorized to share (see Settings &gt; Users
+ &gt; User is allowed to share files with anyone).
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>ID of a song, album or video to share. Use one <code>id</code> parameter for each entry to share.</td>
+ </tr>
+ <tr>
+ <td><code>description</code></td>
+ <td>No</td>
+ <td></td>
+ <td>A user-defined description that will be displayed to people visiting the shared media.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>expires</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The time at which the share expires. Given as milliseconds since 1970.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;shares&gt;</code>
+ element on success, which in turns contains a single <code>&lt;share&gt;</code> element for the newly created share.
+ <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/shares_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-createUser.jsp b/subsonic-site/src/main/webapp/api-createUser.jsp
new file mode 100644
index 00000000..331148b3
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-createUser.jsp
@@ -0,0 +1,112 @@
+<h2 class="div"><a name="createUser"></a>createUser</h2>
+
+<p>
+ <code>http://your-server/rest/createUser.view</code>
+ <br>Since <a href="#versions">1.1.0</a>
+</p>
+
+<p>
+ Creates a new Subsonic user, using the following parameters:
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>username</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The name of the new user.</td>
+ </tr>
+ <tr>
+ <td><code>password</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The password of the new user, either in clear text of hex-encoded (see above).</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>email</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The email address of the new user.</td>
+ </tr>
+ <tr>
+ <td><code>ldapAuthenticated</code></td>
+ <td>No</td>
+ <td>false</td>
+ <td>Whether the user is authenicated in LDAP.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>adminRole</code></td>
+ <td>No</td>
+ <td>false</td>
+ <td>Whether the user is administrator.</td>
+ </tr>
+ <tr>
+ <td><code>settingsRole</code></td>
+ <td>No</td>
+ <td>true</td>
+ <td>Whether the user is allowed to change settings and password.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>streamRole</code></td>
+ <td>No</td>
+ <td>true</td>
+ <td>Whether the user is allowed to play files.</td>
+ </tr>
+ <tr>
+ <td><code>jukeboxRole</code></td>
+ <td>No</td>
+ <td>false</td>
+ <td>Whether the user is allowed to play files in jukebox mode.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>downloadRole</code></td>
+ <td>No</td>
+ <td>false</td>
+ <td>Whether the user is allowed to download files.</td>
+ </tr>
+ <tr>
+ <td><code>uploadRole</code></td>
+ <td>No</td>
+ <td>false</td>
+ <td>Whether the user is allowed to upload files.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>playlistRole</code></td>
+ <td>No</td>
+ <td>false</td>
+ <td>Whether the user is allowed to create and delete playlists. Since 1.8.0, changing this role has no effect.</td>
+ </tr>
+ <tr>
+ <td><code>coverArtRole</code></td>
+ <td>No</td>
+ <td>false</td>
+ <td>Whether the user is allowed to change cover art and tags.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>commentRole</code></td>
+ <td>No</td>
+ <td>false</td>
+ <td>Whether the user is allowed to create and edit comments and ratings.</td>
+ </tr>
+ <tr>
+ <td><code>podcastRole</code></td>
+ <td>No</td>
+ <td>false</td>
+ <td>Whether the user is allowed to administrate Podcasts.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>shareRole</code></td>
+ <td>No</td>
+ <td>false</td>
+ <td>(Since <a href="#versions">1.8.0</a>)Whether the user is allowed to share files with anyone.</td>
+ </tr>
+</table>
+
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-deletePlaylist.jsp b/subsonic-site/src/main/webapp/api-deletePlaylist.jsp
new file mode 100644
index 00000000..8a9cef6d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-deletePlaylist.jsp
@@ -0,0 +1,27 @@
+<h2 class="div"><a name="deletePlaylist"></a>deletePlaylist</h2>
+
+<p>
+ <code>http://your-server/rest/deletePlaylist.view</code>
+ <br>Since <a href="#versions">1.2.0</a>
+</p>
+
+<p>
+ Deletes a saved playlist.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>yes</td>
+ <td></td>
+ <td>ID of the playlist to delete, as obtained by <code>getPlaylists</code>.</td>
+ </tr>
+</table>
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-deleteShare.jsp b/subsonic-site/src/main/webapp/api-deleteShare.jsp
new file mode 100644
index 00000000..8c15f536
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-deleteShare.jsp
@@ -0,0 +1,25 @@
+<h2 class="div"><a name="deleteShare"></a>deleteShare</h2>
+<p>
+ <code>http://your-server/rest/deleteShare.view</code>
+ <br>Since <a href="#versions">1.6.0</a>
+</p>
+<p>
+ Deletes an existing share.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>ID of the share to delete.</td>
+ </tr>
+</table>
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-deleteUser.jsp b/subsonic-site/src/main/webapp/api-deleteUser.jsp
new file mode 100644
index 00000000..4fc94de8
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-deleteUser.jsp
@@ -0,0 +1,28 @@
+<h2 class="div"><a name="deleteUser"></a>deleteUser</h2>
+
+<p>
+ <code>http://your-server/rest/deleteUser.view</code>
+ <br>Since <a href="#versions">1.3.0</a>
+</p>
+
+<p>
+ Deletes an existing Subsonic user, using the following parameters:
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>username</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The name of the user to delete.</td>
+ </tr>
+</table>
+
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-download.jsp b/subsonic-site/src/main/webapp/api-download.jsp
new file mode 100644
index 00000000..63b55a00
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-download.jsp
@@ -0,0 +1,28 @@
+<h2 class="div"><a name="download"></a>download</h2>
+
+<p>
+ <code>http://your-server/rest/download.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+</p>
+
+<p>
+ Downloads a given media file. Similar to <code>stream</code>, but this method returns the original media data
+ without transcoding or downsampling.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>A string which uniquely identifies the file to download. Obtained by calls to getMusicDirectory.</td>
+ </tr>
+</table>
+<p>
+ Returns binary data on success, or an XML document on error (in which case the HTTP content type will start with "text/xml").
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getAlbum.jsp b/subsonic-site/src/main/webapp/api-getAlbum.jsp
new file mode 100644
index 00000000..3980c740
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getAlbum.jsp
@@ -0,0 +1,29 @@
+<h2 class="div"><a name="getAlbum"></a>getAlbum</h2>
+
+<p>
+ <code>http://your-server/rest/getAlbum.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Returns details for an album, including a list of songs. This method organizes music according to ID3 tags.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The album ID.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;album&gt;</code>
+ element on success.
+ <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/album_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getAlbumList.jsp b/subsonic-site/src/main/webapp/api-getAlbumList.jsp
new file mode 100644
index 00000000..a5f2e0d3
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getAlbumList.jsp
@@ -0,0 +1,44 @@
+<h2 class="div"><a name="getAlbumList"></a>getAlbumList</h2>
+
+<p>
+ <code>http://your-server/rest/getAlbumList.view</code>
+ <br>Since <a href="#versions">1.2.0</a>
+</p>
+
+<p>
+ Returns a list of random, newest, highest rated etc. albums. Similar to the album lists
+ on the home page of the Subsonic web interface.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>type</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The list type. Must be one of the following: <code>random</code>, <code>newest</code>,
+ <code>highest</code>, <code>frequent</code>, <code>recent</code>. Since <a href="#versions">1.8.0</a>
+ you can also use <code>alphabeticalByName</code> or <code>alphabeticalByArtist</code> to page through all albums
+ alphabetically, and <code>starred</code> to retrieve starred albums.</td>
+ </tr>
+ <tr>
+ <td><code>size</code></td>
+ <td>No</td>
+ <td>10</td>
+ <td>The number of albums to return. Max 500.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>offset</code></td>
+ <td>No</td>
+ <td>0</td>
+ <td>The list offset. Useful if you for example want to page through the list of newest albums.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;albumList&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/albumList_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getAlbumList2.jsp b/subsonic-site/src/main/webapp/api-getAlbumList2.jsp
new file mode 100644
index 00000000..ee2c962f
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getAlbumList2.jsp
@@ -0,0 +1,42 @@
+<h2 class="div"><a name="getAlbumList2"></a>getAlbumList2</h2>
+
+<p>
+ <code>http://your-server/rest/getAlbumList2.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Similar to <code>getAlbumList</code>, but organizes music according to ID3 tags.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>type</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The list type. Must be one of the following: <code>random</code>, <code>newest</code>,
+ <code>frequent</code>, <code>recent</code>, <code>starred</code>,
+ <code>alphabeticalByName</code> or <code>alphabeticalByArtist</code>.</td>
+ </tr>
+ <tr>
+ <td><code>size</code></td>
+ <td>No</td>
+ <td>10</td>
+ <td>The number of albums to return. Max 500.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>offset</code></td>
+ <td>No</td>
+ <td>0</td>
+ <td>The list offset. Useful if you for example want to page through the list of newest albums.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;albumList2&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/albumList2_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getArtist.jsp b/subsonic-site/src/main/webapp/api-getArtist.jsp
new file mode 100644
index 00000000..d649f5a6
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getArtist.jsp
@@ -0,0 +1,29 @@
+<h2 class="div"><a name="getArtist"></a>getArtist</h2>
+
+<p>
+ <code>http://your-server/rest/getArtist.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Returns details for an artist, including a list of albums. This method organizes music according to ID3 tags.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The artist ID.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;artist&gt;</code>
+ element on success.
+ <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/artist_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getArtists.jsp b/subsonic-site/src/main/webapp/api-getArtists.jsp
new file mode 100644
index 00000000..fdc4f5f7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getArtists.jsp
@@ -0,0 +1,15 @@
+<h2 class="div"><a name="getArtists"></a>getArtists</h2>
+
+<p>
+ <code>http://your-server/rest/getArtists.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Similar to <code>getIndexes</code>, but organizes music according to ID3 tags.
+</p>
+
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;artists&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/artists_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getAvatar.jsp b/subsonic-site/src/main/webapp/api-getAvatar.jsp
new file mode 100644
index 00000000..4201dd52
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getAvatar.jsp
@@ -0,0 +1,27 @@
+<h2 class="div"><a name="getAvatar"></a>getAvatar</h2>
+
+<p>
+ <code>http://your-server/rest/getAvatar.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Returns the avatar (personal image) for a user.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>username</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The user in question.</td>
+ </tr>
+</table>
+<p>
+ Returns the avatar image in binary form.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getChatMessages.jsp b/subsonic-site/src/main/webapp/api-getChatMessages.jsp
new file mode 100644
index 00000000..e27aa640
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getChatMessages.jsp
@@ -0,0 +1,28 @@
+<h2 class="div"><a name="getChatMessages"></a>getChatMessages</h2>
+
+<p>
+ <code>http://your-server/rest/getChatMessages.view</code>
+ <br>Since <a href="#versions">1.2.0</a>
+</p>
+
+<p>
+ Returns the current visible (non-expired) chat messages.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>since</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Only return messages newer than this time (in millis since Jan 1 1970).</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;chatMessages&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/chatMessages_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getCoverArt.jsp b/subsonic-site/src/main/webapp/api-getCoverArt.jsp
new file mode 100644
index 00000000..23f9ad5b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getCoverArt.jsp
@@ -0,0 +1,34 @@
+<h2 class="div"><a name="getCoverArt"></a>getCoverArt</h2>
+
+<p>
+ <code>http://your-server/rest/getCoverArt.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+</p>
+
+<p>
+ Returns a cover art image.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>A string which uniquely identifies the cover art file to download. Obtained by calls to getMusicDirectory.
+ </td>
+ </tr>
+ <tr>
+ <td><code>size</code></td>
+ <td>No</td>
+ <td></td>
+ <td>If specified, scale image to this size.</td>
+ </tr>
+</table>
+<p>
+ Returns the cover art image in binary form.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getIndexes.jsp b/subsonic-site/src/main/webapp/api-getIndexes.jsp
new file mode 100644
index 00000000..375f4a92
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getIndexes.jsp
@@ -0,0 +1,35 @@
+<h2 class="div"><a name="getIndexes"></a>getIndexes</h2>
+
+<p>
+ <code>http://your-server/rest/getIndexes.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+</p>
+
+<p>
+ Returns an indexed structure of all artists.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>musicFolderId</code></td>
+ <td>No</td>
+ <td></td>
+ <td>If specified, only return artists in the music folder with the given ID. See <code>getMusicFolders</code>.
+ </td>
+ </tr>
+ <tr>
+ <td><code>ifModifiedSince</code></td>
+ <td>No</td>
+ <td></td>
+ <td>If specified, only return a result if the artist collection has changed since the given time.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;indexes&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/indexes_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getLicense.jsp b/subsonic-site/src/main/webapp/api-getLicense.jsp
new file mode 100644
index 00000000..32185d7b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getLicense.jsp
@@ -0,0 +1,17 @@
+<h2 class="div"><a name="getLicense"></a>getLicense</h2>
+
+<p>
+ <code>http://your-server/rest/getLicense.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+</p>
+
+<p>
+ Get details about the software license. Takes no extra parameters. Please note that access to the
+ REST API requires that the server has a valid license (after a 30-day trial period). To get a license key you can
+ give a donation to the Subsonic project.
+</p>
+
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;license&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/license_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getLyrics.jsp b/subsonic-site/src/main/webapp/api-getLyrics.jsp
new file mode 100644
index 00000000..e9cfeb9d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getLyrics.jsp
@@ -0,0 +1,35 @@
+<h2 class="div"><a name="getLyrics"></a>getLyrics</h2>
+
+<p>
+ <code>http://your-server/rest/getLyrics.view</code>
+ <br>Since <a href="#versions">1.2.0</a>
+</p>
+
+<p>
+ Searches for and returns lyrics for a given song.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>artist</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The artist name.</td>
+ </tr>
+ <tr>
+ <td><code>title</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The song title.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;lyrics&gt;</code>
+ element on success. The <code>&lt;lyrics&gt;</code> element is empty if no matching lyrics was found.
+ <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/lyrics_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getMusicDirectory.jsp b/subsonic-site/src/main/webapp/api-getMusicDirectory.jsp
new file mode 100644
index 00000000..87e159a1
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getMusicDirectory.jsp
@@ -0,0 +1,32 @@
+<h2 class="div"><a name="getMusicDirectory"></a>getMusicDirectory</h2>
+
+<p>
+ <code>http://your-server/rest/getMusicDirectory.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+</p>
+
+<p>
+ Returns a listing of all files in a music directory. Typically used to get list of albums for an artist,
+ or list of songs for an album.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>A string which uniquely identifies the music folder. Obtained by calls to getIndexes or getMusicDirectory.
+ </td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;directory&gt;</code>
+ element on success.
+ <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/directory_example_1.xml?view=markup">Example 1</a>.
+ <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/directory_example_2.xml?view=markup">Example 2</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getMusicFolders.jsp b/subsonic-site/src/main/webapp/api-getMusicFolders.jsp
new file mode 100644
index 00000000..f7e5ac5c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getMusicFolders.jsp
@@ -0,0 +1,15 @@
+<h2 class="div"><a name="getMusicFolders"></a>getMusicFolders</h2>
+
+<p>
+ <code>http://your-server/rest/getMusicFolders.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+</p>
+
+<p>
+ Returns all configured top-level music folders. Takes no extra parameters.
+</p>
+
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;musicFolders&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/musicFolders_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getNowPlaying.jsp b/subsonic-site/src/main/webapp/api-getNowPlaying.jsp
new file mode 100644
index 00000000..597994d7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getNowPlaying.jsp
@@ -0,0 +1,15 @@
+<h2 class="div"><a name="getNowPlaying"></a>getNowPlaying</h2>
+
+<p>
+ <code>http://your-server/rest/getNowPlaying.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+</p>
+
+<p>
+ Returns what is currently being played by all users. Takes no extra parameters.
+</p>
+
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;nowPlaying&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/nowPlaying_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getPlaylist.jsp b/subsonic-site/src/main/webapp/api-getPlaylist.jsp
new file mode 100644
index 00000000..0e795f8b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getPlaylist.jsp
@@ -0,0 +1,28 @@
+<h2 class="div"><a name="getPlaylist"></a>getPlaylist</h2>
+
+<p>
+ <code>http://your-server/rest/getPlaylist.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+</p>
+
+<p>
+ Returns a listing of files in a saved playlist.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>yes</td>
+ <td></td>
+ <td>ID of the playlist to return, as obtained by <code>getPlaylists</code>.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;playlist&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/playlist_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getPlaylists.jsp b/subsonic-site/src/main/webapp/api-getPlaylists.jsp
new file mode 100644
index 00000000..0bc87e23
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getPlaylists.jsp
@@ -0,0 +1,29 @@
+<h2 class="div"><a name="getPlaylists"></a>getPlaylists</h2>
+
+<p>
+ <code>http://your-server/rest/getPlaylists.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+</p>
+
+<p>
+ Returns all playlists a user is allowed to play.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>username</code></td>
+ <td>no</td>
+ <td></td>
+ <td>(Since <a href="#versions">1.8.0</a>) If specified, return playlists for this user rather than for the authenticated user. The authenticated user must
+ have admin role if this parameter is used.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;playlists&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/playlists_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getPodcasts.jsp b/subsonic-site/src/main/webapp/api-getPodcasts.jsp
new file mode 100644
index 00000000..a5a6b2d2
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getPodcasts.jsp
@@ -0,0 +1,28 @@
+<h2 class="div"><a name="getPodcasts"></a>getPodcasts</h2>
+
+<p>
+ <code>http://your-server/rest/getPodcasts.view</code>
+ <br>Since <a href="#versions">1.6.0</a>
+</p>
+
+<p>
+ Returns all podcast channels the server subscribes to and their episodes. Takes no extra parameters.
+</p>
+
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;podcasts&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/podcasts_example_1.xml?view=markup">Example</a>.
+</p>
+
+<h2 class="div">getShares</h2>
+<p>
+ <code>http://your-server/rest/getShares.view</code>
+ <br>Since <a href="#versions">1.6.0</a>
+</p>
+<p>
+ Returns information about shared media this user is allowed to manage. Takes no extra parameters.
+</p>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;shares&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/shares_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getRandomSongs.jsp b/subsonic-site/src/main/webapp/api-getRandomSongs.jsp
new file mode 100644
index 00000000..bba4fccb
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getRandomSongs.jsp
@@ -0,0 +1,52 @@
+<h2 class="div"><a name="getRandomSongs"></a>getRandomSongs</h2>
+
+<p>
+ <code>http://your-server/rest/getRandomSongs.view</code>
+ <br>Since <a href="#versions">1.2.0</a>
+</p>
+
+<p>
+ Returns random songs matching the given criteria.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>size</code></td>
+ <td>No</td>
+ <td>10</td>
+ <td>The maximum number of songs to return. Max 500.</td>
+ </tr>
+ <tr>
+ <td><code>genre</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Only returns songs belonging to this genre.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>fromYear</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Only return songs published after or in this year.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>toYear</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Only return songs published before or in this year.</td>
+ </tr>
+ <tr>
+ <td><code>musicFolderId</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Only return songs in the music folder with the given ID. See getMusicFolders.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;randomSongs&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/randomSongs_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getShares.jsp b/subsonic-site/src/main/webapp/api-getShares.jsp
new file mode 100644
index 00000000..096d47d8
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getShares.jsp
@@ -0,0 +1,14 @@
+<h2 class="div"><a name="getShares"></a>getShares</h2>
+<p>
+ <code>http://your-server/rest/getShares.view</code>
+ <br>Since <a href="#versions">1.6.0</a>
+</p>
+<p>
+ Returns information about shared media this user is allowed to manage. Takes no extra parameters.
+</p>
+
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;shares&gt;</code>
+ element on success.
+ <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/shares_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getSong.jsp b/subsonic-site/src/main/webapp/api-getSong.jsp
new file mode 100644
index 00000000..3b799a3f
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getSong.jsp
@@ -0,0 +1,29 @@
+<h2 class="div"><a name="getSong"></a>getSong</h2>
+
+<p>
+ <code>http://your-server/rest/getSong.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Returns details for a song.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The song ID.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;song&gt;</code>
+ element on success.
+ <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/song_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getStarred.jsp b/subsonic-site/src/main/webapp/api-getStarred.jsp
new file mode 100644
index 00000000..a6e411fc
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getStarred.jsp
@@ -0,0 +1,14 @@
+<h2 class="div"><a name="getStarred"></a>getStarred</h2>
+
+<p>
+ <code>http://your-server/rest/getStarred.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Returns starred songs, albums and artists.
+</p>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;starred&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/starred_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getStarred2.jsp b/subsonic-site/src/main/webapp/api-getStarred2.jsp
new file mode 100644
index 00000000..c6e9232a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getStarred2.jsp
@@ -0,0 +1,14 @@
+<h2 class="div"><a name="getStarred2"></a>getStarred2</h2>
+
+<p>
+ <code>http://your-server/rest/getStarred2.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Similar to <code>getStarred</code>, but organizes music according to ID3 tags.
+</p>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;starred2&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/starred2_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getUser.jsp b/subsonic-site/src/main/webapp/api-getUser.jsp
new file mode 100644
index 00000000..12615b7c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getUser.jsp
@@ -0,0 +1,29 @@
+<h2 class="div"><a name="getUser"></a>getUser</h2>
+
+<p>
+ <code>http://your-server/rest/getUser.view</code>
+ <br>Since <a href="#versions">1.3.0</a>
+</p>
+
+<p>
+ Get details about a given user, including which authorization roles it has.
+ Can be used to enable/disable certain features in the client, such as jukebox control.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>username</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The name of the user to retrieve. You can only retrieve your own user unless you have admin privileges.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;user&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/user_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-getVideos.jsp b/subsonic-site/src/main/webapp/api-getVideos.jsp
new file mode 100644
index 00000000..11fc7ed0
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-getVideos.jsp
@@ -0,0 +1,15 @@
+<h2 class="div"><a name="getVideos"></a>getVideos</h2>
+
+<p>
+ <code>http://your-server/rest/getVideos.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Returns all video files.
+</p>
+
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;videos&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/videos_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-jukeboxControl.jsp b/subsonic-site/src/main/webapp/api-jukeboxControl.jsp
new file mode 100644
index 00000000..ee87a9b2
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-jukeboxControl.jsp
@@ -0,0 +1,60 @@
+<h2 class="div"><a name="jukeboxControl"></a>jukeboxControl</h2>
+
+<p>
+ <code>http://your-server/rest/jukeboxControl.view</code>
+ <br>Since <a href="#versions">1.2.0</a>
+</p>
+
+<p>
+ Controls the jukebox, i.e., playback directly on the server's audio hardware. Note: The user must
+ be authorized to control the jukebox (see Settings &gt; Users &gt; User is allowed to play files in jukebox mode).
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>action</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The operation to perform. Must be one of: <code>get</code>, <code>status</code> (since <a href="#versions">1.7.0</a>), <code>set</code> (since <a href="#versions">1.7.0</a>),
+ <code>start</code>, <code>stop</code>, <code>skip</code>, <code>add</code>, <code>clear</code>, <code>remove</code>, <code>shuffle</code>, <code>setGain</code>
+ </td>
+ </tr>
+ <tr>
+ <td><code>index</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Used by <code>skip</code> and <code>remove</code>. Zero-based index of the song to skip to or remove.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>offset</code></td>
+ <td>No</td>
+ <td></td>
+ <td>(Since <a href="#versions">1.7.0</a>) Used by <code>skip</code>. Start playing this many seconds into the track.</td>
+ </tr>
+ <tr>
+ <td><code>id</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Used by <code>add</code> and <code>set</code>. ID of song to add to the jukebox playlist. Use multiple <code>id</code> parameters
+ to add many songs in the same request. (<code>set</code> is similar to a <code>clear</code> followed by a <code>add</code>, but
+ will not change the currently playing track.)
+ </td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>gain</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Used by <code>setGain</code> to control the playback volume. A float value between 0.0 and 1.0.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;jukeboxStatus&gt;</code> element on success, unless the <code>get</code>
+ action is used, in which case a nested <code>&lt;jukeboxPlaylist&gt;</code> element is returned.
+ <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/jukeboxStatus_example_1.xml?view=markup">Example 1</a>.
+ <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/jukeboxPlaylist_example_1.xml?view=markup">Example 2</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-ping.jsp b/subsonic-site/src/main/webapp/api-ping.jsp
new file mode 100644
index 00000000..af9568fa
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-ping.jsp
@@ -0,0 +1,14 @@
+<h2 class="div"><a name="ping"></a>ping</h2>
+
+<p>
+ <code>http://your-server/rest/ping.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+</p>
+
+<p>
+ Used to test connectivity with the server. Takes no extra parameters.
+</p>
+
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/ping_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-scrobble.jsp b/subsonic-site/src/main/webapp/api-scrobble.jsp
new file mode 100644
index 00000000..9a01f49f
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-scrobble.jsp
@@ -0,0 +1,34 @@
+<h2 class="div"><a name="scrobble"></a>scrobble</h2>
+
+<p>
+ <code>http://your-server/rest/scrobble.view</code>
+ <br>Since <a href="#versions">1.5.0</a>
+</p>
+
+<p>
+ "Scrobbles" a given music file on last.fm. Requires that the user has configured his/her last.fm
+ credentials on the Subsonic server (Settings &gt; Personal).
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>A string which uniquely identifies the file to scrobble.</td>
+ </tr>
+ <tr>
+ <td><code>submission</code></td>
+ <td>No</td>
+ <td>True</td>
+ <td>Whether this is a "submission" or a "now playing" notification.</td>
+ </tr>
+</table>
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-search.jsp b/subsonic-site/src/main/webapp/api-search.jsp
new file mode 100644
index 00000000..f74fba2e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-search.jsp
@@ -0,0 +1,65 @@
+<h2 class="div"><a name="search"></a>search</h2>
+
+<p>
+ <code>http://your-server/rest/search.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+ <br>Deprecated since <a href="#versions">1.4.0</a>, use <code>search2</code> instead.
+</p>
+
+<p>
+ Returns a listing of files matching the given search criteria. Supports paging through the result.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>artist</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Artist to search for.</td>
+ </tr>
+ <tr>
+ <td><code>album</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Album to searh for.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>title</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Song title to search for.</td>
+ </tr>
+ <tr>
+ <td><code>any</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Searches all fields.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>count</code></td>
+ <td>No</td>
+ <td>20</td>
+ <td>Maximum number of results to return.</td>
+ </tr>
+ <tr>
+ <td><code>offset</code></td>
+ <td>No</td>
+ <td>0</td>
+ <td>Search result offset. Used for paging.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>newerThan</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Only return matches that are newer than this. Given as milliseconds since 1970.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;searchResult&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/searchResult_example_1.xml?view=markup">Example</a>.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-search2.jsp b/subsonic-site/src/main/webapp/api-search2.jsp
new file mode 100644
index 00000000..c1491f4d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-search2.jsp
@@ -0,0 +1,65 @@
+<h2 class="div"><a name="search2"></a>search2</h2>
+
+<p>
+ <code>http://your-server/rest/search2.view</code>
+ <br>Since <a href="#versions">1.4.0</a>
+</p>
+
+<p>
+ Returns albums, artists and songs matching the given search criteria. Supports paging through the result.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>query</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>Search query.</td>
+ </tr>
+ <tr>
+ <td><code>artistCount</code></td>
+ <td>No</td>
+ <td>20</td>
+ <td>Maximum number of artists to return.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>artistOffset</code></td>
+ <td>No</td>
+ <td>0</td>
+ <td>Search result offset for artists. Used for paging.</td>
+ </tr>
+ <tr>
+ <td><code>albumCount</code></td>
+ <td>No</td>
+ <td>20</td>
+ <td>Maximum number of albums to return.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>albumOffset</code></td>
+ <td>No</td>
+ <td>0</td>
+ <td>Search result offset for albums. Used for paging.</td>
+ </tr>
+ <tr>
+ <td><code>songCount</code></td>
+ <td>No</td>
+ <td>20</td>
+ <td>Maximum number of songs to return.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>songOffset</code></td>
+ <td>No</td>
+ <td>0</td>
+ <td>Search result offset for songs. Used for paging.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;searchResult2&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/searchResult2_example_1.xml?view=markup">Example</a>.
+</p>
+
diff --git a/subsonic-site/src/main/webapp/api-search3.jsp b/subsonic-site/src/main/webapp/api-search3.jsp
new file mode 100644
index 00000000..623a65a5
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-search3.jsp
@@ -0,0 +1,65 @@
+<h2 class="div"><a name="search3"></a>search3</h2>
+
+<p>
+ <code>http://your-server/rest/search3.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Similar to <code>search2</code>, but organizes music according to ID3 tags.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>query</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>Search query.</td>
+ </tr>
+ <tr>
+ <td><code>artistCount</code></td>
+ <td>No</td>
+ <td>20</td>
+ <td>Maximum number of artists to return.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>artistOffset</code></td>
+ <td>No</td>
+ <td>0</td>
+ <td>Search result offset for artists. Used for paging.</td>
+ </tr>
+ <tr>
+ <td><code>albumCount</code></td>
+ <td>No</td>
+ <td>20</td>
+ <td>Maximum number of albums to return.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>albumOffset</code></td>
+ <td>No</td>
+ <td>0</td>
+ <td>Search result offset for albums. Used for paging.</td>
+ </tr>
+ <tr>
+ <td><code>songCount</code></td>
+ <td>No</td>
+ <td>20</td>
+ <td>Maximum number of songs to return.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>songOffset</code></td>
+ <td>No</td>
+ <td>0</td>
+ <td>Search result offset for songs. Used for paging.</td>
+ </tr>
+</table>
+<p>
+ Returns a <code>&lt;subsonic-response&gt;</code> element with a nested <code>&lt;searchResult3&gt;</code>
+ element on success. <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/webapp/xsd/searchResult3_example_1.xml?view=markup">Example</a>.
+</p>
+
diff --git a/subsonic-site/src/main/webapp/api-setRating.jsp b/subsonic-site/src/main/webapp/api-setRating.jsp
new file mode 100644
index 00000000..c2fd34ae
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-setRating.jsp
@@ -0,0 +1,33 @@
+<h2 class="div"><a name="setRating"></a>setRating</h2>
+
+<p>
+ <code>http://your-server/rest/setRating.view</code>
+ <br>Since <a href="#versions">1.6.0</a>
+</p>
+
+<p>
+ Sets the rating for a music file.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>A string which uniquely identifies the file (song) or folder (album/artist) to rate.</td>
+ </tr>
+ <tr>
+ <td><code>rating</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The rating between 1 and 5 (inclusive), or 0 to remove the rating.</td>
+ </tr>
+</table>
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-star.jsp b/subsonic-site/src/main/webapp/api-star.jsp
new file mode 100644
index 00000000..a18c9b68
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-star.jsp
@@ -0,0 +1,41 @@
+<h2 class="div"><a name="star"></a>star</h2>
+
+<p>
+ <code>http://your-server/rest/star.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Attaches a star to a song, album or artist.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The ID of the file (song) or folder (album/artist) to star. Multiple parameters allowed.</td>
+ </tr>
+ <tr>
+ <td><code>albumId</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The ID of an album to star. Use this rather than <code>id</code> if the client accesses the media collection according to ID3
+ tags rather than file structure. Multiple parameters allowed.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>artistId</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The ID of an artist to star. Use this rather than <code>id</code> if the client accesses the media collection according to ID3
+ tags rather than file structure. Multiple parameters allowed.</td>
+ </tr>
+</table>
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-stream.jsp b/subsonic-site/src/main/webapp/api-stream.jsp
new file mode 100644
index 00000000..dba598c1
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-stream.jsp
@@ -0,0 +1,59 @@
+<h2 class="div"><a name="stream"></a>stream</h2>
+
+<p>
+ <code>http://your-server/rest/stream.view</code>
+ <br>Since <a href="#versions">1.0.0</a>
+</p>
+
+<p>
+ Streams a given media file.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>A string which uniquely identifies the file to stream. Obtained by calls to getMusicDirectory.</td>
+ </tr>
+ <tr>
+ <td><code>maxBitRate</code></td>
+ <td>No</td>
+ <td></td>
+ <td>(Since <a href="#versions">1.2.0</a>) If specified, the server will attempt to limit the bitrate
+ to this value, in kilobits per second. If set to zero, no limit is imposed.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>format</code></td>
+ <td>No</td>
+ <td></td>
+ <td>(Since <a href="#versions">1.6.0</a>) Specifies the preferred target format (e.g., "mp3" or "flv") in case there are multiple applicable transcodings.</td>
+ </tr>
+ <tr>
+ <td><code>timeOffset</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Only applicable to video streaming. If specified, start streaming at the given offset (in seconds) into the video.
+ Typically used to implement video skipping.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>size</code></td>
+ <td>No</td>
+ <td></td>
+ <td>(Since <a href="#versions">1.6.0</a>) Only applicable to video streaming. Requested video size specified as WxH, for instance "640x480".</td>
+ </tr>
+ <tr>
+ <td><code>estimateContentLength</code></td>
+ <td>No</td>
+ <td>false</td>
+ <td>(Since <a href="#versions">1.8.0</a>). If set to "true", the <em>Content-Length</em> HTTP header will be set to an estimated value
+ for transcoded or downsampled media.</td>
+ </tr></table>
+<p>
+ Returns binary data on success, or an XML document on error (in which case the HTTP content type will start with "text/xml").
+</p>
diff --git a/subsonic-site/src/main/webapp/api-unstar.jsp b/subsonic-site/src/main/webapp/api-unstar.jsp
new file mode 100644
index 00000000..9644f7b5
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-unstar.jsp
@@ -0,0 +1,41 @@
+<h2 class="div"><a name="unstar"></a>unstar</h2>
+
+<p>
+ <code>http://your-server/rest/unstar.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Removes the star from a song, album or artist.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The ID of the file (song) or folder (album/artist) to unstar. Multiple parameters allowed.</td>
+ </tr>
+ <tr>
+ <td><code>albumId</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The ID of an album to unstar. Use this rather than <code>id</code> if the client accesses the media collection according to ID3
+ tags rather than file structure. Multiple parameters allowed.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>artistId</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The ID of an artist to unstar. Use this rather than <code>id</code> if the client accesses the media collection according to ID3
+ tags rather than file structure. Multiple parameters allowed.</td>
+ </tr>
+</table>
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-updatePlaylist.jsp b/subsonic-site/src/main/webapp/api-updatePlaylist.jsp
new file mode 100644
index 00000000..e10856b5
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-updatePlaylist.jsp
@@ -0,0 +1,64 @@
+<h2 class="div"><a name="updatePlaylist"></a>updatePlaylist</h2>
+
+<p>
+ <code>http://your-server/rest/updatePlaylist.view</code>
+ <br>Since <a href="#versions">1.8.0</a>
+</p>
+
+<p>
+ Updates a playlist. Only the owner of a playlist is allowed to update it.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>playlistId</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The playlist ID.</td>
+ </tr>
+ <tr>
+ <td><code>name</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The human-readable name of the playlist.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>comment</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The playlist comment.</td>
+ </tr>
+ <%--TODO: Add later--%>
+ <%--<tr>--%>
+ <%--<td><code>usernameToAdd</code></td>--%>
+ <%--<td>No</td>--%>
+ <%--<td></td>--%>
+ <%--<td>Allow this user to listen to this playlist. Multiple parameters allowed.</td>--%>
+ <%--</tr>--%>
+ <%--<tr class="table-altrow">--%>
+ <%--<td><code>usernameToRemove</code></td>--%>
+ <%--<td>No</td>--%>
+ <%--<td></td>--%>
+ <%--<td>Disallow this user to listen to this playlist. Multiple parameters allowed.</td>--%>
+ <%--</tr>--%>
+ <tr>
+ <td><code>songIdToAdd</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Add this song with this ID to the playlist. Multiple parameters allowed.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>songIndexToRemove</code></td>
+ <td>No</td>
+ <td></td>
+ <td>Remove the song at this position in the playlist. Multiple parameters allowed.</td>
+ </tr>
+</table>
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api-updateShare.jsp b/subsonic-site/src/main/webapp/api-updateShare.jsp
new file mode 100644
index 00000000..8523ef30
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api-updateShare.jsp
@@ -0,0 +1,37 @@
+<h2 class="div"><a name="updateShare"></a>updateShare</h2>
+<p>
+ <code>http://your-server/rest/updateShare.view</code>
+ <br>Since <a href="#versions">1.6.0</a>
+</p>
+<p>
+ Updates the description and/or expiration date for an existing share.
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>id</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>ID of the share to update.</td>
+ </tr>
+ <tr>
+ <td><code>description</code></td>
+ <td>No</td>
+ <td></td>
+ <td>A user-defined description that will be displayed to people visiting the shared media.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>expires</code></td>
+ <td>No</td>
+ <td></td>
+ <td>The time at which the share expires. Given as milliseconds since 1970, or zero to remove the expiration.</td>
+ </tr>
+</table>
+<p>
+ Returns an empty <code>&lt;subsonic-response&gt;</code> element on success.
+</p>
diff --git a/subsonic-site/src/main/webapp/api.jsp b/subsonic-site/src/main/webapp/api.jsp
new file mode 100644
index 00000000..ffcbf0dd
--- /dev/null
+++ b/subsonic-site/src/main/webapp/api.jsp
@@ -0,0 +1,425 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "api"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+<%@ include file="menu.jsp" %>
+
+<div id="content">
+<div id="main-col">
+<h1>Subsonic API</h1>
+
+<p>
+ The Subsonic API allows anyone to build their own programs using Subsonic as the media server, whether they're
+ on the web, the desktop or on mobile devices. All the Subsonic <a href="apps.jsp">apps</a> are built using the
+ Subsonic API.
+</p>
+<p>
+ Feel free to join the <a href="http://groups.google.com/group/subsonic-app-developers">Subsonic App Developers</a> group
+ for discussions, suggestions and questions.
+</p>
+
+<h2 class="div">Introduction</h2>
+
+<p>
+ The Subsonic API allows you to call methods that respond in <a
+ href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a> style xml.
+ Individual methods are detailed below.
+</p>
+
+<p>
+ Please note that all methods take the following parameters:
+</p>
+
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Parameter</th>
+ <th class="param-heading">Required</th>
+ <th class="param-heading">Default</th>
+ <th class="param-heading">Comment</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>u</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The username.</td>
+ </tr>
+ <tr>
+ <td><code>p</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The password, either in clear text or hex-encoded with a "enc:" prefix.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>v</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>The protocol version implemented by the client, i.e., the version of the
+ <code>subsonic-rest-api.xsd</code> schema used (see below).</td>
+ </tr>
+ <tr>
+ <td><code>c</code></td>
+ <td>Yes</td>
+ <td></td>
+ <td>A unique string identifying the client application.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>f</code></td>
+ <td>No</td>
+ <td>xml</td>
+ <td>Request data to be returned in this format. Supported values are "xml", "json" (since <a href="#versions">1.4.0</a>)
+ and "jsonp" (since <a href="#versions">1.6.0</a>). If using jsonp, specify name of javascript callback function using
+ a <code>callback</code> parameter.</td>
+ </tr>
+</table>
+
+<p>
+ For example:
+</p>
+
+<p>
+ <code>http://your-server/rest/getIndexes.view?u=joe&amp;p=sesame&amp;v=1.1.0&amp;c=myapp</code>, or<br/>
+ <code>http://your-server/rest/getIndexes.view?u=joe&amp;p=enc:736573616d65&amp;v=1.1.0&amp;c=myapp</code>
+</p>
+
+<p>
+ Starting with API version <a href="#versions">1.2.0</a> it is no longer necessary to send the username and password as part of the URL.
+ Instead, HTTP <a href="http://en.wikipedia.org/wiki/Basic_access_authentication">Basic</a> authentication could be
+ used.
+ (Only <em>preemptive</em> authentication is supported, meaning that the credentials should be supplied by the client
+ without being challenged for it.)
+</p>
+
+<p>
+ Note that UTF-8 should be used when sending parameters to API methods. The XML returned
+ will also be encoded with UTF-8.
+</p>
+
+<p>
+ All methods (except those that return binary data) returns XML documents conforming to the
+ <code>subsonic-rest-api.xsd</code> schema. This schema (as well as example XML documents) can be found
+ at <code>http://your-server/xsd/</code>
+</p>
+
+<h2 class="div">Error handling</h2>
+
+<p>
+ If a method fails it will return an error code and message in an <code>&lt;error&gt;</code> element.
+ In addition, the <code>status</code> attribute of the <code>&lt;subsonic-response&gt;</code> root element
+ will be set to <code>failed</code> instead of <code>ok</code>. For example:
+</p>
+
+ <pre>
+ &lt;?xml version="1.0" encoding="UTF-8"?&gt;
+ &lt;subsonic-response xmlns="http://subsonic.org/restapi"
+ status="failed" version="1.1.0"&gt;
+ &lt;error code="40" message="Wrong username or password"/&gt;
+ &lt;/subsonic-response&gt;
+ </pre>
+
+<p>
+ The following error codes are defined:
+</p>
+<table width="100%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Code</th>
+ <th class="param-heading">Description</th>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>0</code></td>
+ <td>A generic error.</td>
+ </tr>
+ <tr>
+ <td><code>10</code></td>
+ <td>Required parameter is missing.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>20</code></td>
+ <td>Incompatible Subsonic REST protocol version. Client must upgrade.</td>
+ </tr>
+ <tr>
+ <td><code>30</code></td>
+ <td>Incompatible Subsonic REST protocol version. Server must upgrade.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>40</code></td>
+ <td>Wrong username or password.</td>
+ </tr>
+ <tr>
+ <td><code>50</code></td>
+ <td>User is not authorized for the given operation.</td>
+ </tr>
+ <tr class="table-altrow">
+ <td><code>60</code></td>
+ <td>The trial period for the Subsonic server is over. Please donate to get a license key. Visit subsonic.org for details.</td>
+ </tr>
+ <tr>
+ <td><code>70</code></td>
+ <td>The requested data was not found.</td>
+ </tr>
+</table>
+
+<h2 class="div"><a name="versions"></a>Versions</h2>
+
+<p>
+ This table shows the REST API version implemented in different Subsonic versions:
+</p>
+<table width="50%" class="bottomspace">
+ <tr>
+ <th class="param-heading">Subsonic version</th>
+ <th class="param-heading">REST API version</th>
+ </tr>
+ <tr class="table-altrow">
+ <td>4.7</td>
+ <td>1.8.0</td>
+ </tr>
+ <tr>
+ <td>4.6</td>
+ <td>1.7.0</td>
+ </tr>
+ <tr class="table-altrow">
+ <td>4.5</td>
+ <td>1.6.0</td>
+ </tr>
+ <tr>
+ <td>4.3.1</td>
+ <td>1.5.0</td>
+ </tr>
+ <tr class="table-altrow">
+ <td>4.2</td>
+ <td>1.4.0</td>
+ </tr>
+ <tr>
+ <td>4.1</td>
+ <td>1.3.0</td>
+ </tr>
+ <tr class="table-altrow">
+ <td>4.0</td>
+ <td>1.2.0</td>
+ </tr>
+ <tr>
+ <td>3.9</td>
+ <td>1.1.1</td>
+ </tr>
+ <tr class="table-altrow">
+ <td>3.8</td>
+ <td>1.0.0</td>
+ </tr>
+</table>
+<p>
+ Note that a Subsonic server is backward compatible with a REST client if and only if the major version is the same,
+ and the minor version of the client is less than or equal to the server's. For example, if the server has
+ REST API version 2.2, it supports client versions 2.0, 2.1 and 2.2, but not versions 1.x, 2.3+ or 3.x. The third
+ part of the version number is not used to determine compatibility.
+</p>
+
+<h2 class="div">File structure vs ID3 tags</h2>
+
+<p>
+ Starting with version <a href="#versions">1.8.0</a>, the API provides methods for accessing the media collection
+ organized according to ID3 tags, rather than file structure.
+</p>
+<p>
+ For instance, browsing through the collection using ID3 tags should use the <code>getArtists</code>, <code>getArtist</code>
+ and <code>getAlbum</code> methods.
+ To browse using file structure you would use <code>getIndexes</code> and <code>getMusicDirectory</code>.
+</p>
+<p>
+ Correspondingly, there are two sets of methods for searching, starring and album lists. Refer to the method
+ documentation for details.
+</p>
+
+<h1>API method documentation</h1>
+
+<table width="100%" class="bottomspace">
+ <tr class="table-altrow">
+ <td>System</td>
+ <td>
+ <code><a href="#ping">ping</a></code>,
+ <code><a href="#getLicense">getLicense</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td>Browsing</td>
+ <td>
+ <code><a href="#getMusicFolders">getMusicFolders</a></code>,
+ <code><a href="#getIndexes">getIndexes</a></code>,
+ <code><a href="#getMusicDirectory">getMusicDirectory</a></code>,
+ <code><a href="#getArtists">getArtists</a></code>,
+ <code><a href="#getArtist">getArtist</a></code>,
+ <code><a href="#getAlbum">getAlbum</a></code>,
+ <code><a href="#getSong">getSong</a></code>,
+ <code><a href="#getVideos">getVideos</a></code>
+ </td>
+ </tr>
+ <tr class="table-altrow">
+ <td>Album/song lists</td>
+ <td>
+ <code><a href="#getAlbumList">getAlbumList</a></code>,
+ <code><a href="#getAlbumList2">getAlbumList2</a></code>,
+ <code><a href="#getRandomSongs">getRandomSongs</a></code>,
+ <code><a href="#getNowPlaying">getNowPlaying</a></code>,
+ <code><a href="#getStarred">getStarred</a></code>,
+ <code><a href="#getStarred2">getStarred2</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td>Searching</td>
+ <td>
+ <code><a href="#search">search</a></code>,
+ <code><a href="#search2">search2</a></code>,
+ <code><a href="#search3">search3</a></code>
+ </td>
+ </tr>
+ <tr class="table-altrow">
+ <td>Playlists</td>
+ <td>
+ <code><a href="#getPlaylists">getPlaylists</a></code>,
+ <code><a href="#getPlaylist">getPlaylist</a></code>,
+ <code><a href="#createPlaylist">createPlaylist</a></code>,
+ <code><a href="#updatePlaylist">updatePlaylist</a></code>,
+ <code><a href="#deletePlaylist">deletePlaylist</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td>Media retrieval</td>
+ <td>
+ <code><a href="#stream">stream</a></code>,
+ <code><a href="#download">download</a></code>,
+ <code><a href="#getCoverArt">getCoverArt</a></code>,
+ <code><a href="#getLyrics">getLyrics</a></code>,
+ <code><a href="#getAvatar">getAvatar</a></code>
+ </td>
+ </tr>
+ <tr class="table-altrow">
+ <td>Media annotation</td>
+ <td>
+ <code><a href="#star">star</a></code>,
+ <code><a href="#unstar">unstar</a></code>,
+ <code><a href="#setRating">setRating</a></code>,
+ <code><a href="#scrobble">scrobble</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td>Sharing</td>
+ <td>
+ <code><a href="#getShares">getShares</a></code>,
+ <code><a href="#createShare">createShare</a></code>,
+ <code><a href="#updateShare">updateShare</a></code>,
+ <code><a href="#deleteShare">deleteShare</a></code>
+ </td>
+ </tr>
+ <tr class="table-altrow">
+ <td>Podcast</td>
+ <td>
+ <code><a href="#getPodcasts">getPodcasts</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td>Jukebox</td>
+ <td>
+ <code><a href="#jukeboxControl">jukeboxControl</a></code>
+ </td>
+ </tr>
+ <tr class="table-altrow">
+ <td>Chat</td>
+ <td>
+ <code><a href="#getChatMessages">getChatMessages</a></code>,
+ <code><a href="#addChatMessage">addChatMessage</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td style="white-space: nowrap; padding-right: 0.6em">User management</td>
+ <td>
+ <code><a href="#getUser">getUser</a></code>,
+ <code><a href="#createUser">createUser</a></code>,
+ <code><a href="#deleteUser">deleteUser</a></code>,
+ <code><a href="#changePassword">changePassword</a></code>
+ </td>
+ </tr>
+</table>
+
+<%@ include file="api-ping.jsp" %>
+<%@ include file="api-getLicense.jsp" %>
+
+<%@ include file="api-getMusicFolders.jsp" %>
+<%@ include file="api-getIndexes.jsp" %>
+<%@ include file="api-getMusicDirectory.jsp" %>
+<%@ include file="api-getArtists.jsp" %>
+<%@ include file="api-getArtist.jsp" %>
+<%@ include file="api-getAlbum.jsp" %>
+<%@ include file="api-getSong.jsp" %>
+<%@ include file="api-getVideos.jsp" %>
+
+<%@ include file="api-getAlbumList.jsp" %>
+<%@ include file="api-getAlbumList2.jsp" %>
+<%@ include file="api-getRandomSongs.jsp" %>
+<%@ include file="api-getNowPlaying.jsp" %>
+<%@ include file="api-getStarred.jsp" %>
+<%@ include file="api-getStarred2.jsp" %>
+
+<%@ include file="api-search.jsp" %>
+<%@ include file="api-search2.jsp" %>
+<%@ include file="api-search3.jsp" %>
+
+<%@ include file="api-getPlaylists.jsp" %>
+<%@ include file="api-getPlaylist.jsp" %>
+<%@ include file="api-createPlaylist.jsp" %>
+<%@ include file="api-updatePlaylist.jsp" %>
+<%@ include file="api-deletePlaylist.jsp" %>
+
+<%@ include file="api-stream.jsp" %>
+<%@ include file="api-download.jsp" %>
+<%@ include file="api-getCoverArt.jsp" %>
+<%@ include file="api-getLyrics.jsp" %>
+<%@ include file="api-getAvatar.jsp" %>
+
+<%@ include file="api-star.jsp" %>
+<%@ include file="api-unstar.jsp" %>
+<%@ include file="api-setRating.jsp" %>
+<%@ include file="api-scrobble.jsp" %>
+
+<%@ include file="api-getShares.jsp" %>
+<%@ include file="api-createShare.jsp" %>
+<%@ include file="api-updateShare.jsp" %>
+<%@ include file="api-deleteShare.jsp" %>
+
+<%@ include file="api-getPodcasts.jsp" %>
+
+<%@ include file="api-jukeboxControl.jsp" %>
+
+<%@ include file="api-getChatMessages.jsp" %>
+<%@ include file="api-addChatMessage.jsp" %>
+
+<%@ include file="api-getUser.jsp" %>
+<%@ include file="api-createUser.jsp" %>
+<%@ include file="api-deleteUser.jsp" %>
+<%@ include file="api-changePassword.jsp" %>
+
+</div>
+
+<div id="side-col">
+
+ <%@ include file="google-translate.jsp" %>
+ <%@ include file="donate.jsp" %>
+ <%@ include file="merchandise.jsp" %>
+
+</div>
+
+<div class="clear">
+</div>
+</div>
+<hr/>
+<%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/apps.jsp b/subsonic-site/src/main/webapp/apps.jsp
new file mode 100644
index 00000000..92f13119
--- /dev/null
+++ b/subsonic-site/src/main/webapp/apps.jsp
@@ -0,0 +1,650 @@
+<%@ page import="java.net.URL" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "apps"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+ <%@ include file="menu.jsp" %>
+
+ <div id="content">
+ <div id="main-col">
+ <h1 class="bottomspace">Subsonic Apps</h1>
+
+ <p>Check out the steadily growing list of Subsonic apps. These provide fun and alternative ways to
+ enjoy your media collection - no matter where you are.</p>
+
+ <h2>On your phone</h2>
+
+ <div class="floatcontainer margin10-t margin10-b">
+ <ul class="stars column-left">
+ <li><a href="#android">Subsonic</a> for Android</li>
+ <li><a href="#winphone">Subsonic</a> for Windows Phone</li>
+ <li><a href="#isub">iSub</a> for iPhone/iPad</li>
+ </ul>
+ <ul class="stars column-right">
+ <li><a href="#zsubsonic">Z-Subsonic</a> for iPhone/iPad</li>
+ <li><a href="#substream">SubStream</a> for iPhone/iPad</li>
+ <li><a href="#hypersonic">Hypersonic</a> for iPhone/iPad</li>
+ </ul>
+ </div>
+
+ <h2>On your device</h2>
+
+ <div class="floatcontainer margin10-t margin10-b">
+ <ul class="stars column-left">
+ <li><a href="#sonicair">SonicAir</a> for BlackBerry PlayBook</li>
+ <li><a href="#subsonos">Subsonos</a> for Sonos</li>
+ <li><a href="#chumby">Subsonic</a> for Chumby</li>
+ </ul>
+ <ul class="stars column-right">
+ <li><a href="#subsonictv">SubsonicTV</a> for Roku</li>
+ <li><a href="#subsonicchannel">Subsonic Channel</a> for Roku</li>
+ <li><a href="#xo">XO</a> for webOS and BlackBerry PlayBook</li>
+ </ul>
+ </div>
+
+ <h2>On your desktop</h2>
+
+ <div class="floatcontainer margin10-t margin10-b">
+ <ul class="stars column-left">
+ <li><a href="#subair">SubAir</a> for desktops</li>
+ <li><a href="#submariner">Submariner</a> for Mac</li>
+ <li><a href="#thumper">Thumper</a> for Mac</li>
+ <li><a href="#subclient">Subclient</a> for Windows</li>
+ </ul>
+ <ul class="stars column-right">
+ <li><a href="#subgadget">SubGadget</a> for Windows</li>
+ <li><a href="#periscope">Periscope</a> for Windows</li>
+ <li><a href="#subwiji">SubWiji</a> for Windows</li>
+ </ul>
+ </div>
+
+ <h2>In your browser</h2>
+
+ <div class="floatcontainer margin10-t margin10-b">
+ <ul class="stars column-left">
+ <li><a href="#perisonic">Perisonic</a> for Google Chrome</li>
+ </ul>
+ </div>
+
+ <p>
+ Please note that most of the apps are made by third-party developers, and are not maintained by
+ the Subsonic project. Some apps are commercial, while some are available for free.
+ </p>
+ <p>Also note that after a 30-day trial period you need a license key to use the apps.
+ You get a license key by giving a donation to the Subsonic project. The license never expires and is
+ valid for all current and future apps. By donating you also get other benefits; see info box on the
+ right.
+ </p>
+ <p>
+ Interested in making your own Subsonic app? Check out the <a href="api.jsp">API</a>.
+ </p>
+
+ <div class="featureitem">
+ <a name="android"></a>
+
+ <div class="heading">Subsonic for Android <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/android.png" alt="Android" class="img-left"/>
+ Stream music and video from your home computer to your phone. Never sync again!
+ All your media - anywhere, anytime!
+ </p>
+ <p>
+ Songs are cached for offline playback. Supports mp3, ogg, aac, flac, wma. Most video formats supported too.
+ </p>
+
+ <p>
+ You can also use this app as a remote control for music playing on your server.
+ </p>
+ <p>
+ Features offline mode, adaptive bitrates, equalizer and visualizer.
+ </p>
+ <p>
+ Developed and maintained by Sindre Mehus, the author of Subsonic. Available
+ on <a href="https://market.android.com/details?id=net.sourceforge.subsonic.androidapp">Android Market</a>.
+ </p>
+
+ <a href="inc/img/screenshots/screen12.png"><img src="inc/img/screenshots/thumb12.png" alt="" style="padding:3px;padding-left:40px;padding-right:20px"/></a>
+ <a href="inc/img/screenshots/screen13.png"><img src="inc/img/screenshots/thumb13.png" alt="" style="padding:3px;padding-right:20px"/></a>
+ <a href="inc/img/screenshots/screen14.png"><img src="inc/img/screenshots/thumb14.png" alt="" style="padding:3px;padding-right:20px"/></a>
+ <a href="inc/img/screenshots/screen15.png"><img src="inc/img/screenshots/thumb15.png" alt="" style="padding:3px"/></a>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="isub"></a>
+
+ <div class="heading">iSub for iPhone/iPad <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/appstore.png" alt="App Store" class="img-left"/>
+ <a href="http://isubapp.com/">iSub</a> is an iPhone/iPad app developed by Ben Baron, and is
+ available for purchase on the <a href="http://itunes.apple.com/us/app/isub-music-streamer/id362920532?mt=8">App&nbsp;Store</a>.
+ </p>
+ <a href="inc/img/screenshots/screen20.png"><img src="inc/img/screenshots/thumb20.png" alt="" style="padding:15px;padding-left:80px"/></a>
+ <a href="inc/img/screenshots/screen21.png"><img src="inc/img/screenshots/thumb21.png" alt="" style="padding:15px"/></a>
+ <a href="inc/img/screenshots/screen22.png"><img src="inc/img/screenshots/thumb22.png" alt="" style="padding:15px"/></a>
+
+ <ul class="list">
+ <li>Full support for creating and managing on-the-go playlists.</li>
+ <li>Automatic full song caching for the best network performance with no music drop outs.</li>
+ <li>Manually cache songs (Wifi sync) to listen offline, like on an airplane.</li>
+ <li>Caching of all browsed directories for speedy browsing.</li>
+ <li>Retina display support for beautiful album art while browsing and in the player.</li>
+ <li>Skipping within tracks, even while they are streaming.</li>
+ <li>Resuming music when interrupted by a call or text or when closing the app using the home button while a song is playing.</li>
+ <li>Each music folder is a playlist automatically so when you select a track from an album it will continue to play the rest of the tracks in that album.</li>
+ <li>Shuffle, Repeat 1, and Repeat All when playing an album.</li>
+ <li>Detailed track information by tapping the cover art.</li>
+ <li>Jukebox mode to use your device as a remote control for Subsonic for listening to music around the house.</li>
+ </ul>
+ <p>
+ Support: <a href="mailto:support@isubapp.com">support@isubapp.com</a>
+ </p>
+ <a href="http://itunes.apple.com/us/app/isub-music-streamer/id362920532?mt=8"><img src="inc/img/available_on_appstore.png" alt="" class="img-center"/></a>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="zsubsonic"></a>
+
+ <div class="heading">Z-Subsonic for iPhone/iPad <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/appstore.png" alt="App Store" class="img-left"/>
+ <a href="http://z-subsonic.com/">Z-Subsonic</a> is an iPhone/iPad app developed by Olusola Abiodun, and is
+ available for purchase on the <a href="http://itunes.apple.com/us/app/z-subsonic/id358344265?mt=8">App Store</a>.
+ </p>
+ <a href="inc/img/screenshots/screen17.png"><img src="inc/img/screenshots/thumb17.png" alt="" style="margin-left:30px;padding:3px"/></a>
+ <a href="inc/img/screenshots/screen18.png"><img src="inc/img/screenshots/thumb18.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen19.png"><img src="inc/img/screenshots/thumb19.png" alt="" style="padding:3px"/></a>
+
+ <ul class="list">
+ <li> Access your entire music library from anywhere on your iPhone or iPod regardless of the size of your music collection.</li>
+ <li> Play song formats that the iPhone/iPod will not normally play e.g. wma, flac, ogg.</li>
+ <li> Caches all queued songs as quickly as possible once Wi-fi connection is detected.</li>
+ <li> Browse and manage cached songs by artist/album. Delete entire artist/album from cache at once.</li>
+ <li> Delete or change song priority on the Now Playing list while songs are playing.</li>
+ <li> Double buffering: upcoming song starts to download before the currently playing song finishes.</li>
+ <li> Seeking for fully cached songs.</li>
+ <li> Load playlists stored on the Subsonic server.</li>
+ <li> Multiple server configuration.</li>
+ <li> Random playlist generation using entire song collection.</li>
+ <li> Repeat/shuffle/skip songs.</li>
+ <li> SSL support with prompt to authorize self-signed certificates.</li>
+ <li> Full caching. Z-Subsonic can be used fully disconnected with previously streamed music.</li>
+ <li> Favorites.
+ </ul>
+
+ <p>
+ See the <a href="http://www.youtube.com/watch?v=yFzM7-rfINM">video on YouTube</a>.
+ </p>
+
+ <p>
+ Support: <a href="mailto:helpdesk@z-subsonic.com">helpdesk@z-subsonic.com</a> &ndash;
+ Forum: <a href="http://z-subsonic.com/z-subsonic-forum">http://z-subsonic.com/z-subsonic-forum</a>
+ </p>
+ <a href="http://itunes.apple.com/us/app/z-subsonic/id358344265?mt=8"><img src="inc/img/available_on_appstore.png" alt="" class="img-center"/></a>
+
+
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="substream"></a>
+
+ <div class="heading">SubStream for iPhone/iPad <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/appstore.png" alt="App Store" class="img-left"/>
+ <a href="http://itunes.apple.com/us/app/substream/id389906706?mt=8">SubStream</a> is an iPhone/iPad app developed by Figment Inc., and is
+ available free of charge on the <a href="http://itunes.apple.com/us/app/substream/id389906706?mt=8">App Store</a>.
+ </p>
+ <a href="inc/img/screenshots/screen29.png"><img src="inc/img/screenshots/thumb29.png" alt="" style="margin-left:30px;padding:3px"/></a>
+ <a href="inc/img/screenshots/screen30.png"><img src="inc/img/screenshots/thumb30.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen31.png"><img src="inc/img/screenshots/thumb31.png" alt="" style="padding:3px"/></a>
+
+ <a href="http://itunes.apple.com/us/app/substream/id389906706?mt=8"><img src="inc/img/available_on_appstore.png" alt="" class="img-center"/></a>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="hypersonic"></a>
+
+ <div class="heading">Hypersonic for iPhone/iPad <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/appstore.png" alt="App Store" class="img-left"/>
+ <a href="http://bit.ly/hypersonicmp">Hypersonic</a> is a media player built to stream music live from a Subsonic server.
+ With Last.fm scrobbling, high quality mode, and support to specify a local server, you can always keep your full music collection with you.
+ </p>
+ <p>
+ Hypersonic is developed by Josh Betz and sells for $0.99 on <a href="http://bit.ly/hypersonicmp">App Store</a>.
+ </p>
+
+ <a href="inc/img/screenshots/screen43.png"><img src="inc/img/screenshots/thumb43.png" alt="" style="margin-left:30px;padding:3px"/></a>
+ <a href="inc/img/screenshots/screen44.png"><img src="inc/img/screenshots/thumb44.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen45.png"><img src="inc/img/screenshots/thumb45.png" alt="" style="padding:3px"/></a>
+
+ <a href="http://bit.ly/hypersonicmp"><img src="inc/img/available_on_appstore.png" alt="" class="img-center"/></a>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="winphone"></a>
+
+ <div class="heading">Subsonic for Windows Phone <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/windows-marketplace.png" alt="Windows Marketplace" class="img-left"/>
+ <a href="http://www.avzuylen.com/subsonic-music-streamer.aspx">Subsonic Music Streamer</a> is a Windows Phone 7 app developed by Anton Van Zuylen, and is
+ available for purchase in the <a href="http://redirect.zune.net/redirect?type=phoneApp&id=2eb445a5-ca04-e011-9264-00237de2db9e&source=WP7applist">Windows Marketplace</a>.
+ </p>
+ <a href="inc/img/screenshots/screen23.png"><img src="inc/img/screenshots/thumb23.png" alt="" style="margin-left:30px;padding:3px"/></a>
+ <a href="inc/img/screenshots/screen24.png"><img src="inc/img/screenshots/thumb24.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen25.png"><img src="inc/img/screenshots/thumb25.png" alt="" style="padding:3px"/></a>
+
+ <ul class="list">
+ <li>Always have access to your entire music collection without the need for any third party server or subscription.</li>
+ <li>Supports all popular formats (WMA, FLAC, MP3, AAC, OCG etc).</li>
+ <li>Keep listening when you have no cellular coverage due to full local storage including cover art, lyrics and info.</li>
+ <li>Manage your local stored music in a convenient way.</li>
+ <li>Control the quality of the music by controlling the streaming bit-rate.</li>
+ <li>Create playlists on the device which can contain songs from different servers simultaneously.</li>
+ <li>Add easily your newest music, your recently played albums, or your frequently played albums.</li>
+ <li>Add random albums.</li>
+ <li>Full search support.</li>
+ <li>Keep playing behind locked screen.</li>
+ <li>Full integration with the Music and Video hub.</li>
+ <li>Automatic storage management of local stored songs.</li>
+ <li>Allowing to lock specific local songs.</li>
+ </ul>
+
+ <p>
+ This application focuses on fast and easy handling with two main pages:
+ "Now playing" where you see and control all what is currently playing including cover art and lyrics; and
+ "Add to now playing" providing different methods for adding albums and songs to your playlist.
+ Start the application and the music is playing (just one click)!
+ </p>
+ <p>
+ Support: <a href="mailto:anton@avzuylen.com">anton@avzuylen.com</a>
+ </p>
+ <p>Go get it on the <a href="http://redirect.zune.net/redirect?type=phoneApp&id=2eb445a5-ca04-e011-9264-00237de2db9e&source=WP7applist">Windows Phone Marketplace</a>!</p>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="subair"></a>
+
+ <div class="heading">SubAir <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/air.png" alt="Adobe AIR" class="img-left"/>
+ <a href="http://www.nonpixel.com/subair/">SubAir</a> is a rich desktop application for Subsonic implemented with Adobe&copy; AIR.
+ Works with Windows, Mac and Linux.
+ </p>
+ <a href="inc/img/screenshots/screen16.png"><img src="inc/img/screenshots/thumb16.png" alt="" class="img-center"/></a>
+ <p>
+ Developed and maintained by <a href="http://www.nonpixel.com/">Jim Resnowski</a>, and
+ <a href="http://www.nonpixel.com/subair/">provided free or charge</a>.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="sonicair"></a>
+
+ <div class="heading">SonicAir <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/blackberry.png" alt="BlackBerry" class="img-left"/>
+ <a href="http://appworld.blackberry.com/webstore/content/55137?lang=en">SonicAir</a> is a Subsonic app for the BlackBerry PlayBook. Play all sorts of video and audio, even high definition 720P MKV files.
+ </p>
+
+ <img src="inc/img/screenshots/screen32.png" alt="" class="img-center"/>
+
+ <ul class="list">
+ <li>Listen to music and watch videos.</li>
+ <li>Control bitrate.</li>
+ <li>Cache lists for offline use.</li>
+ <li>Create and play playlists.</li>
+ <li>Use quick list feature to create on-the-go playlists.</li>
+ <li>Download songs for offline use later.</li>
+ </ul>
+ <p>
+ Developed and maintained by Mir &amp; Windsor Design, it's sold for $2.99
+ on <a href="http://appworld.blackberry.com/webstore/content/55137?lang=en">BlackBerry App World</a>.
+ </p>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="featureitem">
+ <a name="subsonos"></a>
+
+ <div class="heading">Subsonos <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <a href="http://www.subsonos.com/">Subsonos</a> allows Subsonic users to enjoy their entire collection by streaming over a Sonos music system.
+ </p>
+
+ <a href="inc/img/screenshots/screen37.png"><img src="inc/img/screenshots/thumb37.png" alt="" class="img-center"/></a>
+
+ <p>
+ Subsonos is a translation service (or proxy) that sits between your Sonos music system and your Subsonic streaming server.
+ Developed by NerdyHearn, Subsonos is currently in beta.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="chumby"></a>
+
+ <div class="heading">Subsonic for Chumby <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/chumby.png" alt="Chumby" class="img-left"/>
+ Introducing the <a href="http://subsonic.develephant.net/">Subsonic app</a> for Chumby-powered devices.
+ </p>
+
+ <a href="inc/img/screenshots/screen38.png"><img src="inc/img/screenshots/thumb38.png" alt="" class="img-center"/></a>
+
+ <ul class="list">
+ <li>Easy to use touchscreen tabletop experience for the Subsonic server.</li>
+ <li>Inviting home screen randomly cycles through your music collection.</li>
+ <li>Full alphabetical directory browsing and integrated soft keyboard for search.</li>
+ <li>Play "DJ" and add albums and songs to the internal playlist while listening.</li>
+ <li>Quick functions like "show 30 random albums", "play 50 random songs", etc.</li>
+ <li>Simple and responsive navigation system.</li>
+ <li>Runs on most Chumby-powered devices.</li>
+ <li>Long-term development road map.</li>
+ </ul>
+
+ <p>
+ Subsonic for Chumby is provided free of charge by <a href="http://subsonic.develephant.net/">develephant</a>.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="subsonictv"></a>
+
+ <div class="heading">SubsonicTV <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <a href="http://subsonictv.com/">SubsonicTV</a> for Roku is the perfect solution for enjoying your music &amp; video collection on your TV.
+ No need to go through the hassle of uploading to the cloud and syncing your files.
+ </p>
+
+ <a href="inc/img/screenshots/screen33.png"><img src="inc/img/screenshots/thumb33.png" alt="" class="img-center"/></a>
+
+ <p>
+ Developed by JNC Ventures and Musiclouds, it's available both as a free lite version and a paid premium version.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="subsonicchannel"></a>
+
+ <div class="heading">Subsonic Channel <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <a href="http://www.randomwalking.com/project.php?project=roku_subsonic">Subsonic Channel</a> is an open-source Roku frontend to Subsonic.
+ </p>
+
+ <a href="inc/img/screenshots/screen36.png"><img src="inc/img/screenshots/thumb36.png" alt="" class="img-center"/></a>
+
+ <ul class="list">
+ <li>Browse your entire catalog.</li>
+ <li>Search for artists, albums, songs.</li>
+ <li>Full catalog shuffle playback.</li>
+ <li>Quick browse of Subsonic album lists (Random, Recent, Top Rated, etc.)</li>
+ </ul>
+
+ <p>
+ Subsonic Channel is developed by Michael Ihde and is donation-supported.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="xo"></a>
+
+ <div class="heading">XO <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <a href="inc/img/screenshots/screen39.png"><img src="inc/img/screenshots/thumb39.png" alt="" class="img-right"/></a>
+
+ <p>
+ <a href="https://developer.palm.com/appredirect/?packageid=com.ericblade.xo">XO</a> is a Subsonic app for webOS.
+ </p>
+
+ <p>
+ Stream any music directly to your TouchPad, Pre, Pixi, or Veer. Built-in HTML5 streaming media support and player, with support for file download
+ and drag-and-drop playlists. XO makes streaming your music from home to wherever you are simple and fun!
+ </p>
+
+ <p>
+ It is also available for <a href="http://appworld.blackberry.com/webstore/content/88097/">BlackBerry PlayBook</a>.
+ </p>
+ <p>
+ XO is developed by Eric Blade.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="submariner"></a>
+
+ <div class="heading">Submariner <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <a href="http://www.read-write.fr/subapp/index.php">Submariner</a> is a Subsonic desktop application for Mac.
+ </p>
+ <a href="inc/img/screenshots/screen35.png"><img src="inc/img/screenshots/thumb35.png" alt="" class="img-center"/></a>
+
+ <p>
+ It provides a clean user interface to manage your remote libraries and to listen your music with simplicity.
+ With the cache streaming and download features, you can also listen to your favorite tracks offline.
+ </p>
+ <p>
+ <a href="http://itunes.apple.com/us/app/submariner/id463444563?ls=1&mt=12"><img class="img-center"
+ src="inc/img/mac-appstore.jpg" alt="Submariner"/></a>
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="thumper"></a>
+
+ <div class="heading">Thumper <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <a href="http://thumperapp.com/">Thumper</a> is a native Subsonic client for Mac.
+ </p>
+ <a href="inc/img/screenshots/screen27.png"><img src="inc/img/screenshots/thumb27.png" alt="" class="img-center"/></a>
+
+ <ul class="list">
+ <li>A Native Mac Application - designed on the Mac, for the Mac.</li>
+ <li>Local Caching of Library Information, Audio, and Album Art - reduce bandwidth and get a more responsive experience.</li>
+ <li>Browse Artists, Albums, and Songs.</li>
+ <li>Quick Artist Filter - quickly narrow your results.</li>
+ <li>Playlists - play, create, and delete Subsonic playlists.</li>
+ <li>Search - find the song you're looking for quickly.</li>
+ <li>Current Playlist Persistence - pickup right where you left off, even after a reboot.</li>
+ <li>Mac Media Key Integration - previous, play/pause, and next key support.</li>
+ <li>Keyboard Shortcuts - control volume, repeat, shuffle, etc. through keyboard shortcuts.</li>
+ <li>Last.fm Integration - songs are scrobbled as they're played.</li>
+ <li>Playback via QuickTime - if QuickTime can play it, so can Thumper.</li>
+ <li>View Random, Newest, Highest Rated, Most Frequent, and Recently Played Albums.</li>
+ <li>Smart Playlist Creation - get random songs narrowed by genre or year.</li>
+ <li>Now Playing Support - See what other users are listening to.</li>
+ <li>Transcoding (including FLAC) support with Subsonic 4.6 or greater.</li>
+ <li>Video streaming (requires proper codec to be installed, see FAQ).</li>
+ </ul>
+ <p>
+ Requires Mac OS X 10.7 or greater.
+ </p>
+ <p>
+ <a href="http://itunes.apple.com/us/app/thumper/id436422990?mt=12&uo=4"><img class="img-center"
+ src="inc/img/mac-appstore.jpg" alt="Thumper"/></a>
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="subgadget"></a>
+
+ <div class="heading">SubGadget <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/windows7.png" alt="Windows 7" class="img-left"/>
+ <a href="http://code.google.com/p/subgadget/">SubGadget</a> is a Windows Sidebar Gadget for Subsonic. Works with Windows 7 and Vista.
+ </p>
+ <img src="inc/img/screenshots/screen26.png" alt="" class="img-center"/>
+ <p>
+ Developed and maintained by Scott Mark, and <a href="http://code.google.com/p/subgadget/">provided free or charge</a>.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="periscope"></a>
+
+ <div class="heading">Periscope Player<a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/windows7.png" alt="Windows 7" class="img-left"/>
+ <a href="http://periscopeplayer.com/">Periscope Player</a> is a Windows desktop application for Subsonic.
+ </p>
+ <a href="inc/img/screenshots/screen28.png"><img src="inc/img/screenshots/thumb28.png" alt="" class="img-center"/></a>
+ <p>
+ Developed and maintained by <a href="mailto:support@periscopeplayer.com">Matt Campanile</a>.
+ Available as Lite and Pro versions. Lite is completely free and is a fully functional player. Pro adds some advanced features and is $4.99.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="subwiji"></a>
+
+ <div class="heading">SubWiji<a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <a href="http://forum.subsonic.org/forum/viewtopic.php?f=8&t=8772">SubWiji</a> is a Windows desktop application for Subsonic.
+ </p>
+ <a href="inc/img/screenshots/screen40.png"><img src="inc/img/screenshots/thumb40.png" alt="" class="img-center"/></a>
+ <a href="inc/img/screenshots/screen41.png"><img src="inc/img/screenshots/thumb41.png" alt="" class="img-center"/></a>
+ <p>Supports docking, auto-hiding, keyboard shortcuts, now playing popup, album grid viewer and much more.</p>
+ <p>SubWiji is made by <a href="http://www.paulodell.co.uk/">Paul O'Dell</a>. Free of charge, but accepts donations.</p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="subclient"></a>
+
+ <div class="heading">Subclient<a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <a href="http://www.subclient.net/">Subclient</a> is Java desktop client for Subsonic.
+ </p>
+ <a href="inc/img/screenshots/screen42.png"><img src="inc/img/screenshots/thumb42.png" alt="" class="img-center"/></a>
+
+ <ul class="list">
+ <li>MPlayer-based media playback.</li>
+ <li>Tray icon and media keys supported.</li>
+ <li>Multiple Subsonic servers can be used.</li>
+ <li>The playlist is saved between sessions.</li>
+ <li>Indexes, Podcasts and Playlists fetched from Subsonic server.</li>
+ <li>Cover arts stored locally to improve performance.</li>
+ </ul>
+ <p>Subclient is made by Alejandro Celaya Alastru&eacute; and is free of charge.</p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <a name="perisonic"></a>
+
+ <div class="heading">Perisonic<a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <a href="https://chrome.google.com/webstore/detail/bkdipjpecphmbijlckkkmabnabhbpjbn">Perisonic</a> is a simple
+ Chrome app for playing random music from Subsonic.
+ </p>
+ <img src="inc/img/screenshots/screen34.png" alt="" class="img-center"/>
+ <p style="padding-top:1em">
+ Perisonic is developed by Robin Bakker and is
+ <a href="https://chrome.google.com/webstore/detail/bkdipjpecphmbijlckkkmabnabhbpjbn">available</a> free of charge.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ </div>
+
+ <div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <%@ include file="donate.jsp" %>
+ </div>
+
+ <div class="clear">
+ </div>
+ </div>
+ <hr/>
+ <%@ include file="footer.jsp" %>
+</div>
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/banner.jsp b/subsonic-site/src/main/webapp/banner.jsp
new file mode 100644
index 00000000..bf371d93
--- /dev/null
+++ b/subsonic-site/src/main/webapp/banner.jsp
@@ -0,0 +1,103 @@
+<script type="text/javascript" language="javascript">
+
+ var currentSlide = 0;
+ var numberSlides = 0;
+
+ function slideTo(slideNumber, manual) {
+ currentSlide = slideNumber;
+ if (currentSlide > numberSlides) {
+ currentSlide = 0;
+ } else if (currentSlide < 0) {
+ currentSlide = numberSlides;
+ }
+ var slidePosition = currentSlide * 900;
+
+ var dur = (currentSlide == 0 || manual) ? 0 : 1000;
+ $('#bannercontent').animate({left: '-'+slidePosition+'px'},{duration:dur});
+ if (!manual) {
+ setTimeout(function() {slideTo(currentSlide + 1, false);}, 10000);
+ }
+ }
+
+ function prevSlide() {
+ slideTo(currentSlide - 1, true);
+ }
+
+ function nextSlide() {
+ slideTo(currentSlide + 1, true);
+ }
+
+ $(document).ready(function() {
+ numberSlides = $('#bannercontent div.slide').length - 1;
+ slideTo(0, false);
+ });
+
+</script>
+
+<hr/>
+<div id="banner-full">
+
+ <a id="slide-prev" href="javascript:prevSlide();"></a>
+ <a id="slide-next" href="javascript:nextSlide();"></a>
+
+ <div id="bannercontent">
+ <div class="slide1 slide">
+ <div class="slidecontent">
+ <img src="inc/img/banner/banner-01.jpg" alt="" class="screenshot"/>
+
+ <div class="title">
+ <div class="large">The soundtrack of your life</div>
+ <div class="small">Non-stop music and video streaming.</div>
+ </div>
+ </div>
+ </div>
+ <div class="slide2 slide">
+ <div class="slidecontent">
+ <img src="inc/img/banner/apps.png" alt="" class="screenshot"/>
+
+ <div class="title">
+ <div class="large">Don't leave home without it</div>
+ <div class="small"><a href="apps.jsp">Apps</a> available for Android, iPhone and Windows&nbsp;Phone&nbsp;7.</div>
+ </div>
+ </div>
+ </div>
+
+ <div class="slide3 slide">
+ <div class="slidecontent">
+ <img src="inc/img/banner/screenshot.png" alt="" class="screenshot"/>
+
+ <div class="title">
+ <div class="large">The most complete personal streaming system</div>
+ <div class="small">Subsonic comes packed with features.</div>
+ </div>
+ <div class="text">
+ Podcast receiver, jukebox mode, on-the-fly downsampling and conversion,
+ multiple frontends, highly configurable, full support for tags, lyrics and album art, open API
+ and <a href="features.jsp">much more</a>.
+ </div>
+ </div>
+ </div>
+ <div class="slide4 slide">
+ <div class="slidecontent">
+ <img src="inc/img/banner/video.png" alt="" class="screenshot"/>
+
+ <div class="title">
+ <div class="large">New in Subsonic 4.3</div>
+ <div class="small">Stream all your movies too!</div>
+ <img src="inc/img/banner/android-video.png" alt="" style="margin-top:20px;margin-left:90px;"/>
+ </div>
+ </div>
+ </div>
+ <div class="slide5 slide">
+ <div class="slidecontent">
+ <img src="inc/img/banner/car.png" alt="" class="screenshot"/>
+
+ <div class="title">
+ <div class="large">No strings attached</div>
+ <div class="small">Relax to your favourite tunes no matter where you are.</div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+<hr/> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/changelog.jsp b/subsonic-site/src/main/webapp/changelog.jsp
new file mode 100644
index 00000000..af6d22ad
--- /dev/null
+++ b/subsonic-site/src/main/webapp/changelog.jsp
@@ -0,0 +1,1011 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "changelog"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+<%@ include file="menu.jsp" %>
+
+<div id="content">
+<div id="main-col">
+<h1 class="bottomspace">Subsonic Change Log</h1>
+
+<a name="4.7.beta2"><h2 class="div">Subsonic 4.7.beta2 - Jun 08, 2012</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Playlist import/export.</li>
+ <li><span class="bugid">New: </span>Sort albums by year.</li>
+ <li><span class="bugid">New: </span>Show album year.</li>
+ <li><span class="bugid">New: </span>Added Czech translation, courtesy of Robert Ilyk.</li>
+ <li><span class="bugid">New: </span>Better error message if file or playlist not found.</li>
+ <li><span class="bugid">Bugfix: </span>Handle media files without any tags.</li>
+ <li><span class="bugid">Bugfix: </span>Display directory name rather than album name.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed genre search problem.</li>
+</ul>
+
+<a name="4.7.beta1"><h2 class="div">Subsonic 4.7.beta1 - May 12, 2012</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Major rewrite of the Subsonic core. It now uses less memory and is significantly faster.</li>
+ <li><span class="bugid">New: </span>"Star" support for managing your favorite artists, albums and songs.</li>
+ <li><span class="bugid">New: </span>Much improved playlist support: private/shared playlists, improved user interface.</li>
+ <li><span class="bugid">New: </span>Added option <em>Settings &gt; Media folders &gt; Fast access mode</em> which additionally improves performance for network disks.</li>
+ <li><span class="bugid">New: </span>Show media folder scanning status.</li>
+ <li><span class="bugid">New: </span>New albums lists: Starred and All.</li>
+ <li><span class="bugid">New: </span>Use ffmpeg rather than lame for downsampling.</li>
+ <li><span class="bugid">New: </span>Added Polish translation, courtesy of Micha&#322; Kotas</li>
+ <li><span class="bugid">New: </span>Added Catalan translation, courtesy of Josep Santal&oacute;.</li>
+ <li><span class="bugid">New: </span>Added Estonian translation, courtesy of Olav M&auml;gi.</li>
+ <li><span class="bugid">New: </span>Updated Dutch translation, courtesy of W. van der Heijden.</li>
+ <li><span class="bugid">New: </span>Updated Swedish translation, courtesy of Fritte Jensen.</li>
+ <li><span class="bugid">New: </span>Updated Catalan translation, courtesy of Josep Santalo.</li>
+ <li><span class="bugid">New: </span>Added option to reset and email forgotten password or username.</li>
+ <li><span class="bugid">New: </span>Make it configurable to run as a different user than root in Linux RPM.</li>
+ <li><span class="bugid">New: </span>Display warning if running as root user.</li>
+ <li><span class="bugid">New: </span>Avoid false alarms from Windows virus scanners.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed problem with players being associated to wrong users.</li>
+ <li><span class="bugid">Bugfix: </span>Serve generic cover art if failing to scale original.</li>
+ <li><span class="bugid">REST: </span>Full support for accessing the media collection organized according to ID3 tags, rather than file structure.</li>
+ <li><span class="bugid">REST: </span>Added starring and playlist management.</li>
+ <li><span class="bugid">REST: </span>Added disc number, creation date and media type.</li>
+ <li><span class="bugid">REST: </span>Suppress content length estimation by default. Added "estimateContentLength" parameter to stream method.</li>
+ <li><span class="bugid">REST: </span>Added getAvatar method.</li>
+ <li><span class="bugid">REST: </span>Added "shareRole" to createUser</li>
+ <li><span class="bugid">REST: </span>Fixed some JSON conversion problems ("JSON does not allow non-finite numbers")</li>
+ <li><span class="bugid">REST: </span>Fixed a problem with the "u" and "p" parameters sometimes not being used if the JSESSIONID cookie is present.</li>
+ <li><span class="bugid">REST: </span>Stream method now supports HEAD requests.</li>
+ <li><span class="bugid">REST: </span>Use shorter IDs.</li>
+ <li><span class="bugid">Tech: </span>Use port 4040 by default for new Windows installs.</li>
+</ul>
+
+<a name="4.6"><h2 class="div">Subsonic 4.6 - Dec 06, 2011</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Added option to resend license key.</li>
+ <li><span class="bugid">New: </span>Added AIFF support.</li>
+</ul>
+
+<a name="4.6.beta2"><h2 class="div">Subsonic 4.6.beta2 - Nov 17, 2011</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Added option in Settings &gt; Transcoding: "Enable this transcoding for all existing and new players."</li>
+ <li><span class="bugid">New: </span>Updated Slovenian translation, courtesy of Jan Jam&#353;ek.</li>
+ <li><span class="bugid">New: </span>Added Google+ button.</li>
+ <li><span class="bugid">New: </span>Automatically delete obsolete players on startup.</li>
+ <li><span class="bugid">Bugfix: </span>Jukebox now support skipping when paused.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed a case where guessing the title and track number failed.</li>
+ <li><span class="bugid">Bugfix: </span>Don't estimate content-length for web players.</li>
+ <li><span class="bugid">Bugfix: </span>Album search links missing if subdirectory exists.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed broken Google search link.</li>
+ <li><span class="bugid">Bugfix: </span>Remove link to lyrics. chartlyrics.com no longer exists.</li>
+ <li><span class="bugid">REST: </span>Ensure that jukebox "set" method maintains correct current index.</li>
+ <li><span class="bugid">REST: </span>Added "scrobblingEnabled" to getUser.</li>
+ <li><span class="bugid">Tech: </span>Ensure Windows uninstaller only removes program files (in case user installs to c:\subsonic).</li>
+ <li><span class="bugid">Tech: </span>Subsonic Control Panel now prompts for elevated permissions when necessary.</li>
+</ul>
+
+<a name="4.6.beta1"><h2 class="div">Subsonic 4.6.beta1 - Nov 1, 2011</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Simplified and improved transcoding framework.</li>
+ <li><span class="bugid">New: </span>Improved video quality with H.264 encoding.</li>
+ <li><span class="bugid">New: </span>Reimplemented jukebox. More robust and new features.</li>
+ <li><span class="bugid">New: </span>Share on Google+.</li>
+ <li><span class="bugid">New: </span>Estimate content-length for transcoded audio.</li>
+ <li><span class="bugid">New: </span>Updated Dutch translation, courtesy of Muiz.</li>
+ <li><span class="bugid">New: </span>Updated German translation, courtesy of deejay.</li>
+ <li><span class="bugid">New: </span>Added BUUF theme, courtesy of Fractal Systems.</li>
+ <li><span class="bugid">New: </span>Added UK English translation, courtesy of Brian Aust.</li>
+ <li><span class="bugid">New: </span>Hide dock icon on Mac.</li>
+ <li><span class="bugid">Bugfix: </span>Menu broken in "Settings &gt; Shared media" when logged in as admin.</li>
+ <li><span class="bugid">Tech: </span>Improved security in Linux packages.</li>
+ <li><span class="bugid">Tech: </span>Stronger license check.</li>
+ <li><span class="bugid">Tech: </span>Use UTF-8 when reading playlist files.</li>
+ <li><span class="bugid">API: </span>Include files in root folders.</li>
+ <li><span class="bugid">API: </span>New jukebox features.</li>
+</ul>
+
+<a name="4.5"><h2 class="div">Subsonic 4.5 - Aug 6, 2011</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Updated Korean translation, courtesy of Rhetor Choi.</li>
+ <li><span class="bugid">New: </span>Updated Danish translation, courtesy of Morten Hartvich.</li>
+ <li><span class="bugid">Bugfix: </span>Clear rating now works again.</li>
+ <li><span class="bugid">Bugfix: </span>Misc fixes to share settings page.</li>
+ <li><span class="bugid">Bugfix: </span>Revert back to running as root in Debian/Ubuntu.</li>
+ <li><span class="bugid">API: </span>JSONP support</li>
+</ul>
+
+<a name="4.5.beta2"><h2 class="div">Subsonic 4.5.beta2 - Jul 28, 2011</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Implemented management of shared media (expiration, removal, statistics, description).</li>
+ <li><span class="bugid">New: </span>Added more actions for selected songs in album view (Download, Add to playlist).</li>
+ <li><span class="bugid">New: </span>Added more actions for selected songs in playlist view (Share).</li>
+ <li><span class="bugid">New: </span>Subsonic service no longer running as root on Debian/Ubuntu</li>
+ <li><span class="bugid">API: </span>Added share management methods.</li>
+ <li><span class="bugid">API: </span>Added rating support.</li>
+ <li><span class="bugid">Bugfix: </span>Use guest user when streaming shared media.</li>
+ <li><span class="bugid">Bugfix: </span>Use UTF-8 in search index file.</li>
+</ul>
+
+<a name="4.5.beta1"><h2 class="div">Subsonic 4.5.beta1 - Jun 12, 2011</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Twitter/Facebook integration.</li>
+ <li><span class="bugid">New: </span>Share songs and videos by sending someone a link.</li>
+ <li><span class="bugid">New: </span>Support video in external player.</li>
+ <li><span class="bugid">New: </span>Support higher video bitrates, 3000 and 5000 kbps.</li>
+ <li><span class="bugid">New: </span>Added Bulgarian translation, courtesy of Ivan Achev.</li>
+ <li><span class="bugid">New: </span>Updated Norwegian translation, courtesy of Tommy Karlsen.</li>
+ <li><span class="bugid">New: </span>Updated German translation, courtesy of deejay2302.</li>
+ <li><span class="bugid">New: </span>Support http header "Content-Range" when streaming.</li>
+ <li><span class="bugid">New: </span>Ignore "@eaDir" folders on Synology devices.</li>
+ <li><span class="bugid">API: </span>Added REST method getPodcasts.</li>
+ <li><span class="bugid">API: </span>Added REST method getShareUrl.</li>
+ <li><span class="bugid">API: </span>Added user email to REST API.</li>
+ <li><span class="bugid">API: </span>Added example XMLs to API documentation.</li>
+ <li><span class="bugid">API: </span>Encoded passwords were not decoded correctly in REST methods createUser and changePassword.</li>
+ <li><span class="bugid">API: </span>Added "format" and "size" parameters to REST method stream.</li>
+ <li><span class="bugid">Bugfix: </span>Don't include podcasts when generating random songs.</li>
+ <li><span class="bugid">Bugfix: </span>Handle whitespace in podcast urls.</li>
+ <li><span class="bugid">Bugfix: </span>Updated expired ssl cert.</li>
+ <li><span class="bugid">Bugfix: </span>Mac installer: make transcode dir executable.</li>
+</ul>
+
+<a name="4.4"><h2 class="div">Subsonic 4.4 - Feb 06, 2011</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Updated Greek translation, courtesy of Constantine Samaklis.</li>
+ <li><span class="bugid">New: </span>Updated Slovenian translation, courtesy of Jan Jam&#353;ek and Marko Kastelic.</li>
+</ul>
+
+<a name="4.4.beta1"><h2 class="div">Subsonic 4.4.beta1 - Jan 20, 2011</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Added https support.</li>
+ <li><span class="bugid">New: </span>Added option to open video in resizable window.</li>
+ <li><span class="bugid">New: </span>Improved search with accented characters (e.g., searching for "bartok" will match "bart&oacute;k").</li>
+ <li><span class="bugid">New: </span>Added REST API method for scrobbling to last.fm.</li>
+ <li><span class="bugid">New: </span>Added Greek translation, courtesy of Constantine Samaklis.</li>
+ <li><span class="bugid">Bugfix: </span>When converting videos, always use a width that is a multiple of two.</li>
+ <li><span class="bugid">Bugfix: </span>Handle invalid pixel aspect rates (PAR) reported by ffmpeg.</li>
+ <li><span class="bugid">Bugfix: </span>Don't scrobble videos to last.fm.</li>
+ <li><span class="bugid">Bugfix: </span>Remember port number and memory settings when reinstalling on Windows.</li>
+ <li><span class="bugid">Bugfix: </span>Accessing "Newest" album list from Android sometimes caused an error.</li>
+</ul>
+
+<a name="4.3"><h2 class="div">Subsonic 4.3 - Jan 7, 2011</h2></a>
+<ul>
+ <li><span class="bugid">Bugfix: </span>When switching bit rate, also jump to correct time offset.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed problem with audio getting out-of-sync with video.</li>
+ <li><span class="bugid">Bugfix: </span>When converting videos, always use a width that is a multiple of two.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed bug in REST method createPlaylist.</li>
+ <li><span class="bugid">Bugfix: </span>Use language settings in /etc/default/locale on Ubuntu/Debian.</li>
+</ul>
+
+<a name="4.3.beta1"><h2 class="div">Subsonic 4.3.beta1 - Dec 30, 2010</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Video support! Stream video to browsers and Android 2.2+ phones.</li>
+ <li><span class="bugid">New: </span>Added Korean translation, courtesy of Choi Jong-seok.</li>
+ <li><span class="bugid">New: </span>Updated French translation, courtesy of Yoann Spicher.</li>
+</ul>
+
+<a name="4.2"><h2 class="div">Subsonic 4.2 - Nov 21, 2010</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Added Portuguese translation, courtesy of Miguel Fonseca.</li>
+ <li><span class="bugid">New: </span>Updated Italian translation, courtesy of Luca Perri.</li>
+ <li><span class="bugid">Bugfix: </span>Improved searching.</li>
+ <li><span class="bugid">Bugfix: </span>Set ID3 tags when transcoding.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed problem with transcoding/downsampling failing for files with non-Latin characters.</li>
+ <li><span class="bugid">Bugfix: </span>Handle transcoding/downsampling files with double quotes in filename.</li>
+ <li><span class="bugid">Bugfix: </span>Remove html markup from podcast descriptions.</li>
+ <li><span class="bugid">Bugfix: </span>Fix broken link to allmusic.</li>
+</ul>
+
+<a name="4.2.beta1"><h2 class="div">Subsonic 4.2.beta1 - Nov 4, 2010</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>New &amp; improved search engine based on <a href="http://lucene.apache.org/">Lucene</a>.</li>
+ <li><span class="bugid">New: </span>New &amp; improved cover art search based on Google Image Search.</li>
+ <li><span class="bugid">New: </span>Mac installer now includes transcoders, courtesy of einstein2x.</li>
+ <li><span class="bugid">New: </span>Updated German translation, courtesy of deejay2302.</li>
+ <li><span class="bugid">New: </span>Improved LAME integration (preserve ID3 tags, avoid skipping in Android client).</li>
+ <li><span class="bugid">New: </span>Added new REST API method for searching.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed bug in startup script in standalone Subsonic (readlink).</li>
+</ul>
+
+<a name="4.1"><h2 class="div">Subsonic 4.1 - Sep 10, 2010</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Updated Danish translation, courtesy of Morten Hartvich.</li>
+ <li><span class="bugid">Bugfix: </span>Exclude dot files in cover art search.</li>
+</ul>
+
+<a name="4.1.beta1"><h2 class="div">Subsonic 4.1.beta1 - Aug 21, 2010</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Support automatic port forwarding on Airport Extreme/Express.</li>
+ <li><span class="bugid">New: </span>Improved tray/application/fav icons.</li>
+ <li><span class="bugid">New: </span>New and updated themes.</li>
+ <li><span class="bugid">New: </span>Improved Mac control panel.</li>
+ <li><span class="bugid">New: </span>Added REST API methods getUser and deleteUser.</li>
+ <li><span class="bugid">New: </span>Added Traditional Chinese translation, courtesy of Cheng Jen Li.</li>
+ <li><span class="bugid">New: </span>Updated French translation, courtesy of Christophe.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed chat feature when deploying Subsonic on Tomcat.</li>
+ <li><span class="bugid">Bugfix: </span>Proper lookup of local IP on Linux.</li>
+ <li><span class="bugid">Bugfix: </span>Support html5 (return correct content type and length).</li>
+ <li><span class="bugid">Performance: </span>Faster coverart lookup.</li>
+ <li><span class="bugid">Tech: </span>Upgraded to LAME 3.98.4.</li>
+</ul>
+
+<a name="4.0.1"><h2 class="div">Subsonic 4.0.1 - May 13, 2010</h2></a>
+<ul>
+ <li><span class="bugid">Bugfix: </span>Fixed broken cover art download.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed broken m4a transcoding.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed broken quick links in artist frame for some new themes.</li>
+</ul>
+
+<a name="4.0"><h2 class="div">Subsonic 4.0 - May 12, 2010</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Added REST API method for deleting playlists.</li>
+ <li><span class="bugid">Bugfix: </span>Use UTF-8 encoding when creating M3U playlists.</li>
+ <li><span class="bugid">Security: </span>Network and cover art settings require admin role.</li>
+</ul>
+
+<a name="4.0.beta2"><h2 class="div">Subsonic 4.0.beta2 - May 05, 2010</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Added themes Slick, High Contrast, High Contrast (Inverted) and High-Tech, courtesy of Fisher Evans.</li>
+ <li><span class="bugid">New: </span>Added themes Simplify, PinkPanther and Denim, courtesy of Thomas Bruce Dyrud.</li>
+ <li><span class="bugid">New: </span>Updated Danish translation, courtesy of Morten Hartvich.</li>
+ <li><span class="bugid">Bugfix: </span>User statistics for streamed data was too high.</li>
+ <li><span class="bugid">Bugfix: </span>Proper ordering songs on multi-disc albums.</li>
+ <li><span class="bugid">Bugfix: </span>Read tags from AAC files.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed errors with chat feature.</li>
+ <li><span class="bugid">Bugfix: </span>More robust tag parsing and editing.</li>
+ <li><span class="bugid">Bugfix: </span>Removed "Settings &gt; General &gt; Video mask" that was added by mistake.</li>
+</ul>
+
+<a name="4.0.beta1"><h2 class="div">Subsonic 4.0.beta1 - Apr 23, 2010</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>New version of the <a href="api.jsp">Subsonic API</a> with many new methods to be used by Subsonic <a href="apps.jsp">apps</a>.</li>
+ <li><span class="bugid">New: </span>New, simpler transcoder pack with ffmpeg and lame.</li>
+ <li><span class="bugid">New: </span>Improved usability of Settings &gt; Network.</li>
+ <li><span class="bugid">New: </span>Added option to clear chat messages.</li>
+ <li><span class="bugid">New: </span>Added Monochrome themes, courtesy of David D.</li>
+ <li><span class="bugid">New: </span>Added Groove themes, courtesy of Thomas Bruce Dyrud.</li>
+ <li><span class="bugid">New: </span>Updated German translation, courtesy of deejay2302.</li>
+ <li><span class="bugid">New: </span>Updated Finnish translation, courtesy of Reijo J&auml;&auml;rni.</li>
+ <li><span class="bugid">New: </span>Updated Slovenian translation, courtesy of Andrej &#381;i&#382;mond.</li>
+ <li><span class="bugid">New: </span>Made user statistics graphs logarithmic.</li>
+ <li><span class="bugid">New: </span>Truncate long genre names in "More" page.</li>
+ <li><span class="bugid">New: </span>Improved year selection in "More" page.</li>
+ <li><span class="bugid">New: </span>Automatically exclude all hidden files and directories (those starting with ".")</li>
+ <li><span class="bugid">Bugfix: </span>Fixed native playback of AAC in Flash player.</li>
+ <li><span class="bugid">Bugfix: </span>Make Flash player work on Linux.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed bug in coverart batch.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed album link to last.fm.</li>
+ <li><span class="bugid">Bugfix: </span>Improved stability of lyrics lookup.</li>
+ <li><span class="bugid">Tech: </span>Replaced tag library with <a href="http://www.jthink.net/jaudiotagger/">Jaudiotagger</a>.</li>
+ <li><span class="bugid">Tech: </span>Compress html pages with gzip.</li>
+ <li><span class="bugid">Tech: </span>Changed default Java memory limit to 100 MB.</li>
+</ul>
+
+<a name="3.9"><h2 class="div">Subsonic 3.9 - Feb 12, 2010</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Added link to <a href="http://www.nonpixel.com/subair/">SubAir</a> in "More" page.</li>
+ <li><span class="bugid">New: </span>Make <em>yourname.subsonic.org</em> addresses also work within LANs.</li>
+ <li><span class="bugid">Bugfix: </span>Don't look for UPnP routers if port forwarding is disabled.</li>
+</ul>
+
+<a name="3.9.beta1"><h2 class="div">Subsonic 3.9.beta1 - Jan 28, 2010</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Automatically configure port forwarding for compatible routers.</li>
+ <li><span class="bugid">New: </span>Access your server using an easy-to-remember address: <em>yourname.subsonic.org</em></li>
+ <li><span class="bugid">New: </span>Added "Getting started" page for basic setup.</li>
+ <li><span class="bugid">New: </span>Cover art batch download, courtesy of Christian Nedreg&aring;rd.</li>
+ <li><span class="bugid">New: </span>Improved relevance for top hits in cover art search, courtesy of Christian Nedreg&aring;rd.</li>
+ <li><span class="bugid">New: </span>Added Polish translation, courtesy of Micha&#322; Kotas</li>
+ <li><span class="bugid">New: </span>Added Icelandic translation, courtesy of DJ Danni.</li>
+ <li><span class="bugid">New: </span>Updated Finnish translation, courtesy of Reijo J&auml;&auml;rni.</li>
+ <li><span class="bugid">New: </span>Updated Russian translation, courtesy of Anton Khoruzhy.</li>
+ <li><span class="bugid">New: </span>Reversed order of chat log, showing newest messages first.</li>
+ <li><span class="bugid">New: </span>Added API method to change password.</li>
+ <li><span class="bugid">New: </span>Discontinued Subsonic JME client.</li>
+ <li><span class="bugid">Bugfix: </span>Avoid setting incorrect content length when transcoding or downsampling.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed lyrics lookup. Now uses chartlyrics.com which provides a stable API.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed "Not in GZIP format" error in Discogs cover image search, courtesy of Christian Nedreg&aring;rd.</li>
+ <li><span class="bugid">Bugfix: </span>Sort list of saved playlists.</li>
+ <li><span class="bugid">Bugfix: </span>Home &gt; Newest now sorts by creation date, not modification date.</li>
+ <li><span class="bugid">Bugfix: </span>Hide donate button when license is valid.</li>
+</ul>
+
+<a name="3.8"><h2 class="div">Subsonic 3.8 - Oct 23, 2009</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>(Android) Downloaded songs can now be played directly from the Subsonic app.</li>
+ <li><span class="bugid">New: </span>(Android) New feature: Download + Play.</li>
+ <li><span class="bugid">New: </span>(Android) New feature: Search.</li>
+ <li><span class="bugid">New: </span>(Android) New feature: Load playlist.</li>
+ <li><span class="bugid">New: </span>(Android) New feature: Delete from phone.</li>
+ <li><span class="bugid">New: </span>(Android) New feature: Check for software update.</li>
+ <li><span class="bugid">New: </span>(Android) Nicer song listing.</li>
+ <li><span class="bugid">New: </span>(Android) More informative error message when not connected.</li>
+ <li><span class="bugid">New: </span>(Android) Show artist shortcuts.</li>
+ <li><span class="bugid">New: </span>Added option to disable chat messages.</li>
+ <li><span class="bugid">New: </span>Delete chat entries more than seven days old.</li>
+ <li><span class="bugid">New: </span>Documented error codes in REST API.</li>
+ <li><span class="bugid">New: </span>Updated Swedish translation, courtesy of Fritte.</li>
+ <li><span class="bugid">New: </span>Updated German translation, courtesy of deejay2302 and Radon.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed wrong background color in More page.</li>
+</ul>
+
+<a name="3.8.beta1"><h2 class="div">Subsonic 3.8.beta1 - Oct 02, 2009</h2></a>
+<ul>
+ <li><span class="bugid">New: </span>Implemented Subsonic client for Android phones.</li>
+ <li><span class="bugid">New: </span>Added chat.</li>
+ <li><span class="bugid">New: </span>Added REST API for third party applications.</li>
+ <li><span class="bugid">New: </span>Support playlist repeat in web player.</li>
+ <li><span class="bugid">New: </span>Jukebox now support WAV format (including FLAC > WAV transcoding).</li>
+ <li><span class="bugid">New: </span>Updated to Last.fm submission protocol version 1.2.1, with support for "Now playing".</li>
+ <li><span class="bugid">New: </span>Updated Dutch translation, courtesy of Sander van der Grind and Jeremy Terpstra.</li>
+ <li><span class="bugid">New: </span>Updated Slovenian translation, courtesy of Andrej &#381;i&#382;mond</li>
+ <li><span class="bugid">New: </span>Improved French translation, courtesy of Rapha&euml;l Boulcourt.</li>
+ <li><span class="bugid">New: </span>Improved German translation, courtesy of 3R3.</li>
+ <li><span class="bugid">New: </span>Added Finnish translation, courtesy of Reijo J&auml;&auml;rni</li>
+ <li><span class="bugid">Bugfix: </span>Subsonic server doesn't require an internet connection during startup.</li>
+ <li><span class="bugid">Bugfix: </span>Avoid problems when upgrading stand-alone version.</li>
+ <li><span class="bugid">Bugfix: </span>Repeat now works properly in jukebox mode.</li>
+ <li><span class="bugid">Bugfix: </span>Looks nicer in Chrome.</li>
+ <li><span class="bugid">Bugfix: </span>Usernames can now contain white spaces and international characters.</li>
+ <li><span class="bugid">Bugfix: </span>Allow alternate date format in Podcast episodes.</li>
+ <li><span class="bugid">Bugfix: </span>Fixed broken Discogs image search.</li>
+ <li><span class="bugid">Security: </span>IP addresses are no longer displayed in the log or the status view.</li>
+</ul>
+
+<a name="3.7"><h2 class="div">Subsonic 3.7 - Jun 22, 2009</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Default search option is now to search both title, album and artist.</li>
+ <li><span class="bugid">New:</span> Customizable default music, playlist and podcast folders in support of Amahi Home Server.</li>
+ <li><span class="bugid">New:</span> Added configurable message in login page.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed broken WAR version.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed broken tag editor.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed broken upload progress bar.</li>
+ <li><span class="bugid">Bugfix:</span> Automatically start web player when clicking play on artist, album or song.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed problem with "Random album" page being initially empty.</li>
+ <li><span class="bugid">Bugfix:</span> Added some padding above player toolbar.</li>
+ <li><span class="bugid">Bugfix:</span> Playlist combobox option disabling broken in IE8.</li>
+ <li><span class="bugid">Security:</span> Don't show full file paths in "Status" and "Help" pages.</li>
+</ul>
+
+<a name="3.7.beta1"><h2 class="div">Subsonic 3.7.beta1 - May 08, 2009</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Jukebox support. Plays music directly on the server's audio hardware.</li>
+ <li><span class="bugid">New:</span> Improved search feature. (Paging, album/artist search fields.)</li>
+ <li><span class="bugid">New:</span> Added buttons for next/previous track in web player.</li>
+ <li><span class="bugid">New:</span> Support for artist-level comments.</li>
+ <li><span class="bugid">New:</span> Added new authorization role "User is allowed to change settings and password" in support for guest users.</li>
+ <li><span class="bugid">New:</span> Added theme "Cool and Clean", courtesy of Dan Eriksen.</li>
+ <li><span class="bugid">New:</span> Added theme "Midnight Fun", courtesy of Don Pearson.</li>
+ <li><span class="bugid">New:</span> Added Slovenian translation, courtesy of Andrej &#381;i&#382;mond.</li>
+ <li><span class="bugid">New:</span> Added Danish translation, courtesy of Morten Hartvich</li>
+ <li><span class="bugid">New:</span> Added Japanese translation, courtesy of Takahiro Suzuki.</li>
+ <li><span class="bugid">New:</span> Updated Norwegian translation, courtesy of jigsaw.</li>
+ <li><span class="bugid">New:</span> Updated Swedish translation, courtesy of Fredrik Leufkens.</li>
+ <li><span class="bugid">New:</span> Show online help as balloon tooltip.</li>
+ <li><span class="bugid">New:</span> Player is always visible in playlist, even when scrolling.</li>
+ <li><span class="bugid">New:</span> Removed frame borders.</li>
+ <li><span class="bugid">New:</span> Don't show player username or IP address in playlist.</li>
+ <li><span class="bugid">New:</span> Automatically trim text fields when entering email address and license key.</li>
+ <li><span class="bugid">New:</span> Added advanced option to bind Subsonic to a particular IP address. (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1740 ">More</a>)</li>
+ <li><span class="bugid">New:</span> Improved subsonic.sh startup script.</li>
+ <li><span class="bugid">New:</span> Automatically add Windows Firewall exceptions during install. (<a href="http://forum.subsonic.org/forum/viewtopic.php?p=5188">More</a>)</li>
+ <li><span class="bugid">Performance:</span> Improved browser and server caching of artist list. (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1558">More</a>)</li>
+ <li><span class="bugid">Performance:</span> Only poll for service status if Subsonic Control Panel is opened. (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1612">More</a>)</li>
+ <li><span class="bugid">Bugfix:</span> Web player now displays correct duration for transcoded tracks.</li>
+ <li><span class="bugid">Bugfix:</span> Sticky artist index now works in IE.</li>
+ <li><span class="bugid">Bugfix:</span> Discogs image retrieval now works again.</li>
+ <li><span class="bugid">Bugfix:</span> Now works behind SSL proxy. (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1301">More</a>)</li>
+ <li><span class="bugid">Bugfix:</span> Missing album art for artists in multiple folders. (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1626">More</a>)</li>
+ <li><span class="bugid">Bugfix:</span> Wrong player selected if different users access Subsonic from the same browser instance.</li>
+ <li><span class="bugid">Bugfix:</span> Wrong repeat state displayed in playlist.</li>
+ <li><span class="bugid">Bugfix:</span> Stop web player when playlist is cleared.</li>
+ <li><span class="bugid">Bugfix:</span> Lyrics lookup working again.</li>
+ <li><span class="bugid">Bugfix:</span> Support quotes in Podcast names. (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1734">More</a>)</li>
+ <li><span class="bugid">Bugfix:</span> Fixed IE layout problem in top frame.</li>
+</ul>
+
+<a name="3.6"><h2 class="div">Subsonic 3.6 - Feb 01, 2009</h2></a>
+<ul>
+ <li><span class="bugid">Security:</span> For improved security, only transcoders installed in SUBSONIC_HOME/transcode are allowed to be executed. This includes LAME downsampling.</li>
+ <li><span class="bugid">New:</span> Added Swedish translation by J&ouml;rgen Sj&ouml;berg.</li>
+ <li><span class="bugid">New:</span> Added two new locales, "English (United States)" and "English (United Kingdom)". The only difference currently is the date format.</li>
+ <li><span class="bugid">New:</span> Change tray icon if Subsonic server isn't running.</li>
+ <li><span class="bugid">Bugfix:</span> Make new Flash player work if Subsonic is behind proxy.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed problem where server in some cases came to a state where streaming is refused.</li>
+ <li><span class="bugid">Bugfix:</span> Support download and streaming of files larger than 2 GB.</li>
+ <li><span class="bugid">Bugfix:</span> Use UTF-8 when generating m3u playlist.</li>
+ <li><span class="bugid">Bugfix:</span> Main frame now correctly switches to the currently playing album.</li>
+ <li><span class="bugid">Bugfix:</span> Show currently playing icon for all player types.</li>
+</ul>
+
+<a name="3.6.beta2"><h2 class="div">Subsonic 3.6.beta2 - Jan 13, 2009</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Updated French translation. (Thanks to sheridan).</li>
+ <li><span class="bugid">New:</span> Improved subsonic.sh startup script.</li>
+ <li><span class="bugid">Bugfix:</span> New Flash player now works in Linux browsers. (Thanks to zeekay).</li>
+ <li><span class="bugid">Bugfix:</span> Fixed bug introduced in 3.6.beta1 causing streams to be killed repeatedly.</li>
+ <li><span class="bugid">Bugfix:</span> Show proper error message if user is not authorized to perform an operation.</li>
+ <li><span class="bugid">Bugfix:</span> Removing welcome title/subtitle/message doesn't work.</li>
+ <li><span class="bugid">Bugfix:</span> Welcome message too wide in IE.</li>
+ <li><span class="bugid">Bugfix:</span> Flash player doesn't work with Italian locale.</li>
+ <li><span class="bugid">Bugfix:</span> Disable "Play more random songs when end of playlist is reached" if Flash player.</li>
+ <li><span class="bugid">Tech:</span> Embedded player now requires Flash plugin 9.0.0 or later, not 9.0.115 or later.</li>
+</ul>
+
+<a name="3.6.beta1"><h2 class="div">Subsonic 3.6.beta1 - Jan 05, 2009</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Much improved embedded Flash player.</li>
+ <li><span class="bugid">New:</span> Playlist is now Ajax-enabled, for a smoother user experience.</li>
+ <li><span class="bugid">New:</span> Configurable Welcome title, subtitle and message in home page. Uses wiki notation.</li>
+ <li><span class="bugid">New:</span> Fade-in effect for cover art images.</li>
+ <li><span class="bugid">New:</span> Option to append selected tracks to previously saved playlist.</li>
+ <li><span class="bugid">New:</span> Random play on artist/album level.</li>
+ <li><span class="bugid">New:</span> New agent/service architecture. Tray icon should now (finally) work on Vista.</li>
+ <li><span class="bugid">New:</span> From the Subsonic Control Panel you can now see the Windows service status, and start/stop the Subsonic service.</li>
+ <li><span class="bugid">New:</span> Display "Now playing" for up to an hour, including idle time.</li>
+ <li><span class="bugid">New:</span> Enable transcoders on first-time Windows install (since they are now bundled).</li>
+ <li><span class="bugid">New:</span> Added Cancel buttons to all settings pages.</li>
+ <li><span class="bugid">New:</span> Created subsonic.bat</li>
+ <li><span class="bugid">New:</span> Changed license to GPLv3.</li>
+ <li><span class="bugid">New:</span> Hide music library statistics if unavailable.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed broken lyrics lookup (again).</li>
+ <li><span class="bugid">Bugfix:</span> Avoid ugly line breaks in IE.</li>
+ <li><span class="bugid">Tech:</span> Java 6 or later is now required for Windows installer version.</li>
+</ul>
+
+<a name="3.5"><h2 class="div">Subsonic 3.5 - Nov 09, 2008</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> New Subsonic logo (thanks to <a href="http://www.conceptualintegration.com/">Concept211</a>).</li>
+ <li><span class="bugid">New:</span> Added Italian translation (thanks to Michele Petrecca).
+ <li><span class="bugid">New:</span> Smooth scrolling in jump list.</li>
+ <li><span class="bugid">New:</span> Updated AAC decoder (faad.exe) in transcoder pack.</li>
+ <li><span class="bugid">New:</span> Added OS to about page.</li>
+ <li><span class="bugid">New:</span> Changed license to Creative Commons Noncommercial.</li>
+ <li><span class="bugid">Bugfix:</span> Added start menu item "Settings" as work-around for missing tray icon in Vista.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed caching problem in Opera. (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1334">More</a>)</li>
+ <li><span class="bugid">Bugfix:</span> Improved Windows installer. (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1291">More</a>)</li>
+ <li><span class="bugid">Bugfix:</span> Fixed typos in several translations.</li>
+</ul>
+
+<a name="3.5.beta2"><h2 class="div">Subsonic 3.5.beta2 - Sep 23, 2008</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Fancy cover art zoom.</li>
+ <li><span class="bugid">New:</span> Remove artist name from album name.</li>
+ <li><span class="bugid">New:</span> Transcoding pack is now included in Windows installer.</li>
+ <li><span class="bugid">New:</span> Updated German translation (thanks to J&ouml;rg Frommann) and Norwegian translation
+ (thanks to jigsaw).
+ </li>
+ <li><span class="bugid">New:</span> Added French translation (thanks to JohnDillinger).
+ <li><span class="bugid">New:</span> Added Ripserver theme.</li>
+ <li><span class="bugid">Bugfix:</span> Streaming to mobile phones now works better.</li>
+ <li><span class="bugid">Bugfix:</span> Made tray icon work on Vista (requires Java 6 or later).</li>
+ <li><span class="bugid">Bugfix:</span> Disable random playlist functionality if user is not authorized to play
+ music.
+ </li>
+ <li><span class="bugid">Tech:</span> Build number is now identical to Subversion revision.</li>
+</ul>
+
+<a name="3.5.beta1"><h2 class="div">Subsonic 3.5.beta1 - Jul 10, 2008</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Implemented music player for Java-enabled mobile phones.
+ (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1203">More</a>)
+ </li>
+ <li><span class="bugid">New:</span> Support for personal images (avatars).</li>
+ <li><span class="bugid">New:</span> Support "read-only" view.
+ (<a href="http://forum.subsonic.org/forum/viewtopic.php?p=2435">More</a>)
+ </li>
+ <li><span class="bugid">New:</span> Simplified user interface in settings pages. Now only one "Save" button.</li>
+ <li><span class="bugid">New:</span> Improved usability of coverart search page. Now also searches discogs.com.</li>
+ <li><span class="bugid">New:</span> Merge artists with same name, but located in different music folders.</li>
+ <li><span class="bugid">New:</span> Added option "Let others see what I am playing"</li>
+ <li><span class="bugid">New:</span> Added option "Always use web player".
+ (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1077">More</a>)
+ </li>
+ <li><span class="bugid">New:</span> Nicer controls in modern browsers (Opera 9.5, Firefox 3, IE 7).</li>
+ <li><span class="bugid">Bugfix:</span> Lots of extra players are no longer created.</li>
+ <li><span class="bugid">Bugfix:</span> Fix minor bug with letter appearing if only file (not directory) exists.
+ (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1023">More</a>)
+ </li>
+ <li><span class="bugid">Bugfix:</span> Make standalone version work on Linux without X11 server.</li>
+ <li><span class="bugid">Bugfix:</span> Make lyrics work again.
+ (<a href="http://forum.subsonic.org/forum/viewtopic.php?p=2588">More</a>)
+ </li>
+ <li><span class="bugid">Bugfix:</span> Proper sorting of "The" artists.
+ (<a href="http://forum.subsonic.org/forum/viewtopic.php?t=1144">More</a>)
+ </li>
+ <li><span class="bugid">Bugfix:</span> Make source release build.</li>
+</ul>
+
+<a name="3.4"><h2 class="div">Subsonic 3.4 - Apr 27, 2008</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added optional setting for LDAP bind DN and password.</li>
+ <li><span class="bugid">New:</span> Added quick links to Google, Wikipedia, allmusic and Last.fm.</li>
+ <li><span class="bugid">New:</span> Added standalone installation option.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed layout problems in Podcast page.</li>
+ <li><span class="bugid">Bugfix:</span> Clean up partially downloaded Podcast episodes at start-up.</li>
+ <li><span class="bugid">Bugfix:</span> Old Podcast episodes were in some cases not deleted.</li>
+</ul>
+
+<a name="3.4.beta1"><h2 class="div">Subsonic 3.4.beta1 - Mar 28, 2008</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added support for user authentication in LDAP, including Microsoft Active
+ Directory.
+ </li>
+ <li><span class="bugid">New:</span> Implemented "Party mode" with a simpler user interface.</li>
+ <li><span class="bugid">New:</span> Added option to specify music folder in "Random playlist".</li>
+ <li><span class="bugid">New:</span> Added option "Play more random songs when end of playlist is reached" in "Random
+ playlist".
+ </li>
+ <li><span class="bugid">New:</span> Implemented download option in WAP interface.</li>
+ <li><span class="bugid">New:</span> Implemented random playlist option in WAP interface.</li>
+ <li><span class="bugid">New:</span> Make index always visible (doesn't work in IE).</li>
+ <li><span class="bugid">New:</span> Added play/add/download buttons for songs in left frame.</li>
+ <li><span class="bugid">New:</span> Suggest track number in tag editor.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed faulty layout in main frame.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed caching bug of left frame (when changing theme etc).</li>
+ <li><span class="bugid">Bugfix:</span> "Highest rated" now also shows albums that have never been played.</li>
+ <li><span class="bugid">Bugfix:</span> Player selection in WAP interface now works.</li>
+ <li><span class="bugid">Bugfix:</span> Support quotes in search field and shortcut field.</li>
+ <li><span class="bugid">Bugfix:</span> Don't display track number zero.</li>
+ <li><span class="bugid">Tech:</span> Faster start-up on Windows. Extract war file to SUBSONIC_HOME/jetty instead of
+ temp directory.
+ </li>
+ <li><span class="bugid">Tech:</span> Made it possible to run the Jetty version on Linux and other platforms.</li>
+ <li><span class="bugid">Tech:</span> Allow up to one week of idle time in Jetty.</li>
+</ul>
+
+<a name="3.3"><h2 class="div">Subsonic 3.3 - Dec 23, 2007</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added "HD-720" and "Barents Sea" themes.</li>
+ <li><span class="bugid">New:</span> Improved layout of left and main frame.</li>
+ <li><span class="bugid">New:</span> Sort genres in "Edit tags".</li>
+ <li><span class="bugid">Bugfix:</span> Make transcoding work when combined with client-side playlist.</li>
+ <li><span class="bugid">Bugfix:</span> Case-insensitive sorting of artists.</li>
+ <li><span class="bugid">Bugfix:</span> Made genre parsing more robust.</li>
+ <li><span class="bugid">Tech:</span> Upgraded to Acegi 1.0.5</li>
+ <li><span class="bugid">Tech:</span> Upgraded to Spring 2.5</li>
+ <li><span class="bugid">Tech:</span> Make it compile with Java 5.</li>
+</ul>
+
+<a name="3.3.beta1"><h2 class="div">Subsonic 3.3.beta1 - Nov 23, 2007</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Implemented client-side playlists, including random skipping within songs
+ (see <em>Settings &gt; Players &gt; Playlist is managed by player</em>).
+ </li>
+ <li><span class="bugid">New:</span> Support resumable downloads.</li>
+ <li><span class="bugid">New:</span> Rewrite stream URL if Subsonic is behind a proxy.</li>
+ <li><span class="bugid">New:</span> Added two new themes designed for large HD screens.</li>
+ <li><span class="bugid">New:</span> Added Russian translation by Iaroslav Andrusiak.</li>
+ <li><span class="bugid">New:</span> Made it possible to collapse/expand Podcast episodes. Improved layout and
+ usability.
+ </li>
+ <li><span class="bugid">New:</span> Added "Play on phone" option to wap interface.</li>
+ <li><span class="bugid">New:</span> Auto-focus on username field in login page.</li>
+ <li><span class="bugid">New:</span> Created new settings categories "Advanced" and "Personal".</li>
+ <li><span class="bugid">New:</span> Moved index from top to left frame.</li>
+ <li><span class="bugid">Bugfix:</span> Support Podcast folder that is located outside music folder.</li>
+ <li><span class="bugid">Bugfix:</span> Handle track number on the form "3/12"</li>
+ <li><span class="bugid">Bugfix:</span> Fixed concurrency bug when rendering wiki markup.</li>
+</ul>
+
+<a name="3.2"><h2 class="div">Subsonic 3.2 - Oct 09, 2007</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added support for editing genre in ID3 tags.</li>
+ <li><span class="bugid">New:</span> Show miniature album images in "Now playing" sidebar.</li>
+ <li><span class="bugid">Bugfix:</span> Handle podcasts with colons in the name.</li>
+ <li><span class="bugid">Bugfix:</span> Handle podcasts without enclosures.</li>
+ <li><span class="bugid">Bugfix:</span> Handle song, album and artist names with special characters (&lt;, &gt; etc)
+ </li>
+</ul>
+
+<a name="3.2.beta1"><h2 class="div">Subsonic 3.2.beta1 - Sep 19, 2007</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Download Podcasts with the new integrated Podcast receiver.</li>
+ <li><span class="bugid">New:</span> One-click installation with the new Windows installer.</li>
+ <li><span class="bugid">New:</span> Fetch lyrics automatically from www.metrolyrics.com.</li>
+ <li><span class="bugid">New:</span> See what others are playing in the new "Now playing" sidebar.</li>
+ <li><span class="bugid">New:</span> Play music directly in the browser with the new integrated Flash-based player.
+ </li>
+ <li><span class="bugid">New:</span> New tag engine (entagged.sourceforge.net) supports tags in a lot of formats
+ (mp3, ogg, flac, wav, wma,
+ etc).
+ </li>
+ <li><span class="bugid">New:</span> Added confirmation dialog when deleting playlists.</li>
+ <li><span class="bugid">New:</span> Remember selected music folder (in left frame) across sessions.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed bug with rendering multiple status charts concurrently.</li>
+ <li><span class="bugid">Tech:</span> Added db admin tool.</li>
+</ul>
+
+<a name="3.1"><h2 class="div">Subsonic 3.1 - Jul 30, 2007</h2></a>
+<p>(No changes since 3.1.beta2)</p>
+
+<a name="3.1.beta2"><h2 class="div">Subsonic 3.1.beta2 - Jul 23, 2007</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Optimized scanning of music folders. Dramatic improvement for network disks.
+ </li>
+ <li><span class="bugid">Bugfix:</span> Fixed minor concurrency bug in search index creation.</li>
+ <li><span class="bugid">Bugfix:</span> Make cache work if clocks on remote disks are out of sync.</li>
+ <li><span class="bugid">Bugfix:</span> Ensure that cover art images are ordered alphabetically.</li>
+ <li><span class="bugid">Bugfix:</span> Remove nag message for licensed users.</li>
+</ul>
+
+<a name="3.1.beta1"><h2 class="div">Subsonic 3.1.beta1 - Jun 30, 2007</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added checkboxes to songs in playlist, with option to perform operations on all
+ selected songs.
+ </li>
+ <li><span class="bugid">New:</span> Now possible to specify genre and decade when generating random playlist.</li>
+ <li><span class="bugid">New:</span> Added menu option to sort playlist by track, album or artist.</li>
+ <li><span class="bugid">New:</span> Audioscrobbling is now more fault-tolerant. Will retry if Last.fm is down.</li>
+ <li><span class="bugid">New:</span> Replaced Google ads with a donation request message. Donors will not see the
+ message.
+ </li>
+ <li><span class="bugid">New:</span> Added new attribute "default" to transcodings. When "default" is true, the
+ transcoding is automatically activated for new players.
+ </li>
+ <li><span class="bugid">New:</span> Implemented support for browser caching of left frame (with artist list).</li>
+ <li><span class="bugid">New:</span> Made downsampling command configurable.</li>
+ <li><span class="bugid">New:</span> Switch to "Now playing" after 3 minutes of inactivity.</li>
+ <li><span class="bugid">New:</span> Album page now has link to artist.</li>
+ <li><span class="bugid">Bugfix:</span> Logically delete/undelete metadata for albums that disappear/reappear on
+ disk.
+ </li>
+ <li><span class="bugid">Bugfix:</span> Fixed ugly checkboxes in IE.</li>
+</ul>
+
+<a name="3.0"><h2 class="div">Subsonic 3.0 - Mar 22, 2007</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added Google ads.</li>
+ <li><span class="bugid">Tech:</span> Upgraded <a href="http://code.google.com/p/jvorbiscomment/">jvorbiscomment</a>
+ library.
+ </li>
+ <li><span class="bugid">Bugfix:</span> Artists from different music folders are now properly sorted.</li>
+</ul>
+
+<a name="3.0.beta2"><h2 class="div">Subsonic 3.0.beta2 - Feb 24, 2007</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added per-user bitrate limit.</li>
+ <li><span class="bugid">New:</span> Show error message in browser if Subsonic home can't be created.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed remaining bugs (hopefully) related to folders with non-latin
+ characters.
+ </li>
+ <li><span class="bugid">Bugfix:</span> Zooming of ID3 cover art now works.</li>
+ <li><span class="bugid">Bugfix:</span> last.fm password must no longer be entered every time.</li>
+</ul>
+
+<a name="3.0.beta1"><h2 class="div">Subsonic 3.0.beta1 - Feb 04, 2007</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Audioscrobbling support. Automatically register what you're playing on last.fm.
+ </li>
+ <li><span class="bugid">New:</span> Support display and editing of OGG Vorbis tags.</li>
+ <li><span class="bugid">New:</span> Display cover art embedded in ID3 tags.</li>
+ <li><span class="bugid">New:</span> Dutch translation by Ronald Knot.</li>
+ <li><span class="bugid">New:</span> Links to previous/next album by same artist.</li>
+ <li><span class="bugid">New:</span> Change tab order in login screen.</li>
+ <li><span class="bugid">Bugfix:</span> Support directory names with non-latin characters.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed ampersand bug in wap interface.</li>
+ <li><span class="bugid">Bugfix:</span> Display hours for very long tracks.</li>
+ <li><span class="bugid">Tech:</span> Upgraded Spring and Acegi to latest versions.</li>
+</ul>
+
+<a name="2.9"><h2 class="div">Subsonic 2.9 - Nov 13, 2006</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added German translation by Harald Weiss.</li>
+ <li><span class="bugid">New:</span> Show server version and memory usage in help page.</li>
+ <li><span class="bugid">Bugfix:</span> Don't hang if unable to resolve latest version number.</li>
+ <li><span class="bugid">Bugfix:</span> Avoid duplicates in random album page.</li>
+ <li><span class="bugid">Bugfix:</span> More robust ID3 parsing.</li>
+ <li><span class="bugid">Bugfix:</span> More robust thumbnail scaling.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed bug which in some cases made it impossible to restart streams.</li>
+ <li><span class="bugid">Bugfix:</span> Improve track number removal from title.</li>
+</ul>
+
+<a name="2.9.beta1"><h2 class="div">Subsonic 2.9.beta1 - Oct 16, 2006</h2></a>
+<ul>
+ <li><span class="bugid">Bugfix:</span> Avoid excessive disk and memory usage when (re)scanning the music library
+ (bug introduced in 2.8).
+ </li>
+ <li><span class="bugid">Bugfix:</span> Avoid flickering PNG images in IE.</li>
+ <li><span class="bugid">New:</span> Improved thumbnail quality using step-wise bilinear resampling.</li>
+ <li><span class="bugid">New:</span> Thumbnails are now cached in SUBSONIC_HOME/thumbs. Expect significant speed-ups
+ (after a while), in particular for huge images.
+ </li>
+ <li><span class="bugid">New:</span> Improved search speed by a factor of two.</li>
+ <li><span class="bugid">New:</span> Miscellaneous other caching mechanisms for faster response times.</li>
+ <li><span class="bugid">New:</span> Support Wiki markup in album comments.</li>
+ <li><span class="bugid">New:</span> Added "Download" menu option to main album view.</li>
+ <li><span class="bugid">New:</span> Ratings are now per-user. Average rating is also displayed.</li>
+ <li><span class="bugid">New:</span> Now possible to delete rating (for current user).</li>
+ <li><span class="bugid">New:</span> Added Spanish translation by Jorge Bueno Magdalena. Gracias, Jorge!</li>
+ <li><span class="bugid">New:</span> New Subsonic logo.</li>
+ <li><span class="bugid">New:</span> Keep bitrate statistics even if player reconnects.</li>
+ <li><span class="bugid">New:</span> Support editing of track numbers in ID3 tags.</li>
+ <li><span class="bugid">New:</span> Show full file name as tool tip in ID3 tag editor.</li>
+ <li><span class="bugid">New:</span> Search results are now better sorted.</li>
+</ul>
+
+<a name="2.8"><h2 class="div">Subsonic 2.8 - Sep 07, 2006</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added option for transcoders to obey the player max bitrate setting.</li>
+ <li><span class="bugid">New:</span> Sort songs by track number.</li>
+ <li><span class="bugid">New:</span> Added transcoding support for Shorten and WavPack.</li>
+ <li><span class="bugid">New:</span> Improved caching of cover art images in browser.</li>
+ <li><span class="bugid">New:</span> Scroller color in Sandstorm theme.</li>
+ <li><span class="bugid">New:</span> Updated Norwegian translation.</li>
+ <li><span class="bugid">New:</span> Added Simplified Chinese translation by Neil Gao (currently incomplete).</li>
+ <li><span class="bugid">Bugfix:</span> Fixed performance problem with "Home" page.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed broken wap interface.</li>
+ <li><span class="bugid">Bugfix:</span> Fixed playlist autoscroll.</li>
+ <li><span class="bugid">Bugfix:</span> Proper rendering of directories with both files and sub-directories.</li>
+</ul>
+
+<a name="2.8.beta1"><h2 class="div">Subsonic 2.8.beta1 - Aug 13, 2006</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Transcoding plugin framework.</li>
+ <li><span class="bugid">New:</span> VBR (variable bitrate) detection and resampling.</li>
+ <li><span class="bugid">New:</span> Added form-based login with remember-me.</li>
+ <li><span class="bugid">New:</span> Added logout option.</li>
+ <li><span class="bugid">New:</span> Support per-user language and theme.</li>
+ <li><span class="bugid">New:</span> Show track number, genre, format, duration and file size.</li>
+ <li><span class="bugid">New:</span> Configurable level of song details.</li>
+ <li><span class="bugid">New:</span> Various artists detection.</li>
+ <li><span class="bugid">New:</span> Added option to stream over plain HTTP when using SSL.</li>
+ <li><span class="bugid">New:</span> Mouseover tooltip for truncated text and cover art images.</li>
+ <li><span class="bugid">New:</span> Optional notification of new final and beta releases.</li>
+ <li><span class="bugid">New:</span> Nicer error page.</li>
+ <li><span class="bugid">New:</span> Added "Back in black" and "Sandstorm" themes.</li>
+ <li><span class="bugid">New:</span> Exclude files and folders listed in "subsonic_exclude.txt"</li>
+ <li><span class="bugid">Tech:</span> New security implementation based on Acegi (http://acegisecurity.org/)</li>
+ <li><span class="bugid">Tech:</span> Springified WAP pages and servlets.</li>
+ <li><span class="bugid">Tech:</span> Springified DWR.</li>
+ <li><span class="bugid">Tech:</span> Springified DAO's and data source.</li>
+</ul>
+
+<a name="2.7"><h2 class="div">Subsonic 2.7 - Jun 12, 2006</h2></a>
+<ul>
+ <li><span class="bugid">Tech:</span> Subsonic was completely rewritten to use the Spring MVC framework.</li>
+ <li><span class="bugid">New:</span> Theme support. Now ships with two themes, "Subsonic Default" and "2 minutes to
+ midnight". Theme authors are encouraged to contribute.
+ </li>
+ <li><span class="bugid">New:</span> Ajax-based ID3 tag editor.</li>
+ <li><span class="bugid">New:</span> Cover art 3D effect and popup. (3D effect not available in Internet Explorer).
+ </li>
+ <li><span class="bugid">New:</span> Added options to limit bandwidth for downloads and uploads.</li>
+ <li><span class="bugid">New:</span> Added progress bar to upload page.</li>
+ <li><span class="bugid">New:</span> Show upload (as well as download and streaming) charts in status page.</li>
+ <li><span class="bugid">New:</span> Added option to configure shortcuts to certain folders.</li>
+ <li><span class="bugid">New:</span> Rating where you can see how much each user has uploaded/downloaded/streamed.
+ </li>
+ <li><span class="bugid">New:</span> Nicer layout and graphics.</li>
+ <li><span class="bugid">New:</span> Added option to download playlists, both current and previously saved ones.</li>
+ <li><span class="bugid">New:</span> Now logs to c:/subsonic/subsonic.log (Windows) or /var/subsonic/subsonic.log
+ (other platforms).
+ </li>
+ <li><span class="bugid">New:</span> Support symbolic links on Unix.</li>
+ <li><span class="bugid">New:</span> Support XSPF playlist format.</li>
+ <li><span class="bugid">New:</span> Create backup of old image file when changing cover art.</li>
+ <li><span class="bugid">Bugfix:</span> Avoid wrapped lines if browser window is small.</li>
+ <li><span class="bugid">Bugfix:</span> Use proper Y-range in bandwidth charts.</li>
+ <li><span class="bugid">Bugfix:</span> Integer overflow in search index creation interval.</li>
+ <li><span class="bugid">Bugfix:</span> Some Amazon search didn't show any results.</li>
+ <li><span class="bugid">Bugfix:</span> Now possible to change cover art even if original file is write protected
+ (Windows only).
+ </li>
+</ul>
+
+<a name="2.6"><h2 class="div">Subsonic 2.6 - Mar 10, 2006</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Nicer layout, colors and icons. Customizable welcome message. Option to limit
+ number of cover art images to display.
+ </li>
+ <li><span class="bugid">New:</span> You can now specify multiple media folders in the configuration.
+ This is useful, for example, if you have your music on multiple disks, or if you have one
+ directory with music, and another with movies. The index (on the left-hand side) can either show all
+ media folders (merged alphabetically), or you can select from a combo box which folder to display.
+ </li>
+ <li><span class="bugid">New:</span> Assign ratings (one to five stars) and comments to individual albums.</li>
+ <li><span class="bugid">New:</span> There is a new welcome page, displaying lists of random albums, newest albums,
+ highest rated albums, most often played albums and most recently played albums.
+ </li>
+ <li><span class="bugid">New:</span> You can configure a set of links to Internet TV and radio stations. These links
+ become available in the index on the left-hand side. Click on a link, and your player connects to the station.
+ </li>
+ <li><span class="bugid">New:</span> Saved playlists are now available as Podcasts (available from the "More" page).
+ </li>
+ <li><span class="bugid">New:</span> Improved player management. Support multiple players with the same IP address,
+ and players with dynamic IP addresses. Display player type (e.g., WinAmp) and last-seen date.
+ </li>
+ <li><span class="bugid">New:</span> Macedonian translation by Stefan Ivanovski.</li>
+ <li><span class="bugid">New:</span> Implemented support for non-Latin character encodings (for instance Japanese or
+ Cyrillic).
+ </li>
+ <li><span class="bugid">New:</span> Added option to load a previously saved playlist in the WAP interface.</li>
+ <li><span class="bugid">New:</span> "Album Info" now integrates with Google Music.</li>
+ <li><span class="bugid">New:</span> Avoid unnecessary reloading of the playlist window.</li>
+ <li><span class="bugid">Bugfix:</span> Fallback to file name if ID3 tags are present but empty.</li>
+ <li><span class="bugid">Bugfix:</span> LAME now works on Linux.</li>
+ <li><span class="bugid">Bugfix:</span> Solved problem with playlist autoscroll on rearrange.</li>
+ <li><span class="bugid">Bugfix:</span> Clicking index in top frame sometimes caused reloading of left frame.</li>
+</ul>
+
+<a name="2.5"><h2 class="div">Subsonic 2.5 - Nov 25, 2005</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Implemented user management. Users are easily created, deleted and assigned
+ different privileges.
+ </li>
+ <li><span class="bugid">New:</span> Faster song switching. Players react immediately to playlist changes.</li>
+ <li><span class="bugid">New:</span> Now possible to refine search for cover art and album info.</li>
+ <li><span class="bugid">New:</span> Better support for OGG, AAC and other formats. Added proper suffix to stream URL
+ as a hint to the player. </li>
+ <li><span class="bugid">New:</span> Display media library statistics.</li>
+ <li><span class="bugid">New:</span> New location for preferences, search index and database (c:\subsonic or
+ /var/subsonic).
+ </li>
+ <li><span class="bugid">Bugfix:</span> Improved parsing of MP3 tags. Avoid funny characters in artist, album and
+ song title.
+ </li>
+</ul>
+
+<a name="2.4"><h2 class="div">Subsonic 2.4 - Oct 10, 2005</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Download cover art and album info from Amazon web service.</li>
+ <li><span class="bugid">New:</span> Show selection of random albums on welcome page.</li>
+ <li><span class="bugid">New:</span> Display notice if LAME is not installed.</li>
+ <li><span class="bugid">Bugfix:</span> Allow max one stream per player.</li>
+ <li><span class="bugid">Bugfix:</span> Use user-wide (not system-wide) preferences on non-Windows platforms.</li>
+</ul>
+
+<a name="2.3"><h2 class="div">Subsonic 2.3 - May 28, 2005</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Full internationalization support.</li>
+ <li><span class="bugid">New:</span> Automatic update of search index at specified intervals.</li>
+ <li><span class="bugid">New:</span> Search is now more like Google.</li>
+ <li><span class="bugid">New:</span> Updating search index is now a lot faster (30 seconds for 18000 songs).</li>
+ <li><span class="bugid">New:</span> Unique playlist "undo" function.</li>
+ <li><span class="bugid">New:</span> "Now Playing" automatically refreshes when a new album is played.</li>
+ <li><span class="bugid">New:</span> Ongoing downloads are now displayed in the status page, with charts showing
+ download speed.
+ </li>
+ <li><span class="bugid">New:</span> Some improvements in zip functionality.</li>
+ <li><span class="bugid">New:</span> Significantly improved accuracy in charts.</li>
+ <li><span class="bugid">New:</span> Better support for non-ASCII characters in SHOUTcast.</li>
+ <li><span class="bugid">New:</span> No longer necessary to enter username and password in player.</li>
+ <li><span class="bugid">New:</span> Support for "ignored articles".</li>
+ <li><span class="bugid">New:</span> Show log in help page.</li>
+</ul>
+
+<a name="2.2"><h2 class="div">Subsonic 2.2 - March 17, 2005</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Implemented SHOUTcast support.</li>
+ <li><span class="bugid">New:</span> Added "Album info" which links to reviews etc at allmusic.com.</li>
+ <li><span class="bugid">New:</span> Support for uploading files from the browser to the Subsonic server. Zip-files
+ are automatically unpacked.
+ </li>
+ <li><span class="bugid">New:</span> Improved usability in search interface.</li>
+ <li><span class="bugid">New:</span> Option to specify http://yourhostname/stream/file.ogg etc.</li>
+ <li><span class="bugid">Bugfix:</span> Detect zero-terminated strings in ID3 tags.</li>
+ <li><span class="bugid">Bugfix:</span> Use ID3v2 tags instead of ID3v1, if both are present.</li>
+</ul>
+
+<a name="2.1"><h2 class="div">Subsonic 2.1 - March 8, 2005</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added more search options.</li>
+ <li><span class="bugid">New:</span> Added support for downloading an entire directory structure as a zip file.</li>
+ <li><span class="bugid">New:</span> Subsonic now parses song titles, artists and albums from ID3 tags.</li>
+ <li><span class="bugid">New:</span> Settings for cover art size and max bitrate can now be set for individual
+ players.
+ </li>
+ <li><span class="bugid">New:</span> Search index is now generated in the background.</li>
+ <li><span class="bugid">New:</span> Keep position in playlist frame (e.g., always show the currently playing track).
+ </li>
+ <li><span class="bugid">Bugfix:</span> Some minor bug fixes.</li>
+</ul>
+
+<a name="2.0"><h2 class="div">Subsonic 2.0 - February 27, 2005</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added WAP interface for controlling Subsonic from a mobile phone or PDA.</li>
+ <li><span class="bugid">New:</span> Added option to generate a random playlist.</li>
+ <li><span class="bugid">New:</span> Added option to download and save individual songs.</li>
+ <li><span class="bugid">New:</span> Subsonic now alerts users if a new version is available.</li>
+ <li><span class="bugid">New:</span> Improved documentation and usability.</li>
+ <li><span class="bugid">New:</span> ANT support.</li>
+</ul>
+
+<a name="1.0"><h2 class="div">Subsonic 1.0 - February 10, 2005</h2></a>
+<ul>
+ <li><span class="bugid">New:</span> Added chart for displaying bitrates last few minutes.</li>
+ <li><span class="bugid">New:</span> Implemented transcoding to lower bitrates.</li>
+ <li><span class="bugid">New:</span> Added online help.</li>
+ <li><span class="bugid">New:</span> Support PLS and M3U playlists.</li>
+</ul>
+
+<a name="0.1"><h2 class="div">Subsonic 0.1 - December 14, 2004</h2></a>
+<ul>
+ <li>Initial release.</li>
+</ul>
+
+</div>
+
+<div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <div class="sidebox">
+ <h2>Releases</h2>
+ <ul class="list">
+ <li><a href="#4.7.beta2">Subsonic 4.7.beta2</a></li>
+ <li><a href="#4.7.beta1">Subsonic 4.7.beta1</a></li>
+ <li><a href="#4.6">Subsonic 4.6</a></li>
+ <li><a href="#4.6.beta2">Subsonic 4.6.beta2</a></li>
+ <li><a href="#4.6.beta1">Subsonic 4.6.beta1</a></li>
+ <li><a href="#4.5">Subsonic 4.5</a></li>
+ <li><a href="#4.5.beta2">Subsonic 4.5.beta2</a></li>
+ <li><a href="#4.5.beta1">Subsonic 4.5.beta1</a></li>
+ <li><a href="#4.4">Subsonic 4.4</a></li>
+ <li><a href="#4.4.beta1">Subsonic 4.4.beta1</a></li>
+ <li><a href="#4.3">Subsonic 4.3</a></li>
+ <li><a href="#4.3.beta1">Subsonic 4.3.beta1</a></li>
+ <li><a href="#4.2">Subsonic 4.2</a></li>
+ <li><a href="#4.2.beta1">Subsonic 4.2.beta1</a></li>
+ <li><a href="#4.1">Subsonic 4.1</a></li>
+ <li><a href="#4.1.beta1">Subsonic 4.1.beta1</a></li>
+ <li><a href="#4.0.1">Subsonic 4.0.1</a></li>
+ <li><a href="#4.0">Subsonic 4.0</a></li>
+ <li><a href="#4.0.beta2">Subsonic 4.0.beta2</a></li>
+ <li><a href="#4.0.beta1">Subsonic 4.0.beta1</a></li>
+ <li><a href="#3.9">Subsonic 3.9</a></li>
+ <li><a href="#3.9.beta1">Subsonic 3.9.beta1</a></li>
+ <li><a href="#3.8">Subsonic 3.8</a></li>
+ <li><a href="#3.8.beta1">Subsonic 3.8.beta1</a></li>
+ <li><a href="#3.7">Subsonic 3.7</a></li>
+ <li><a href="#3.7.beta1">Subsonic 3.7.beta1</a></li>
+ <li><a href="#3.6">Subsonic 3.6</a></li>
+ <li><a href="#3.6.beta2">Subsonic 3.6.beta2</a></li>
+ <li><a href="#3.6.beta1">Subsonic 3.6.beta1</a></li>
+ <li><a href="#3.5">Subsonic 3.5</a></li>
+ <li><a href="#3.5.beta2">Subsonic 3.5.beta2</a></li>
+ <li><a href="#3.5.beta1">Subsonic 3.5.beta1</a></li>
+ <li><a href="#3.4">Subsonic 3.4</a></li>
+ <li><a href="#3.4">Subsonic 3.4.beta1</a></li>
+ <li><a href="#3.3">Subsonic 3.3</a></li>
+ <li><a href="#3.3.beta1">Subsonic 3.3.beta1</a></li>
+ <li><a href="#3.2">Subsonic 3.2</a></li>
+ <li><a href="#3.2.beta1">Subsonic 3.2.beta1</a></li>
+ <li><a href="#3.1">Subsonic 3.1</a></li>
+ <li><a href="#3.1.beta2">Subsonic 3.1.beta2</a></li>
+ <li><a href="#3.1.beta1">Subsonic 3.1.beta1</a></li>
+ <li><a href="#3.0">Subsonic 3.0</a></li>
+ <li><a href="#3.0.beta2">Subsonic 3.0.beta2</a></li>
+ <li><a href="#3.0.beta1">Subsonic 3.0.beta1</a></li>
+ <li><a href="#2.9">Subsonic 2.9</a></li>
+ <li><a href="#2.9.beta1">Subsonic 2.9.beta1</a></li>
+ <li><a href="#2.8">Subsonic 2.8</a></li>
+ <li><a href="#2.8.beta1">Subsonic 2.8.beta1</a></li>
+ <li><a href="#2.7">Subsonic 2.7</a></li>
+ <li><a href="#2.6">Subsonic 2.6</a></li>
+ <li><a href="#2.5">Subsonic 2.5</a></li>
+ <li><a href="#2.4">Subsonic 2.4</a></li>
+ <li><a href="#2.3">Subsonic 2.3</a></li>
+ <li><a href="#2.2">Subsonic 2.2</a></li>
+ <li><a href="#2.1">Subsonic 2.1</a></li>
+ <li><a href="#2.0">Subsonic 2.0</a></li>
+ <li><a href="#1.0">Subsonic 1.0</a></li>
+ <li><a href="#0.1">Subsonic 0.1</a></li>
+ </ul>
+ </div>
+
+ <%@ include file="donate.jsp" %>
+
+</div>
+
+<div class="clear">
+</div>
+</div>
+<hr/>
+<%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/demo.jsp b/subsonic-site/src/main/webapp/demo.jsp
new file mode 100644
index 00000000..d6ce9cc4
--- /dev/null
+++ b/subsonic-site/src/main/webapp/demo.jsp
@@ -0,0 +1,55 @@
+<%@ page import="java.util.Random" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "demo"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+ <%@ include file="menu.jsp" %>
+
+ <div id="content">
+ <div id="main-col">
+ <h1>Online Demo</h1>
+ <p>
+ Try the online demo to get a taste of what Subsonic is all about!
+ </p>
+
+ <ul class="list">
+ <li>
+ Not all Subsonic's features are available in the demo version. For instance, application settings can not be viewed
+ or changed. Please refer to the <a href="screenshots.jsp">screenshots</a> to see what you're missing.
+ </li>
+ <li>
+ All the music in the demo is free, and courtesy of <a href="http://www.jamendo.com/">Jamendo</a> and the respective artists.
+ </li>
+ </ul>
+
+ <%
+ Random random = new Random(System.currentTimeMillis());
+ int userId = random.nextInt(5) + 1;
+ %>
+ <p style="text-align:center;font-size:1.3em"><b><a href="http://subsonic.org/demo/login.view?user=guest<%=userId%>&password=guest" target="_blank">&raquo; Start demo</a></b></p>
+ </div>
+
+ <div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <%@ include file="download-subsonic.jsp" %>
+ <%@ include file="donate.jsp" %>
+ </div>
+
+ <div class="clear">
+ </div>
+ </div>
+ <hr/>
+ <%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/documentation.jsp b/subsonic-site/src/main/webapp/documentation.jsp
new file mode 100644
index 00000000..5fa711f8
--- /dev/null
+++ b/subsonic-site/src/main/webapp/documentation.jsp
@@ -0,0 +1,66 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "documentation"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+ <%@ include file="menu.jsp" %>
+
+ <div id="content">
+ <div id="main-col">
+ <h1>Documentation</h1>
+
+ <ul class="list" style="padding-top:1em">
+ <li><b><a href="installation.jsp">Installation</a></b><br>
+ How to install Subsonic on Windows, Mac, Linux and other platforms.
+ </li>
+ <li><b><a href="getting-started.jsp">Getting started</a></b><br>
+ How to set up music folders, remote access etc.
+ </li>
+ <li><b><a href="faq.jsp">FAQ</a></b><br>
+ Frequently asked questions.
+ </li>
+ <li><b><a href="http://monroeworld.com/android/subsonic/">A practical guide to installing and configuring Subsonic</a></b><br>
+ By Shane R. Monroe, Monroeworld.com.
+ </li>
+ <li><b><a href="https://sourceforge.net/apps/mediawiki/subsonic/index.php?title=Subsonic">Wiki</a></b><br>
+ Wiki pages contributed by your fellow Subsonic users.
+ </li>
+ <li><b><a href="forum.jsp">Forum</a></b><br>
+ Discuss and ask questions to fellow users. Roughly 30 new posts per day.
+ </li>
+ <li><b><a href="transcoding.jsp">Transcoding</a></b><br>
+ Detailed documentation of how Subsonic automatically converts between music formats.
+ </li>
+ <li><b><a href="translate.jsp">Translation</a></b><br>
+ How to translate Subsonic to a new language.
+ </li>
+ <li><b><a href="api.jsp">API documentation</a></b><br>
+ How to access Subsonic using the REST API. (For developers)
+ </li>
+
+ </ul>
+
+ </div>
+
+ <div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <%@ include file="download-subsonic.jsp" %>
+ </div>
+
+ <div class="clear">
+ </div>
+ </div>
+ <hr/>
+ <%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/donate.jsp b/subsonic-site/src/main/webapp/donate.jsp
new file mode 100644
index 00000000..c0bf9805
--- /dev/null
+++ b/subsonic-site/src/main/webapp/donate.jsp
@@ -0,0 +1,26 @@
+<div class="sidebox">
+ <h2>Donate</h2>
+ <p>
+ Love Subsonic? Support us by giving a donation and enjoy premium features like:
+ </p>
+ <ul>
+ <li><a href="apps.jsp">Apps</a> for Android, iPhone, WP&nbsp;7, PlayBook, Roku and more*.</li>
+ <li>Video streaming.</li>
+ <li>Share your media on Facebook, Twitter, Google+.</li>
+ <li>No ads.</li>
+ <li>Your personal server address: <em>yourname</em>.subsonic.org</li>
+ </ul>
+ <p>
+ The suggested donation amount is &euro;20, but you can give any amount you like.
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=2D72AEBGWW6Q4">&euro;10</a>,
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=R3XS7XY5C34SE">&euro;15</a>,
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=8QD3YWR7LMDKU">&euro;20</a>,
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=XH7FRBHAVH6QW">&euro;25</a>,
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BPFV56E3TWWRQ">&euro;30</a>
+ </p>
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=8QD3YWR7LMDKU"><img src="inc/img/paypal.gif" alt="Donate" class="img-center"/></a>
+
+ <p style="padding-top:10px;">After completing the payment you'll receive a license key by email which unlocks the premium features.</p>
+
+ <p style="font-size:9px;">* Some <a href="apps.jsp">apps</a> are sold by third-party developers.</p>
+</div> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/download-subsonic.jsp b/subsonic-site/src/main/webapp/download-subsonic.jsp
new file mode 100644
index 00000000..2dd3d8c4
--- /dev/null
+++ b/subsonic-site/src/main/webapp/download-subsonic.jsp
@@ -0,0 +1,19 @@
+<div class="sidebox">
+ <h2>Download Subsonic</h2>
+
+ <p>Free download available for Windows, Mac, Linux and Unix.</p>
+
+ <p><a href="download.jsp"><img src="inc/img/button-download.png" alt="Download" class="img-center"/></a></p>
+
+ <p>... or try the <a href="demo.jsp"><b>demo</b></a> first!</p>
+
+
+ <h2 style="padding-top:1em">Subsonic Mobile</h2>
+ <a href="apps.jsp"><img src="inc/img/android.png" alt="Android" class="img-right"/></a>
+
+ <p>Stream music to <a href="apps.jsp">Android</a>, <a href="apps.jsp">iPhone</a>, <a href="apps.jsp">Windows Phone</a> and more.</p>
+ <a href="apps.jsp"><img src="inc/img/appstore.png" alt="iPhone" class="img-right"/></a>
+
+ <p>All your music - anywhere, anytime! Never sync again.</p>
+
+</div> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/download.jsp b/subsonic-site/src/main/webapp/download.jsp
new file mode 100644
index 00000000..997998a7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/download.jsp
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%!
+ String current = "download";
+ String stable = "4.6";
+ String beta = "4.7.beta2"; // Set to null if no beta is available.
+%>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+ <%@ include file="menu.jsp" %>
+
+ <div id="content">
+ <div id="main-col">
+ <h1 class="bottomspace">Download Subsonic</h1>
+
+ <table width="100%" border="0" cellspacing="0" cellpadding="0" class="featuretable bottomspace">
+ <tr class="table-heading">
+ <th></th>
+ <th class="featurename">Latest stable release &ndash; Subsonic <%=stable%></th>
+ <th><a href="changelog.jsp#<%=stable%>">What's new?</a></th>
+ <th></th>
+ </tr>
+ <tr class="table-altrow">
+ <td><img src="inc/img/download-windows.png" alt="" height="16" width="16"/></td>
+ <td class="featurename" style="padding-left:0">Windows installer</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=stable%>-setup.exe"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#windows"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ <tr>
+ <td><img src="inc/img/download-mac.png" alt="" height="16" width="16"/></td>
+ <td class="featurename" style="padding-left:0">Mac OS X 10.5+ installer</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=stable%>.pkg"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#mac"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ <tr class="table-altrow">
+ <td><img src="inc/img/download-ubuntu.png" alt="" height="16" width="16"/></td>
+ <td class="featurename" style="padding-left:0">Debian/Ubuntu installer</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=stable%>.deb"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#debian"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ <tr>
+ <td><img src="inc/img/download-fedora.png" alt="" height="16" width="16"/></td>
+ <td class="featurename" style="padding-left:0">Red Hat/Fedora installer</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=stable%>.rpm"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#rpm"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ <tr class="table-altrow">
+ <td></td>
+ <td class="featurename" style="padding-left:0">Stand-alone version (all platforms)</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=stable%>-standalone.tar.gz"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#standalone"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td class="featurename" style="padding-left:0"> WAR version (all platforms)</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=stable%>-war.zip"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#war"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ </table>
+
+ <% if (beta != null) { %>
+ <table width="100%" border="0" cellspacing="0" cellpadding="0" class="featuretable bottomspace">
+ <tr class="table-heading">
+ <th></th>
+ <th class="featurename">Latest beta release &ndash; Subsonic <%=beta%></th>
+ <th><a href="changelog.jsp#<%=beta%>">What's new?</a></th>
+ <th></th>
+ </tr>
+ <tr class="table-altrow">
+ <td><img src="inc/img/download-windows.png" alt="" height="16" width="16"/></td>
+ <td class="featurename" style="padding-left:0">Windows installer</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=beta%>-setup.exe"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#windows"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ <tr>
+ <td><img src="inc/img/download-mac.png" alt="" height="16" width="16"/></td>
+ <td class="featurename" style="padding-left:0">Mac OS X 10.5+ installer</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=beta%>.pkg"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#mac"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ <tr class="table-altrow">
+ <td><img src="inc/img/download-ubuntu.png" alt="" height="16" width="16"/></td>
+ <td class="featurename" style="padding-left:0">Debian/Ubuntu installer</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=beta%>.deb"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#debian"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ <tr>
+ <td><img src="inc/img/download-fedora.png" alt="" height="16" width="16"/></td>
+ <td class="featurename" style="padding-left:0">Red Hat/Fedora installer</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=beta%>.rpm"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#rpm"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ <tr class="table-altrow">
+ <td></td>
+ <td class="featurename" style="padding-left:0">Stand-alone version (all platforms)</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=beta%>-standalone.tar.gz"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#standalone"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td class="featurename" style="padding-left:0"> WAR version (all platforms)</td>
+ <td style="white-space:nowrap;"><a href="download2.jsp?target=subsonic-<%=beta%>-war.zip"><img
+ src="inc/img/download_small.gif" alt="Download" height="11" width="11"/>&nbsp;Download</a></td>
+ <td style="white-space:nowrap;"><a href="installation.jsp#war"><img src="inc/img/star.png" alt="Instructions" height="14" width="14"/> Instructions</a></td>
+ </tr>
+ </table>
+ <% } %>
+
+ <h1>Hosting</h1>
+ <p>
+ If you don't want to install and configure Subsonic on your own computer you can get a pre-installed Subsonic server,
+ which works immediately out-of-the-box, from one of our affiliated hosting providers. <a href="hosting.jsp">Read more about their Subsonic hosting offers</a>.
+ </p>
+
+ <h1>Terms of use</h1>
+ <p>
+ <a href="http://www.gnu.org/copyleft/gpl.html"><img class="img-left" alt="GPL" src="inc/img/gpl.png"/></a>
+ Subsonic is open-source software licensed under the <a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License</a>.
+ Please note that Subsonic is <em>not</em> a tool for illegal distribution of copyrighted material. Always pay attention to and
+ follow the relevant laws specific to your country.
+ </p>
+ </div>
+
+ <div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <div class="sidebox">
+ <h2>Archive</h2>
+ <p>
+ Older versions, as well as source code, can be downloaded from
+ <a href="http://sourceforge.net/projects/subsonic/">SourceForge</a>.
+ </p>
+ </div>
+
+ <%@ include file="merchandise.jsp" %>
+
+ </div>
+
+ <div class="clear">
+ </div>
+ </div>
+ <hr/>
+ <%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/download2.jsp b/subsonic-site/src/main/webapp/download2.jsp
new file mode 100644
index 00000000..be6f6c70
--- /dev/null
+++ b/subsonic-site/src/main/webapp/download2.jsp
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <title>Subsonic &raquo; Free Music Streamer</title>
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/reset/reset.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/fonts/fonts.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/grid/grid.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/base/base.css">
+ <%@ include file="tracking.jsp" %>
+</head>
+
+<body onload="setTimeout('redirect()', 1500);">
+<!-- Google Code for Download Conversion Page -->
+<script type="text/javascript">
+/* <![CDATA[ */
+var google_conversion_id = 1068027807;
+var google_conversion_language = "en";
+var google_conversion_format = "3";
+var google_conversion_color = "ffffff";
+var google_conversion_label = "REx2CIW81AEQn5-j_QM";
+var google_conversion_value = 0;
+/* ]]> */
+</script>
+<script type="text/javascript" src="http://www.googleadservices.com/pagead/conversion.js">
+</script>
+<noscript>
+ <div style="display:inline;">
+ <img height="1" width="1" style="border-style:none;" alt="" src="http://www.googleadservices.com/pagead/conversion/1068027807/?label=REx2CIW81AEQn5-j_QM&amp;guid=ON&amp;script=0"/>
+ </div>
+</noscript>
+
+<%--Microsoft adCenter conversion--%>
+<script type="text/javascript">if (!window.mstag) mstag = {loadTag : function(){},time : (new Date()).getTime()};</script> <script id="mstag_tops" type="text/javascript" src="//flex.atdmt.com/mstag/site/97afbb31-0ace-43b0-a06d-1d8930db1ce5/mstag.js"></script> <script type="text/javascript"> mstag.loadTag("conversion", {cp : "5050", dedup : "1"})</script> <noscript> <iframe src="//flex.atdmt.com/mstag/tag/97afbb31-0ace-43b0-a06d-1d8930db1ce5/conversion.html?cp=5050&dedup=1" frameborder="0" scrolling="no" width="1" height="1" style="visibility:hidden; display:none"> </iframe> </noscript>
+
+<script type="text/javascript">
+ function redirect() {
+ window.location = "http://prdownloads.sourceforge.net/subsonic/<%=request.getParameter("target")%>";
+ }
+</script>
+
+<h2>Please wait, contacting SourceForge download center...</h2>
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/faq.jsp b/subsonic-site/src/main/webapp/faq.jsp
new file mode 100644
index 00000000..570c02f7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/faq.jsp
@@ -0,0 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "faq"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+ <%@ include file="menu.jsp" %>
+
+ <div id="content">
+ <div id="main-col">
+ <h1 class="bottomspace">Frequently Asked Questions</h1>
+
+ <h3>Are there other payment options than PayPal?</h3>
+ <p>Yes. You can make a payment to subsonic_donation@activeobjects.no on <a href="http://www.moneybookers.com/" target="_blank">Moneybookers</a>.</p>
+
+ <h3>How long does it take to get the license after I have donated?</h3>
+ <p>Normally no more than ten minutes. If it should take longer, please <a href="mailto:sindre@activeobjects.no">take contact</a>,
+ but please check your spam filter first.</p>
+
+ <h3>How do I install the license key I received by email?</h3>
+ <p>Please follow the guide in the <a href="getting-started.jsp#3">Getting Started</a> documentation.</p>
+
+ <h3>I can't access my Subsonic server from the internet or from my iPhone/Android phone.</h3>
+ <p>Please follow the guide in the <a href="getting-started.jsp#2">Getting Started</a> documentation.</p>
+
+ <h3>I forgot my Subsonic password. Can it be retrieved?</h3>
+ <p>Yes. Please read <a href="http://forum.subsonic.org/forum/viewtopic.php?t=3770">this forum post</a>.</p>
+
+ <h3>I've lost my license key. Can I have it resent?</h3>
+ <p>Yes. Please go <a href="http://subsonic.org/backend/requestLicense.view">here</a>.</p>
+
+ <%--TODO: Network shares--%>
+ </div>
+
+ <div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <%@ include file="download-subsonic.jsp" %>
+ <%@ include file="donate.jsp" %>
+
+ </div>
+
+ <div class="clear">
+ </div>
+ </div>
+ <hr/>
+ <%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/favicon.ico b/subsonic-site/src/main/webapp/favicon.ico
new file mode 100644
index 00000000..d2c13383
--- /dev/null
+++ b/subsonic-site/src/main/webapp/favicon.ico
Binary files differ
diff --git a/subsonic-site/src/main/webapp/features.jsp b/subsonic-site/src/main/webapp/features.jsp
new file mode 100644
index 00000000..f43ba114
--- /dev/null
+++ b/subsonic-site/src/main/webapp/features.jsp
@@ -0,0 +1,226 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "features"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+<%@ include file="menu.jsp" %>
+
+<div id="content">
+<div id="main-col">
+<h1>Subsonic Features</h1>
+
+<div class="featureitem">
+ <a name="userfriendly"></a>
+
+ <div class="heading">Easy to use <a href="#top" class="backtotop" title="Back To Top"><img
+ src="inc/img/top.gif" alt="Back To Top" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="screenshot">
+ <a href="inc/img/features/amy.png"><img src="inc/img/features/amy-small.png" alt=""/></a>
+ </div>
+ <div class="description">
+ <ul class="list">
+ <li>Listen to your music from anywhere &ndash; all you need is a browser.</li>
+ <li>The clean web interface is optimized for constrained bandwidth environments and efficient browsing through large music
+ collections (hundreds of gigabytes).</li>
+ <li>Free-text search helps you find your favorite tracks quickly.</li>
+ <li>Displays cover art, including images embedded in ID3 tags.</li>
+ <li>Assign ratings and comments to albums.</li>
+ <li>Common playlist features (add, remove, rearrange, repeat, shuffle, undo, save, load).</li>
+ </ul>
+ </div>
+ </div>
+</div>
+
+<div class="featureitem">
+ <a name="versatile"></a>
+
+ <div class="heading">Versatile <a href="#top" class="backtotop" title="Back To Top"><img
+ src="inc/img/top.gif" alt="Back To Top" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="screenshot">
+ <a href="inc/img/screenshots/screen13.png"><img src="inc/img/screenshots/thumb13.png" alt="" style="padding-left:10px"/></a>
+ </div>
+ <div class="description">
+ <ul class="list">
+ <li>Stream or download music directly to your phone. Apps available for <a href="apps.jsp">Android</a>,
+ <a href="apps.jsp">iPhone</a> and <a href="apps.jsp">Windows Phone</a></li>
+ <li>Use the AIR desktop application, <a href="apps.jsp">SubAir</a>.</li>
+ <li>Control Subsonic from any mobile phone or PDA, using the WAP interface.</li>
+ <li>Supports multiple simultaneous players. Manage any player from any location.</li>
+ <li>Upload and download files to/from Subsonic, with automatic zipping and unzipping.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+
+ <div class="featureitem">
+ <a name="mediasupport"></a>
+
+ <div class="heading">Supports most media formats <a href="#top" class="backtotop" title="Back To Top"><img
+ src="inc/img/top.gif" alt="Back To Top" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="screenshot">
+ <img src="inc/img/features/media-support.png" alt=""/>
+ </div>
+
+ <div class="description">
+ <ul class="list">
+ <li>Supports MP3, OGG, AAC and any other audio or video format that streams over HTTP.</li>
+ <li><a href="transcoding.jsp"><b>Transcoding engine</b></a> allows for streaming of a variety of lossy and lossless formats by converting to MP3 on-the-fly.</li>
+ <li>Works with any network-enabled media player, such as Winamp, iTunes, XMMS, VLC, MusicMatch and Windows Media Player. Also includes an embedded Flash player.</li>
+ <li>Tag parsing and editing of MP3, AAC, OGG, FLAC, WMA and APE files, using the <a href="http://www.jthink.net/jaudiotagger/">Jaudiotagger</a> library.</li>
+ <li>Playlists can be saved and restored. M3U, PLS and XSPF formats are supported. Saved playlists are available as Podcasts.</li>
+ <li>On-the-fly resampling to lower bitrates using the high-quality LAME encoder. Handy if your bandwidth is limited.</li>
+ <li>Implements the SHOUTcast protocol. Players which support this (including Winamp, iTunes and XMMS) display the current artist and song, along
+ with other metadata.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+
+<div class="featureitem">
+ <a name="customize"></a>
+ <div class="heading">Customizable user experience <a href="#top" class="backtotop" title="Back To Top"><img
+ src="inc/img/top.gif" alt="Back To Top" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="screenshot">
+ <a href="inc/img/features/personal-settings.png"><img src="inc/img/features/personal-settings-small.png" alt=""/></a>
+ <p/>
+ <a href="inc/img/features/avatar.png"><img src="inc/img/features/avatar-small.png" alt=""/></a>
+ </div>
+ <div class="description">
+ <ul class="list">
+ <li>Available in these languages:<br/><br/>
+
+ <table style="padding-left:1.5em">
+ <tr><td>&#149; English </td><td>(by Sindre Mehus)</td></tr>
+ <tr><td>&#149; French </td><td>(by JohnDillinger)</td></tr>
+ <tr><td>&#149; Spanish </td><td>(by Jorge Bueno Magdalena)</td></tr>
+ <tr><td>&#149; Portuguese </td><td>(by Miguel Fonseca)</td></tr>
+ <tr><td>&#149; German </td><td>(by Harald Weiss and J&ouml;rg Frommann)</td></tr>
+ <tr><td>&#149; Italian </td><td>(by Michele Petrecca)</td></tr>
+ <tr><td>&#149; Greek </td><td>(by Constantine Samaklis)</td></tr>
+ <tr><td>&#149; Russian </td><td>(by Iaroslav Andrusiak)</td></tr>
+ <tr><td>&#149; Slovenian </td><td>(by Andrej &#381;i&#382;mond, Jan Jamsek and Marko Kastelic)</td></tr>
+ <tr><td>&#149; Macedonian </td><td>(by Stefan Ivanovski)</td></tr>
+ <tr><td>&#149; Polish </td><td>(by Micha&#322; Kotas)</td></tr>
+ <tr><td>&#149; Bulgarian </td><td>(by Ivan Achev)</td></tr>
+ <tr><td>&#149; Chinese </td><td>(by Neil Gao)</td></tr>
+ <tr><td>&#149; Japanese </td><td>(by Takahiro Suzuki)</td></tr>
+ <tr><td>&#149; Korean </td><td>(by Choi Jong-seok)</td></tr>
+ <tr><td>&#149; Dutch </td><td>(by Ronald Knot)</td></tr>
+ <tr><td>&#149; Norwegian </td><td>(by Sindre Mehus and jigsaw)</td></tr>
+ <tr><td>&#149; Swedish </td><td>(by J&ouml;rgen Sj&ouml;berg)</td></tr>
+ <tr><td>&#149; Danish </td><td>(by Morten Hartvich)</td></tr>
+ <tr><td>&#149; Finnish </td><td>(by Reijo J&auml;&auml;rni)</td></tr>
+ <tr><td>&#149; Icelandic </td><td>(by DJ Danny)</td></tr>
+ </table>
+ </li>
+ <li>Select from 24 different themes, including some that are optimized for HD screens.</li>
+ <li>Highly configurable user interface.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+
+<div class="featureitem">
+ <a name="integrate"></a>
+
+ <div class="heading">Integrates with the best web services <a href="#top" class="backtotop" title="Back To Top"><img
+ src="inc/img/top.gif" alt="Back To Top" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="screenshot">
+ <img src="inc/img/features/last-fm.png" alt="" style="padding-bottom:20px;padding-right:20px"/>
+ <p/>
+ <img src="inc/img/features/wikipedia.png" alt="" style="padding-right:20px"/>
+ </div>
+ <div class="description">
+ <ul class="list">
+ <li>Automatically register what you're playing on Last.fm, using the built-in Audioscrobbling support.</li>
+ <li>Find cover art and lyrics using web services from Google and Chartlyrics.</li>
+ <li>Read album reviews and more at Wikipedia, Google Music and allmusic.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+
+<div class="featureitem">
+ <a name="secure"></a>
+
+ <div class="heading">Secure and reliable<a href="#top" class="backtotop" title="Back To Top"><img
+ src="inc/img/top.gif" alt="Back To Top" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="screenshot">
+ <a href="inc/img/features/logon.png"><img src="inc/img/features/logon-small.png" alt=""/></a>
+ </div>
+ <div class="description">
+ <ul class="list">
+ <li>Users must log in with a username and password. Users are assigned different privileges.</li>
+ <li>Specify upload and download bandwidth limits.</li>
+ <li>Use HTTPS/SSL encryption for ultimate protection.</li>
+ <li>Supports authentication in LDAP and Active Directory.</li>
+ <li>Runs for months without crashing, hanging or leaking resources.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+
+<div class="featureitem">
+ <a name="extras"></a>
+
+ <div class="heading">Cool extra features <a href="#top" class="backtotop" title="Back To Top"><img
+ src="inc/img/top.gif" alt="Back To Top" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="screenshot">
+ <img src="inc/img/features/extras.png" alt=""/>
+ </div>
+ <div class="description">
+ <ul class="list">
+ <li>Download Podcasts with the integrated Podcast receiver.</li>
+ <li>Manage your internet TV and radio stations.</li>
+ <li>Play music directly on the server's audio hardware using the <b>jukebox</b> mode.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+
+</div>
+
+
+<div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <div class="sidebox">
+ <h2>Features</h2>
+ <ul class="list">
+ <li><a href="#userfriendly">Easy to use</a></li>
+ <li><a href="#versatile">Versatile</a></li>
+ <li><a href="#mediasupport">Supports most media formats</a></li>
+ <li><a href="#customize">Customizable user experience</a></li>
+ <li><a href="#integrate">Integrates with the best web services</a></li>
+ <li><a href="#secure">Secure and reliable</a></li>
+ <li><a href="#extras">Cool extra features</a></li>
+ </ul>
+ </div>
+
+ <%@ include file="download-subsonic.jsp" %>
+ <%@ include file="translate-subsonic.jsp" %>
+</div>
+
+<div class="clear">
+</div>
+</div>
+<hr/>
+<%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/footer.jsp b/subsonic-site/src/main/webapp/footer.jsp
new file mode 100644
index 00000000..277ea27a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/footer.jsp
@@ -0,0 +1,11 @@
+<div id="footer">
+ <div class="footercontent">
+ <div>
+ &copy; Copyright 2011 Sindre Mehus.
+ <span style="padding-left: 1em">Hosting kindly provided by <a href="http://zazeen.com/" target="_blank">zazeen.com</a></span>
+ </div>
+ </div>
+</div>
+<script type="text/javascript" language="javascript">
+ setupZoom();
+</script> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/forum.jsp b/subsonic-site/src/main/webapp/forum.jsp
new file mode 100644
index 00000000..9de0b47c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/forum.jsp
@@ -0,0 +1,3 @@
+<%
+ response.sendRedirect("http://forum.subsonic.org/forum");
+%> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/getting-started.jsp b/subsonic-site/src/main/webapp/getting-started.jsp
new file mode 100644
index 00000000..cdf077d5
--- /dev/null
+++ b/subsonic-site/src/main/webapp/getting-started.jsp
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "getting-started"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+ <%@ include file="menu.jsp" %>
+
+ <div id="content">
+ <div id="main-col">
+ <h1 class="bottomspace">Getting Started</h1>
+
+ <p>
+ This guide assumes that you have successfully installed the Subsonic server on your computer. If not,
+ please refer to the <a href="installation.jsp">installation instructions</a>.
+ </p>
+ <p>
+ After installing and starting Subsonic, open the Subsonic web page. The web address may differ depending
+ on your installation options, but is typically <a href="http://localhost" target="_blank">http://localhost</a>
+ or <a href="http://localhost:4040" target="_blank">http://localhost:4040</a>.
+ </p>
+
+ <a name="1"><h2>1 Setting up music folders</h2></a>
+
+ <p>You must tell Subsonic where you keep your music. Select <b>Settings &gt; Music folders</b> to add one or
+ more folders.</p>
+
+ <p>Note that if you add more than one music folder, a list will appear on the left side of the screen where you can
+ select the active folder.</p>
+
+ <a href="inc/img/gettingstarted/musicfolders.png"><img src="inc/img/gettingstarted/musicfolders_thumb.png" alt=""/></a>
+
+ <p>Also note that Subsonic will organize your music according to how they are organized on your disk.
+ Unlike many other music applications, Subsonic does not organize the music according to the tag information
+ embedded in the files. (It does, however, also read the tags for presentation and search purposes.)</p>
+
+ <p>Consequently, it's recommended that the music folders you add to Subsonic are organized in an
+ <span style="white-space:nowrap;">"artist/album/song"</span> manner. There are music managers, like
+ <a href="http://www.mediamonkey.com/" target="_blank">MediaMonkey</a>, that can help you achieve this.</p>
+
+ <a name="2"><h2>2 Setting up remote access</h2></a>
+ <p>With Subsonic you can access your music anywhere on the internet or from your iPhone or Android phone.
+ However, in order to do that certain conditions must be met:</p>
+
+ <ul class="list">
+ <li>Your router must have a public IP address and must be accessible from the internet. This is true for most home internet connections.</li>
+ <li>Your router must support the UPnP or NAT-PMP protocol so that Subsonic can setup the appropriate port forwarding. If your router doesn't support
+ this you will have to configure the port forwarding manually.</li>
+ </ul>
+
+ <a name="2.1"><h3>2.1 Automatic port forwarding</h3></a>
+ <p>To enable automatic port forwarding in Subsonic, go to <b>Settings &gt; Network</b> and enable the
+ "Automatically configure your router..." option. Click the Save button and pay close attention to the status message
+ that is displayed. If you get an error message, you should first try to configure your router to enable UPnP
+ (or NAT-PMP if you have an AirPort from Apple).
+ If it still fails, or your router doesn't support UPnP, follow the instructions below.
+ If it works, the Subsonic server will at regular intervals (every hour) contact the router and tell it to
+ forward incoming connections (from the internet) to the Subsonic server.
+ </p>
+
+ <a name="2.2"><h3>2.2 Manual port forwarding</h3></a>
+ <p>If the automatic option didn't work you can still set it up manually. Consult <a href="http://portforward.com/" target="_blank">portforward.com</a>
+ to get instructions specific to your router. Note that the instructions contain important steps on how to
+ configure a <em>static IP address</em> for your computer. You should follow these. Later in the process, you
+ will find that Subsonic is not on the list of applications, so select the "Default Guide" instead.
+ </p>
+ <p>
+ When you get to the point where the router asks for <em>private and public ports</em>, enter the port number the
+ Subsonic server is using (normally 80 on Windows and 4040 on other operating systems) for both values.
+ If asked for a <em>protocol</em>, select TCP.
+ </p>
+
+ <p>If you are unsure what any of this means you will probably need to consult someone with network configuration
+ experience.</p>
+
+ <a name="2.3"><h3>2.3 Setting up your personal subsonic.org address</h3></a>
+ <p>Once you get the port forwarding set up correctly, the next step is to get yourself an easy-to-remember web address.
+ You will use this address to access your Subsonic server from the internet.</p>
+
+ <p>From <b>Settings &gt; Network</b> you can register your address. (Remember to log on with admin rights).
+ Enable the "Access your server over the internet..." option,
+ and enter your preferred address, for instance http://joe.subsonic.org.</p>
+
+ <p>Click the Save button, and pay attention to the status message that is displayed. Note that Subsonic will also perform
+ a test to ensure that the web address works properly. If the test fails it might be an indication that the port
+ forwarding is not set up correctly.</p>
+
+ <p>If you don't want to use a subsonic.org address you can get similar services from dynamic DNS providers such as dyndns.com.</p>
+
+
+ <a name="2.4"><h3>2.4 Troubleshooting</h3></a>
+ <p>This section describes some common network problems and how to fix them.</p>
+ <ul class="list">
+ <li><b>Multiple routers.</b> There might be more than one router on your network, for instance both an "inner"
+ wireless router and an "outer" (closest to the internet) cable/fiber modem with routing enabled. You must
+ make sure that incoming traffic received by the outermost router is forwarded to the inner router (which
+ in turn forwards the traffic on to your Subsonic server). You can do this by configuring port forwarding on the
+ outer router (forward traffic to the inner router), or setting it in <em>bridge mode</em>. Your ISP should
+ be able to help you if you have problems with this. </li>
+ <li><b>Port blocked by ISP.</b> Many ISPs (Internet Service Providers) block incoming traffic on port 80, which is
+ used by most web servers. Subsonic uses port 80 by default on Windows. You can avoid this by configuring
+ Subsonic to use a different port. Open the Subsonic Control Panel by clicking on the Subsonic tray icon.
+ Change the port number to any random number between 1025 and 65,000. If you set up manual port forwarding
+ (see above), remember to update that as well.</li>
+ <li><b>Firewall.</b> You might be running firewall software (on the Subsonic server) which blocks incoming traffic.
+ If this is the case, try first to turn the firewall off. If this helps, turn the firewall back on and configure it
+ to allow incoming traffic to Subsonic. Note: The Windows installer version of Subsonic will automatically
+ configure the built-in Windows Firewall.</li>
+ </ul>
+
+ <a name="3"><h2>3 Registering your license key</h2></a>
+ <p>Most features in Subsonic are free, but some (like mobile phone streaming) require a license after the 30-day
+ free trial. You get the license key by donating &euro;10 or more to the Subsonic project. After you receive the license key
+ by email, you must register it on your server as follows:</p>
+
+ <ul class="list">
+ <li>Click the "Donate" link in the top right corner of the Subsonic web interface.</li>
+ <li>Enter the email address and license key you received by email.</li>
+ </ul>
+
+ <a href="inc/img/gettingstarted/license.png"><img src="inc/img/gettingstarted/license_thumb.png" alt=""/></a>
+
+ <a name="4"><h2>4 Using https</h2></a>
+ <p>For improved security you can turn on https encryption. On Windows, open the Subsonic Control Panel by clicking
+ on the Subsonic tray icon, then enable https on the specified port (default 443).
+ </p>
+ <p> On Linux, add <code>--https-port=4443</code> (or any other port) to SUBSONIC_ARGS in
+ <code>/etc/default/subsonic</code> (Ubuntu/Debian) or <code>/etc/sysconfig/subsonic</code> (Fedora/RPM).
+ </p>
+ <p>
+ Note that Subsonic uses a self-signed https certificate by default. This provides encryption but not
+ proper authentication. To use your own certificate you must put it in a Java keystore, then specify the
+ following Java system properties: <em>subsonic.ssl.keystore</em> &ndash; (Path to an alternate SSL keystore), and
+ <em>subsonic.ssl.password</em> &ndash; (Password of the alternate SSL keystore). On Windows, you can set these system
+ properties in <code>C:\Program Files\Subsonic\subsonic-service.exe.vmoptions</code>.
+ </p>
+
+ </div>
+
+ <div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <div class="sidebox">
+ <h2>Table of contents</h2>
+ <ul class="list">
+ <li><a href="#1">1 Setting up music folders</a></li>
+ <li><a href="#2">2 Setting up remote access</a></li>
+
+ <ul class="list">
+ <li><a href="#2.1">2.1 Automatic port forwarding</a></li>
+ <li><a href="#2.2">2.2 Manual port forwarding</a></li>
+ <li><a href="#2.3">2.3 Setting up your personal subsonic.org address</a></li>
+ <li><a href="#2.3">2.4 Troubleshooting</a></li>
+ </ul>
+ <li><a href="#3">3 Registering your license key</a></li>
+ <li><a href="#4">4 Using https</a></li>
+ </ul>
+ </div>
+ </div>
+
+ <div class="clear">
+ </div>
+ </div>
+ <hr/>
+ <%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/google-translate.jsp b/subsonic-site/src/main/webapp/google-translate.jsp
new file mode 100644
index 00000000..b2e9370e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/google-translate.jsp
@@ -0,0 +1,9 @@
+<div style="height:65px;padding-left:30px">
+ <div id="google_translate_element"></div><script>
+ function googleTranslateElementInit() {
+ new google.translate.TranslateElement({
+ pageLanguage: 'en'
+ }, 'google_translate_element');
+ }
+ </script><script src="http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
+</div> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/header.jsp b/subsonic-site/src/main/webapp/header.jsp
new file mode 100644
index 00000000..ed488809
--- /dev/null
+++ b/subsonic-site/src/main/webapp/header.jsp
@@ -0,0 +1,18 @@
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Subsonic &raquo; Free Music Streamer</title>
+
+ <link rel="stylesheet" type="text/css" href="inc/css/style.css"/>
+ <link rel="stylesheet" type="text/css" href="inc/css/banner.css"/>
+ <link rel="shortcut icon" href="favicon.ico"/>
+
+ <script type="text/javascript" language="javascript" src="inc/js/jquery-1.4.4.min.js"></script>
+ <script type="text/javascript" language="javascript" src="inc/js/FancyZoom.js"></script>
+ <script type="text/javascript" language="javascript" src="inc/js/FancyZoomHTML.js"></script>
+
+ <%@ include file="tracking.jsp" %>
+
+ <!--[if lte IE 6]>
+ <link rel="stylesheet" type="text/css" href="inc/css/pngfix.css" />
+ <![endif]-->
+</head>
diff --git a/subsonic-site/src/main/webapp/hosting.jsp b/subsonic-site/src/main/webapp/hosting.jsp
new file mode 100644
index 00000000..a2f498e4
--- /dev/null
+++ b/subsonic-site/src/main/webapp/hosting.jsp
@@ -0,0 +1,91 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%!
+ String current = "hosting";
+ String gigaProsUrl = "http://www.gigapros.com/affiliate/scripts/click.php?a_aid=subsonic&desturl=http://www.gigapros.com/portal/index.php/products-a-services/specialty-hosting/subsonic-server.html";
+ String zazeenUrl = "https://www.zazeen.com/OnlinePC.html";
+%>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+ <%@ include file="menu.jsp" %>
+
+ <div id="content">
+ <div id="main-col">
+ <h1 class="bottomspace">Subsonic Hosting</h1>
+
+ <p>
+ An alternative to running the Subsonic on your own computer is to get a pre-installed Subsonic server from
+ one of our hosting partners.
+ </p>
+
+ <div class="featureitem">
+ <div class="heading">Zazeen</div>
+ <div class="content">
+ <div class="wide-content">
+
+ <a href="<%=zazeenUrl%>" target="_blank"><img src="inc/img/zazeen.gif" alt="Zazeen" class="img-left"/></a>
+ <p>
+ Zazeen's <em>Online PC</em> comes with Ubuntu and a full range of applications and services, including
+ a ready-to-use Subsonic server.
+ </p>
+ <p>
+ Zazeen provides multiple 10Gbit fiber optic backbone and
+ peering arrangements to most ISPs in North America and Europe.
+ </p>
+
+ <p>
+ <b><a href="<%=zazeenUrl%>" target="_blank">Check out Zazeen's server plans and prices.</a></b>
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <div class="heading">GigaPros</div>
+ <div class="content">
+ <div class="wide-content">
+
+ <a href="<%=gigaProsUrl%>" target="_blank"><img src="inc/img/gigapros.png" alt="GigaPros" class="img-left"/></a>
+ <p>
+ GigaPros' Subsonic hosting servers are actually powerful Virtual Private Servers (VPS), which are highly optimized to run Subsonic.
+ </p>
+ <p>
+ These VPS'es have fully functional pre-installed Subsonic server and they behave exactly like your own Dedicated Server
+ with full root access.
+ </p>
+
+ <a href="http://www.trialpay.com/productpage/?c=ee8eacd&tid=RHyuuKT" target="_blank">
+ <img class="img-right" src="http://www.trialpay.com/mi/?rc=v&ri=1368898&p=VtA3333j&t=RHyuuKT&type=img" alt=""/>
+ </a>
+ <p>
+ <b><a href="<%=gigaProsUrl%>" target="_blank">Check out GigaPros' server plans and prices.</a></b>
+ </p>
+
+
+ </div>
+ </div>
+ </div>
+
+ </div>
+
+ <div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ </div>
+
+ <div class="clear">
+ </div>
+ </div>
+ <hr/>
+ <%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/inc/css/banner.css b/subsonic-site/src/main/webapp/inc/css/banner.css
new file mode 100644
index 00000000..22f1d669
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/css/banner.css
@@ -0,0 +1,104 @@
+
+#banner-full {
+ width: 900px;
+ height: 299px;
+ background-color: #282828;
+ overflow: hidden;
+ position: relative;
+ border-top: 1px solid #5c5c5c;
+ border-bottom: 1px solid #4e4e4e;
+}
+#slide-prev {
+ position: absolute;
+ left: 815px;
+ top: 260px;
+ z-index: 200;
+ width:32px;
+ height:32px;
+ margin: 0;
+ padding: 0;
+ background: url('../img/banner/prev.png') no-repeat;
+}
+#slide-next {
+ position: absolute;
+ left: 860px;
+ top: 260px;
+ z-index: 200;
+ width:32px;
+ height:32px;
+ margin: 0;
+ padding: 0;
+ background: url('../img/banner/next.png') no-repeat;
+}
+#slide-prev:hover
+{
+ background: url('../img/banner/prev-hover.png') no-repeat;
+}
+#slide-next:hover
+{
+ background: url('../img/banner/next-hover.png') no-repeat;
+}
+#bannercontent {
+ position: absolute;
+ left: 0;
+ z-index: 100;
+}
+#banner-full .slide {
+ width: 900px;
+ height: 301px;
+ position: absolute;
+}
+#banner-full .slidecontent {
+ position: relative;
+ width: 900px;
+ height: 301px;
+}
+#banner-full .slide .screenshot {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+}
+#banner-full .slide .title {
+ width: 380px;
+ height: 65px;
+ position: absolute;
+ top: 80px;
+ left: 515px;
+}
+#banner-full .slide1 .title {
+ top: 100px;
+ left: 530px;
+}
+#banner-full .slide4 .title {
+ left: 575px;
+}
+#banner-full .slide5 .title {
+ left: 575px;
+ width: 300px;
+}
+#banner-full .slide .title .large {
+ font-size: 24px;
+ font-weight: bold;
+ line-height: normal;
+ color: #fff;
+ margin-bottom:10px;
+}
+#banner-full .slide .title .small {
+ font-size: 16px;
+ font-style: normal;
+ color: #ddd;
+}
+#banner-full .slide .text {
+ position: absolute;
+ top: 185px;
+ left: 515px;
+ width: 380px;
+ line-height: 1.4em;
+ color: #aaa;
+}
+
+#bannercontent .slide1 {left:0;}
+#bannercontent .slide2 {left:900px;}
+#bannercontent .slide3 {left:1800px;}
+#bannercontent .slide4 {left:2700px;}
+#bannercontent .slide5 {left:3600px;}
diff --git a/subsonic-site/src/main/webapp/inc/css/style.css b/subsonic-site/src/main/webapp/inc/css/style.css
new file mode 100644
index 00000000..ab5435ba
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/css/style.css
@@ -0,0 +1,345 @@
+*,h1,h2,h3,h4,h5,h6,p,div,body,html,ul,li,ol,img,a{margin:0;padding:0;}
+body {
+ width: 100%;
+ margin: 0;
+ padding: 0 0 20px 0;
+ background: #fff url('../img/content-bg.gif') 0px 0px repeat-x;
+ font-size: 0.8em;
+ color: #444;
+ font-family: Arial, Helvetica, sans-serif;
+}
+.clear { clear: both; }
+.hide { display: none; }
+p { margin: 0.2em 0 1em 0; }
+hr { display: none; }
+a img {
+ border: none;
+}
+a {
+ color: #4275bc;
+ text-decoration: none;
+}
+a:hover {
+ color: #060c36;
+ text-decoration: underline;
+}
+.floatcontainer {
+ overflow: hidden;
+ width: 100%;
+}
+h1 {
+ font-size: 18px;
+ color: #060c36;
+ font-weight: bold;
+ padding: 0 0 6px 0;
+}
+h2 {
+ font-size: 14px;
+ color: #060c36;
+ font-weight: bold;
+ padding: 0 0 4px 0;
+}
+h2.div {
+ border-bottom: 1px solid #ccc;
+ margin-bottom: 10px;
+}
+h3 {
+ font-size: 13px;
+ color: #060c36;
+ font-weight: bold;
+ padding: 0 0 2px 0;
+}
+h4 {
+ font-size: 11px;
+ color: #060c36;
+ font-weight: normal;
+ text-transform: uppercase;
+}
+/* ---------- List Items ---------- */
+html>body #content ul.list {
+ list-style: none;
+ text-indent: -1em;
+}
+#content ul {
+ margin: 0 0 1em 0;
+ padding: 0 0 0 1em;
+}
+#content ul.list li {
+ padding: 4px 0 4px 0;
+ margin: 0 0 0 0.25em;
+}
+#content ul.list li:before { /* Show right angle quotes to cool browsers */
+ content: "\00BB \0020";
+}
+ol {
+ margin: 0 0 .8em 1em;
+ padding-left: 2em;
+}
+#content ol li {
+ margin-bottom: 1.6em;
+}
+#content ul.stars {
+ list-style: none;
+ margin: 0px;
+ padding: 0px;
+}
+#content ul.stars li {
+ background: url('../img/star.png') 0px 0px no-repeat;
+ padding: 0 10px 8px 20px;
+ margin: 0px;
+ list-style: none;
+}
+#content ul.stars li:before {
+ content: "";
+}
+#container {
+ width: 900px;
+ margin: 0 auto;
+ padding-top: 106px;
+ position: relative;
+}
+#logo {
+ position: absolute;
+ left: -40px;
+ top: 0;
+ z-index: 99;
+}
+#content {
+ width: 898px;
+ background: #fff url('../img/content-bg.gif') 0px 0px repeat-x;
+ border: 1px solid #cbcedc;
+ line-height: 1.4em;
+}
+#main-col {
+ width: 600px;
+ padding: 15px 20px 15px 20px;
+ float: left;
+}
+#side-col {
+ margin: 20px 0 0 0;
+ width: 240px;
+ float: left;
+}
+#side-col .sidebox {
+ margin: 0 0 20px 0;
+ padding: 10px;
+ border: 1px solid #cbcedc;
+ background-color: #e6e7ee;
+}
+#wide-col {
+ padding: 15px 20px 15px 20px;
+}
+/* ---------- Nav ----------- */
+#nav {
+ background: url('../img/topnav.gif') top left no-repeat;
+ height: 39px;
+ width: 900px;
+ position: relative;
+ overflow: hidden;
+}
+#nav ul {
+ margin: 0;
+ padding: 0;
+ list-style-image: none;
+ list-style: none;
+}
+#nav li {
+ margin: 0;
+ padding: 0;
+ float: left;
+}
+#nav li a {
+ background: url('../img/topnav-hover.gif') 0px 99px repeat-x;
+ height: 39px;
+ color: #7281b3;
+ text-decoration: none;
+ display: block;
+ font-size: 14px;
+ overflow: hidden;
+ float: left;
+ cursor: pointer;
+}
+#nav li a span {
+ display: block;
+ float: left;
+ padding: 12px 11px 12px 11px; /* Change for narrower menu items. */
+ background: url('../img/topnav-div.gif') right 1px no-repeat;
+}
+#nav li a:hover, #nav li a.active {
+ background: url('../img/topnav-hover.gif') 0px 1px repeat-x;
+ color: #a9b3d6;
+}
+#nav li#menu-home a:hover, #nav li#menu-home a.active {
+ background: url('../img/home-rollover.gif') 1px 1px no-repeat;
+ color: #a9b3d6;
+}
+/* ---------- Menu Visibility ---------- */
+#nav li a.open {
+ background: url('../img/topnav-hover.gif') 0px -49px repeat-x !important;
+ color: #ffffff !important;
+}
+#nav li#menu-home a.open {
+ background: url('../img/home-rollover.gif') 1px -49px no-repeat !important;
+ color: #ffffff !important;
+}
+/* ---------- Footer ----------- */
+#footer {
+ width: 900px;
+ background: url('../img/footer.gif') bottom left no-repeat;
+ border-top: 1px solid #383d5e;
+ color: #7281B3;
+ font-size: 11px;
+}
+#footer .footercontent {
+ padding: 10px;
+}
+#footer a {
+ text-decoration: none;
+ color: #9ea9ce;
+}
+#footer a:hover {
+ color: #fff;
+}
+/* ---------- Content Formatting ---------- */
+.column-left {
+ float: left;
+ width: 50%;
+}
+.column-right {
+ float: right;
+ width: 50%;
+}
+ul.column-right, ul.column-left {
+ margin: 0;
+ padding: 0;
+}
+/* ---------- Feature Table ----------- */
+tr.table-heading {
+ background: url('../img/header.gif') 0px 0px no-repeat;
+ color: #fff;
+ font-weight: bold;
+ line-height: normal;
+}
+tr.table-heading th {
+ padding: 6px 10px 6px 10px;
+}
+th.featurename {
+ text-align: left !important;
+}
+tr.table-altrow {
+ background: #f1f2f8;
+}
+table.featuretable td {
+ padding: 6px 10px 6px 10px;
+ text-align: center;
+}
+table.featuretable th a{
+ color: #cccccc;
+}
+table.featuretable {
+ padding: 6px 4px;
+}
+table.featuretable td.meta {
+ padding: 0px;
+}
+td.featurename {
+ text-align: left !important;
+ width: 50%;
+}
+.important {
+ color: #911;
+ font-weight: bold;
+}
+
+/* ---------- Transcoding Table ----------- */
+th.transcoding-heading {
+ text-align: left !important;
+ padding-right:2em;
+}
+td.transcoding {
+ white-space:nowrap;
+ padding-right:2em;
+}
+
+/* ---------- API Parameter Table ----------- */
+th.param-heading {
+ font-size:11px;
+}
+
+/* ---------- Feature Detail ----------- */
+.featureitem {
+ background: #f1f2f8;
+ margin-bottom: 20px;
+}
+.featureitem .heading {
+ background: url('../img/header.gif') 0px 0px no-repeat;
+ color: #fff;
+ font-weight: bold;
+ padding: 6px 10px 6px 10px;
+ position: relative;
+}
+.featureitem .content {
+ overflow: hidden;
+ width: 100%;
+ background: url('../img/itemcontentborder.gif') top left repeat-y;
+ border-bottom: 1px solid #CBCEDC;
+}
+.featureitem .content .description {
+ margin-right: 190px;
+ padding: 10px 0 10px 10px;
+}
+.featureitem .content .wide-description {
+ padding: 10px;
+}
+.featureitem .content .wide-content {
+ padding: 10px;
+}
+.featureitem .content .screenshot {
+ float: right;
+ padding: 10px 10px 10px 0px;
+}
+
+.margin10-t { margin-top: 10px; }
+.margin10-r { margin-right: 10px; }
+.margin10-b { margin-bottom: 10px; }
+.margin10-l { margin-left: 10px; }
+
+.margin20-t { margin-top: 20px; }
+.margin20-r { margin-right: 20px; }
+.margin20-b { margin-bottom: 20px; }
+.margin20-l { margin-left: 20px; }
+
+/* ---------- Search form ---------- */
+#search {
+ position: absolute;
+ top: 55px;
+ right: 0;
+}
+
+/* ---------- Content ---------- */
+.bugid, code, pre, td.transcoding {
+ font: 13px "Bitstream Vera Sans Mono", 'Courier New', Courier, Fixed, monospace;
+}
+.bugid { color: #09f; }
+code, pre { color: #093; }
+.bottomspace {
+ margin-bottom: 20px;
+}
+.backtotop {
+ position: absolute;
+ top: 8px;
+ right: 8px;
+}
+.img-right {
+ float: right;
+ margin-left: 10px;
+}
+.img-left {
+ float: left;
+ margin-right: 10px;
+}
+.img-center {
+ display:block;
+ margin-left:auto;
+ margin-right:auto;
+} \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/inc/img/air.png b/subsonic-site/src/main/webapp/inc/img/air.png
new file mode 100644
index 00000000..ff1199a0
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/air.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/android.png b/subsonic-site/src/main/webapp/inc/img/android.png
new file mode 100644
index 00000000..5180aeab
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/android.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/appstore.png b/subsonic-site/src/main/webapp/inc/img/appstore.png
new file mode 100644
index 00000000..0cb660bc
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/appstore.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/available_on_appstore.png b/subsonic-site/src/main/webapp/inc/img/available_on_appstore.png
new file mode 100644
index 00000000..c02b588d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/available_on_appstore.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/android-video.png b/subsonic-site/src/main/webapp/inc/img/banner/android-video.png
new file mode 100644
index 00000000..a405faae
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/android-video.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/apps.png b/subsonic-site/src/main/webapp/inc/img/banner/apps.png
new file mode 100644
index 00000000..513a9609
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/apps.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/apps.xcf b/subsonic-site/src/main/webapp/inc/img/banner/apps.xcf
new file mode 100644
index 00000000..f4c47872
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/apps.xcf
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/banner-01.jpg b/subsonic-site/src/main/webapp/inc/img/banner/banner-01.jpg
new file mode 100644
index 00000000..95301745
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/banner-01.jpg
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/banner-bg.gif b/subsonic-site/src/main/webapp/inc/img/banner/banner-bg.gif
new file mode 100644
index 00000000..f62c250d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/banner-bg.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/car.png b/subsonic-site/src/main/webapp/inc/img/banner/car.png
new file mode 100644
index 00000000..ed516232
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/car.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/iphone.png b/subsonic-site/src/main/webapp/inc/img/banner/iphone.png
new file mode 100644
index 00000000..508e46ae
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/iphone.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/isub1.png b/subsonic-site/src/main/webapp/inc/img/banner/isub1.png
new file mode 100644
index 00000000..ac3bd21b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/isub1.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/next-hover.png b/subsonic-site/src/main/webapp/inc/img/banner/next-hover.png
new file mode 100644
index 00000000..461a158a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/next-hover.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/next.png b/subsonic-site/src/main/webapp/inc/img/banner/next.png
new file mode 100644
index 00000000..74319504
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/next.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/prev-hover.png b/subsonic-site/src/main/webapp/inc/img/banner/prev-hover.png
new file mode 100644
index 00000000..ac3fd348
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/prev-hover.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/prev.png b/subsonic-site/src/main/webapp/inc/img/banner/prev.png
new file mode 100644
index 00000000..46331b14
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/prev.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/screenshot.png b/subsonic-site/src/main/webapp/inc/img/banner/screenshot.png
new file mode 100644
index 00000000..25dc44b4
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/screenshot.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/video.png b/subsonic-site/src/main/webapp/inc/img/banner/video.png
new file mode 100644
index 00000000..52dd9dd3
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/video.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/banner/wp7.png b/subsonic-site/src/main/webapp/inc/img/banner/wp7.png
new file mode 100644
index 00000000..0312d4d7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/banner/wp7.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/blackberry.png b/subsonic-site/src/main/webapp/inc/img/blackberry.png
new file mode 100644
index 00000000..471d4dfe
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/blackberry.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/body-bg.gif b/subsonic-site/src/main/webapp/inc/img/body-bg.gif
new file mode 100644
index 00000000..40a631a0
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/body-bg.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/button-download.png b/subsonic-site/src/main/webapp/inc/img/button-download.png
new file mode 100644
index 00000000..dc990cf7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/button-download.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/change-password-small.png b/subsonic-site/src/main/webapp/inc/img/change-password-small.png
new file mode 100644
index 00000000..8b882cb1
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/change-password-small.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/change-password.png b/subsonic-site/src/main/webapp/inc/img/change-password.png
new file mode 100644
index 00000000..01fd4679
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/change-password.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/chumby.png b/subsonic-site/src/main/webapp/inc/img/chumby.png
new file mode 100644
index 00000000..8d0b683e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/chumby.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/content-bg.gif b/subsonic-site/src/main/webapp/inc/img/content-bg.gif
new file mode 100644
index 00000000..f253c508
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/content-bg.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/donate.png b/subsonic-site/src/main/webapp/inc/img/donate.png
new file mode 100644
index 00000000..3b00577e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/donate.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/download-fedora.png b/subsonic-site/src/main/webapp/inc/img/download-fedora.png
new file mode 100644
index 00000000..4e57200e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/download-fedora.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/download-linux.png b/subsonic-site/src/main/webapp/inc/img/download-linux.png
new file mode 100644
index 00000000..872d802f
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/download-linux.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/download-mac.png b/subsonic-site/src/main/webapp/inc/img/download-mac.png
new file mode 100644
index 00000000..509a50b2
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/download-mac.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/download-ubuntu.png b/subsonic-site/src/main/webapp/inc/img/download-ubuntu.png
new file mode 100644
index 00000000..3a904dc7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/download-ubuntu.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/download-windows.png b/subsonic-site/src/main/webapp/inc/img/download-windows.png
new file mode 100644
index 00000000..d66f0be3
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/download-windows.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/download_small.gif b/subsonic-site/src/main/webapp/inc/img/download_small.gif
new file mode 100644
index 00000000..fa56b595
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/download_small.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/closebox.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/closebox.png
new file mode 100644
index 00000000..4de4396d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/closebox.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/spacer.gif b/subsonic-site/src/main/webapp/inc/img/fancyzoom/spacer.gif
new file mode 100644
index 00000000..5bfd67a2
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/spacer.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-fill.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-fill.png
new file mode 100644
index 00000000..1e341533
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-fill.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-l.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-l.png
new file mode 100644
index 00000000..a63ea481
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-l.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-r.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-r.png
new file mode 100644
index 00000000..15980d58
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-r.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow1.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow1.png
new file mode 100644
index 00000000..8b48000b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow1.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow2.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow2.png
new file mode 100644
index 00000000..09209f37
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow2.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow3.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow3.png
new file mode 100644
index 00000000..7636fec2
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow3.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow4.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow4.png
new file mode 100644
index 00000000..c7f148d9
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow4.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow5.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow5.png
new file mode 100644
index 00000000..2a75b82a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow5.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow6.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow6.png
new file mode 100644
index 00000000..65801aa0
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow6.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow7.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow7.png
new file mode 100644
index 00000000..cb447608
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow7.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow8.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow8.png
new file mode 100644
index 00000000..f1c6acdb
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow8.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-1.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-1.png
new file mode 100644
index 00000000..5615629c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-1.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-10.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-10.png
new file mode 100644
index 00000000..77595dbd
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-10.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-11.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-11.png
new file mode 100644
index 00000000..c2147d56
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-11.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-12.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-12.png
new file mode 100644
index 00000000..cf027248
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-12.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-2.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-2.png
new file mode 100644
index 00000000..95eaae89
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-2.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-3.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-3.png
new file mode 100644
index 00000000..9e2b9cb3
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-3.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-4.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-4.png
new file mode 100644
index 00000000..a39c0fc0
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-4.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-5.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-5.png
new file mode 100644
index 00000000..80bea63b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-5.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-6.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-6.png
new file mode 100644
index 00000000..b962e5f7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-6.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-7.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-7.png
new file mode 100644
index 00000000..9b6e489f
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-7.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-8.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-8.png
new file mode 100644
index 00000000..fe147d5f
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-8.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-9.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-9.png
new file mode 100644
index 00000000..b321b1c7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-9.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/amy-small.png b/subsonic-site/src/main/webapp/inc/img/features/amy-small.png
new file mode 100644
index 00000000..77765178
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/amy-small.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/amy.png b/subsonic-site/src/main/webapp/inc/img/features/amy.png
new file mode 100644
index 00000000..9a0a5bbd
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/amy.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/avatar-small.png b/subsonic-site/src/main/webapp/inc/img/features/avatar-small.png
new file mode 100644
index 00000000..66a95810
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/avatar-small.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/avatar.png b/subsonic-site/src/main/webapp/inc/img/features/avatar.png
new file mode 100644
index 00000000..943c8ff6
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/avatar.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/bbc.png b/subsonic-site/src/main/webapp/inc/img/features/bbc.png
new file mode 100644
index 00000000..906f5e27
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/bbc.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/extras.png b/subsonic-site/src/main/webapp/inc/img/features/extras.png
new file mode 100644
index 00000000..40369ae9
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/extras.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/extras.xcf b/subsonic-site/src/main/webapp/inc/img/features/extras.xcf
new file mode 100644
index 00000000..1e25fcc9
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/extras.xcf
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/flac.png b/subsonic-site/src/main/webapp/inc/img/features/flac.png
new file mode 100644
index 00000000..f601d00a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/flac.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/itunes.png b/subsonic-site/src/main/webapp/inc/img/features/itunes.png
new file mode 100644
index 00000000..f0fc1aa8
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/itunes.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/lame.png b/subsonic-site/src/main/webapp/inc/img/features/lame.png
new file mode 100644
index 00000000..0e2f79f4
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/lame.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/lame.png.orig b/subsonic-site/src/main/webapp/inc/img/features/lame.png.orig
new file mode 100644
index 00000000..0e2f79f4
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/lame.png.orig
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/last-fm.png b/subsonic-site/src/main/webapp/inc/img/features/last-fm.png
new file mode 100644
index 00000000..0c92ac2b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/last-fm.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/logon-small.png b/subsonic-site/src/main/webapp/inc/img/features/logon-small.png
new file mode 100644
index 00000000..015cda1c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/logon-small.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/logon.png b/subsonic-site/src/main/webapp/inc/img/features/logon.png
new file mode 100644
index 00000000..01514b8f
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/logon.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/media-support.png b/subsonic-site/src/main/webapp/inc/img/features/media-support.png
new file mode 100644
index 00000000..1e15244e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/media-support.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/media-support.xcf b/subsonic-site/src/main/webapp/inc/img/features/media-support.xcf
new file mode 100644
index 00000000..d42e43e4
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/media-support.xcf
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/mp3.png b/subsonic-site/src/main/webapp/inc/img/features/mp3.png
new file mode 100644
index 00000000..0ea7c8af
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/mp3.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/mp3.png.orig b/subsonic-site/src/main/webapp/inc/img/features/mp3.png.orig
new file mode 100644
index 00000000..0ea7c8af
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/mp3.png.orig
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/nrk.png b/subsonic-site/src/main/webapp/inc/img/features/nrk.png
new file mode 100644
index 00000000..cc6986cd
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/nrk.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/personal-settings-small.png b/subsonic-site/src/main/webapp/inc/img/features/personal-settings-small.png
new file mode 100644
index 00000000..b1369be0
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/personal-settings-small.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/personal-settings.png b/subsonic-site/src/main/webapp/inc/img/features/personal-settings.png
new file mode 100644
index 00000000..398ba2e9
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/personal-settings.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/podcast.png b/subsonic-site/src/main/webapp/inc/img/features/podcast.png
new file mode 100644
index 00000000..01a98c64
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/podcast.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png b/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png
new file mode 100644
index 00000000..7d8acd18
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png.orig b/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png.orig
new file mode 100644
index 00000000..7d8acd18
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png.orig
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/wap-small.png b/subsonic-site/src/main/webapp/inc/img/features/wap-small.png
new file mode 100644
index 00000000..f41eb81b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/wap-small.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/wap.png b/subsonic-site/src/main/webapp/inc/img/features/wap.png
new file mode 100644
index 00000000..637e52f0
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/wap.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png b/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png
new file mode 100644
index 00000000..39233e28
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png.orig b/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png.orig
new file mode 100644
index 00000000..12d0e244
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png.orig
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/winamp.png b/subsonic-site/src/main/webapp/inc/img/features/winamp.png
new file mode 100644
index 00000000..cc35943b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/winamp.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/winamp.png.orig b/subsonic-site/src/main/webapp/inc/img/features/winamp.png.orig
new file mode 100644
index 00000000..cc35943b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/winamp.png.orig
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/wmp.png b/subsonic-site/src/main/webapp/inc/img/features/wmp.png
new file mode 100644
index 00000000..3449e18d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/wmp.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/features/wmp.png.orig b/subsonic-site/src/main/webapp/inc/img/features/wmp.png.orig
new file mode 100644
index 00000000..3449e18d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/features/wmp.png.orig
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/footer.gif b/subsonic-site/src/main/webapp/inc/img/footer.gif
new file mode 100644
index 00000000..fa269e85
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/footer.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/gettingstarted/license.png b/subsonic-site/src/main/webapp/inc/img/gettingstarted/license.png
new file mode 100644
index 00000000..9dbada3c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/gettingstarted/license.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/gettingstarted/license_thumb.png b/subsonic-site/src/main/webapp/inc/img/gettingstarted/license_thumb.png
new file mode 100644
index 00000000..1a951a91
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/gettingstarted/license_thumb.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders.png b/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders.png
new file mode 100644
index 00000000..0b236083
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders_thumb.png b/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders_thumb.png
new file mode 100644
index 00000000..620c813c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders_thumb.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/gigapros.png b/subsonic-site/src/main/webapp/inc/img/gigapros.png
new file mode 100644
index 00000000..b5b1f2d3
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/gigapros.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/gpl.png b/subsonic-site/src/main/webapp/inc/img/gpl.png
new file mode 100644
index 00000000..b06e0439
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/gpl.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/header.gif b/subsonic-site/src/main/webapp/inc/img/header.gif
new file mode 100644
index 00000000..115a5738
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/header.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/home-rollover.gif b/subsonic-site/src/main/webapp/inc/img/home-rollover.gif
new file mode 100644
index 00000000..1f9fc0db
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/home-rollover.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/itemcontentborder.gif b/subsonic-site/src/main/webapp/inc/img/itemcontentborder.gif
new file mode 100644
index 00000000..7e3d252b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/itemcontentborder.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/mac-appstore.jpg b/subsonic-site/src/main/webapp/inc/img/mac-appstore.jpg
new file mode 100644
index 00000000..6531fd23
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/mac-appstore.jpg
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/mac-installer-small.png b/subsonic-site/src/main/webapp/inc/img/mac-installer-small.png
new file mode 100644
index 00000000..9f07bc9b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/mac-installer-small.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/mac-installer.png b/subsonic-site/src/main/webapp/inc/img/mac-installer.png
new file mode 100644
index 00000000..ca38de3e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/mac-installer.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/merchandise.png b/subsonic-site/src/main/webapp/inc/img/merchandise.png
new file mode 100644
index 00000000..11f94fa8
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/merchandise.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/mpa-nominee.png b/subsonic-site/src/main/webapp/inc/img/mpa-nominee.png
new file mode 100644
index 00000000..657f7c88
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/mpa-nominee.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/paypal.gif b/subsonic-site/src/main/webapp/inc/img/paypal.gif
new file mode 100644
index 00000000..d017250a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/paypal.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/ripserver-small.png b/subsonic-site/src/main/webapp/inc/img/ripserver-small.png
new file mode 100644
index 00000000..b220c40d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/ripserver-small.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/ripserver.png b/subsonic-site/src/main/webapp/inc/img/ripserver.png
new file mode 100644
index 00000000..00c58d85
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/ripserver.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen01.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen01.png
new file mode 100644
index 00000000..53771adf
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen01.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen02.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen02.png
new file mode 100644
index 00000000..e63fa2f4
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen02.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen03.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen03.png
new file mode 100644
index 00000000..e4c7ee58
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen03.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen05.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen05.png
new file mode 100644
index 00000000..aedc6874
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen05.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen06.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen06.png
new file mode 100644
index 00000000..22794dab
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen06.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen07.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen07.png
new file mode 100644
index 00000000..a81c3b10
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen07.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen08.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen08.png
new file mode 100644
index 00000000..72283443
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen08.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen09.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen09.png
new file mode 100644
index 00000000..e8770c62
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen09.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen10.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen10.png
new file mode 100644
index 00000000..7595e82d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen10.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen11.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen11.png
new file mode 100644
index 00000000..80074d99
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen11.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen12.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen12.png
new file mode 100644
index 00000000..cd979719
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen12.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen13.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen13.png
new file mode 100644
index 00000000..f594532a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen13.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen14.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen14.png
new file mode 100644
index 00000000..d2adb422
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen14.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen15.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen15.png
new file mode 100644
index 00000000..6bc3b296
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen15.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen16.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen16.png
new file mode 100644
index 00000000..db292acb
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen16.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen17.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen17.png
new file mode 100644
index 00000000..e42004ba
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen17.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen18.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen18.png
new file mode 100644
index 00000000..827f1e8a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen18.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen19.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen19.png
new file mode 100644
index 00000000..1a4b90ad
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen19.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen20.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen20.png
new file mode 100644
index 00000000..77f3c426
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen20.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen21.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen21.png
new file mode 100644
index 00000000..ab2e645d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen21.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen22.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen22.png
new file mode 100644
index 00000000..8287d2ab
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen22.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen23.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen23.png
new file mode 100644
index 00000000..fc5ea59b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen23.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen24.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen24.png
new file mode 100644
index 00000000..bff8ba81
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen24.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen25.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen25.png
new file mode 100644
index 00000000..8f09b94c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen25.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen26.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen26.png
new file mode 100644
index 00000000..154c34b0
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen26.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen27.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen27.png
new file mode 100644
index 00000000..4233d2f9
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen27.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen28.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen28.png
new file mode 100644
index 00000000..1514347b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen28.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen29.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen29.png
new file mode 100644
index 00000000..97826ef6
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen29.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen30.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen30.png
new file mode 100644
index 00000000..a1ef9428
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen30.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen31.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen31.png
new file mode 100644
index 00000000..3d09bc69
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen31.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen32.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen32.png
new file mode 100644
index 00000000..06a1d621
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen32.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen33.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen33.png
new file mode 100644
index 00000000..25915c31
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen33.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen34.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen34.png
new file mode 100644
index 00000000..6ba7cd35
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen34.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen35.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen35.png
new file mode 100644
index 00000000..d4117ba1
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen35.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen36.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen36.png
new file mode 100644
index 00000000..d2d06093
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen36.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen37.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen37.png
new file mode 100644
index 00000000..607d75ab
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen37.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen38.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen38.png
new file mode 100644
index 00000000..04beaca7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen38.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen39.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen39.png
new file mode 100644
index 00000000..64bfa7c2
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen39.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen40.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen40.png
new file mode 100644
index 00000000..96023bdd
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen40.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen41.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen41.png
new file mode 100644
index 00000000..077783eb
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen41.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen42.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen42.png
new file mode 100644
index 00000000..9b1f31e2
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen42.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen43.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen43.png
new file mode 100644
index 00000000..2493b601
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen43.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen44.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen44.png
new file mode 100644
index 00000000..4ec7d197
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen44.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen45.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen45.png
new file mode 100644
index 00000000..f384c93b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/screen45.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb01.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb01.png
new file mode 100644
index 00000000..605383d6
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb01.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb02.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb02.png
new file mode 100644
index 00000000..23e9e9f8
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb02.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb03.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb03.png
new file mode 100644
index 00000000..8378058d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb03.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb05.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb05.png
new file mode 100644
index 00000000..9c132083
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb05.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb06.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb06.png
new file mode 100644
index 00000000..f454486c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb06.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb07.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb07.png
new file mode 100644
index 00000000..a0f4fe5c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb07.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb08.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb08.png
new file mode 100644
index 00000000..ba6b3d6b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb08.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb09.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb09.png
new file mode 100644
index 00000000..2115721e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb09.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb10.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb10.png
new file mode 100644
index 00000000..2a24588d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb10.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb11.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb11.png
new file mode 100644
index 00000000..8444f2ad
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb11.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb12.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb12.png
new file mode 100644
index 00000000..fbf03231
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb12.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb13.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb13.png
new file mode 100644
index 00000000..cb841be1
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb13.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb14.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb14.png
new file mode 100644
index 00000000..529082f6
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb14.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb15.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb15.png
new file mode 100644
index 00000000..03396f44
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb15.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb16.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb16.png
new file mode 100644
index 00000000..a1b7d033
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb16.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb17.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb17.png
new file mode 100644
index 00000000..58deaef7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb17.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb18.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb18.png
new file mode 100644
index 00000000..9fc3f4ec
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb18.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb19.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb19.png
new file mode 100644
index 00000000..b06f3834
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb19.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb20.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb20.png
new file mode 100644
index 00000000..d5dd2a59
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb20.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb21.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb21.png
new file mode 100644
index 00000000..55289db9
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb21.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb22.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb22.png
new file mode 100644
index 00000000..55b2f3b9
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb22.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb23.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb23.png
new file mode 100644
index 00000000..8d499d53
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb23.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb24.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb24.png
new file mode 100644
index 00000000..050d2d1b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb24.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb25.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb25.png
new file mode 100644
index 00000000..40f81c44
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb25.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb27.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb27.png
new file mode 100644
index 00000000..ad674590
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb27.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb28.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb28.png
new file mode 100644
index 00000000..fae6d77d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb28.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb29.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb29.png
new file mode 100644
index 00000000..249b5d15
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb29.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb30.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb30.png
new file mode 100644
index 00000000..ac7610ed
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb30.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb31.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb31.png
new file mode 100644
index 00000000..f2d34ebf
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb31.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb33.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb33.png
new file mode 100644
index 00000000..944bcc2a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb33.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb35.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb35.png
new file mode 100644
index 00000000..0020c90d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb35.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb36.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb36.png
new file mode 100644
index 00000000..0c819962
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb36.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb37.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb37.png
new file mode 100644
index 00000000..67e3142a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb37.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb38.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb38.png
new file mode 100644
index 00000000..b277ec15
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb38.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb39.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb39.png
new file mode 100644
index 00000000..2c0c70a2
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb39.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb40.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb40.png
new file mode 100644
index 00000000..d92cbf35
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb40.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb41.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb41.png
new file mode 100644
index 00000000..7a5aceee
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb41.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb42.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb42.png
new file mode 100644
index 00000000..a60200e9
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb42.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb43.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb43.png
new file mode 100644
index 00000000..3591d0c0
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb43.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb44.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb44.png
new file mode 100644
index 00000000..4ef3276a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb44.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb45.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb45.png
new file mode 100644
index 00000000..5c49c48d
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb45.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/search.png b/subsonic-site/src/main/webapp/inc/img/search.png
new file mode 100644
index 00000000..4e522b23
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/search.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/sindre.jpeg b/subsonic-site/src/main/webapp/inc/img/sindre.jpeg
new file mode 100644
index 00000000..b3656f39
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/sindre.jpeg
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/star.png b/subsonic-site/src/main/webapp/inc/img/star.png
new file mode 100644
index 00000000..cd2b8bb2
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/star.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/subsonic-forum.png b/subsonic-site/src/main/webapp/inc/img/subsonic-forum.png
new file mode 100644
index 00000000..39ba6e6e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/subsonic-forum.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/subsonic-shop.jpeg b/subsonic-site/src/main/webapp/inc/img/subsonic-shop.jpeg
new file mode 100644
index 00000000..6a4dde6a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/subsonic-shop.jpeg
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/subsonic-tshirt.png b/subsonic-site/src/main/webapp/inc/img/subsonic-tshirt.png
new file mode 100644
index 00000000..730f92cf
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/subsonic-tshirt.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/subsonic.png b/subsonic-site/src/main/webapp/inc/img/subsonic.png
new file mode 100644
index 00000000..f2cb2a60
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/subsonic.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/top.gif b/subsonic-site/src/main/webapp/inc/img/top.gif
new file mode 100644
index 00000000..a3a18784
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/top.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/topnav-div.gif b/subsonic-site/src/main/webapp/inc/img/topnav-div.gif
new file mode 100644
index 00000000..3a4f7238
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/topnav-div.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/topnav-hover.gif b/subsonic-site/src/main/webapp/inc/img/topnav-hover.gif
new file mode 100644
index 00000000..45547bb1
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/topnav-hover.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/topnav.gif b/subsonic-site/src/main/webapp/inc/img/topnav.gif
new file mode 100644
index 00000000..e5fadeed
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/topnav.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/ubuntu.png b/subsonic-site/src/main/webapp/inc/img/ubuntu.png
new file mode 100644
index 00000000..f707e260
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/ubuntu.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/windows-installer-small.png b/subsonic-site/src/main/webapp/inc/img/windows-installer-small.png
new file mode 100644
index 00000000..d33639b4
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/windows-installer-small.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/windows-installer.png b/subsonic-site/src/main/webapp/inc/img/windows-installer.png
new file mode 100644
index 00000000..07bbcf5b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/windows-installer.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/windows-marketplace.png b/subsonic-site/src/main/webapp/inc/img/windows-marketplace.png
new file mode 100644
index 00000000..0d3c18ad
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/windows-marketplace.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/windows7.png b/subsonic-site/src/main/webapp/inc/img/windows7.png
new file mode 100644
index 00000000..0559b26e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/windows7.png
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/zazeen-ad.gif b/subsonic-site/src/main/webapp/inc/img/zazeen-ad.gif
new file mode 100644
index 00000000..45189efe
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/zazeen-ad.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/img/zazeen.gif b/subsonic-site/src/main/webapp/inc/img/zazeen.gif
new file mode 100644
index 00000000..3fcd454e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/img/zazeen.gif
Binary files differ
diff --git a/subsonic-site/src/main/webapp/inc/js/FancyZoom.js b/subsonic-site/src/main/webapp/inc/js/FancyZoom.js
new file mode 100644
index 00000000..37df0b7b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/js/FancyZoom.js
@@ -0,0 +1,761 @@
+// FancyZoom.js - v1.1 - http://www.fancyzoom.com
+//
+// Copyright (c) 2008 Cabel Sasser / Panic Inc
+// All rights reserved.
+//
+// Requires: FancyZoomHTML.js
+// Instructions: Include JS files in page, call setupZoom() in onLoad. That's it!
+// Any <a href> links to images will be updated to zoom inline.
+// Add rel="nozoom" to your <a href> to disable zooming for an image.
+//
+// Redistribution and use of this effect in source form, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// * USE OF SOURCE ON COMMERCIAL (FOR-PROFIT) WEBSITE REQUIRES ONE-TIME LICENSE FEE PER DOMAIN.
+// Reasonably priced! Visit www.fancyzoom.com for licensing instructions. Thanks!
+//
+// * Non-commercial (personal) website use is permitted without license/payment!
+//
+// * Redistribution of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// * Redistribution of source code and derived works cannot be sold without specific
+// written prior permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+var includeCaption = true; // Turn on the "caption" feature, and write out the caption HTML
+var zoomTime = 5; // Milliseconds between frames of zoom animation
+var zoomSteps = 15; // Number of zoom animation frames
+var includeFade = 1; // Set to 1 to fade the image in / out as it zooms
+var minBorder = 90; // Amount of padding between large, scaled down images, and the window edges
+var shadowSettings = '0px 5px 25px rgba(0, 0, 0, '; // Blur, radius, color of shadow for compatible browsers
+
+var zoomImagesURI = 'inc/img/fancyzoom/'; // Location of the zoom and shadow images
+
+// Init. Do not add anything below this line, unless it's something awesome.
+
+var myWidth = 0, myHeight = 0, myScroll = 0; myScrollWidth = 0; myScrollHeight = 0;
+var zoomOpen = false, preloadFrame = 1, preloadActive = false, preloadTime = 0, imgPreload = new Image();
+var preloadAnimTimer = 0;
+
+var zoomActive = new Array(); var zoomTimer = new Array();
+var zoomOrigW = new Array(); var zoomOrigH = new Array();
+var zoomOrigX = new Array(); var zoomOrigY = new Array();
+
+var zoomID = "ZoomBox";
+var theID = "ZoomImage";
+var zoomCaption = "ZoomCaption";
+var zoomCaptionDiv = "ZoomCapDiv";
+
+if (navigator.userAgent.indexOf("MSIE") != -1) {
+ var browserIsIE = true;
+}
+
+// Zoom: Setup The Page! Called in your <body>'s onLoad handler.
+
+function setupZoom() {
+ prepZooms();
+ insertZoomHTML();
+ zoomdiv = document.getElementById(zoomID);
+ zoomimg = document.getElementById(theID);
+}
+
+// Zoom: Inject Javascript functions into hrefs pointing to images, one by one!
+// Skip any href that contains a rel="nozoom" tag.
+// This is done at page load time via an onLoad() handler.
+
+function prepZooms() {
+ if (! document.getElementsByTagName) {
+ return;
+ }
+ var links = document.getElementsByTagName("a");
+ for (i = 0; i < links.length; i++) {
+ if (links[i].getAttribute("href")) {
+ if (links[i].getAttribute("href").search(/(.*)\.(jpg|jpeg|gif|png|bmp|tif|tiff)/gi) != -1) {
+ if (links[i].getAttribute("rel") != "nozoom") {
+ links[i].onclick = function (event) { return zoomClick(this, event); };
+ links[i].onmouseover = function () { zoomPreload(this); };
+ }
+ }
+ }
+ }
+}
+
+// Zoom: Load an image into an image object. When done loading, function sets preloadActive to false,
+// so other bits know that they can proceed with the zoom.
+// Preloaded image is stored in imgPreload and swapped out in the zoom function.
+
+function zoomPreload(from) {
+
+ var theimage = from.getAttribute("href");
+
+ // Only preload if we have to, i.e. the image isn't this image already
+
+ if (imgPreload.src.indexOf(from.getAttribute("href").substr(from.getAttribute("href").lastIndexOf("/"))) == -1) {
+ preloadActive = true;
+ imgPreload = new Image();
+
+ // Set a function to fire when the preload is complete, setting flags along the way.
+
+ imgPreload.onload = function() {
+ preloadActive = false;
+ }
+
+ // Load it!
+ imgPreload.src = theimage;
+ }
+}
+
+// Zoom: Start the preloading animation cycle.
+
+function preloadAnimStart() {
+ preloadTime = new Date();
+ document.getElementById("ZoomSpin").style.left = (myWidth / 2) + 'px';
+ document.getElementById("ZoomSpin").style.top = ((myHeight / 2) + myScroll) + 'px';
+ document.getElementById("ZoomSpin").style.visibility = "visible";
+ preloadFrame = 1;
+ document.getElementById("SpinImage").src = zoomImagesURI+'zoom-spin-'+preloadFrame+'.png';
+ preloadAnimTimer = setInterval("preloadAnim()", 100);
+}
+
+// Zoom: Display and ANIMATE the jibber-jabber widget. Once preloadActive is false, bail and zoom it up!
+
+function preloadAnim(from) {
+ if (preloadActive != false) {
+ document.getElementById("SpinImage").src = zoomImagesURI+'zoom-spin-'+preloadFrame+'.png';
+ preloadFrame++;
+ if (preloadFrame > 12) preloadFrame = 1;
+ } else {
+ document.getElementById("ZoomSpin").style.visibility = "hidden";
+ clearInterval(preloadAnimTimer);
+ preloadAnimTimer = 0;
+ zoomIn(preloadFrom);
+ }
+}
+
+// ZOOM CLICK: We got a click! Should we do the zoom? Or wait for the preload to complete?
+// todo?: Double check that imgPreload src = clicked src
+
+function zoomClick(from, evt) {
+
+ var shift = getShift(evt);
+
+ // Check for Command / Alt key. If pressed, pass them through -- don't zoom!
+ if (! evt && window.event && (window.event.metaKey || window.event.altKey)) {
+ return true;
+ } else if (evt && (evt.metaKey|| evt.altKey)) {
+ return true;
+ }
+
+ // Get browser dimensions
+ getSize();
+
+ // If preloading still, wait, and display the spinner.
+ if (preloadActive == true) {
+ // But only display the spinner if it's not already being displayed!
+ if (preloadAnimTimer == 0) {
+ preloadFrom = from;
+ preloadAnimStart();
+ }
+ } else {
+ // Otherwise, we're loaded: do the zoom!
+ zoomIn(from, shift);
+ }
+
+ return false;
+
+}
+
+// Zoom: Move an element in to endH endW, using zoomHost as a starting point.
+// "from" is an object reference to the href that spawned the zoom.
+
+function zoomIn(from, shift) {
+
+ zoomimg.src = from.getAttribute("href");
+
+ // Determine the zoom settings from where we came from, the element in the <a>.
+ // If there's no element in the <a>, or we can't get the width, make stuff up
+
+ if (from.childNodes[0].width) {
+ startW = from.childNodes[0].width;
+ startH = from.childNodes[0].height;
+ startPos = findElementPos(from.childNodes[0]);
+ } else {
+ startW = 50;
+ startH = 12;
+ startPos = findElementPos(from);
+ }
+
+ hostX = startPos[0];
+ hostY = startPos[1];
+
+ // Make up for a scrolled containing div.
+ // TODO: This HAS to move into findElementPos.
+
+ if (document.getElementById('scroller')) {
+ hostX = hostX - document.getElementById('scroller').scrollLeft;
+ }
+
+ // Determine the target zoom settings from the preloaded image object
+
+ endW = imgPreload.width;
+ endH = imgPreload.height;
+
+ // Start! But only if we're not zooming already!
+
+ if (zoomActive[theID] != true) {
+
+ // Clear everything out just in case something is already open
+
+ if (document.getElementById("ShadowBox")) {
+ document.getElementById("ShadowBox").style.visibility = "hidden";
+ } else if (! browserIsIE) {
+
+ // Wipe timer if shadow is fading in still
+ if (fadeActive["ZoomImage"]) {
+ clearInterval(fadeTimer["ZoomImage"]);
+ fadeActive["ZoomImage"] = false;
+ fadeTimer["ZoomImage"] = false;
+ }
+
+ document.getElementById("ZoomImage").style.webkitBoxShadow = shadowSettings + '0.0)';
+ }
+
+ document.getElementById("ZoomClose").style.visibility = "hidden";
+
+ // Setup the CAPTION, if existing. Hide it first, set the text.
+
+ if (includeCaption) {
+ document.getElementById(zoomCaptionDiv).style.visibility = "hidden";
+ if (from.getAttribute('title') && includeCaption) {
+ // Yes, there's a caption, set it up
+ document.getElementById(zoomCaption).innerHTML = from.getAttribute('title');
+ } else {
+ document.getElementById(zoomCaption).innerHTML = "";
+ }
+ }
+
+ // Store original position in an array for future zoomOut.
+
+ zoomOrigW[theID] = startW;
+ zoomOrigH[theID] = startH;
+ zoomOrigX[theID] = hostX;
+ zoomOrigY[theID] = hostY;
+
+ // Now set the starting dimensions
+
+ zoomimg.style.width = startW + 'px';
+ zoomimg.style.height = startH + 'px';
+ zoomdiv.style.left = hostX + 'px';
+ zoomdiv.style.top = hostY + 'px';
+
+ // Show the zooming image container, make it invisible
+
+ if (includeFade == 1) {
+ setOpacity(0, zoomID);
+ }
+ zoomdiv.style.visibility = "visible";
+
+ // If it's too big to fit in the window, shrink the width and height to fit (with ratio).
+
+ sizeRatio = endW / endH;
+ if (endW > myWidth - minBorder) {
+ endW = myWidth - minBorder;
+ endH = endW / sizeRatio;
+ }
+ if (endH > myHeight - minBorder) {
+ endH = myHeight - minBorder;
+ endW = endH * sizeRatio;
+ }
+
+ zoomChangeX = ((myWidth / 2) - (endW / 2) - hostX);
+ zoomChangeY = (((myHeight / 2) - (endH / 2) - hostY) + myScroll);
+ zoomChangeW = (endW - startW);
+ zoomChangeH = (endH - startH);
+
+ // Shift key?
+
+ if (shift) {
+ tempSteps = zoomSteps * 7;
+ } else {
+ tempSteps = zoomSteps;
+ }
+
+ // Setup Zoom
+
+ zoomCurrent = 0;
+
+ // Setup Fade with Zoom, If Requested
+
+ if (includeFade == 1) {
+ fadeCurrent = 0;
+ fadeAmount = (0 - 100) / tempSteps;
+ } else {
+ fadeAmount = 0;
+ }
+
+ // Do It!
+
+ zoomTimer[theID] = setInterval("zoomElement('"+zoomID+"', '"+theID+"', "+zoomCurrent+", "+startW+", "+zoomChangeW+", "+startH+", "+zoomChangeH+", "+hostX+", "+zoomChangeX+", "+hostY+", "+zoomChangeY+", "+tempSteps+", "+includeFade+", "+fadeAmount+", 'zoomDoneIn(zoomID)')", zoomTime);
+ zoomActive[theID] = true;
+ }
+}
+
+// Zoom it back out.
+
+function zoomOut(from, evt) {
+
+ // Get shift key status.
+ // IE events don't seem to get passed through the function, so grab it from the window.
+
+ if (getShift(evt)) {
+ tempSteps = zoomSteps * 7;
+ } else {
+ tempSteps = zoomSteps;
+ }
+
+ // Check to see if something is happening/open
+
+ if (zoomActive[theID] != true) {
+
+ // First, get rid of the shadow if necessary.
+
+ if (document.getElementById("ShadowBox")) {
+ document.getElementById("ShadowBox").style.visibility = "hidden";
+ } else if (! browserIsIE) {
+
+ // Wipe timer if shadow is fading in still
+ if (fadeActive["ZoomImage"]) {
+ clearInterval(fadeTimer["ZoomImage"]);
+ fadeActive["ZoomImage"] = false;
+ fadeTimer["ZoomImage"] = false;
+ }
+
+ document.getElementById("ZoomImage").style.webkitBoxShadow = shadowSettings + '0.0)';
+ }
+
+ // ..and the close box...
+
+ document.getElementById("ZoomClose").style.visibility = "hidden";
+
+ // ...and the caption if necessary!
+
+ if (includeCaption && document.getElementById(zoomCaption).innerHTML != "") {
+ // fadeElementSetup(zoomCaptionDiv, 100, 0, 5, 1);
+ document.getElementById(zoomCaptionDiv).style.visibility = "hidden";
+ }
+
+ // Now, figure out where we came from, to get back there
+
+ startX = parseInt(zoomdiv.style.left);
+ startY = parseInt(zoomdiv.style.top);
+ startW = zoomimg.width;
+ startH = zoomimg.height;
+ zoomChangeX = zoomOrigX[theID] - startX;
+ zoomChangeY = zoomOrigY[theID] - startY;
+ zoomChangeW = zoomOrigW[theID] - startW;
+ zoomChangeH = zoomOrigH[theID] - startH;
+
+ // Setup Zoom
+
+ zoomCurrent = 0;
+
+ // Setup Fade with Zoom, If Requested
+
+ if (includeFade == 1) {
+ fadeCurrent = 0;
+ fadeAmount = (100 - 0) / tempSteps;
+ } else {
+ fadeAmount = 0;
+ }
+
+ // Do It!
+
+ zoomTimer[theID] = setInterval("zoomElement('"+zoomID+"', '"+theID+"', "+zoomCurrent+", "+startW+", "+zoomChangeW+", "+startH+", "+zoomChangeH+", "+startX+", "+zoomChangeX+", "+startY+", "+zoomChangeY+", "+tempSteps+", "+includeFade+", "+fadeAmount+", 'zoomDone(zoomID, theID)')", zoomTime);
+ zoomActive[theID] = true;
+ }
+}
+
+// Finished Zooming In
+
+function zoomDoneIn(zoomdiv, theID) {
+
+ // Note that it's open
+
+ zoomOpen = true;
+ zoomdiv = document.getElementById(zoomdiv);
+
+ // Position the table shadow behind the zoomed in image, and display it
+
+ if (document.getElementById("ShadowBox")) {
+
+ setOpacity(0, "ShadowBox");
+ shadowdiv = document.getElementById("ShadowBox");
+
+ shadowLeft = parseInt(zoomdiv.style.left) - 13;
+ shadowTop = parseInt(zoomdiv.style.top) - 8;
+ shadowWidth = zoomdiv.offsetWidth + 26;
+ shadowHeight = zoomdiv.offsetHeight + 26;
+
+ shadowdiv.style.width = shadowWidth + 'px';
+ shadowdiv.style.height = shadowHeight + 'px';
+ shadowdiv.style.left = shadowLeft + 'px';
+ shadowdiv.style.top = shadowTop + 'px';
+
+ document.getElementById("ShadowBox").style.visibility = "visible";
+ fadeElementSetup("ShadowBox", 0, 100, 5);
+
+ } else if (! browserIsIE) {
+ // Or, do a fade of the modern shadow
+ fadeElementSetup("ZoomImage", 0, .8, 5, 0, "shadow");
+ }
+
+ // Position and display the CAPTION, if existing
+
+ if (includeCaption && document.getElementById(zoomCaption).innerHTML != "") {
+ // setOpacity(0, zoomCaptionDiv);
+ zoomcapd = document.getElementById(zoomCaptionDiv);
+ zoomcapd.style.top = parseInt(zoomdiv.style.top) + (zoomdiv.offsetHeight + 15) + 'px';
+ zoomcapd.style.left = (myWidth / 2) - (zoomcapd.offsetWidth / 2) + 'px';
+ zoomcapd.style.visibility = "visible";
+ // fadeElementSetup(zoomCaptionDiv, 0, 100, 5);
+ }
+
+ // Display Close Box (fade it if it's not IE)
+
+ if (!browserIsIE) setOpacity(0, "ZoomClose");
+ document.getElementById("ZoomClose").style.visibility = "visible";
+ if (!browserIsIE) fadeElementSetup("ZoomClose", 0, 100, 5);
+
+ // Get keypresses
+ document.onkeypress = getKey;
+
+}
+
+// Finished Zooming Out
+
+function zoomDone(zoomdiv, theID) {
+
+ // No longer open
+
+ zoomOpen = false;
+
+ // Clear stuff out, clean up
+
+ zoomOrigH[theID] = "";
+ zoomOrigW[theID] = "";
+ document.getElementById(zoomdiv).style.visibility = "hidden";
+ zoomActive[theID] == false;
+
+ // Stop getting keypresses
+
+ document.onkeypress = null;
+
+}
+
+// Actually zoom the element
+
+function zoomElement(zoomdiv, theID, zoomCurrent, zoomStartW, zoomChangeW, zoomStartH, zoomChangeH, zoomStartX, zoomChangeX, zoomStartY, zoomChangeY, zoomSteps, includeFade, fadeAmount, execWhenDone) {
+
+ // console.log("Zooming Step #"+zoomCurrent+ " of "+zoomSteps+" (zoom " + zoomStartW + "/" + zoomChangeW + ") (zoom " + zoomStartH + "/" + zoomChangeH + ") (zoom " + zoomStartX + "/" + zoomChangeX + ") (zoom " + zoomStartY + "/" + zoomChangeY + ") Fade: "+fadeAmount);
+
+ // Test if we're done, or if we continue
+
+ if (zoomCurrent == (zoomSteps + 1)) {
+ zoomActive[theID] = false;
+ clearInterval(zoomTimer[theID]);
+
+ if (execWhenDone != "") {
+ eval(execWhenDone);
+ }
+ } else {
+
+ // Do the Fade!
+
+ if (includeFade == 1) {
+ if (fadeAmount < 0) {
+ setOpacity(Math.abs(zoomCurrent * fadeAmount), zoomdiv);
+ } else {
+ setOpacity(100 - (zoomCurrent * fadeAmount), zoomdiv);
+ }
+ }
+
+ // Calculate this step's difference, and move it!
+
+ moveW = cubicInOut(zoomCurrent, zoomStartW, zoomChangeW, zoomSteps);
+ moveH = cubicInOut(zoomCurrent, zoomStartH, zoomChangeH, zoomSteps);
+ moveX = cubicInOut(zoomCurrent, zoomStartX, zoomChangeX, zoomSteps);
+ moveY = cubicInOut(zoomCurrent, zoomStartY, zoomChangeY, zoomSteps);
+
+ document.getElementById(zoomdiv).style.left = moveX + 'px';
+ document.getElementById(zoomdiv).style.top = moveY + 'px';
+ zoomimg.style.width = moveW + 'px';
+ zoomimg.style.height = moveH + 'px';
+
+ zoomCurrent++;
+
+ clearInterval(zoomTimer[theID]);
+ zoomTimer[theID] = setInterval("zoomElement('"+zoomdiv+"', '"+theID+"', "+zoomCurrent+", "+zoomStartW+", "+zoomChangeW+", "+zoomStartH+", "+zoomChangeH+", "+zoomStartX+", "+zoomChangeX+", "+zoomStartY+", "+zoomChangeY+", "+zoomSteps+", "+includeFade+", "+fadeAmount+", '"+execWhenDone+"')", zoomTime);
+ }
+}
+
+// Zoom Utility: Get Key Press when image is open, and act accordingly
+
+function getKey(evt) {
+ if (! evt) {
+ theKey = event.keyCode;
+ } else {
+ theKey = evt.keyCode;
+ }
+
+ if (theKey == 27) { // ESC
+ zoomOut(this, evt);
+ }
+}
+
+////////////////////////////
+//
+// FADE Functions
+//
+
+function fadeOut(elem) {
+ if (elem.id) {
+ fadeElementSetup(elem.id, 100, 0, 10);
+ }
+}
+
+function fadeIn(elem) {
+ if (elem.id) {
+ fadeElementSetup(elem.id, 0, 100, 10);
+ }
+}
+
+// Fade: Initialize the fade function
+
+var fadeActive = new Array();
+var fadeQueue = new Array();
+var fadeTimer = new Array();
+var fadeClose = new Array();
+var fadeMode = new Array();
+
+function fadeElementSetup(theID, fdStart, fdEnd, fdSteps, fdClose, fdMode) {
+
+ // alert("Fading: "+theID+" Steps: "+fdSteps+" Mode: "+fdMode);
+
+ if (fadeActive[theID] == true) {
+ // Already animating, queue up this command
+ fadeQueue[theID] = new Array(theID, fdStart, fdEnd, fdSteps);
+ } else {
+ fadeSteps = fdSteps;
+ fadeCurrent = 0;
+ fadeAmount = (fdStart - fdEnd) / fadeSteps;
+ fadeTimer[theID] = setInterval("fadeElement('"+theID+"', '"+fadeCurrent+"', '"+fadeAmount+"', '"+fadeSteps+"')", 15);
+ fadeActive[theID] = true;
+ fadeMode[theID] = fdMode;
+
+ if (fdClose == 1) {
+ fadeClose[theID] = true;
+ } else {
+ fadeClose[theID] = false;
+ }
+ }
+}
+
+// Fade: Do the fade. This function will call itself, modifying the parameters, so
+// many instances can run concurrently. Can fade using opacity, or fade using a box-shadow.
+
+function fadeElement(theID, fadeCurrent, fadeAmount, fadeSteps) {
+
+ if (fadeCurrent == fadeSteps) {
+
+ // We're done, so clear.
+
+ clearInterval(fadeTimer[theID]);
+ fadeActive[theID] = false;
+ fadeTimer[theID] = false;
+
+ // Should we close it once the fade is complete?
+
+ if (fadeClose[theID] == true) {
+ document.getElementById(theID).style.visibility = "hidden";
+ }
+
+ // Hang on.. did a command queue while we were working? If so, make it happen now
+
+ if (fadeQueue[theID] && fadeQueue[theID] != false) {
+ fadeElementSetup(fadeQueue[theID][0], fadeQueue[theID][1], fadeQueue[theID][2], fadeQueue[theID][3]);
+ fadeQueue[theID] = false;
+ }
+ } else {
+
+ fadeCurrent++;
+
+ // Now actually do the fade adjustment.
+
+ if (fadeMode[theID] == "shadow") {
+
+ // Do a special fade on the webkit-box-shadow of the object
+
+ if (fadeAmount < 0) {
+ document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (Math.abs(fadeCurrent * fadeAmount)) + ')';
+ } else {
+ document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (100 - (fadeCurrent * fadeAmount)) + ')';
+ }
+
+ } else {
+
+ // Set the opacity depending on if we're adding or subtracting (pos or neg)
+
+ if (fadeAmount < 0) {
+ setOpacity(Math.abs(fadeCurrent * fadeAmount), theID);
+ } else {
+ setOpacity(100 - (fadeCurrent * fadeAmount), theID);
+ }
+ }
+
+ // Keep going, and send myself the updated variables
+ clearInterval(fadeTimer[theID]);
+ fadeTimer[theID] = setInterval("fadeElement('"+theID+"', '"+fadeCurrent+"', '"+fadeAmount+"', '"+fadeSteps+"')", 15);
+ }
+}
+
+////////////////////////////
+//
+// UTILITY functions
+//
+
+// Utility: Set the opacity, compatible with a number of browsers. Value from 0 to 100.
+
+function setOpacity(opacity, theID) {
+
+ var object = document.getElementById(theID).style;
+
+ // If it's 100, set it to 99 for Firefox.
+
+ if (navigator.userAgent.indexOf("Firefox") != -1) {
+ if (opacity == 100) { opacity = 99.9999; } // This is majorly awkward
+ }
+
+ // Multi-browser opacity setting
+
+ object.filter = "alpha(opacity=" + opacity + ")"; // IE/Win
+ object.opacity = (opacity / 100); // Safari 1.2, Firefox+Mozilla
+
+}
+
+// Utility: Math functions for animation calucations - From http://www.robertpenner.com/easing/
+//
+// t = time, b = begin, c = change, d = duration
+// time = current frame, begin is fixed, change is basically finish - begin, duration is fixed (frames),
+
+function linear(t, b, c, d)
+{
+ return c*t/d + b;
+}
+
+function sineInOut(t, b, c, d)
+{
+ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+}
+
+function cubicIn(t, b, c, d) {
+ return c*(t/=d)*t*t + b;
+}
+
+function cubicOut(t, b, c, d) {
+ return c*((t=t/d-1)*t*t + 1) + b;
+}
+
+function cubicInOut(t, b, c, d)
+{
+ if ((t/=d/2) < 1) return c/2*t*t*t + b;
+ return c/2*((t-=2)*t*t + 2) + b;
+}
+
+function bounceOut(t, b, c, d)
+{
+ if ((t/=d) < (1/2.75)){
+ return c*(7.5625*t*t) + b;
+ } else if (t < (2/2.75)){
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+ } else if (t < (2.5/2.75)){
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+ } else {
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+ }
+}
+
+
+// Utility: Get the size of the window, and set myWidth and myHeight
+// Credit to quirksmode.org
+
+function getSize() {
+
+ // Window Size
+
+ if (self.innerHeight) { // Everyone but IE
+ myWidth = window.innerWidth;
+ myHeight = window.innerHeight;
+ myScroll = window.pageYOffset;
+ } else if (document.documentElement && document.documentElement.clientHeight) { // IE6 Strict
+ myWidth = document.documentElement.clientWidth;
+ myHeight = document.documentElement.clientHeight;
+ myScroll = document.documentElement.scrollTop;
+ } else if (document.body) { // Other IE, such as IE7
+ myWidth = document.body.clientWidth;
+ myHeight = document.body.clientHeight;
+ myScroll = document.body.scrollTop;
+ }
+
+ // Page size w/offscreen areas
+
+ if (window.innerHeight && window.scrollMaxY) {
+ myScrollWidth = document.body.scrollWidth;
+ myScrollHeight = window.innerHeight + window.scrollMaxY;
+ } else if (document.body.scrollHeight > document.body.offsetHeight) { // All but Explorer Mac
+ myScrollWidth = document.body.scrollWidth;
+ myScrollHeight = document.body.scrollHeight;
+ } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
+ myScrollWidth = document.body.offsetWidth;
+ myScrollHeight = document.body.offsetHeight;
+ }
+}
+
+// Utility: Get Shift Key Status
+// IE events don't seem to get passed through the function, so grab it from the window.
+
+function getShift(evt) {
+ var shift = false;
+ if (! evt && window.event) {
+ shift = window.event.shiftKey;
+ } else if (evt) {
+ shift = evt.shiftKey;
+ if (shift) evt.stopPropagation(); // Prevents Firefox from doing shifty things
+ }
+ return shift;
+}
+
+// Utility: Find the Y position of an element on a page. Return Y and X as an array
+
+function findElementPos(elemFind)
+{
+ var elemX = 0;
+ var elemY = 0;
+ do {
+ elemX += elemFind.offsetLeft;
+ elemY += elemFind.offsetTop;
+ } while ( elemFind = elemFind.offsetParent )
+
+ return Array(elemX, elemY);
+} \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/inc/js/FancyZoomHTML.js b/subsonic-site/src/main/webapp/inc/js/FancyZoomHTML.js
new file mode 100644
index 00000000..7644a9a8
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/js/FancyZoomHTML.js
@@ -0,0 +1,318 @@
+// FancyZoomHTML.js - v1.0
+// Used to draw necessary HTML elements for FancyZoom
+//
+// Copyright (c) 2008 Cabel Sasser / Panic Inc
+// All rights reserved.
+
+function insertZoomHTML() {
+
+ // All of this junk creates the three <div>'s used to hold the closebox, image, and zoom shadow.
+
+ var inBody = document.getElementsByTagName("body").item(0);
+
+ // WAIT SPINNER
+
+ var inSpinbox = document.createElement("div");
+ inSpinbox.setAttribute('id', 'ZoomSpin');
+ inSpinbox.style.position = 'absolute';
+ inSpinbox.style.left = '10px';
+ inSpinbox.style.top = '10px';
+ inSpinbox.style.visibility = 'hidden';
+ inSpinbox.style.zIndex = '525';
+ inBody.insertBefore(inSpinbox, inBody.firstChild);
+
+ var inSpinImage = document.createElement("img");
+ inSpinImage.setAttribute('id', 'SpinImage');
+ inSpinImage.setAttribute('src', zoomImagesURI+'zoom-spin-1.png');
+ inSpinbox.appendChild(inSpinImage);
+
+ // ZOOM IMAGE
+ //
+ // <div id="ZoomBox">
+ // <a href="javascript:zoomOut();"><img src="/images/spacer.gif" id="ZoomImage" border="0"></a> <!-- THE IMAGE -->
+ // <div id="ZoomClose">
+ // <a href="javascript:zoomOut();"><img src="/images/closebox.png" width="30" height="30" border="0"></a>
+ // </div>
+ // </div>
+
+ var inZoombox = document.createElement("div");
+ inZoombox.setAttribute('id', 'ZoomBox');
+
+ inZoombox.style.position = 'absolute';
+ inZoombox.style.left = '10px';
+ inZoombox.style.top = '10px';
+ inZoombox.style.visibility = 'hidden';
+ inZoombox.style.zIndex = '499';
+
+ inBody.insertBefore(inZoombox, inSpinbox.nextSibling);
+
+ var inImage1 = document.createElement("img");
+ inImage1.onclick = function (event) { zoomOut(this, event); return false; };
+ inImage1.setAttribute('src',zoomImagesURI+'spacer.gif');
+ inImage1.setAttribute('id','ZoomImage');
+ inImage1.setAttribute('border', '0');
+ // inImage1.setAttribute('onMouseOver', 'zoomMouseOver();')
+ // inImage1.setAttribute('onMouseOut', 'zoomMouseOut();')
+
+ // This must be set first, so we can later test it using webkitBoxShadow.
+ inImage1.setAttribute('style', '-webkit-box-shadow: '+shadowSettings+'0.0)');
+ inImage1.style.display = 'block';
+ inImage1.style.width = '10px';
+ inImage1.style.height = '10px';
+ inImage1.style.cursor = 'pointer'; // -webkit-zoom-out?
+ inZoombox.appendChild(inImage1);
+
+ var inClosebox = document.createElement("div");
+ inClosebox.setAttribute('id', 'ZoomClose');
+ inClosebox.style.position = 'absolute';
+
+ // In MSIE, we need to put the close box inside the image.
+ // It's 2008 and I'm having to do a browser detect? Sigh.
+ if (browserIsIE) {
+ inClosebox.style.left = '-1px';
+ inClosebox.style.top = '0px';
+ } else {
+ inClosebox.style.left = '-15px';
+ inClosebox.style.top = '-15px';
+ }
+
+ inClosebox.style.visibility = 'hidden';
+ inZoombox.appendChild(inClosebox);
+
+ var inImage2 = document.createElement("img");
+ inImage2.onclick = function (event) { zoomOut(this, event); return false; };
+ inImage2.setAttribute('src',zoomImagesURI+'closebox.png');
+ inImage2.setAttribute('width','30');
+ inImage2.setAttribute('height','30');
+ inImage2.setAttribute('border','0');
+ inImage2.style.cursor = 'pointer';
+ inClosebox.appendChild(inImage2);
+
+ // SHADOW
+ // Only draw the table-based shadow if the programatic webkitBoxShadow fails!
+ // Also, don't draw it if we're IE -- it wouldn't look quite right anyway.
+
+ if (! document.getElementById('ZoomImage').style.webkitBoxShadow && ! browserIsIE) {
+
+ // SHADOW BASE
+
+ var inFixedBox = document.createElement("div");
+ inFixedBox.setAttribute('id', 'ShadowBox');
+ inFixedBox.style.position = 'absolute';
+ inFixedBox.style.left = '50px';
+ inFixedBox.style.top = '50px';
+ inFixedBox.style.width = '100px';
+ inFixedBox.style.height = '100px';
+ inFixedBox.style.visibility = 'hidden';
+ inFixedBox.style.zIndex = '498';
+ inBody.insertBefore(inFixedBox, inZoombox.nextSibling);
+
+ // SHADOW
+ // Now, the shadow table. Skip if not compatible, or irrevelant with -box-shadow.
+
+ // <div id="ShadowBox"><table border="0" width="100%" height="100%" cellpadding="0" cellspacing="0"> X
+ // <tr height="25">
+ // <td width="27"><img src="/images/zoom-shadow1.png" width="27" height="25"></td>
+ // <td background="/images/zoom-shadow2.png">&nbsp;</td>
+ // <td width="27"><img src="/images/zoom-shadow3.png" width="27" height="25"></td>
+ // </tr>
+
+ var inShadowTable = document.createElement("table");
+ inShadowTable.setAttribute('border', '0');
+ inShadowTable.setAttribute('width', '100%');
+ inShadowTable.setAttribute('height', '100%');
+ inShadowTable.setAttribute('cellpadding', '0');
+ inShadowTable.setAttribute('cellspacing', '0');
+ inFixedBox.appendChild(inShadowTable);
+
+ var inShadowTbody = document.createElement("tbody"); // Needed for IE (for HTML4).
+ inShadowTable.appendChild(inShadowTbody);
+
+ var inRow1 = document.createElement("tr");
+ inRow1.style.height = '25px';
+ inShadowTbody.appendChild(inRow1);
+
+ var inCol1 = document.createElement("td");
+ inCol1.style.width = '27px';
+ inRow1.appendChild(inCol1);
+ var inShadowImg1 = document.createElement("img");
+ inShadowImg1.setAttribute('src', zoomImagesURI+'zoom-shadow1.png');
+ inShadowImg1.setAttribute('width', '27');
+ inShadowImg1.setAttribute('height', '25');
+ inShadowImg1.style.display = 'block';
+ inCol1.appendChild(inShadowImg1);
+
+ var inCol2 = document.createElement("td");
+ inCol2.setAttribute('background', zoomImagesURI+'zoom-shadow2.png');
+ inRow1.appendChild(inCol2);
+ // inCol2.innerHTML = '<img src=';
+ var inSpacer1 = document.createElement("img");
+ inSpacer1.setAttribute('src',zoomImagesURI+'spacer.gif');
+ inSpacer1.setAttribute('height', '1');
+ inSpacer1.setAttribute('width', '1');
+ inSpacer1.style.display = 'block';
+ inCol2.appendChild(inSpacer1);
+
+ var inCol3 = document.createElement("td");
+ inCol3.style.width = '27px';
+ inRow1.appendChild(inCol3);
+ var inShadowImg3 = document.createElement("img");
+ inShadowImg3.setAttribute('src', zoomImagesURI+'zoom-shadow3.png');
+ inShadowImg3.setAttribute('width', '27');
+ inShadowImg3.setAttribute('height', '25');
+ inShadowImg3.style.display = 'block';
+ inCol3.appendChild(inShadowImg3);
+
+ // <tr>
+ // <td background="/images/zoom-shadow4.png">&nbsp;</td>
+ // <td bgcolor="#ffffff">&nbsp;</td>
+ // <td background="/images/zoom-shadow5.png">&nbsp;</td>
+ // </tr>
+
+ inRow2 = document.createElement("tr");
+ inShadowTbody.appendChild(inRow2);
+
+ var inCol4 = document.createElement("td");
+ inCol4.setAttribute('background', zoomImagesURI+'zoom-shadow4.png');
+ inRow2.appendChild(inCol4);
+ // inCol4.innerHTML = '&nbsp;';
+ var inSpacer2 = document.createElement("img");
+ inSpacer2.setAttribute('src',zoomImagesURI+'spacer.gif');
+ inSpacer2.setAttribute('height', '1');
+ inSpacer2.setAttribute('width', '1');
+ inSpacer2.style.display = 'block';
+ inCol4.appendChild(inSpacer2);
+
+ var inCol5 = document.createElement("td");
+ inCol5.setAttribute('bgcolor', '#ffffff');
+ inRow2.appendChild(inCol5);
+ // inCol5.innerHTML = '&nbsp;';
+ var inSpacer3 = document.createElement("img");
+ inSpacer3.setAttribute('src',zoomImagesURI+'spacer.gif');
+ inSpacer3.setAttribute('height', '1');
+ inSpacer3.setAttribute('width', '1');
+ inSpacer3.style.display = 'block';
+ inCol5.appendChild(inSpacer3);
+
+ var inCol6 = document.createElement("td");
+ inCol6.setAttribute('background', zoomImagesURI+'zoom-shadow5.png');
+ inRow2.appendChild(inCol6);
+ // inCol6.innerHTML = '&nbsp;';
+ var inSpacer4 = document.createElement("img");
+ inSpacer4.setAttribute('src',zoomImagesURI+'spacer.gif');
+ inSpacer4.setAttribute('height', '1');
+ inSpacer4.setAttribute('width', '1');
+ inSpacer4.style.display = 'block';
+ inCol6.appendChild(inSpacer4);
+
+ // <tr height="26">
+ // <td width="27"><img src="/images/zoom-shadow6.png" width="27" height="26"</td>
+ // <td background="/images/zoom-shadow7.png">&nbsp;</td>
+ // <td width="27"><img src="/images/zoom-shadow8.png" width="27" height="26"></td>
+ // </tr>
+ // </table>
+
+ var inRow3 = document.createElement("tr");
+ inRow3.style.height = '26px';
+ inShadowTbody.appendChild(inRow3);
+
+ var inCol7 = document.createElement("td");
+ inCol7.style.width = '27px';
+ inRow3.appendChild(inCol7);
+ var inShadowImg7 = document.createElement("img");
+ inShadowImg7.setAttribute('src', zoomImagesURI+'zoom-shadow6.png');
+ inShadowImg7.setAttribute('width', '27');
+ inShadowImg7.setAttribute('height', '26');
+ inShadowImg7.style.display = 'block';
+ inCol7.appendChild(inShadowImg7);
+
+ var inCol8 = document.createElement("td");
+ inCol8.setAttribute('background', zoomImagesURI+'zoom-shadow7.png');
+ inRow3.appendChild(inCol8);
+ // inCol8.innerHTML = '&nbsp;';
+ var inSpacer5 = document.createElement("img");
+ inSpacer5.setAttribute('src',zoomImagesURI+'spacer.gif');
+ inSpacer5.setAttribute('height', '1');
+ inSpacer5.setAttribute('width', '1');
+ inSpacer5.style.display = 'block';
+ inCol8.appendChild(inSpacer5);
+
+ var inCol9 = document.createElement("td");
+ inCol9.style.width = '27px';
+ inRow3.appendChild(inCol9);
+ var inShadowImg9 = document.createElement("img");
+ inShadowImg9.setAttribute('src', zoomImagesURI+'zoom-shadow8.png');
+ inShadowImg9.setAttribute('width', '27');
+ inShadowImg9.setAttribute('height', '26');
+ inShadowImg9.style.display = 'block';
+ inCol9.appendChild(inShadowImg9);
+ }
+
+ if (includeCaption) {
+
+ // CAPTION
+ //
+ // <div id="ZoomCapDiv" style="margin-left: 13px; margin-right: 13px;">
+ // <table border="1" cellpadding="0" cellspacing="0">
+ // <tr height="26">
+ // <td><img src="zoom-caption-l.png" width="13" height="26"></td>
+ // <td rowspan="3" background="zoom-caption-fill.png"><div id="ZoomCaption"></div></td>
+ // <td><img src="zoom-caption-r.png" width="13" height="26"></td>
+ // </tr>
+ // </table>
+ // </div>
+
+ var inCapDiv = document.createElement("div");
+ inCapDiv.setAttribute('id', 'ZoomCapDiv');
+ inCapDiv.style.position = 'absolute';
+ inCapDiv.style.visibility = 'hidden';
+ inCapDiv.style.marginLeft = 'auto';
+ inCapDiv.style.marginRight = 'auto';
+ inCapDiv.style.zIndex = '501';
+
+ inBody.insertBefore(inCapDiv, inZoombox.nextSibling);
+
+ var inCapTable = document.createElement("table");
+ inCapTable.setAttribute('border', '0');
+ inCapTable.setAttribute('cellPadding', '0'); // Wow. These honestly need to
+ inCapTable.setAttribute('cellSpacing', '0'); // be intercapped to work in IE. WTF?
+ inCapDiv.appendChild(inCapTable);
+
+ var inTbody = document.createElement("tbody"); // Needed for IE (for HTML4).
+ inCapTable.appendChild(inTbody);
+
+ var inCapRow1 = document.createElement("tr");
+ inTbody.appendChild(inCapRow1);
+
+ var inCapCol1 = document.createElement("td");
+ inCapCol1.setAttribute('align', 'right');
+ inCapRow1.appendChild(inCapCol1);
+ var inCapImg1 = document.createElement("img");
+ inCapImg1.setAttribute('src', zoomImagesURI+'zoom-caption-l.png');
+ inCapImg1.setAttribute('width', '13');
+ inCapImg1.setAttribute('height', '26');
+ inCapImg1.style.display = 'block';
+ inCapCol1.appendChild(inCapImg1);
+
+ var inCapCol2 = document.createElement("td");
+ inCapCol2.setAttribute('background', zoomImagesURI+'zoom-caption-fill.png');
+ inCapCol2.setAttribute('id', 'ZoomCaption');
+ inCapCol2.setAttribute('valign', 'middle');
+ inCapCol2.style.fontSize = '14px';
+ inCapCol2.style.fontFamily = 'Helvetica';
+ inCapCol2.style.fontWeight = 'bold';
+ inCapCol2.style.color = '#ffffff';
+ inCapCol2.style.textShadow = '0px 2px 4px #000000';
+ inCapCol2.style.whiteSpace = 'nowrap';
+ inCapRow1.appendChild(inCapCol2);
+
+ var inCapCol3 = document.createElement("td");
+ inCapRow1.appendChild(inCapCol3);
+ var inCapImg2 = document.createElement("img");
+ inCapImg2.setAttribute('src', zoomImagesURI+'zoom-caption-r.png');
+ inCapImg2.setAttribute('width', '13');
+ inCapImg2.setAttribute('height', '26');
+ inCapImg2.style.display = 'block';
+ inCapCol3.appendChild(inCapImg2);
+ }
+} \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/inc/js/jquery-1.4.4.min.js b/subsonic-site/src/main/webapp/inc/js/jquery-1.4.4.min.js
new file mode 100644
index 00000000..8f3ca2e2
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/js/jquery-1.4.4.min.js
@@ -0,0 +1,167 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
+b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
+this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
+"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
+!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
+getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
+script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
+!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
+false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
+A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
+b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
+c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
+c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
+encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
+[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
+e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
+if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
+3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
+d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
+d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
+"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
+1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
+d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
+Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
+var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
+this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
+this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
+c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
+b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
+h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
+for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
+parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
+height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
+f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
+"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
+e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
+c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
+c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
+b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
diff --git a/subsonic-site/src/main/webapp/inc/video/subsonic-medium.jpg b/subsonic-site/src/main/webapp/inc/video/subsonic-medium.jpg
new file mode 100644
index 00000000..799ba92a
--- /dev/null
+++ b/subsonic-site/src/main/webapp/inc/video/subsonic-medium.jpg
Binary files differ
diff --git a/subsonic-site/src/main/webapp/index.html b/subsonic-site/src/main/webapp/index.html
new file mode 100644
index 00000000..372f74d1
--- /dev/null
+++ b/subsonic-site/src/main/webapp/index.html
@@ -0,0 +1,10 @@
+<html>
+
+<head>
+ <meta http-equiv="refresh" content="0;URL=index.jsp">
+</head>
+
+<body>
+</body>
+
+</html> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/index.jsp b/subsonic-site/src/main/webapp/index.jsp
new file mode 100644
index 00000000..94ffd395
--- /dev/null
+++ b/subsonic-site/src/main/webapp/index.jsp
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "home"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+<%@ include file="menu.jsp" %>
+<%@ include file="banner.jsp" %>
+
+<div id="content">
+<div id="main-col">
+ <h1>Welcome to Subsonic!</h1>
+
+ <div class="floatcontainer margin10-t margin10-b">
+ <ul class="stars column-left">
+ <li>Enjoy your music and movies no matter where you are. Share with family and friends.</li>
+ <li>Browse and manage your media collection with the user-friendly web interface.</li>
+ <li>Stream music to <a href="apps.jsp">Android</a>, <a href="apps.jsp">iPhone</a> and <a href="apps.jsp">Windows Phone</a>.</li>
+ <li>Subsonic <a href="apps.jsp">apps</a> available for Roku, BlackBerry Playbook and many more.</li>
+ </ul>
+ <ul class="stars column-right">
+ <li>Convert and stream lossless music on the fly.</li>
+ <li>Manage 100,000+ files in your music collection without hassle.</li>
+ <li>Download and listen to Podcasts.</li>
+ <li>Get cover art, lyrics, reviews and other album info from Google, <a href="http://www.chartlyrics.com/" target="_blank">Chartlyrics</a>,
+ allmusic and Wikipedia.</li>
+ <li><a href="features.jsp">Plus much more...</a></li>
+ </ul>
+ </div>
+
+ <div class="featureitem">
+ <div class="heading">What is Subsonic?</div>
+ <div class="content">
+ <div class="wide-content">
+
+ <p>
+ Subsonic is a free, web-based media streamer, providing ubiquitous access to your music.
+ Use it to share your music with friends, or to listen to your own music while at work. You can
+ stream to multiple players simultaneously, for instance to one player in your kitchen and another in
+ your living room.
+ </p>
+
+ <a href="inc/img/screenshots/screen01.png"><img src="inc/img/screenshots/thumb01.png" alt="" class="img-right"/></a>
+
+ <p>
+ Subsonic is designed to handle very large music collections (hundreds of gigabytes).
+ Although optimized for MP3 streaming, it works for any audio or video format that can stream over HTTP,
+ for instance AAC and OGG. By using <a href="transcoding.jsp">transcoder plug-ins</a>, Subsonic supports
+ on-the-fly conversion and streaming of virtually any audio format, including WMA, FLAC, APE, Musepack,
+ WavPack and Shorten.
+ </p>
+
+ <p>
+ If you have constrained bandwidth, you may set an upper limit for the bitrate of the music streams.
+ Subsonic will then automatically resample the music to a suitable bitrate.
+ </p>
+
+ <p>
+ In addition to being a streaming media server, Subsonic works very well as a local jukebox. The
+ intuitive web interface, as well as search and index facilities, are optimized for efficient browsing through large
+ media libraries. Subsonic also comes with an integrated Podcast receiver, with many of the same features
+ as you find in iTunes.
+ </p>
+
+ <p>
+ Based on Java technology, Subsonic runs on most platforms, including Windows, Mac, Linux and Unix variants.
+ </p>
+
+ <a href="http://www.gnu.org/copyleft/gpl.html"><img src="inc/img/gpl.png" alt="GPL" class="img-left"/></a>
+
+ <p>
+ Subsonic is open-source software licensed under <a rel="license" href="http://www.gnu.org/copyleft/gpl.html">GPL</a>.
+ </p>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="featureitem">
+ <div class="heading">About</div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ <img src="inc/img/sindre.jpeg" alt="Sindre Mehus" hspace="10" vspace="10" style="float:right"/>
+ Subsonic is developed by <a href="mailto:sindre@activeobjects.no">Sindre Mehus</a>.
+ I live in Oslo, Norway and work as a Java software consultant.
+ </p>
+ <p>
+ If you have any questions, comments or suggestions for improvements, please visit the <a href="forum.jsp">Subsonic Forum</a>.
+ </p>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <%@ include file="download-subsonic.jsp" %>
+ <%@ include file="quotes.jsp" %>
+ <%@ include file="donate.jsp" %>
+ <div class="bottomspace">
+ <a href="http://sourceforge.net/projects/subsonic/"><img src="http://sourceforge.net/sflogo.php?group_id=126265&type=4" alt="SourceForge.net" class="img-center"/></a>
+ </div>
+</div>
+<div class="clear">
+</div>
+</div>
+<hr/>
+<%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/installation.jsp b/subsonic-site/src/main/webapp/installation.jsp
new file mode 100644
index 00000000..9a477dc1
--- /dev/null
+++ b/subsonic-site/src/main/webapp/installation.jsp
@@ -0,0 +1,278 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "installation"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"></a>
+
+<div id="container">
+<%@ include file="menu.jsp" %>
+
+<div id="content">
+<div id="main-col">
+<h1 class="bottomspace">Installing Subsonic</h1>
+<p>
+ Subsonic features several flexible installation options. Select the one which suits you best:
+</p>
+
+<ul class="list">
+ <li><a href="#windows">Windows installation</a></li>
+ <li><a href="#mac">Mac installation</a></li>
+ <li><a href="#debian">Debian/Ubuntu installation</a></li>
+ <li><a href="#rpm">Red Hat/Fedora installation</a></li>
+ <li><a href="#standalone">Stand-alone installation</a></li>
+ <li><a href="#war">WAR installation</a></li>
+</ul>
+
+<a href="inc/img/change-password.png"><img src="inc/img/change-password-small.png" alt="Change password" class="img-right"/></a>
+<p class="bottomspace"><b>Important!</b>
+ Immediately after installing Subsonic you should change the admin password to secure the server.
+ Point your browser to the Subsonic web page (see URL below), and log in with username <code>admin</code> and password
+ <code>admin</code>. Go to <code>Settings &gt; Users</code> to change password and create new users.
+</p>
+
+<div class="featureitem">
+ <a name="windows"></a>
+ <div class="heading"><img src="inc/img/download-windows.png" alt="" height="16" width="16"/> Windows installation <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ On Windows, the easiest way to install Subsonic is using the provided Windows Installer: <code>subsonic-x.x-setup.exe</code>.
+ </p>
+ <a href="inc/img/windows-installer.png"><img class="img-right" src="inc/img/windows-installer-small.png" alt="Windows Installer"/></a>
+ <p>
+ It installs Subsonic as a service, available in <code>Control Panel &gt; Administrative Tools &gt; Services</code>, that is started automatically when you log on to Windows.
+ </p>
+ <p>
+ It also creates links in the Start Menu: <code>Start &gt; All Programs &gt; Subsonic</code>. From this menu you can start/stop the Subsonic service, open the Subsonic web page, or
+ change basic settings such as which port number Subsonic should use. You can also click on the little yellow submarine tray icon.
+ </p>
+ <p>
+ If you're upgrading an existing Subsonic installation, you don't have to uninstall the old version first. In any case, the existing Subsonic settings are preserved.
+ </p>
+ <p>
+ After installing and starting Subsonic, open the Subsonic web page on <a href="http://localhost">http://localhost</a>.
+ </p>
+ </div>
+ </div>
+</div>
+
+<div class="featureitem">
+ <a name="mac"></a>
+ <div class="heading"><img src="inc/img/download-mac.png" alt="" height="16" width="16"/> Mac installation <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <a href="inc/img/mac-installer.png"><img class="img-right" src="inc/img/mac-installer-small.png" alt="Mac Installer"/></a>
+ <p>
+ Download the installation package and run it. This installs Subsonic.app in Applications. Start it by opening Applications and
+ click the Subsonic icon. A small headset icon will appear in the menu bar. If you want Subsonic to start automatically when you log in,
+ open <b>System Preferences &gt; Accounts</b> and add Subsonic to the list of <b>Login Items</b>.
+ </p>
+ <p>
+ After installing and starting Subsonic, open the Subsonic web page on <a href="http://localhost:4040">http://localhost:4040</a>.
+ </p>
+ <p><b>Advanced configuration</b></p>
+ <p>
+ To change the port number, Java memory settings or other startup parameters, edit <code style="white-space:nowrap;">/Applications/Subsonic.app/Contents/Info.plist</code>.
+ </p>
+ <p><b>Troubleshooting</b></p>
+ <p>
+ If Subsonic doesn't start properly you can troubleshoot it by starting it from the command line:
+ <code style="white-space:nowrap;" >/Applications/Subsonic.app/Contents/MacOS/JavaApplicationStub</code>.
+ </p>
+ <p>
+ Also check the logs in <code style="white-space:nowrap;">/Library/Application Support/Subsonic</code>.
+ </p>
+
+ </div>
+ </div>
+</div>
+
+<div class="featureitem">
+ <a name="debian"></a>
+ <div class="heading"><img src="inc/img/download-ubuntu.png" alt="" height="16" width="16"/> Debian/Ubuntu installation <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ This installation option applies to Debian Linux, including Ubuntu.
+ </p>
+ <ul>
+ <li>First, install Java: <code>sudo apt-get install openjdk-6-jre</code></li>
+ <li><a href="download.jsp">Download</a> the Subsonic .deb package and install it: <code>sudo dpkg -i subsonic-x.x.deb</code></li>
+ </ul>
+ <p>
+ Notice that the installer configures your system to start Subsonic automatically when booting.
+ After installing, open the Subsonic web page on <a href="http://localhost:4040">http://localhost:4040</a>.
+ </p>
+
+ <p><b>Change user</b></p>
+ <p>
+ By default the Subsonic process is run as the root user. To improve security it is strongly advised that you run it as a
+ dedicated user with less powerful privileges. You can specify this user by setting the SUBSONIC_USER variable in
+ <code style="white-space:nowrap;">/etc/default/subsonic</code>.
+ </p>
+ <p>
+ Note that non-root users are by default not allowed to use ports below 1024. Also make sure to grant the user write permissions in
+ the music directories, otherwise changing album art and tags will fail.
+ </p>
+
+ <p><b>Advanced configuration</b></p>
+ <p>
+ To change the port number, Java memory settings or other startup parameters, edit the SUBSONIC_ARGS variable in
+ <code style="white-space:nowrap;">/etc/default/subsonic</code>. To restart Subsonic, do
+ <code style="white-space:nowrap;">sudo service subsonic restart</code>
+ </p>
+
+ <p><b>Troubleshooting</b></p>
+ <p>
+ Check the logs in <code style="white-space:nowrap;">/var/subsonic</code>.
+ </p>
+
+ </div>
+ </div>
+</div>
+
+<div class="featureitem">
+ <a name="rpm"></a>
+ <div class="heading"><img src="inc/img/download-fedora.png" alt="" height="16" width="16"/> Red Hat/Fedora installation <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p>
+ This installation option applies to Red Hat Linux, including Fedora.
+ </p>
+ <ul>
+ <li>First, install Java: <code>sudo yum install java-1.6.0-openjdk</code></li>
+ <li><a href="download.jsp">Download</a> the Subsonic .rpm installation package and install it: <code style="white-space:nowrap;">sudo yum install --nogpgcheck subsonic-x.x.rpm</code></li>
+ <li>If nothing happens, try to remove the old version first (all settings will be retained): <code style="white-space:nowrap;">sudo yum remove subsonic</code></li>
+ </ul>
+ <p>
+ Notice that the installer configures your system to start Subsonic automatically when booting.
+ After installing, open the Subsonic web page on <a href="http://localhost:4040">http://localhost:4040</a>.
+ </p>
+
+ <p><b>Change user</b></p>
+ <p>
+ By default the Subsonic process is run as the root user. To improve security it is strongly advised that you run it as a
+ dedicated user with less powerful privileges. You can specify this user by setting the SUBSONIC_USER variable in
+ <code style="white-space:nowrap;">/etc/sysconfig/subsonic</code>.
+ </p>
+ <p>
+ Note that non-root users are by default not allowed to use ports below 1024. Also make sure to grant the user write permissions in
+ the music directories, otherwise changing album art and tags will fail.
+ </p>
+
+ <p><b>Advanced configuration</b></p>
+ <p>
+ To change the port number, Java memory settings or other startup parameters, edit the SUBSONIC_ARGS variable in
+ <code style="white-space:nowrap;">/etc/sysconfig/subsonic</code>. To restart Subsonic, do
+ <code style="white-space:nowrap;">sudo service subsonic restart</code>
+ </p>
+
+ <p><b>Troubleshooting</b></p>
+ <p>
+ Check the logs in <code style="white-space:nowrap;">/var/subsonic</code>.
+ </p>
+
+ </div>
+ </div>
+</div>
+
+<div class="featureitem">
+ <a name="standalone"></a>
+ <div class="heading">Stand-alone installation <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p><b>Requirements: </b>Sun Java 5 or later (<a href="http://www.java.com">Download</a>)</p>
+ <p>
+ This is Subsonic with an embedded Jetty server, and can be installed on any Windows, Linux, Unix, FreeNAS, unRAID etc operating system.
+ </p>
+ <ul>
+ <li>Unpack <code>subsonic-x.x-standalone.tar.gz</code> to <code>SUBSONIC_HOME/standalone</code>.
+ <code>SUBSONIC_HOME</code> is typically <code>c:\subsonic</code> on Windows, and <code>/var/subsonic</code> on Unix-based operating systems.</li>
+ <li>Optionally configure the startup script <code>SUBSONIC_HOME/standalone/subsonic.sh</code></li>
+ <li>Execute the startup script. (Typically you will configure your operating system to execute the script automatically at start-up.)</li>
+ <li>Open the Subsonic web page. The default address is <a href="http://localhost:4040">http://localhost:4040</a>.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+
+<div class="featureitem">
+ <a name="war"></a>
+
+ <div class="heading">WAR installation <a href="#top" class="backtotop" title="Top"><img src="inc/img/top.gif" alt="" height="16" width="16"/></a></div>
+ <div class="content">
+ <div class="wide-content">
+ <p><b>Requirements: </b>Java 5 or later (<a href="http://www.java.com">Download</a>). A servlet container supporting Servlet 2.4 and JSP 2.0.</p>
+
+ <p>
+ Use this option if you want to deploy Subsonic in an external server, such as Tomcat, Jetty, GlassFish or Geronimo. Subsonic comes
+ packaged as a standard Java web application, <code>subsonic.war</code>, which can be easily deployed in any compatible servlet container.
+ The most commonly used server is Tomcat, and the rest of this section describes how to install or upgrade Subsonic on a Tomcat server.
+ (Please note that Subsonic currently doesn't work with Tomcat&nbsp;7.)
+ </p>
+
+ <ul>
+ <li>Stop Tomcat if it's running.</li>
+ <li>Remove these files and directories if they exist:
+ <ul>
+ <li><code>TOMCAT_HOME/webapps/subsonic.war</code></li>
+ <li><code>TOMCAT_HOME/webapps/subsonic</code></li>
+ <li><code>TOMCAT_HOME/work</code></li>
+ </ul>
+ </li>
+ <li>Copy the file <code>subsonic.war</code> to <code>TOMCAT_HOME/webapps</code>.</li>
+ <li>Start Tomcat.</li>
+ <li>Point your web browser to <a href="http://localhost/subsonic">http://localhost/subsonic</a> (or
+ <a href="http://localhost:8080/subsonic">http://localhost:8080/subsonic</a> if you installed Tomcat on port 8080.)</li>
+ </ul>
+
+ <p><b>Notes</b></p>
+ <ul>
+ <li> If you installed Tomcat as a Windows Service, you can start and stop it from the service manager: <code>Control Panel &gt; Administrative Tools &gt; Services</code>.</li>
+ <li><code>TOMCAT_HOME</code> refers to the directory in which you installed Tomcat. On Windows this is normally <code>C:\Program Files\Apache Software Foundation\Tomcat 5.5</code></li>
+ <li>On Linux, Subsonic keeps its files in <code>/var/subsonic</code>. Depending on your configuration, Tomcat may not be permitted to create this directory, in which case
+ you have to create it manually: <code>mkdir /var/subsonic; chown tomcat:tomcat /var/subsonic</code></li>
+ </ul>
+
+ <p><b>Troubleshooting</b></p>
+ <p>
+ If you experience any problems, please make sure you follow the installation instructions above. Here's a list of suggestions of what to do if it still doesn't work:
+ </p>
+ <ul>
+ <li>Restart Tomcat.</li>
+ <li>Reinstall Subsonic.</li>
+ <li>Upgrade to the latest Tomcat version (at least if you're using Tomcat 5.0 or earlier).</li>
+ <li>Look for errors in the Subsonic log, <code>c:\subsonic\subsonic.log</code> or <code>/var/subsonic/subsonic.log</code>.</li>
+ <li>Look for errors in the Tomcat logs, <code>TOMCAT_HOME/logs</code>.</li>
+ <li>Post a message to the <a href="forum.jsp">Subsonic forum</a>. Please let us know what Subsonic version, Tomcat version and
+ operating system you're using. Also, please give a detailed description of the problem. This way, we'll be able to help you faster.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+
+</div>
+
+<div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <%@ include file="tutorial.jsp" %>
+ <%@ include file="donate.jsp" %>
+ <%@ include file="translate-subsonic.jsp" %>
+
+</div>
+
+<div class="clear">
+</div>
+</div>
+<hr/>
+<%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/libraries.jsp b/subsonic-site/src/main/webapp/libraries.jsp
new file mode 100644
index 00000000..b0991114
--- /dev/null
+++ b/subsonic-site/src/main/webapp/libraries.jsp
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "libraries"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+ <%@ include file="menu.jsp" %>
+
+ <div id="content">
+ <div id="main-col">
+ <h1>Third-party libraries</h1>
+
+ <p>Subsonic uses the following licensed third-party software libraries:</p>
+ <ul class="list">
+ <li>Spring Framework &ndash; <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a></li>
+ <li>Acegi Security &ndash; <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a></li>
+ <li>cglib &ndash; <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a></li>
+ <li>Apache Commons &ndash; <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a></li>
+ <li>HSQL &ndash; <a href="http://hsqldb.org/web/hsqlLicense.html">HSQL License</a></li>
+ <li>Radeox &ndash; <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a></li>
+ <li>Log4j &ndash; <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a></li>
+ <li>DWR &ndash; <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a></li>
+ <li>Jaudiotagger &ndash; <a href="http://www.gnu.org/copyleft/lesser.txt">LGPL</a></li>
+ <li>JFreeChart &ndash; <a href="http://www.gnu.org/copyleft/lesser.txt">LGPL</a></li>
+ <li>JDOM &ndash; <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a></li>
+ <li>Ehcache &ndash; <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a></li>
+ <li>JLayer &ndash; <a href="http://www.gnu.org/copyleft/lesser.txt">LGPL</a></li>
+ <li>Jetty &ndash; <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a></li>
+ <li>JGoodies &ndash; <a href="http://www.opensource.org/licenses/bsd-license.php">BSD</a></li>
+ </ul>
+
+ </div>
+
+ <div class="clear">
+ </div>
+ </div>
+ <hr/>
+ <%@ include file="footer.jsp" %>
+</div>
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/menu.jsp b/subsonic-site/src/main/webapp/menu.jsp
new file mode 100644
index 00000000..b438c7ce
--- /dev/null
+++ b/subsonic-site/src/main/webapp/menu.jsp
@@ -0,0 +1,32 @@
+<div id="logo"><a href="index.jsp"><img src="inc/img/subsonic.png" alt="Subsonic"/></a></div>
+
+<div class="hide">
+</div>
+
+<div id="search">
+ <table><tr>
+ <form method="post" action="search.jsp" name="searchForm">
+ <td><input type="text" name="query" id="query" size="18" value="Search" onclick="document.searchForm.query.select();"/></td>
+ <td><a href="javascript:document.searchForm.submit()"><img src="inc/img/search.png" alt="Search" title="Search"/></a></td>
+ </form>
+ </tr></table>
+</div>
+
+<hr/>
+<div id="nav">
+ <ul>
+ <li id="menu-home" ><a href="index.jsp" class="<%=current.equals("home") ? "open" : ""%>"><span>Home</span></a></li>
+ <li><a href="download.jsp" class="<%=current.equals("download") ? "open" : ""%>"><span>Download</span></a></li>
+ <li><a href="hosting.jsp" class="<%=current.equals("hosting") ? "open" : ""%>"><span>Hosting</span></a></li>
+ <li><a href="documentation.jsp" class="<%=current.equals("documentation") ? "open" : ""%>"><span>Documentation</span></a></li>
+ <li><a href="features.jsp" class="<%=current.equals("features") ? "open" : ""%>"><span>Features</span></a></li>
+ <li><a href="apps.jsp" class="<%=current.equals("apps") ? "open" : ""%>"><span>Apps</span></a></li>
+ <li><a href="screenshots.jsp" class="<%=current.equals("screenshots") ? "open" : ""%>"><span>Screenshots</span></a></li>
+ <li><a href="demo.jsp" class="<%=current.equals("demo") ? "open" : ""%>"><span>Demo</span></a></li>
+ <li><a href="changelog.jsp" class="<%=current.equals("changelog") ? "open" : ""%>"><span>Change Log</span></a></li>
+ <li><a href="forum.jsp" class="<%=current.equals("forum") ? "open" : ""%>"><span>Forum</span></a></li>
+ <li><a href="api.jsp" class="<%=current.equals("api") ? "open" : ""%>"><span>API</span></a></li>
+ </ul>
+</div>
+<hr/>
+
diff --git a/subsonic-site/src/main/webapp/merchandise.jsp b/subsonic-site/src/main/webapp/merchandise.jsp
new file mode 100644
index 00000000..c650c1d3
--- /dev/null
+++ b/subsonic-site/src/main/webapp/merchandise.jsp
@@ -0,0 +1,7 @@
+<div class="sidebox">
+ <h2>Merchandise</h2>
+ <p>
+ Show your support for Subsonic! Buy t-shirts and other cool stuff in the <a href="http://www.cafepress.com/subsonic_shop"><b>Subsonic Shop</b></a>!
+ </p>
+ <a href="http://www.cafepress.com/subsonic_shop"><img src="inc/img/merchandise.png" alt="Shop" class="img-center"/></a>
+</div>
diff --git a/subsonic-site/src/main/webapp/paypal-landing.jsp b/subsonic-site/src/main/webapp/paypal-landing.jsp
new file mode 100644
index 00000000..9f91cbb7
--- /dev/null
+++ b/subsonic-site/src/main/webapp/paypal-landing.jsp
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Subsonic &raquo; Free Music Streamer</title>
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/reset/reset.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/fonts/fonts.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/grid/grid.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/base/base.css">
+ <%@ include file="tracking.jsp" %>
+</head>
+<body style="padding-left:5em; padding-top:1em; width:42em">
+
+<h1>Thank you!</h1>
+
+<p>
+ Thanks for supporting Subsonic - your license key will be emailed to you shortly.
+</p>
+
+<p>
+ If you haven't received the email within an hour, <b>remember to check your spam folder</b>. Feel free to
+ <a href="mailto:sindre@activeobjects.no">take contact</a> if you have any questions or issues
+ regarding the payment or the Subsonic license key.
+</p>
+
+<p>
+ To install the license, click the "Donate" link in the top right corner of the Subsonic web interface
+ (<a href="getting-started.jsp#3">more info</a>).
+</p>
+
+<p>
+ For more information, please visit <a href="http://subsonic.org/">subsonic.org</a>
+</p>
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/quotes.jsp b/subsonic-site/src/main/webapp/quotes.jsp
new file mode 100644
index 00000000..8ac97fb3
--- /dev/null
+++ b/subsonic-site/src/main/webapp/quotes.jsp
@@ -0,0 +1,55 @@
+<script type="text/javascript">
+ var quoteIndex = 0;
+
+ var quotes = new Array();
+ var i = 0;
+ quotes[i++] = "Please don't ever stop development on this project! Subsonic 4 life!";
+ quotes[i++] = "I've used many media servers and this is by far the best.";
+ quotes[i++] = "It's the best streaming app I've ever seen! And I've tried them all.";
+ quotes[i++] = "You release often and listen to user feedback. Awesome!";
+ quotes[i++] = "Just set up subsonic - easy to install and working great. The features, the performance, everything is just excellent!";
+ quotes[i++] = "I am extremely impressed with the stability of the program.";
+ quotes[i++] = "I just switched from Jinzora and I'm really impressed about Subsonic. The performance is great.";
+ quotes[i++] = "I just installed Subsonic and immediately forgot about all previous php-based jukeboxes (including my own...)";
+ quotes[i++] = "Subsonic is beautiful in simplicity of the end user interface. I had no issues setting it up and the guide was brilliant.";
+ quotes[i++] = "One word describes Subsonic: AWESOME!";
+ quotes[i++] = "Every release is consistently better and I love the way you take feedback on board and act on it. Long live Subsonic!";
+
+ var authors = new Array();
+ i = 0;
+ authors[i++] = "cup0spam";
+ authors[i++] = "ClemsonJeeper";
+ authors[i++] = "Eloquence";
+ authors[i++] = "Eloquence";
+ authors[i++] = "cwilliams";
+ authors[i++] = "chugmonkey";
+ authors[i++] = "k3tana";
+ authors[i++] = "cellulit";
+ authors[i++] = "labrat-radio";
+ authors[i++] = "Ghostrider";
+ authors[i++] = "Chug";
+
+ function hideQuote() {
+ $('#quote').animate({opacity: 0.0},{duration:1500});
+ setTimeout(showQuote, 1700);
+ }
+
+ function showQuote() {
+ $("#quote").html('<span>"' + quotes[quoteIndex] + '"&nbsp;&nbsp;&nbsp;&ndash;&nbsp;' + authors[quoteIndex ] + '</span>');
+ quoteIndex = (quoteIndex + 1) % quotes.length;
+
+ $('#quote').animate({opacity: 1.0},{duration:1500});
+ setTimeout(hideQuote, 4000);
+ }
+
+ setTimeout(hideQuote, 4000);
+
+</script>
+
+<div class="sidebox" style="height:75px">
+
+ <h2>What people say</h2>
+ <div id="quote" style="font-size: 11px;">
+ "Just the media server I need! I have been using Andromeda and AjaxAmp etc but Subsonic beats everything!"&nbsp;&nbsp;&nbsp;&ndash;&nbsp;Marc
+ </div>
+</div>
diff --git a/subsonic-site/src/main/webapp/redirect-expired.jsp b/subsonic-site/src/main/webapp/redirect-expired.jsp
new file mode 100644
index 00000000..5b63eacf
--- /dev/null
+++ b/subsonic-site/src/main/webapp/redirect-expired.jsp
@@ -0,0 +1,104 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Subsonic &raquo; Free Music Streamer</title>
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/reset/reset.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/fonts/fonts.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/grid/grid.css">
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/base/base.css">
+</head>
+<body style="padding-left:5em; padding-top:1em; width:42em">
+
+<h1>Trial period expired</h1>
+
+<p>
+ Sorry, the trial period for the web address <b><%= request.getParameter("redirectFrom")%>.subsonic.org</b> has expired.
+</p>
+
+<p>
+ But don't worry; to get permanent ownership of the address you can give a one-time donation to the Subsonic project.
+</p>
+
+<p>
+ As a donor you get the following benefits:
+</p>
+<ul>
+ <li>A personal web address for your Subsonic server (<em>yourname</em>.subsonic.org).</li>
+ <li>Streaming music to Android, iPhone and Windows Phone.</li>
+ <li>Video streaming.</li>
+ <li>No ads in the Subsonic web interface.</li>
+ <li>Free access to new premium features.</li>
+</ul>
+
+<p>
+ The suggested donation amount is
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HBYHMJC3TL4HW"><b>&euro;20</b></a>,
+ but you can give any amount you like.
+</p>
+
+<p>
+ Click one of the buttons to go to PayPal where you can pay by credit card or by using your PayPal account.
+ Once the donation is processed, you will receive a license key by email.
+</p>
+
+ <table style="margin-left:5em">
+ <tr>
+ <td style="border:none;">
+ <table>
+ <tr>
+ <td style="border:none;padding:0;padding:0"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=NCYZTDPDEAFSG"><img src="inc/img/paypal.gif" alt=""/></a> </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;border:none;padding:0">&euro;10</td>
+ </tr>
+ </table>
+ </td>
+ <td style="border:none;">
+ <table>
+ <tr>
+ <td style="border:none;padding:0;padding:0"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=NF8AFLP86QR7W"><img src="inc/img/paypal.gif" alt=""/></a> </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;border:none;padding:0">&euro;15</td>
+ </tr>
+ </table>
+ </td>
+ <td style="border:none;">
+ <table>
+ <tr>
+ <td style="border:none;padding:0"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HBYHMJC3TL4HW"><img src="inc/img/paypal.gif" alt=""/></a> </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;border:none;padding:0">&euro;20</td>
+ </tr>
+ </table>
+ </td>
+ <td style="border:none;">
+ <table>
+ <tr>
+ <td style="border:none;padding:0"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FRZ9FX9XRLHQN"><img src="inc/img/paypal.gif" alt=""/></a> </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;border:none;padding:0">&euro;25</td>
+ </tr>
+ </table>
+ </td>
+ <td style="border:none;">
+ <table>
+ <tr>
+ <td style="border:none;padding:0"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=C5REPEZX2DFQS"><img src="inc/img/paypal.gif" alt=""/></a> </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;border:none;padding:0">&euro;30</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+<p>
+ For more information, please visit <a href="http://subsonic.org/">subsonic.org</a>
+</p>
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/ripserver.jsp b/subsonic-site/src/main/webapp/ripserver.jsp
new file mode 100644
index 00000000..1dc0b2ec
--- /dev/null
+++ b/subsonic-site/src/main/webapp/ripserver.jsp
@@ -0,0 +1,8 @@
+<div class="sidebox">
+ <h2>Ripserver</h2>
+
+ <a href="inc/img/ripserver.png"><img src="inc/img/ripserver-small.png" alt="Ripserver" class="img-right"/></a>
+ <p>
+ Subsonic comes preinstalled on the <a href="http://ripfactory.com/ripserver.html">Ripserver NAS device</a>.
+ </p>
+</div> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/robots.txt b/subsonic-site/src/main/webapp/robots.txt
new file mode 100644
index 00000000..8093c87b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/screenshots.jsp b/subsonic-site/src/main/webapp/screenshots.jsp
new file mode 100644
index 00000000..be20ad46
--- /dev/null
+++ b/subsonic-site/src/main/webapp/screenshots.jsp
@@ -0,0 +1,67 @@
+<%@ page import="java.net.URL" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<%! String current = "screenshots"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+ <%@ include file="menu.jsp" %>
+
+ <div id="content">
+ <div id="main-col">
+ <a href="inc/img/screenshots/screen02.png"><img src="inc/img/screenshots/thumb02.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen01.png"><img src="inc/img/screenshots/thumb01.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen05.png"><img src="inc/img/screenshots/thumb05.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen06.png"><img src="inc/img/screenshots/thumb06.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen03.png"><img src="inc/img/screenshots/thumb03.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen07.png"><img src="inc/img/screenshots/thumb07.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen08.png"><img src="inc/img/screenshots/thumb08.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen09.png"><img src="inc/img/screenshots/thumb09.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen10.png"><img src="inc/img/screenshots/thumb10.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen11.png"><img src="inc/img/screenshots/thumb11.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen16.png" title="SubAir app"><img src="inc/img/screenshots/thumb16.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen17.png" title="Z-Subsonic app for iPhone"><img src="inc/img/screenshots/thumb17.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen20.png" title="iSub app for iPhone"><img src="inc/img/screenshots/thumb20.png" alt="" style="padding:3px"/></a>
+ <a href="inc/img/screenshots/screen12.png" title="Subsonic app for Android"><img src="inc/img/screenshots/thumb12.png" alt="" style="padding:3px;padding-right:20px"/></a>
+ <a href="inc/img/screenshots/screen13.png" title="Subsonic app for Android"><img src="inc/img/screenshots/thumb13.png" alt="" style="padding:3px;padding-right:20px"/></a>
+ <a href="inc/img/screenshots/screen14.png" title="Subsonic app for Android"><img src="inc/img/screenshots/thumb14.png" alt="" style="padding:3px;padding-right:20px"/></a>
+ <a href="inc/img/screenshots/screen15.png" title="Subsonic app for Android"><img src="inc/img/screenshots/thumb15.png" alt="" style="padding:3px;padding-right:20px"/></a>
+ <a href="inc/img/screenshots/screen23.png" title="Subsonic app for Windows Phone"><img src="inc/img/screenshots/thumb23.png" alt="" style="padding:3px;padding-right:10px"/></a>
+ <a href="inc/img/screenshots/screen24.png" title="Subsonic app for Windows Phone"><img src="inc/img/screenshots/thumb24.png" alt="" style="padding:3px;padding-right:10px"/></a>
+ <a href="inc/img/screenshots/screen25.png" title="Subsonic app for Windows Phone"><img src="inc/img/screenshots/thumb25.png" alt="" style="padding:3px"/></a>
+
+ <div class="bottomspace"></div>
+
+ <a name="video"><div></div></a>
+
+ <object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/EBDrdWxd95k?fs=1&amp;hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/EBDrdWxd95k?fs=1&amp;hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object>
+ <div class="bottomspace"></div>
+ <object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/xhgK9ShSpWg?fs=1&amp;hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/xhgK9ShSpWg?fs=1&amp;hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object>
+ <div class="bottomspace"></div>
+ <object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/PvsQk3IoOt4?fs=1&amp;hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/PvsQk3IoOt4?fs=1&amp;hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object>
+ <div class="bottomspace"></div>
+ <object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/UNqLjV10sTA?fs=1&amp;hl=en_GB"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/UNqLjV10sTA?fs=1&amp;hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object>
+ </div>
+
+
+ <div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <%@ include file="download-subsonic.jsp" %>
+ <%@ include file="donate.jsp" %>
+ </div>
+
+ <div class="clear">
+ </div>
+ </div>
+ <hr/>
+ <%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/search.jsp b/subsonic-site/src/main/webapp/search.jsp
new file mode 100644
index 00000000..cc5e24a6
--- /dev/null
+++ b/subsonic-site/src/main/webapp/search.jsp
@@ -0,0 +1,4 @@
+<%
+ String query = request.getParameter("query") + "+site:subsonic.org";
+ response.sendRedirect("http://www.google.com/search?q=" + query);
+%>
diff --git a/subsonic-site/src/main/webapp/subsonic-ad.jsp b/subsonic-site/src/main/webapp/subsonic-ad.jsp
new file mode 100644
index 00000000..082cdbb0
--- /dev/null
+++ b/subsonic-site/src/main/webapp/subsonic-ad.jsp
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Subsonic &raquo; Free Music Streamer</title>
+
+ <link rel="stylesheet" type="text/css" href="inc/css/style.css"/>
+
+ <!--[if lte IE 6]>
+ <link rel="stylesheet" type="text/css" href="inc/css/pngfix.css" />
+ <![endif]-->
+</head>
+<body>
+<div id="side-col"
+ style="background-color: white;
+ margin: 0;
+ width: 178px;
+ height: 398px;
+ border: 1px solid gray;">
+ <div style="margin:6px;padding-top:0.5em">
+ <h2 style=""><img src="inc/img/donate.png" alt="">&nbsp;&nbsp;Love Subsonic?</h2>
+ <p>
+ Support us by giving a donation and enjoy premium features like:
+ </p>
+ <div style="font-size:12px;">
+ <div style="color:#00008b"><a href="http://subsonic.org/pages/apps.jsp" target="blank">Apps</a> for Android, iPhone, WP&nbsp;7, PlayBook, Roku ++.</div>
+ <div style="color:green;padding-top:5px">Video streaming.</div>
+ <div style="color:#00008b;padding-top:5px">Share on Facebook, Twitter, Google+</div>
+ <div style="color:green;padding-top:5px">Your personal server address: <em>you</em>.subsonic.org</div>
+ <div style="color:#00008b;padding-top:5px">No ads.</div>
+ </div>
+
+ <p style="padding-top:12px">
+ The suggested donation amount is &euro;20, but you can give any amount you like.
+ </p>
+ <p style="text-align: center;">
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=JUF7FRS6WTLHC">&euro;10</a>,
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=LQGGXPWSHEFRQ">&euro;15</a>,
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BMH2GB5E4MU7G">&euro;20</a>,
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=YS72FN3AFG3LN">&euro;25</a>,
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9FTC3YWKEGS6">&euro;30</a>
+ </p>
+ <p>
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BMH2GB5E4MU7G"><img src="inc/img/paypal.gif" alt="Donate" class="img-center"/></a>
+ </p>
+
+ </div>
+</div>
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/tracking.jsp b/subsonic-site/src/main/webapp/tracking.jsp
new file mode 100644
index 00000000..672e67e5
--- /dev/null
+++ b/subsonic-site/src/main/webapp/tracking.jsp
@@ -0,0 +1,9 @@
+<script type="text/javascript">
+var _gaq = _gaq || [];
+_gaq.push(['_setAccount', 'UA-110410-1']);
+_gaq.push(['_trackPageview']);
+(function() {
+var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
+</script> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/transcoding.jsp b/subsonic-site/src/main/webapp/transcoding.jsp
new file mode 100644
index 00000000..c526f55c
--- /dev/null
+++ b/subsonic-site/src/main/webapp/transcoding.jsp
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<%! String current = "transcoding"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<a name="top"/>
+
+<div id="container">
+ <%@ include file="menu.jsp" %>
+
+ <div id="content">
+ <div id="main-col">
+ <h1>Transcoding</h1>
+ <p>
+ Transcoding is the process of converting media from one format to another. Subsonic's transcoding engine allows for streaming of
+ media that would normally not be streamable, for instance lossless formats. The transcoding is performed on-the-fly and doesn't require any disk usage.
+ </p>
+
+ <p>
+ The actual transcoding is done by third-party command line programs which are installed in:
+ </p>
+ <p>
+ <b>Windows</b>&nbsp;&nbsp;<code>c:\subsonic\transcode</code><br/>
+ <b>Mac</b>&nbsp;&nbsp;<code>/Library/Application Support/Subsonic/transcode</code><br/>
+ <b>Linux</b>&nbsp;&nbsp;<code>/var/subsonic/transcode</code>
+ </p>
+
+ <p>
+ Note that two transcoders can be chained together. Subsonic comes pre-installed with ffmpeg which supports
+ a huge range of audio and video formats.
+ </p>
+
+ <h2 class="div">Recommended configuration</h2>
+ <p>
+ The recommended settings for audio transcoding is:
+ </p>
+ <p>
+ <b>Step 1</b>&nbsp;&nbsp;<code>ffmpeg -i %s -ab %bk -v 0 -f mp3 -</code><br/>
+ </p>
+
+ <p>
+ The recommended settings for video transcoding is:
+ </p>
+ <p>
+ <b>Step 1</b>&nbsp;&nbsp;<code>ffmpeg -ss %o -i %s -async 1 -b %bk -s %wx%h -ar 44100 -ac 2 -v 0 -f flv -vcodec libx264 -preset superfast -threads 0 -</code><br/>
+ </p>
+
+ <p>
+ Note that "%s" is substituted with the path of the original file at run-time, and "%b" is substituted with
+ the max bitrate of the player. "%t", "%a" and "%l" are substituted with the song's title, artist and album.
+ </p>
+
+
+ <h2 class="div">Adding custom transcoders</h2>
+ <p>
+ You can add your own custom transcoder given that it fulfills the following requirements:
+ </p>
+ <ul class="list">
+ <li>It must have a command line interface.</li>
+ <li>It must be able to send output to stdout.</li>
+ <li>If used in transcoding step 2 it must be able to read input from stdin.</li>
+ </ul>
+
+ <h2 class="div">Troubleshooting</h2>
+ <ul class="list">
+ <li>Is the transcoder installed in <code>c:\subsonic\transcode</code> (or <code>/var/subsonic/transcode</code>)?</li>
+ <li>Is the transcoder activated for your player (in Settings &gt; Players)?</li>
+ <li>Is the proper file extension added to the list of recognized file types (in Settings &gt; General)?</li>
+ <li>If it still doesn't work, please check the Subsonic log.</li>
+ </ul>
+
+ </div>
+
+ <div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <%@ include file="donate.jsp" %>
+ <%@ include file="merchandise.jsp" %>
+ </div>
+
+ <div class="clear">
+ </div>
+ </div>
+ <hr/>
+ <%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/translate-subsonic.jsp b/subsonic-site/src/main/webapp/translate-subsonic.jsp
new file mode 100644
index 00000000..668ea29e
--- /dev/null
+++ b/subsonic-site/src/main/webapp/translate-subsonic.jsp
@@ -0,0 +1,6 @@
+<div class="sidebox">
+ <h2>Get involved!</h2>
+ <p>
+ Help the project by translating Subsonic to new languages, or improving existing translations. Interested? Please read <a href="translate.jsp">this</a>.
+ </p>
+</div> \ No newline at end of file
diff --git a/subsonic-site/src/main/webapp/translate.jsp b/subsonic-site/src/main/webapp/translate.jsp
new file mode 100644
index 00000000..ad371d3b
--- /dev/null
+++ b/subsonic-site/src/main/webapp/translate.jsp
@@ -0,0 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<%! String current = "translate"; %>
+<%@ include file="header.jsp" %>
+
+<body>
+
+<div id="container">
+<%@ include file="menu.jsp" %>
+
+<div id="content">
+<div id="main-col">
+<h1 class="bottomspace">Translating Subsonic</h1>
+
+ <p>
+ Here's how to translate Subsonic to a new language. This description assumes that you're using the Windows installer
+ version of Subsonic.
+ </p>
+
+ <p>
+ In the following, <code>&lt;ROOT&gt;</code> refers to the directory in which you installed Subsonic
+ &ndash; normally <code>c:\Program Files\Subsonic</code>.
+ </p>
+ <ol>
+ <li>Stop the Subsonic service if it's running.</li>
+ <li>Rename <code>&lt;ROOT&gt;\subsonic.war</code> to <code>&lt;ROOT&gt;\subsonic.zip</code>.</li>
+ <li>Unzip the zip file into a new <em>directory</em> called <code>&lt;ROOT&gt;\subsonic.war</code>.
+ <li>Find the two-letter ISO-639 code for your language &ndash; a list is available <a href="http://www.loc.gov/standards/iso639-2/php/English_list.php">here</a>.
+ For instance, Italian is assigned the code <code>it</code>.</li>
+ <li>Add the ISO-639 code to the file <code>&lt;ROOT&gt;\subsonic.war\WEB_INF\classes\net\sourceforge\subsonic\i18n\locales.txt</code>.</li>
+ <li>In the same directory is the file <code>ResourceBundle_en.properties</code> which is the English translation. Use this (or any other file)
+ as the basis for your translation. Better yet, use the latest version from the
+ <a href="http://subsonic.svn.sourceforge.net/viewvc/subsonic/trunk/subsonic-main/src/main/resources/net/sourceforge/subsonic/i18n/">SVN repository</a>.</li>
+ <li>Create the new resource file, for instance <code>ResourceBundle_it.properties</code>.</li>
+ <li>Translate the text in the new file.</li>
+ <li>If you are using a non-Latin alphabet (e.g., Cyrillic or Japanese), you have to convert the property file to ASCII before using it.
+ Use the <code>native2ascii</code> tool which is included in the Java Development Kit. For instance, if you're writing a Macedonian translation
+ (using the Cyrillic alphabet) using UTF-16 character encoding, you must convert it as follows: <br/><br/>
+
+ <code>native2ascii -encoding utf-16 c:\develop\ResourceBundle_mk.properties &lt;ROOT&gt;/subsonic.war/WEB_INF/classes/net/sourceforge/subsonic/i18n/ResourceBundle_mk.properties</code>
+ </li>
+ <li>You have to restart Subsonic for the changes to have effect.</li>
+ <li>When you're done, send the new language file to <a href="mailto:sindre@activeobjects.no">sindre@activeobjects.no</a>.</li>
+ </ol>
+
+</div>
+
+ <div id="side-col">
+ <%@ include file="google-translate.jsp" %>
+ <%@ include file="donate.jsp" %>
+ <%@ include file="merchandise.jsp" %>
+ </div>
+
+ <div class="clear">
+ </div>
+</div>
+ <hr/>
+ <%@ include file="footer.jsp" %>
+</div>
+
+
+</body>
+</html>
diff --git a/subsonic-site/src/main/webapp/tutorial.jsp b/subsonic-site/src/main/webapp/tutorial.jsp
new file mode 100644
index 00000000..a26824f8
--- /dev/null
+++ b/subsonic-site/src/main/webapp/tutorial.jsp
@@ -0,0 +1,8 @@
+<div class="sidebox">
+ <h2>Other ways to use Subsonic</h2>
+ <ul class="list">
+ <li><a href="http://forum.subsonic.org/forum/viewtopic.php?t=1487">Subsonic on FreeNAS</a></li>
+ <li><a href="http://forum.subsonic.org/forum/viewtopic.php?t=2392">Subsonic on unRAID</a></li>
+ <li><a href="http://vortexbox.org/2010/03/vortexbox-now-with-subsonic/">Subsonic on VortexBox</a></li>
+ </ul>
+</div>
diff --git a/subsonic-site/src/main/webapp/zazeen-ad.jsp b/subsonic-site/src/main/webapp/zazeen-ad.jsp
new file mode 100644
index 00000000..d83d8170
--- /dev/null
+++ b/subsonic-site/src/main/webapp/zazeen-ad.jsp
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+</head>
+<body style="border:0;margin:0;padding:0">
+<a href="https://www.zazeen.com/" target="_blank">
+ <img src="inc/img/zazeen-ad.gif" alt="" width="120" height="600" style="border:0;margin:0;padding:0"/>
+</a>
+</body>
+</html>