Holy fuck. It works!

This commit is contained in:
magnolia-fan 2011-06-28 00:43:54 +04:00
parent b9ac20f575
commit 18b2b910ae
19 changed files with 948 additions and 929 deletions

View File

@ -3,42 +3,46 @@ class Ajax
referer: false referer: false
loadArtistData: (name) -> loadArtistData: (name) ->
search.showSpinner() _search.showSpinner()
name = name.split(' ').join('+') name = name.split(' ').join('+')
$.get '/artist/' +name+ '/', (data) -> $.get '/artist/' +name+ '/', (data) ->
if data.status? if data.status?
if data.status is 'loading' if data.status is 'loading'
search.showArtistPics data.pics _search.showArtistPics data.pics
setTimeout () -> setTimeout () ->
this.loadArtistData name _ajax.loadArtistData name
, 3000 , 3000
else if data.status is 'corrected' else if data.status is 'corrected'
ajax.loadArtistData data.page _ajax.loadArtistData data.page
else if data.status is 'suggestions' else if data.status is 'suggestions'
search.hideSpinner() _search.hideSpinner()
search.showSuggestions data.values _search.showSuggestions data.values
else if data.status == 'loading_failed' else if data.status == 'loading_failed'
search.hideSpinner() _search.hideSpinner()
search.showError() _search.showError()
else else
this.setArchor '/artist/' +name+ '/' _ajax.setArchor '/artist/' +name+ '/'
pages.renderArtist data _pages.renderArtist data
beathaven.redrawScrollbar() _beathaven.redrawScrollbar()
false
loadSearchPage: -> loadSearchPage: ->
$.get '/templates/search.html', (data) -> $.get '/templates/search.html', (data) ->
this.setArchor '/search/' _ajax.setArchor '/search/'
pages.renderSearch data _pages.renderSearch data
false
loadSettingsPage: -> loadSettingsPage: ->
$.get '/templates/settings.html', (data) -> $.get '/templates/settings.html', (data) ->
this.setArchor '/settings/' _ajax.setArchor '/settings/'
pages.renderSettings data _pages.renderSettings data
false
load404Page: -> load404Page: ->
$.get '/404.html', (data) -> $.get '/404.html', (data) ->
$('.data-container .inner').html data $('.data-container .inner').html data
beathaven.redrawScrollbar() _beathaven.redrawScrollbar()
false
setArchor: (anchor) -> setArchor: (anchor) ->
@referer = this.getAnchor() @referer = this.getAnchor()
@ -50,21 +54,25 @@ class Ajax
setTitle: (title) -> setTitle: (title) ->
document.title = title+ ' @ BeatHaven' document.title = title+ ' @ BeatHaven'
detectPage: () -> go: (url) ->
if m = this.getAnchor().match /\/artist\/(.+)\// this.setArchor url
this.loadArtistData m[1]
else if this.getAnchor() == '' or Ajax.getAnchor().match /\/search\//
this.loadSearchPage();
else if this.getAnchor().match /\/settings\//
this.loadSearchPage()
else
this.load404Page()
$ ->
window.ajax = new Ajax()
$('a.data.artist').live 'click', ->
ajax.loadArtistData $(this).html()
false false
$(window).bind 'hashchange', ->
ajax.detectPage() detectPage: () ->
if m = _ajax.getAnchor().match /\/artist\/(.+)\//
_ajax.loadArtistData m[1]
else if _ajax.getAnchor() == '' or _ajax.getAnchor().match /\/search\//
_ajax.loadSearchPage();
else if _ajax.getAnchor().match /\/settings\//
_ajax.loadSettingsPage()
else
_ajax.loadSearchPage()
false
$('a.data.artist').live 'click', ->
_ajax.loadArtistData $(this).html()
false
$(window).bind 'hashchange', ->
_ajax.detectPage()
false

View File

@ -1,18 +1,25 @@
# Registering global objects
_beathaven = null
_session = 1
_vkontakte = null
_ajax = null
_player = null
_search = null
_pages = null
_settings = null
$ -> $ ->
l = document.location l = document.location
if l.host not in ['beathaven.org', 'localhost'] if l.host not in ['beathaven.org', 'localhost']
l.href = 'http://beathaven.org/'+ l.hash l.href = 'http://beathaven.org/'+ l.hash
window.beathaven = new BeatHaven() _beathaven = new BeatHaven()
window.vkontakte = new Vkontakte(if l.host == 'beathaven.org' then 2335068 else 2383163) _beathaven.init()
beathaven.init()
vkontakte.init()
$(window).resize -> $(window).resize ->
beathaven.adjustSizes() _beathaven.adjustSizes()
window.setTimeout -> window.setTimeout ->
beathaven.checkRedrawScrollbar() _beathaven.checkRedrawScrollbar()
, 500 , 500
class BeatHaven class BeatHaven
@ -20,9 +27,24 @@ class BeatHaven
last_height: false last_height: false
init: -> init: ->
this.drawInterface()
this.adjustSizes() this.adjustSizes()
ajax.detectPage() this.checkRedrawScrollbar()
_vkontakte = new Vkontakte(if document.location.host == 'beathaven.org' then 2335068 else 2383163)
_vkontakte.init()
_ajax = new Ajax()
_player = new Player()
_player.initJplayer()
_search = new Search()
_pages = new Pages()
_settings = new Settings()
_ajax.detectPage()
adjustSizes: -> adjustSizes: ->
$('.data-container').height $(window).height() - $('.header-container').height() $('.data-container').height $(window).height() - $('.header-container').height()
@ -45,7 +67,7 @@ class BeatHaven
document.getElementById(focused_id).focus() document.getElementById(focused_id).focus()
focused_id = false focused_id = false
window.setTimeout -> window.setTimeout ->
beathaven.checkRedrawScrollbar() _beathaven.checkRedrawScrollbar()
, 500 , 500
redrawScrollbar: -> redrawScrollbar: ->

View File

@ -47,8 +47,9 @@ class Pages
$('.data-container').css backgroundImage: 'none' $('.data-container').css backgroundImage: 'none'
$('.data-container .inner').html('').append(artist_info).append(albums_info) $('.data-container .inner').html('').append(artist_info).append(albums_info)
yaCounter7596904.hit ajax.getAnchor(), data.artist.name, ajax.referer yaCounter7596904.hit _ajax.getAnchor(), data.artist.name, _ajax.referer
ajax.setTitle data.artist.name _ajax.setTitle data.artist.name
false
renderSearch: (data) -> renderSearch: (data) ->
$('.data-container').css background: 'url(/images/concrete_wall_2.png) 0 -30px repeat' $('.data-container').css background: 'url(/images/concrete_wall_2.png) 0 -30px repeat'
@ -69,20 +70,18 @@ class Pages
zIndex: 9999 # z-index списка zIndex: 9999 # z-index списка
deferRequestBy: 500 # Задержка запроса (мсек) deferRequestBy: 500 # Задержка запроса (мсек)
onSelect: -> onSelect: ->
ajax.loadArtistData() _ajax.loadArtistData $('#search_field').val()
$('#search_field').focus() $('#search_field').focus()
, 501 , 501
yaCounter7596904.hit ajax.getAnchor(), 'Artist Search', ajax.referer yaCounter7596904.hit _ajax.getAnchor(), 'Artist Search', _ajax.referer
ajax.setTitle 'Artist Search' _ajax.setTitle 'Artist Search'
false
renderSettings: (data) -> renderSettings: (data) ->
$('.data-container').css background: 'none' $('.data-container').css background: 'none'
$('.data-container .inner').html data $('.data-container .inner').html data
yaCounter7596904.hit ajax.getAnchor(), 'Settings', ajax.referer yaCounter7596904.hit _ajax.getAnchor(), 'Settings', _ajax.referer
ajax.setTitle 'Settings' _ajax.setTitle 'Settings'
$('.settings-container .tabs .tab').first().trigger 'click' $('.settings-container .tabs .tab').first().trigger 'click'
false
$ ->
window.pages = new Pages()
false

View File

@ -13,8 +13,8 @@ class Player
supplied: "mp3" supplied: "mp3"
cssSelectorAncestor: "" cssSelectorAncestor: ""
cssSelector: cssSelector:
play: "#player .play" play: ".player .play"
pause: "#player .pause" pause: ".player .pause"
stop: "" stop: ""
videoPlay: "" videoPlay: ""
seekBar: "" seekBar: ""
@ -28,19 +28,19 @@ class Player
@jp.bind $.jPlayer.event.timeupdate, (e) -> @jp.bind $.jPlayer.event.timeupdate, (e) ->
data = e.jPlayer.status data = e.jPlayer.status
if not Player.scrobbled and data.currentPercentAbsolute > 50 if not _player.scrobbled and data.currentPercentAbsolute > 50
$obj = $('.playlist-tracks li.now') $obj = $('.playlist-tracks li.now')
self.scrobble $obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track') self.scrobble $obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track')
Player.scrobbled = true _player.scrobbled = true
$('#player .progress .loaded').width(data.seekPercent * self.bar_width / 100) $('.player .progress .loaded').width(data.seekPercent * self.bar_width / 100)
$('#player .progress .played').width(data.currentPercentAbsolute * self.bar_width / 100) $('.player .progress .played').width(data.currentPercentAbsolute * self.bar_width / 100)
@jp.bind $.jPlayer.event.ended, (e) -> @jp.bind $.jPlayer.event.ended, (e) ->
next = self.nextTrack() next = self.nextTrack()
if not next if not next
$('#jplayer').jPlayer 'clearMedia' $('#jplayer').jPlayer 'clearMedia'
$('#player .now-playing').html 'Nothing left to <strike>lose</strike> play' $('.player .now-playing').html 'Nothing left to <strike>lose</strike> play'
$('#player .loaded, #player .played').width 0 $('.player .loaded, .player .played').width 0
$('.playlist-tracks li').removeClass 'now' $('.playlist-tracks li').removeClass 'now'
else else
self.setTrack next self.setTrack next
@ -54,31 +54,31 @@ class Player
<li id="i' +Math.round(Math.random() * 999999)+ '" data-artist="' +artist.trim()+ '" data-album="' +album.trim()+ '" data-track="' +track.trim()+ '" data-length="' +length+ '"> <li id="i' +Math.round(Math.random() * 999999)+ '" data-artist="' +artist.trim()+ '" data-album="' +album.trim()+ '" data-track="' +track.trim()+ '" data-length="' +length+ '">
<div class="item"> <div class="item">
<div class="fade"></div> <div class="fade"></div>
<span class="title" title="' +artist.htmlsafe()+ ' &mdash ' +track.htmlsafe()+ '">' +artist+ ' &mdash ' +track+ '</span> <span class="title" title="' +artist.htmlsafe()+ " &mdash; " +track.htmlsafe()+ '">' +artist+ ' &mdash; ' +track+ '</span>
<span class="duration">' +length+ '</span> <span class="duration">' +length+ '</span>
<div class="remove">remove</div> <div class="remove">remove</div>
</div> </div>
</li>' </li>'
$('#playlist').html($('.playlist-tracks')).scrollbar() $('.playlist').html($('.playlist-tracks')).scrollbar()
$('.playlist-tracks').sortable() $('.playlist-tracks').sortable()
if autoplay if autoplay
Player.setTrack($('.playlist-tracks li').last().attr('id').split('i')[1]) _player.setTrack($('.playlist-tracks li').last().attr('id').split('i')[1])
else if initial_count == 0 and not Player.hasTrack() else if initial_count == 0 and not _player.hasTrack()
Player.setTrack($('.playlist-tracks li').first().attr('id').split('i')[1]) _player.setTrack($('.playlist-tracks li').first().attr('id').split('i')[1])
setTrack: (id) -> setTrack: (id) ->
$obj = $('#i' +id) $obj = $('#i' +id)
query = $obj.attr('data-artist')+ ' &mdash ' +$obj.attr('data-track') query = $obj.attr('data-artist')+ ' &mdash; ' +$obj.attr('data-track')
$('#player .now-playing').html query+ '<div class="fade"></div>' $('.player .now-playing').html query+ '<div class="fade"></div>'
$('.playlist-tracks li').removeClass 'now' $('.playlist-tracks li').removeClass 'now'
$obj.addClass 'now' $obj.addClass 'now'
$('#player .loaded, #player .played').width 0 $('.player .loaded, .player .played').width 0
vkontakte.loadTracksData $obj.attr('data-artist'), $obj.attr('data-track'), $obj.attr('data-length'), -> _vkontakte.loadTracksData $obj.attr('data-artist'), $obj.attr('data-track'), $obj.attr('data-length'), (url)->
player.playSource() _player.playSource url
this.updateNowListening $obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track') this.updateNowListening $obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track')
hasTrack: -> hasTrack: ->
@ -99,7 +99,7 @@ class Player
cnt = $('.playlist-tracks li').length cnt = $('.playlist-tracks li').length
if not this.onShuffle() # Shuffle off if not this.onShuffle() # Shuffle off
if $('.playlist-tracks .now').next().length == 0 # Last track and repeat is on if $('.playlist-tracks .now').next().length == 0 # Last track and repeat is on
if Player.onRepeat() or manual # Repeat or manual click if _player.onRepeat() or manual # Repeat or manual click
return $('.playlist-tracks li').first().attr('id').split('i')[1] return $('.playlist-tracks li').first().attr('id').split('i')[1]
else else
false false
@ -117,7 +117,7 @@ class Player
prevTrack: -> prevTrack: ->
cnt = $('.playlist-tracks li').length cnt = $('.playlist-tracks li').length
if not Player.onShuffle() # Shuffle off if not _player.onShuffle() # Shuffle off
if $('.playlist-tracks .now').prev().length == 0 # First track in the playlist if $('.playlist-tracks .now').prev().length == 0 # First track in the playlist
return $('.playlist-tracks li').last().attr('id').split('i')[1] return $('.playlist-tracks li').last().attr('id').split('i')[1]
else else
@ -139,37 +139,31 @@ class Player
return $('#repeat').hasClass 'active' return $('#repeat').hasClass 'active'
updateNowListening: (artist, album, track) -> updateNowListening: (artist, album, track) ->
if session.user.lastfm_username if _session.getUser().lastfm_username
session.query '/lastfm/listening?r=' +Math.random(), artist: artist, album: album, track: track _session.query '/lastfm/listening?r=' +Math.random(), artist: artist, album: album, track: track
scrobble: (artist, album, track) -> scrobble: (artist, album, track) ->
if session.user.lastfm_username if _session.getUser().lastfm_username
session.query '/lastfm/scrobble?r=' +Math.random(), artist: artist, album: album, track: track _session.query '/lastfm/scrobble?r=' +Math.random(), artist: artist, album: album, track: track
$ ->
window.player = new Player()
window.player.initJplayer()
false
# Player Controls # Player Controls
$('#player .controls .prev').live 'click', -> $('.player .controls .prev').live 'click', ->
Player.setTrack Player.prevTrack() _player.setTrack _player.prevTrack()
false false
$('#player .controls .next').live 'click', -> $('.player .controls .next').live 'click', ->
Player.setTrack Player.nextTrack(true) _player.setTrack _player.nextTrack(true)
false false
$('#player .play').live 'click', -> $('.player .play').live 'click', ->
if $('.playlist-tracks li').length > 0 and not Player.hasTrack() if $('.playlist-tracks li').length > 0 and not _player.hasTrack()
player.setTrack $('.playlist-tracks li').first().attr('id').split('i')[1] _player.setTrack $('.playlist-tracks li').first().attr('id').split('i')[1]
false false
$('#player .progress').live 'click', (e) -> $('.player .progress').live 'click', (e) ->
$('#jplayer').jPlayer 'playHead', Math.round((e.offsetX / Player.bar_width) * 100) $('#jplayer').jPlayer 'playHead', Math.round((e.offsetX / _player.bar_width) * 100)
false false
# Player Additional Controls # Player Additional Controls
@ -182,8 +176,8 @@ $('#empty-playlist').live 'click', ->
if confirm('Are you sure?') if confirm('Are you sure?')
$('.playlist-tracks li').remove() $('.playlist-tracks li').remove()
$('#jplayer').jPlayer 'clearMedia' $('#jplayer').jPlayer 'clearMedia'
$('#player .now-playing').text 'Add some music to playlist' $('.player .now-playing').text 'Add some music to playlist'
$('#player .loaded, #player .played').width 0 $('.player .loaded, .player .played').width 0
false false
# Playlist Actions # Playlist Actions
@ -201,13 +195,13 @@ $('.playlist-tracks li .remove').live 'click', ->
$li = $(this).parent().parent() $li = $(this).parent().parent()
if $li.hasClass 'now' if $li.hasClass 'now'
$('#jplayer').jPlayer 'clearMedia' $('#jplayer').jPlayer 'clearMedia'
$('#player .now-playing').text '...' $('.player .now-playing').text '...'
$('#player .loaded, #player .played').width 0 $('.player .loaded, .player .played').width 0
$li.remove() $li.remove()
false false
$('.playlist-tracks li').live 'dblclick', -> $('.playlist-tracks li').live 'dblclick', ->
player.setTrack $(this).attr('id').split('i')[1] _player.setTrack $(this).attr('id').split('i')[1]
false false
# Adding To Playlist actions # Adding To Playlist actions
@ -218,7 +212,7 @@ $('.add-album').live 'click', ->
for item in $(this).parent().parent().parent().find('.tracklist li') for item in $(this).parent().parent().parent().find('.tracklist li')
track_name = $(item).find('.trackname').html() track_name = $(item).find('.trackname').html()
length = $(item).find('.length').html() length = $(item).find('.length').html()
Player.addTrack artist, album, track_name, length _player.addTrack artist, album, track_name, length
false false
$('.add-track').live 'click', -> $('.add-track').live 'click', ->
@ -226,7 +220,7 @@ $('.add-track').live 'click', ->
album = $(this).parent().parent().parent().parent().find('h2.name').text().replace /\s\([\d]{4}\)$/, '' album = $(this).parent().parent().parent().parent().find('h2.name').text().replace /\s\([\d]{4}\)$/, ''
track_name = $(this).parent().find('.trackname').html() track_name = $(this).parent().find('.trackname').html()
length = $(this).parent().find('.length').html() length = $(this).parent().find('.length').html()
Player.addTrack artist, album, track_name, length _player.addTrack artist, album, track_name, length
false false
$('.tracklist li').live 'mouseover mouseout', (e) -> $('.tracklist li').live 'mouseover mouseout', (e) ->
@ -241,5 +235,5 @@ $('.tracklist li').live 'dblclick', (e) ->
album = $(this).parent().parent().parent().find('h2.name').text().replace /\s\([\d]{4}\)$/, '' album = $(this).parent().parent().parent().find('h2.name').text().replace /\s\([\d]{4}\)$/, ''
track_name = $(this).find('.trackname').html() track_name = $(this).find('.trackname').html()
length = $(this).find('.length').html() length = $(this).find('.length').html()
Player.addTrack artist, album, track_name, length, true _player.addTrack artist, album, track_name, length, true
false false

View File

@ -21,7 +21,7 @@ class Search
$('.suggestions ul').append ' $('.suggestions ul').append '
<li> <li>
<a class="data artist">' +item.name+ '</a> <a class="data artist">' +item.name+ '</a>
' +(if item.desc then '<br/><span>'+ item.desc +'</span>' else '')+ ' ' +(if item.desc? then '<br/><span>'+item.desc+'</span>' else '')+ '
</li>' </li>'
$('.suggestions').show() $('.suggestions').show()
false false
@ -48,16 +48,12 @@ class Search
@pics = [] @pics = []
$ ->
window.search = new Search()
false
$('.search').live 'click', -> $('.search').live 'click', ->
ajax.loadSearchPage() _ajax.go '/search/'
false false
$('#search_form').live 'submit', -> $('#search_form').live 'submit', ->
$('.autocomplete-container').remove() $('.autocomplete-container').remove()
ajax.loadArtistData $('#search_field').val() _ajax.loadArtistData $('#search_field').val()
false false
$('.suggestions a').live 'click', -> $('.suggestions a').live 'click', ->
$('#search_field').val $(this).text() $('#search_field').val $(this).text()

View File

@ -3,7 +3,21 @@ class Session
vk_params: null vk_params: null
user: null user: null
constructor: (@vk_params) -> constructor: (params) ->
attrs = ['expire', 'mid', 'secret', 'sid', 'sig']
_params = {}
for key in attrs
if params[key]?
_params[key] = params[key]
@vk_params = _params
false
setUser: (user) ->
@user = user
false
getUser: ->
@user
query: (url, params, callback) -> query: (url, params, callback) ->
q_params = @vk_params q_params = @vk_params
@ -11,13 +25,3 @@ class Session
q_params[attr] = params[attr] q_params[attr] = params[attr]
$.post url, q_params, callback $.post url, q_params, callback
false false
setVkParams: (params) ->
attrs = ['expire', 'mid', 'secret', 'sid', 'sig']
for key in attrs
@vk_params[key] = params[key]
false
$ ->
window.session = new Session()
false

View File

@ -1,35 +1,32 @@
class Settings class Settings
getAccountInfo: (callback) -> getAccountInfo: (callback) ->
session.query '/user/update/', {}, callback _session.query '/user/update/', {}, callback
saveAccountInfo: (params, callback) -> saveAccountInfo: (params, callback) ->
session.query '/user/update', params, callback _session.query '/user/update', params, callback
loadFormData: (form) -> loadFormData: (form) ->
if form == 'account' if form == 'account'
$('.settings-container .form input[name$="username"]').val session.user.name $('.settings-container .form input[name$="username"]').val _session.getUser().name
$('.settings-container .form input[name$="email"]').val session.email $('.settings-container .form input[name$="email"]').val _session.getUser().email
else if form == 'lastfm' else if form == 'lastfm'
if @user.lastfm_username if _session.getUser().lastfm_username
$('.form-container input[name$="username"]').first().val session.lastfm_username $('.form-container input[name$="username"]').first().val _session.getUser().lastfm_username
$ ->
window.settings = new Settings()
false
$('.settings') .live 'click', -> $('.settings') .live 'click', ->
ajax.loadSettingsPage(); _ajax.go('/settings/');
$('.settings-container .tabs .tab').live 'click', -> $('.settings-container .tabs .tab').live 'click', ->
if $(this).hasClass 'active' if not $(this).hasClass 'active'
$('.settings-container .tabs .tab').removeClass 'active' $('.settings-container .tabs .tab').removeClass 'active'
$(this).addClass 'active' $(this).addClass 'active'
$('.form-container').html $('.forms .'+ $(this).attr 'data-fieldset').html() $('.form-container').html $('.forms .'+ $(this).attr 'data-fieldset').html()
settings.loadFormData $(this).attr 'data-fieldset' _settings.loadFormData $(this).attr 'data-fieldset'
$('.lastfm-connect') .live 'click', -> $('.lastfm-connect') .live 'click', ->
window.open session.user.lastfm_login_url window.open _session.getUser().lastfm_login_url
$('.settings-container .form input').live 'blur', -> $('.settings-container .form input').live 'blur', ->
active_tab = $('.settings-container .tabs .tab.active').attr 'data-fieldset' active_tab = $('.settings-container .tabs .tab.active').attr 'data-fieldset'
@ -37,5 +34,5 @@ $('.settings-container .form input').live 'blur', ->
params = params =
username: $('.settings-container .form input[name$="username"]').first().val() username: $('.settings-container .form input[name$="username"]').first().val()
email: $('.settings-container .form input[name$="email"]').first().val() email: $('.settings-container .form input[name$="email"]').first().val()
settings.saveAccountInfo params, -> _settings.saveAccountInfo params, ->
$('#header-container .hello .greating').text 'Hi there, ' +(if params.username.length > 0 then params.username else '%username%')+ '!' $('#header-container .hello .greating').text 'Hi there, ' +(if params.username.length > 0 then params.username else '%username%')+ '!'

View File

@ -1,50 +1,53 @@
class Vkontakte class Vkontakte
qr: [] qr: null
constructor: (@api_id) -> constructor: (@api_id) ->
init: -> init: ->
@qr = []
VK.init VK.init
apiId: @api_id apiId: @api_id
nameTransportPath: '/xd_receiver.html'
VK.Auth.getLoginStatus this.authInfo VK.Auth.getLoginStatus this.authInfo
authInfo: (response) -> authInfo: (response) ->
if typeof response isnt 'undefined' and response.session if typeof response isnt 'undefined' and response.session
session.setVkParams response.session _session = new Session(response.session)
$('#vk_login, .auth_notice').hide() $('#vk_login, .auth_notice').hide()
$('#vk_logout').css display: 'block' $('#vk_logout').css display: 'block'
$('#search_field').focus() if $('#search_field').length > 0 $('#search_field').focus() if $('#search_field').length > 0
session.query '/user/auth', {}, (ar) -> _session.query '/user/auth', {}, (ar) ->
if ar.newbie if ar.newbie
VK.Api.call 'getVariable', key: 1281, (r) -> VK.Api.call 'getVariable', key: 1281, (r) ->
Session.query '/user/update', name: r.response, (ar2) -> _session.query '/user/update', name: r.response, (ar2) ->
session.user = ar2.user _session.setUser ar2.user
$('#header-container .hello .greating') $('.header-container .hello .greating')
.text 'Hi there, ' +(if session.user.name then session.user.name else '%username%')+ '!' .text 'Hi there, ' +(if _session.getUser().name then _session.getUser().name else '%username%')+ '!'
else else
session.user = ar.user _session.setUser ar.user
$('#header-container .hello .greating') $('.header-container .hello .greating')
.text 'Hi there, ' +( if session.user.name then session.user.name else '%username%')+ '!' .text 'Hi there, ' +(if _session.getUser().name then _session.getUser().name else '%username%')+ '!'
else else
_session = new Session({})
$('#vk_login, .auth_notice').css display: 'block' $('#vk_login, .auth_notice').css display: 'block'
$('#vk_logout').hide() $('#vk_logout').hide()
window._session = _session
loadTracksData: (artist, track, duration, callback) -> loadTracksData: (artist, track, duration, callback) ->
track_prepared = track.replace(/\(.*\)/i, '').split('/')[0]; track_prepared = track.replace(/\(.*\)/i, '').split('/')[0];
query = artist +' '+ track_prepared; query = artist+' '+track_prepared;
if @qr[query]? if url = _vkontakte.getQR query
callback @qr[query] callback url
else else
VK.Api.call 'audio.search', q: query, (r) -> VK.Api.call 'audio.search', q: query, (r) ->
url = this.matchPerfectResult r.response, artist, track, duration r.response.splice 0, 1
@qr[query] = url; url = _vkontakte.matchPerfectResult r.response, artist, track, duration
_vkontakte.addQR query, url
callback url callback url
matchPerfectResult: (data, artist, track, duration) -> matchPerfectResult: (data, artist, track, duration) ->
@ -85,8 +88,16 @@ class Vkontakte
return best_result.url return best_result.url
addQR: (query, url) ->
@qr[query] = url;
getQR: (query) ->
if @qr[query]?
@qr[query]
false
$ -> $ ->
$('#vk_login').click -> $('#vk_login').click ->
VK.Auth.login vkontakte.authInfo, 8 VK.Auth.login _vkontakte.authInfo(), 8
$('#vk_logout').click -> $('#vk_logout').click ->
VK.Auth.logout vkontakte.authInfo VK.Auth.logout _vkontakte.authInfo()

View File

@ -38,7 +38,7 @@ class ArtistController < ApplicationController
render :json => {status: 'corrected', page: results[0][:name]} render :json => {status: 'corrected', page: results[0][:name]}
return return
else else
render :json => {status: 'suggestions', values: results} render :json => {status: 'suggestions', values: results.take(5)}
return return
end end
end end

View File

@ -12,7 +12,10 @@
<%= javascript_include_tag "jquery/jquery.contentchange.js" %> <%= javascript_include_tag "jquery/jquery.contentchange.js" %>
<%= javascript_include_tag "jquery/jquery.jplayer.js" %> <%= javascript_include_tag "jquery/jquery.jplayer.js" %>
<%= javascript_include_tag "jquery/jquery.scroll.js" %> <%= javascript_include_tag "jquery/jquery.scroll.js" %>
<%= javascript_include_tag "coffee/beathaven.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "coffee/vkontakte.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "coffee/session.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "coffee/ajax.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "coffee/player.js", :type => "text/javascript", :charset => "utf-8" %> <%= javascript_include_tag "coffee/player.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "coffee/search.js", :type => "text/javascript", :charset => "utf-8" %> <%= javascript_include_tag "coffee/search.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "coffee/pages.js", :type => "text/javascript", :charset => "utf-8" %> <%= javascript_include_tag "coffee/pages.js", :type => "text/javascript", :charset => "utf-8" %>
@ -63,7 +66,6 @@
<li class="search">Search</li> <li class="search">Search</li>
<li><a href="https://twitter.com/#!/beat_haven" target="_blank">News</a></li> <li><a href="https://twitter.com/#!/beat_haven" target="_blank">News</a></li>
<li class="vk_auth" id="vk_login">Login</li> <li class="vk_auth" id="vk_login">Login</li>
<li class="vk_auth" id="vk_logout">Logout</li>
</ul> </ul>
</div> </div>
<div class="data-container" class="css-scrollbar"> <div class="data-container" class="css-scrollbar">

View File

@ -15,7 +15,7 @@ Barista.configure do |c|
# c.register :tests, :root => Rails.root.join('test', 'coffeescript'), :output_prefix => 'test' # c.register :tests, :root => Rails.root.join('test', 'coffeescript'), :output_prefix => 'test'
# Disable wrapping in a closure: # Disable wrapping in a closure:
# c.bare = true c.bare = true
# ... or ... # ... or ...
# c.bare! # c.bare!

View File

@ -1,87 +1,89 @@
/* DO NOT MODIFY. This file was compiled Mon, 27 Jun 2011 17:43:40 GMT from var Ajax;
* /Users/chez/Sites/beathaven/app/coffeescripts/ajax.coffee Ajax = (function() {
*/ function Ajax() {}
Ajax.prototype.referer = false;
(function() { Ajax.prototype.loadArtistData = function(name) {
var Ajax; _search.showSpinner();
Ajax = (function() { name = name.split(' ').join('+');
function Ajax() {} $.get('/artist/' + name + '/', function(data) {
Ajax.prototype.referer = false; if (data.status != null) {
Ajax.prototype.loadArtistData = function(name) { if (data.status === 'loading') {
search.showSpinner(); _search.showArtistPics(data.pics);
name = name.split(' ').join('+'); return setTimeout(function() {
return $.get('/artist/' + name + '/', function(data) { return _ajax.loadArtistData(name);
if (data.status != null) { }, 3000);
if (data.status === 'loading') { } else if (data.status === 'corrected') {
search.showArtistPics(data.pics); return _ajax.loadArtistData(data.page);
return setTimeout(function() { } else if (data.status === 'suggestions') {
return this.loadArtistData(name); _search.hideSpinner();
}, 3000); return _search.showSuggestions(data.values);
} else if (data.status === 'corrected') { } else if (data.status === 'loading_failed') {
return ajax.loadArtistData(data.page); _search.hideSpinner();
} else if (data.status === 'suggestions') { return _search.showError();
search.hideSpinner();
return search.showSuggestions(data.values);
} else if (data.status === 'loading_failed') {
search.hideSpinner();
return search.showError();
}
} else {
this.setArchor('/artist/' + name + '/');
pages.renderArtist(data);
return beathaven.redrawScrollbar();
} }
});
};
Ajax.prototype.loadSearchPage = function() {
return $.get('/templates/search.html', function(data) {
this.setArchor('/search/');
return pages.renderSearch(data);
});
};
Ajax.prototype.loadSettingsPage = function() {
return $.get('/templates/settings.html', function(data) {
this.setArchor('/settings/');
return pages.renderSettings(data);
});
};
Ajax.prototype.load404Page = function() {
return $.get('/404.html', function(data) {
$('.data-container .inner').html(data);
return beathaven.redrawScrollbar();
});
};
Ajax.prototype.setArchor = function(anchor) {
this.referer = this.getAnchor();
return window.location.hash = '#' + anchor;
};
Ajax.prototype.getAnchor = function() {
return window.location.hash.substring(1);
};
Ajax.prototype.setTitle = function(title) {
return document.title = title + ' @ BeatHaven';
};
Ajax.prototype.detectPage = function() {
var m;
if (m = this.getAnchor().match(/\/artist\/(.+)\//)) {
return this.loadArtistData(m[1]);
} else if (this.getAnchor() === '' || Ajax.getAnchor().match(/\/search\//)) {
return this.loadSearchPage();
} else if (this.getAnchor().match(/\/settings\//)) {
return this.loadSearchPage();
} else { } else {
return this.load404Page(); _ajax.setArchor('/artist/' + name + '/');
_pages.renderArtist(data);
return _beathaven.redrawScrollbar();
} }
};
return Ajax;
})();
$(function() {
$('a.data.artist').live('click', function() {
ajax.loadArtistData($(this).html());
return false;
}); });
return $(window).bind('hashchange', function() { return false;
return ajax.detectPage(); };
Ajax.prototype.loadSearchPage = function() {
$.get('/templates/search.html', function(data) {
_ajax.setArchor('/search/');
return _pages.renderSearch(data);
}); });
}); return false;
}).call(this); };
Ajax.prototype.loadSettingsPage = function() {
$.get('/templates/settings.html', function(data) {
_ajax.setArchor('/settings/');
return _pages.renderSettings(data);
});
return false;
};
Ajax.prototype.load404Page = function() {
$.get('/404.html', function(data) {
$('.data-container .inner').html(data);
return _beathaven.redrawScrollbar();
});
return false;
};
Ajax.prototype.setArchor = function(anchor) {
this.referer = this.getAnchor();
return window.location.hash = '#' + anchor;
};
Ajax.prototype.getAnchor = function() {
return window.location.hash.substring(1);
};
Ajax.prototype.setTitle = function(title) {
return document.title = title + ' @ BeatHaven';
};
Ajax.prototype.go = function(url) {
this.setArchor(url);
return false;
};
Ajax.prototype.detectPage = function() {
var m;
if (m = _ajax.getAnchor().match(/\/artist\/(.+)\//)) {
_ajax.loadArtistData(m[1]);
} else if (_ajax.getAnchor() === '' || _ajax.getAnchor().match(/\/search\//)) {
_ajax.loadSearchPage();
} else if (_ajax.getAnchor().match(/\/settings\//)) {
_ajax.loadSettingsPage();
} else {
_ajax.loadSearchPage();
}
return false;
};
return Ajax;
})();
$('a.data.artist').live('click', function() {
_ajax.loadArtistData($(this).html());
return false;
});
$(window).bind('hashchange', function() {
_ajax.detectPage();
return false;
});

View File

@ -1,95 +1,97 @@
/* DO NOT MODIFY. This file was compiled Mon, 27 Jun 2011 17:49:39 GMT from var BeatHaven, _ajax, _beathaven, _pages, _player, _search, _session, _settings, _vkontakte;
* /Users/chez/Sites/beathaven/app/coffeescripts/beathaven.coffee _beathaven = null;
*/ _session = 1;
_vkontakte = null;
(function() { _ajax = null;
var BeatHaven; _player = null;
$(function() { _search = null;
var ajax, beathaven, l, pages, player, search, session, settings, vkontakte, _ref; _pages = null;
l = document.location; _settings = null;
if ((_ref = l.host) !== 'beathaven.org' && _ref !== 'localhost') { $(function() {
l.href = 'http://beathaven.org/' + l.hash; var l, _ref;
} l = document.location;
beathaven = new BeatHaven(); if ((_ref = l.host) !== 'beathaven.org' && _ref !== 'localhost') {
vkontakte = new Vkontakte(l.host === 'beathaven.org' ? 2335068 : 2383163); l.href = 'http://beathaven.org/' + l.hash;
session = new Session(); }
ajax = new Ajax(); _beathaven = new BeatHaven();
player = new Player(); _beathaven.init();
search = new Search(); $(window).resize(function() {
pages = new Pages(); return _beathaven.adjustSizes();
settings = new Settings();
beathaven.init();
vkontakte.init();
$(window).resize(function() {
return beathaven.adjustSizes();
});
return window.setTimeout(function() {
return beathaven.checkRedrawScrollbar();
}, 500);
}); });
BeatHaven = (function() { return window.setTimeout(function() {
function BeatHaven() {} return _beathaven.checkRedrawScrollbar();
BeatHaven.prototype.last_height = false; }, 500);
BeatHaven.prototype.init = function() { });
this.drawInterface(); BeatHaven = (function() {
this.adjustSizes(); function BeatHaven() {}
return ajax.detectPage(); BeatHaven.prototype.last_height = false;
}; BeatHaven.prototype.init = function() {
BeatHaven.prototype.adjustSizes = function() { this.adjustSizes();
$('.data-container').height($(window).height() - $('.header-container').height()); this.checkRedrawScrollbar();
$('.data-container').width($(window).width() - $('.player').width()); _vkontakte = new Vkontakte(document.location.host === 'beathaven.org' ? 2335068 : 2383163);
$('.player-container').height($(window).height()); _vkontakte.init();
$('.playlist').height($(window).height() - $('.player').height() - $('.player-container .additional-controls').height()); _ajax = new Ajax();
$('.data-container').scrollbar(); _player = new Player();
return $('.playlist').scrollbar(); _player.initJplayer();
}; _search = new Search();
BeatHaven.prototype.checkRedrawScrollbar = function() { _pages = new Pages();
var focused_id, outer_height; _settings = new Settings();
return _ajax.detectPage();
};
BeatHaven.prototype.adjustSizes = function() {
$('.data-container').height($(window).height() - $('.header-container').height());
$('.data-container').width($(window).width() - $('.player').width());
$('.player-container').height($(window).height());
$('.playlist').height($(window).height() - $('.player').height() - $('.player-container .additional-controls').height());
$('.data-container').scrollbar();
return $('.playlist').scrollbar();
};
BeatHaven.prototype.checkRedrawScrollbar = function() {
var focused_id, outer_height;
focused_id = false;
if (document.activeElement.id != null) {
focused_id = document.activeElement.id;
}
outer_height = $('.data-container > div').outerHeight();
if (outer_height > 300 && outer_height !== this.last_height) {
this.last_height = outer_height;
this.redrawScrollbar();
}
if (focused_id) {
document.getElementById(focused_id).focus();
focused_id = false; focused_id = false;
if (document.activeElement.id != null) {
focused_id = document.activeElement.id;
}
outer_height = $('.data-container > div').outerHeight();
if (outer_height > 300 && outer_height !== this.last_height) {
this.last_height = outer_height;
this.redrawScrollbar();
}
if (focused_id) {
document.getElementById(focused_id).focus();
focused_id = false;
}
return window.setTimeout(function() {
return beathaven.checkRedrawScrollbar();
}, 500);
};
BeatHaven.prototype.redrawScrollbar = function() {
$('.data-container').html($('.data-container').find('.inner').first());
return $('.data-container').scrollbar();
};
return BeatHaven;
})();
String.prototype.htmlsafe = function() {
var item, replaces, str, _i, _len;
replaces = [["\\", "\\\\"], ["\"", "&quot;"], ["<", "&lt;"], [">", "&gt;"]];
str = this;
for (_i = 0, _len = replaces.length; _i < _len; _i++) {
item = replaces[_i];
str = str.replace(item[0], item[1]);
} }
return str; return window.setTimeout(function() {
return _beathaven.checkRedrawScrollbar();
}, 500);
}; };
String.prototype.trim = function() { BeatHaven.prototype.redrawScrollbar = function() {
var str; $('.data-container').html($('.data-container').find('.inner').first());
str = this; return $('.data-container').scrollbar();
while (str.indexOf(' ') !== -1) {
str = str.replace(' ', ' ');
}
if (str.charAt(0) === ' ') {
str = str.substring(1);
}
if (str.charAt(str.length - 1) === ' ') {
str = str.substring(0, str.length - 1);
}
return str;
}; };
}).call(this); return BeatHaven;
})();
String.prototype.htmlsafe = function() {
var item, replaces, str, _i, _len;
replaces = [["\\", "\\\\"], ["\"", "&quot;"], ["<", "&lt;"], [">", "&gt;"]];
str = this;
for (_i = 0, _len = replaces.length; _i < _len; _i++) {
item = replaces[_i];
str = str.replace(item[0], item[1]);
}
return str;
};
String.prototype.trim = function() {
var str;
str = this;
while (str.indexOf(' ') !== -1) {
str = str.replace(' ', ' ');
}
if (str.charAt(0) === ' ') {
str = str.substring(1);
}
if (str.charAt(str.length - 1) === ' ') {
str = str.substring(0, str.length - 1);
}
return str;
};

View File

@ -1,14 +1,9 @@
/* DO NOT MODIFY. This file was compiled Mon, 27 Jun 2011 17:49:39 GMT from var Pages;
* /Users/chez/Sites/beathaven/app/coffeescripts/pages.coffee Pages = (function() {
*/ function Pages() {}
Pages.prototype.renderArtist = function(data) {
(function() { var albums_info, artist_info;
var Pages; artist_info = $('\
Pages = (function() {
function Pages() {}
Pages.prototype.renderArtist = function(data) {
var albums_info, artist_info;
artist_info = $('\
<div class="artist-info">\ <div class="artist-info">\
<div class="pic">\ <div class="pic">\
<img src="' + data.artist.pic + '" alt="' + data.artist.name + '" width="250" />\ <img src="' + data.artist.pic + '" alt="' + data.artist.name + '" width="250" />\
@ -18,11 +13,11 @@
' + data.artist.desc + '\ ' + data.artist.desc + '\
</div>\ </div>\
</div>'); </div>');
albums_info = $('<div class="albums"></div>'); albums_info = $('<div class="albums"></div>');
$.each(data.albums, function(i, album) { $.each(data.albums, function(i, album) {
var album_info; var album_info;
if (album.year != null) { if (album.year != null) {
album_info = $('\ album_info = $('\
<div class="album">\ <div class="album">\
<h2 class="name">' + album.name + ' (' + album.year + ')</h2>\ <h2 class="name">' + album.name + ' (' + album.year + ')</h2>\
<div class="pic">\ <div class="pic">\
@ -34,9 +29,9 @@
<div class="tracklist"><ul></ul></div>\ <div class="tracklist"><ul></ul></div>\
</div>\ </div>\
<div class="kaboom"></div>'); <div class="kaboom"></div>');
$.each(album.tracks.album, function(i, track) { $.each(album.tracks.album, function(i, track) {
var track_info; var track_info;
track_info = $('\ track_info = $('\
<li>\ <li>\
<div class="add-track button gray">+</div>\ <div class="add-track button gray">+</div>\
<div class="track-container">\ <div class="track-container">\
@ -46,51 +41,53 @@
<div class="length">' + track.duration + '</div>\ <div class="length">' + track.duration + '</div>\
</div>\ </div>\
</li>'); </li>');
return $(album_info).find('.tracklist ul').append(track_info); return $(album_info).find('.tracklist ul').append(track_info);
}); });
return $(albums_info).append(album_info); return $(albums_info).append(album_info);
}
});
$('.data-container').css({
backgroundImage: 'none'
});
$('.data-container .inner').html('').append(artist_info).append(albums_info);
yaCounter7596904.hit(_ajax.getAnchor(), data.artist.name, _ajax.referer);
_ajax.setTitle(data.artist.name);
return false;
};
Pages.prototype.renderSearch = function(data) {
$('.data-container').css({
background: 'url(/images/concrete_wall_2.png) 0 -30px repeat'
});
$('.data-container .inner').html(data);
$('.search-container').css('marginLeft', ($('.data-container').width() - 425) / 2 + 'px').css('marginTop', ($('.data-container').height() / 2 - 230) + 'px').height(($('.data-container').height() - $('#search_form').height()) / 2);
setTimeout(function() {
$('#search_field').bh_autocomplete({
serviceUrl: '/artist/autocomplete',
minChars: 2,
delimiter: /(,|;)\s*/,
maxHeight: 400,
width: 415,
zIndex: 9999,
deferRequestBy: 500,
onSelect: function() {
return _ajax.loadArtistData($('#search_field').val());
} }
}); });
$('.data-container').css({ return $('#search_field').focus();
backgroundImage: 'none' }, 501);
}); yaCounter7596904.hit(_ajax.getAnchor(), 'Artist Search', _ajax.referer);
$('.data-container .inner').html('').append(artist_info).append(albums_info); _ajax.setTitle('Artist Search');
yaCounter7596904.hit(ajax.getAnchor(), data.artist.name, ajax.referer); return false;
return ajax.setTitle(data.artist.name); };
}; Pages.prototype.renderSettings = function(data) {
Pages.prototype.renderSearch = function(data) { $('.data-container').css({
$('.data-container').css({ background: 'none'
background: 'url(/images/concrete_wall_2.png) 0 -30px repeat' });
}); $('.data-container .inner').html(data);
$('.data-container .inner').html(data); yaCounter7596904.hit(_ajax.getAnchor(), 'Settings', _ajax.referer);
$('.search-container').css('marginLeft', ($('.data-container').width() - 425) / 2 + 'px').css('marginTop', ($('.data-container').height() / 2 - 230) + 'px').height(($('.data-container').height() - $('#search_form').height()) / 2); _ajax.setTitle('Settings');
setTimeout(function() { $('.settings-container .tabs .tab').first().trigger('click');
$('#search_field').bh_autocomplete({ return false;
serviceUrl: '/artist/autocomplete', };
minChars: 2, return Pages;
delimiter: /(,|;)\s*/, })();
maxHeight: 400,
width: 415,
zIndex: 9999,
deferRequestBy: 500,
onSelect: function() {
return ajax.loadArtistData();
}
});
return $('#search_field').focus();
}, 501);
yaCounter7596904.hit(ajax.getAnchor(), 'Artist Search', ajax.referer);
return ajax.setTitle('Artist Search');
};
Pages.prototype.renderSettings = function(data) {
$('.data-container').css({
background: 'none'
});
$('.data-container .inner').html(data);
yaCounter7596904.hit(ajax.getAnchor(), 'Settings', ajax.referer);
ajax.setTitle('Settings');
return $('.settings-container .tabs .tab').first().trigger('click');
};
return Pages;
})();
}).call(this);

View File

@ -1,285 +1,276 @@
/* DO NOT MODIFY. This file was compiled Mon, 27 Jun 2011 17:49:39 GMT from var Player;
* /Users/chez/Sites/beathaven/app/coffeescripts/player.coffee Player = (function() {
*/ function Player() {}
Player.prototype.bar_width = 330;
(function() { Player.prototype.jp = null;
var Player; Player.prototype.scrobbled = false;
Player = (function() { Player.prototype.initJplayer = function() {
function Player() {} var self;
Player.prototype.bar_width = 330; self = this;
Player.prototype.jp = null; this.jp = $("#jplayer");
Player.prototype.scrobbled = false; this.jp.jPlayer({
Player.prototype.initJplayer = function() { swfPath: "/js",
var self; supplied: "mp3",
self = this; cssSelectorAncestor: "",
this.jp = $("#jplayer"); cssSelector: {
this.jp.jPlayer({ play: ".player .play",
swfPath: "/js", pause: ".player .pause",
supplied: "mp3", stop: "",
cssSelectorAncestor: "", videoPlay: "",
cssSelector: { seekBar: "",
play: "#player .play", playBar: "",
pause: "#player .pause", mute: "",
stop: "", unmute: "",
videoPlay: "", volumeBar: "",
seekBar: "", volumeBarValue: "",
playBar: "", currentTime: "",
mute: "", duration: ""
unmute: "",
volumeBar: "",
volumeBarValue: "",
currentTime: "",
duration: ""
}
});
this.jp.bind($.jPlayer.event.timeupdate, function(e) {
var $obj, data;
data = e.jPlayer.status;
if (!Player.scrobbled && data.currentPercentAbsolute > 50) {
$obj = $('.playlist-tracks li.now');
self.scrobble($obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track'));
Player.scrobbled = true;
}
$('#player .progress .loaded').width(data.seekPercent * self.bar_width / 100);
return $('#player .progress .played').width(data.currentPercentAbsolute * self.bar_width / 100);
});
this.jp.bind($.jPlayer.event.ended, function(e) {
var next;
next = self.nextTrack();
if (!next) {
$('#jplayer').jPlayer('clearMedia');
$('#player .now-playing').html('Nothing left to <strike>lose</strike> play');
$('#player .loaded, #player .played').width(0);
return $('.playlist-tracks li').removeClass('now');
} else {
return self.setTrack(next);
}
});
return false;
};
Player.prototype.addTrack = function(artist, album, track, length, autoplay) {
var initial_count;
if (!(autoplay != null)) {
autoplay = false;
} }
initial_count = $('.playlist-tracks li').length; });
$('.playlist-tracks').append('\ this.jp.bind($.jPlayer.event.timeupdate, function(e) {
var $obj, data;
data = e.jPlayer.status;
if (!_player.scrobbled && data.currentPercentAbsolute > 50) {
$obj = $('.playlist-tracks li.now');
self.scrobble($obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track'));
_player.scrobbled = true;
}
$('.player .progress .loaded').width(data.seekPercent * self.bar_width / 100);
return $('.player .progress .played').width(data.currentPercentAbsolute * self.bar_width / 100);
});
this.jp.bind($.jPlayer.event.ended, function(e) {
var next;
next = self.nextTrack();
if (!next) {
$('#jplayer').jPlayer('clearMedia');
$('.player .now-playing').html('Nothing left to <strike>lose</strike> play');
$('.player .loaded, .player .played').width(0);
return $('.playlist-tracks li').removeClass('now');
} else {
return self.setTrack(next);
}
});
return false;
};
Player.prototype.addTrack = function(artist, album, track, length, autoplay) {
var initial_count;
if (!(autoplay != null)) {
autoplay = false;
}
initial_count = $('.playlist-tracks li').length;
$('.playlist-tracks').append('\
<li id="i' + Math.round(Math.random() * 999999) + '" data-artist="' + artist.trim() + '" data-album="' + album.trim() + '" data-track="' + track.trim() + '" data-length="' + length + '">\ <li id="i' + Math.round(Math.random() * 999999) + '" data-artist="' + artist.trim() + '" data-album="' + album.trim() + '" data-track="' + track.trim() + '" data-length="' + length + '">\
<div class="item">\ <div class="item">\
<div class="fade"></div>\ <div class="fade"></div>\
<span class="title" title="' + artist.htmlsafe() + ' &mdash ' + track.htmlsafe() + '">' + artist + ' &mdash ' + track + '</span>\ <span class="title" title="' + artist.htmlsafe() + " &mdash; " + track.htmlsafe() + '">' + artist + ' &mdash; ' + track + '</span>\
<span class="duration">' + length + '</span>\ <span class="duration">' + length + '</span>\
<div class="remove">remove</div>\ <div class="remove">remove</div>\
</div>\ </div>\
</li>'); </li>');
$('#playlist').html($('.playlist-tracks')).scrollbar(); $('.playlist').html($('.playlist-tracks')).scrollbar();
$('.playlist-tracks').sortable(); $('.playlist-tracks').sortable();
if (autoplay) { if (autoplay) {
return Player.setTrack($('.playlist-tracks li').last().attr('id').split('i')[1]); return _player.setTrack($('.playlist-tracks li').last().attr('id').split('i')[1]);
} else if (initial_count === 0 && !Player.hasTrack()) { } else if (initial_count === 0 && !_player.hasTrack()) {
return Player.setTrack($('.playlist-tracks li').first().attr('id').split('i')[1]); return _player.setTrack($('.playlist-tracks li').first().attr('id').split('i')[1]);
} }
}; };
Player.prototype.setTrack = function(id) { Player.prototype.setTrack = function(id) {
var $obj, query; var $obj, query;
$obj = $('#i' + id); $obj = $('#i' + id);
query = $obj.attr('data-artist') + ' &mdash ' + $obj.attr('data-track'); query = $obj.attr('data-artist') + ' &mdash; ' + $obj.attr('data-track');
$('#player .now-playing').html(query + '<div class="fade"></div>'); $('.player .now-playing').html(query + '<div class="fade"></div>');
$('.playlist-tracks li').removeClass('now'); $('.playlist-tracks li').removeClass('now');
$obj.addClass('now'); $obj.addClass('now');
$('#player .loaded, #player .played').width(0); $('.player .loaded, .player .played').width(0);
vkontakte.loadTracksData($obj.attr('data-artist'), $obj.attr('data-track'), $obj.attr('data-length'), function() { _vkontakte.loadTracksData($obj.attr('data-artist'), $obj.attr('data-track'), $obj.attr('data-length'), function(url) {
return player.playSource(); return _player.playSource(url);
}); });
return this.updateNowListening($obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track')); return this.updateNowListening($obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track'));
}; };
Player.prototype.hasTrack = function() { Player.prototype.hasTrack = function() {
if ($('#jplayer audio').length > 0) { if ($('#jplayer audio').length > 0) {
return $('#jplayer audio').attr('src') != null; return $('#jplayer audio').attr('src') != null;
} else if ($('#jplayer object').length > 0) { } else if ($('#jplayer object').length > 0) {
$('#jplayer').jPlayer('play');
true;
}
return false;
};
Player.prototype.playSource = function(url) {
$('#jplayer').jPlayer('setMedia', {
mp3: url
});
$('#jplayer').jPlayer('play'); $('#jplayer').jPlayer('play');
return this.scrobbled = false; true;
}; }
Player.prototype.nextTrack = function(manual) { return false;
var $li, cnt, rnd; };
manual = manual != null; Player.prototype.playSource = function(url) {
cnt = $('.playlist-tracks li').length; $('#jplayer').jPlayer('setMedia', {
if (!this.onShuffle()) { mp3: url
if ($('.playlist-tracks .now').next().length === 0) { });
if (Player.onRepeat() || manual) { $('#jplayer').jPlayer('play');
return $('.playlist-tracks li').first().attr('id').split('i')[1]; return this.scrobbled = false;
} else { };
false; Player.prototype.nextTrack = function(manual) {
} var $li, cnt, rnd;
manual = manual != null;
cnt = $('.playlist-tracks li').length;
if (!this.onShuffle()) {
if ($('.playlist-tracks .now').next().length === 0) {
if (_player.onRepeat() || manual) {
return $('.playlist-tracks li').first().attr('id').split('i')[1];
} else { } else {
return $('.playlist-tracks .now').next().attr('id').split('i')[1]; false;
} }
} else if (cnt === 1) {
return $('.playlist-tracks li').first().attr('id').split('i')[1];
} else { } else {
while (true) { return $('.playlist-tracks .now').next().attr('id').split('i')[1];
rnd = Math.floor(Math.random() * (cnt + .999)); }
$li = $('.playlist-tracks li').eq(rnd); } else if (cnt === 1) {
if ($li.length > 0 && !$li.hasClass('now')) { return $('.playlist-tracks li').first().attr('id').split('i')[1];
return $li.attr('id').split('i')[1]; } else {
} while (true) {
rnd = Math.floor(Math.random() * (cnt + .999));
$li = $('.playlist-tracks li').eq(rnd);
if ($li.length > 0 && !$li.hasClass('now')) {
return $li.attr('id').split('i')[1];
} }
} }
return false; }
}; return false;
Player.prototype.prevTrack = function() { };
var $li, cnt, rnd; Player.prototype.prevTrack = function() {
cnt = $('.playlist-tracks li').length; var $li, cnt, rnd;
if (!Player.onShuffle()) { cnt = $('.playlist-tracks li').length;
if ($('.playlist-tracks .now').prev().length === 0) { if (!_player.onShuffle()) {
return $('.playlist-tracks li').last().attr('id').split('i')[1]; if ($('.playlist-tracks .now').prev().length === 0) {
} else { return $('.playlist-tracks li').last().attr('id').split('i')[1];
return $('.playlist-tracks .now').prev().attr('id').split('i')[1];
}
} else if (cnt === 1) {
return $('.playlist-tracks li').first().attr('id').split('i')[1];
} else { } else {
while (true) { return $('.playlist-tracks .now').prev().attr('id').split('i')[1];
rnd = Math.floor(Math.random() * (cnt + .999)); }
$li = $('.playlist-tracks li').eq(rnd); } else if (cnt === 1) {
if ($li.length > 0 && !$li.hasClass('now')) { return $('.playlist-tracks li').first().attr('id').split('i')[1];
return $li.attr('id').split('i')[1]; } else {
} while (true) {
rnd = Math.floor(Math.random() * (cnt + .999));
$li = $('.playlist-tracks li').eq(rnd);
if ($li.length > 0 && !$li.hasClass('now')) {
return $li.attr('id').split('i')[1];
} }
} }
return false;
};
Player.prototype.onShuffle = function() {
return $('#shuffle').hasClass('active');
};
Player.prototype.onRepeat = function() {
return $('#repeat').hasClass('active');
};
Player.prototype.updateNowListening = function(artist, album, track) {
if (session.user.lastfm_username) {
return session.query('/lastfm/listening?r=' + Math.random(), {
artist: artist,
album: album,
track: track
});
}
};
Player.prototype.scrobble = function(artist, album, track) {
if (session.user.lastfm_username) {
return session.query('/lastfm/scrobble?r=' + Math.random(), {
artist: artist,
album: album,
track: track
});
}
};
return Player;
})();
$(function() {
return player.initJplayer();
});
$('#player .controls .prev').live('click', function() {
Player.setTrack(Player.prevTrack());
return false;
});
$('#player .controls .next').live('click', function() {
Player.setTrack(Player.nextTrack(true));
return false;
});
$('#player .play').live('click', function() {
if ($('.playlist-tracks li').length > 0 && !Player.hasTrack()) {
player.setTrack($('.playlist-tracks li').first().attr('id').split('i')[1]);
} }
return false; return false;
}); };
$('#player .progress').live('click', function(e) { Player.prototype.onShuffle = function() {
$('#jplayer').jPlayer('playHead', Math.round((e.offsetX / Player.bar_width) * 100)); return $('#shuffle').hasClass('active');
return false; };
}); Player.prototype.onRepeat = function() {
$('#repeat, #shuffle').live('click', function() { return $('#repeat').hasClass('active');
$(this).toggleClass('active'); };
return false; Player.prototype.updateNowListening = function(artist, album, track) {
}); if (_session.getUser().lastfm_username) {
$('#empty-playlist').live('click', function() { return _session.query('/lastfm/listening?r=' + Math.random(), {
if (confirm('Are you sure?')) { artist: artist,
$('.playlist-tracks li').remove(); album: album,
$('#jplayer').jPlayer('clearMedia'); track: track
$('#player .now-playing').text('Add some music to playlist'); });
$('#player .loaded, #player .played').width(0);
} }
return false; };
}); Player.prototype.scrobble = function(artist, album, track) {
$('.playlist-tracks li .fade, .playlist-tracks li .duration, .playlist-tracks li .remove').live('mouseover mouseout', function(e) { if (_session.getUser().lastfm_username) {
if (e.type === 'mouseover') { return _session.query('/lastfm/scrobble?r=' + Math.random(), {
$(this).parent().find('.duration').hide(); artist: artist,
$(this).parent().find('.remove').show(); album: album,
} else { track: track
$(this).parent().find('.remove').hide(); });
$(this).parent().find('.duration').show();
} }
return false; };
}); return Player;
$('.playlist-tracks li .remove').live('click', function() { })();
var $li; $('.player .controls .prev').live('click', function() {
$li = $(this).parent().parent(); _player.setTrack(_player.prevTrack());
if ($li.hasClass('now')) { return false;
$('#jplayer').jPlayer('clearMedia'); });
$('#player .now-playing').text('...'); $('.player .controls .next').live('click', function() {
$('#player .loaded, #player .played').width(0); _player.setTrack(_player.nextTrack(true));
} return false;
$li.remove(); });
return false; $('.player .play').live('click', function() {
}); if ($('.playlist-tracks li').length > 0 && !_player.hasTrack()) {
$('.playlist-tracks li').live('dblclick', function() { _player.setTrack($('.playlist-tracks li').first().attr('id').split('i')[1]);
player.setTrack($(this).attr('id').split('i')[1]); }
return false; return false;
}); });
$('.add-album').live('click', function() { $('.player .progress').live('click', function(e) {
var album, artist, item, length, track_name, _i, _len, _ref; $('#jplayer').jPlayer('playHead', Math.round((e.offsetX / _player.bar_width) * 100));
artist = $('.artist-info .name').html(); return false;
album = $(this).parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, ''); });
_ref = $(this).parent().parent().parent().find('.tracklist li'); $('#repeat, #shuffle').live('click', function() {
for (_i = 0, _len = _ref.length; _i < _len; _i++) { $(this).toggleClass('active');
item = _ref[_i]; return false;
track_name = $(item).find('.trackname').html(); });
length = $(item).find('.length').html(); $('#empty-playlist').live('click', function() {
Player.addTrack(artist, album, track_name, length); if (confirm('Are you sure?')) {
} $('.playlist-tracks li').remove();
return false; $('#jplayer').jPlayer('clearMedia');
}); $('.player .now-playing').text('Add some music to playlist');
$('.add-track').live('click', function() { $('.player .loaded, .player .played').width(0);
var album, artist, length, track_name; }
artist = $('.artist-info .name').html(); return false;
album = $(this).parent().parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, ''); });
track_name = $(this).parent().find('.trackname').html(); $('.playlist-tracks li .fade, .playlist-tracks li .duration, .playlist-tracks li .remove').live('mouseover mouseout', function(e) {
length = $(this).parent().find('.length').html(); if (e.type === 'mouseover') {
Player.addTrack(artist, album, track_name, length); $(this).parent().find('.duration').hide();
return false; $(this).parent().find('.remove').show();
}); } else {
$('.tracklist li').live('mouseover mouseout', function(e) { $(this).parent().find('.remove').hide();
if (e.type === 'mouseover') { $(this).parent().find('.duration').show();
$(this).find('.add-track').show(); }
} else { return false;
$(this).find('.add-track').hide(); });
} $('.playlist-tracks li .remove').live('click', function() {
return false; var $li;
}); $li = $(this).parent().parent();
$('.tracklist li').live('dblclick', function(e) { if ($li.hasClass('now')) {
var album, artist, length, track_name; $('#jplayer').jPlayer('clearMedia');
artist = $('.artist-info .name').html(); $('.player .now-playing').text('...');
album = $(this).parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, ''); $('.player .loaded, .player .played').width(0);
track_name = $(this).find('.trackname').html(); }
length = $(this).find('.length').html(); $li.remove();
Player.addTrack(artist, album, track_name, length, true); return false;
return false; });
}); $('.playlist-tracks li').live('dblclick', function() {
}).call(this); _player.setTrack($(this).attr('id').split('i')[1]);
return false;
});
$('.add-album').live('click', function() {
var album, artist, item, length, track_name, _i, _len, _ref;
artist = $('.artist-info .name').html();
album = $(this).parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, '');
_ref = $(this).parent().parent().parent().find('.tracklist li');
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
item = _ref[_i];
track_name = $(item).find('.trackname').html();
length = $(item).find('.length').html();
_player.addTrack(artist, album, track_name, length);
}
return false;
});
$('.add-track').live('click', function() {
var album, artist, length, track_name;
artist = $('.artist-info .name').html();
album = $(this).parent().parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, '');
track_name = $(this).parent().find('.trackname').html();
length = $(this).parent().find('.length').html();
_player.addTrack(artist, album, track_name, length);
return false;
});
$('.tracklist li').live('mouseover mouseout', function(e) {
if (e.type === 'mouseover') {
$(this).find('.add-track').show();
} else {
$(this).find('.add-track').hide();
}
return false;
});
$('.tracklist li').live('dblclick', function(e) {
var album, artist, length, track_name;
artist = $('.artist-info .name').html();
album = $(this).parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, '');
track_name = $(this).find('.trackname').html();
length = $(this).find('.length').html();
_player.addTrack(artist, album, track_name, length, true);
return false;
});

View File

@ -1,81 +1,73 @@
/* DO NOT MODIFY. This file was compiled Mon, 27 Jun 2011 17:49:39 GMT from var Search;
* /Users/chez/Sites/beathaven/app/coffeescripts/search.coffee Search = (function() {
*/ function Search() {}
Search.prototype.pics = [];
(function() { Search.prototype.showSpinner = function() {
var Search; $('.search-container input').attr({
Search = (function() { disabled: 'disabled'
function Search() {} }).blur();
Search.prototype.pics = []; $('.search-container img').show();
Search.prototype.showSpinner = function() { $('.autocomplete-container').hide();
$('.search-container input').attr({ $('.artist_loading.failed').hide();
disabled: 'disabled' this.hideSuggestions();
}).blur(); return false;
$('.search-container img').show(); };
$('.autocomplete-container').hide(); Search.prototype.hideSpinner = function() {
$('.artist_loading.failed').hide(); $('.search-container input').removeAttr('disabled');
this.hideSuggestions(); $('.search_field').focus();
return false; $('.search-container img').hide();
}; return false;
Search.prototype.hideSpinner = function() { };
$('.search-container input').removeAttr('disabled'); Search.prototype.showSuggestions = function(values) {
$('.search_field').focus(); var item, _i, _len;
$('.search-container img').hide(); for (_i = 0, _len = values.length; _i < _len; _i++) {
return false; item = values[_i];
}; $('.suggestions ul').append('\
Search.prototype.showSuggestions = function(values) {
var item, _i, _len;
for (_i = 0, _len = values.length; _i < _len; _i++) {
item = values[_i];
$('.suggestions ul').append('\
<li>\ <li>\
<a class="data artist">' + item.name + '</a>\ <a class="data artist">' + item.name + '</a>\
' + (item.desc ? '<br/><span>' + item.desc(+'</span>') : '') + '\ ' + (item.desc != null ? '<br/><span>' + item.desc + '</span>' : '') + '\
</li>'); </li>');
} }
$('.suggestions').show(); $('.suggestions').show();
return false; return false;
}; };
Search.prototype.hideSuggestions = function() { Search.prototype.hideSuggestions = function() {
$('.suggestions ul li').remove(); $('.suggestions ul li').remove();
$('.suggestions').hide(); $('.suggestions').hide();
return false; return false;
}; };
Search.prototype.showArtistPics = function(pics) { Search.prototype.showArtistPics = function(pics) {
var pic, _i, _len; var pic, _i, _len;
$('.artist_loading.ok, .artist_pics').show(); $('.artist_loading.ok, .artist_pics').show();
for (_i = 0, _len = pics.length; _i < _len; _i++) { for (_i = 0, _len = pics.length; _i < _len; _i++) {
pic = pics[_i]; pic = pics[_i];
if (this.pics.indexOf(pic) === -1) { if (this.pics.indexOf(pic) === -1) {
this.pics.push(pic); this.pics.push(pic);
$('.artist_pics').append('\ $('.artist_pics').append('\
<div class="pic">\ <div class="pic">\
<img src="' + pic + '" alt=""/>\ <img src="' + pic + '" alt=""/>\
</div>'); </div>');
}
} }
return false; }
}; return false;
Search.prototype.showError = function() { };
$('.artist_loading.ok, .artist_pics').hide(); Search.prototype.showError = function() {
$('.artist_loading.failed').show(); $('.artist_loading.ok, .artist_pics').hide();
return this.pics = []; $('.artist_loading.failed').show();
}; return this.pics = [];
return Search; };
})(); return Search;
$(function() { })();
$('.search').live('click', function() { $('.search').live('click', function() {
ajax.loadSearchPage(); _ajax.go('/search/');
return false; return false;
}); });
$('#search_form').live('submit', function() { $('#search_form').live('submit', function() {
$('.autocomplete-container').remove(); $('.autocomplete-container').remove();
ajax.loadArtistData($('#search_field').val()); _ajax.loadArtistData($('#search_field').val());
return false; return false;
}); });
return $('.suggestions a').live('click', function() { $('.suggestions a').live('click', function() {
$('#search_field').val($(this).text()); $('#search_field').val($(this).text());
return false; return false;
}); });
});
}).call(this);

View File

@ -1,34 +1,36 @@
/* DO NOT MODIFY. This file was compiled Mon, 27 Jun 2011 17:49:39 GMT from var Session;
* /Users/chez/Sites/beathaven/app/coffeescripts/session.coffee Session = (function() {
*/ Session.prototype.vk_params = null;
Session.prototype.user = null;
(function() { function Session(params) {
var Session; var attrs, key, _i, _len, _params;
Session = (function() { attrs = ['expire', 'mid', 'secret', 'sid', 'sig'];
Session.prototype.vk_params = null; _params = {};
Session.prototype.user = null; for (_i = 0, _len = attrs.length; _i < _len; _i++) {
function Session(vk_params) { key = attrs[_i];
this.vk_params = vk_params; if (params[key] != null) {
_params[key] = params[key];
}
} }
Session.prototype.query = function(url, params, callback) { this.vk_params = _params;
var attr, q_params, _i, _len; false;
q_params = this.vk_params; }
for (_i = 0, _len = params.length; _i < _len; _i++) { Session.prototype.setUser = function(user) {
attr = params[_i]; this.user = user;
q_params[attr] = params[attr]; return false;
} };
$.post(url, q_params, callback); Session.prototype.getUser = function() {
return false; return this.user;
}; };
Session.prototype.setVkParams = function(params) { Session.prototype.query = function(url, params, callback) {
var attrs, key, _i, _len; var attr, q_params, _i, _len;
attrs = ['expire', 'mid', 'secret', 'sid', 'sig']; q_params = this.vk_params;
for (_i = 0, _len = attrs.length; _i < _len; _i++) { for (_i = 0, _len = params.length; _i < _len; _i++) {
key = attrs[_i]; attr = params[_i];
this.vk_params[key] = params[key]; q_params[attr] = params[attr];
} }
return false; $.post(url, q_params, callback);
}; return false;
return Session; };
})(); return Session;
}).call(this); })();

View File

@ -1,54 +1,48 @@
/* DO NOT MODIFY. This file was compiled Mon, 27 Jun 2011 14:00:02 GMT from var Settings;
* /Users/chez/Sites/beathaven/app/coffeescripts/settings.coffee Settings = (function() {
*/ function Settings() {}
Settings.prototype.getAccountInfo = function(callback) {
(function() { return _session.query('/user/update/', {}, callback);
var Settings; };
Settings = (function() { Settings.prototype.saveAccountInfo = function(params, callback) {
function Settings() {} return _session.query('/user/update', params, callback);
Settings.prototype.getAccountInfo = function(callback) { };
return session.query('/user/update/', {}, callback); Settings.prototype.loadFormData = function(form) {
}; if (form === 'account') {
Settings.prototype.saveAccountInfo = function(params, callback) { $('.settings-container .form input[name$="username"]').val(_session.getUser().name);
return session.query('/user/update', params, callback); return $('.settings-container .form input[name$="email"]').val(_session.getUser().email);
}; } else if (form === 'lastfm') {
Settings.prototype.loadFormData = function(form) { if (_session.getUser().lastfm_username) {
if (form === 'account') { return $('.form-container input[name$="username"]').first().val(_session.getUser().lastfm_username);
$('.settings-container .form input[name$="username"]').val(session.user.name);
return $('.settings-container .form input[name$="email"]').val(session.email);
} else if (form === 'lastfm') {
if (this.user.lastfm_username) {
return $('.form-container input[name$="username"]').first().val(session.lastfm_username);
}
} }
}
};
return Settings;
})();
$('.settings').live('click', function() {
return _ajax.go('/settings/');
});
$('.settings-container .tabs .tab').live('click', function() {
if (!$(this).hasClass('active')) {
$('.settings-container .tabs .tab').removeClass('active');
$(this).addClass('active');
$('.form-container').html($('.forms .' + $(this).attr('data-fieldset')).html());
return _settings.loadFormData($(this).attr('data-fieldset'));
}
});
$('.lastfm-connect').live('click', function() {
return window.open(_session.getUser().lastfm_login_url);
});
$('.settings-container .form input').live('blur', function() {
var active_tab, params;
active_tab = $('.settings-container .tabs .tab.active').attr('data-fieldset');
if (active_tab === 'account') {
params = {
username: $('.settings-container .form input[name$="username"]').first().val(),
email: $('.settings-container .form input[name$="email"]').first().val()
}; };
return Settings; return _settings.saveAccountInfo(params, function() {
})(); return $('#header-container .hello .greating').text('Hi there, ' + (params.username.length > 0 ? params.username : '%username%') + '!');
$('.settings').live('click', function() { });
return ajax.loadSettingsPage(); }
}); });
$('.settings-container .tabs .tab').live('click', function() {
if ($(this).hasClass('active')) {
$('.settings-container .tabs .tab').removeClass('active');
$(this).addClass('active');
$('.form-container').html($('.forms .' + $(this).attr('data-fieldset')).html());
return settings.loadFormData($(this).attr('data-fieldset'));
}
});
$('.lastfm-connect').live('click', function() {
return window.open(session.user.lastfm_login_url);
});
$('.settings-container .form input').live('blur', function() {
var active_tab, params;
active_tab = $('.settings-container .tabs .tab.active').attr('data-fieldset');
if (active_tab === 'account') {
params = {
username: $('.settings-container .form input[name$="username"]').first().val(),
email: $('.settings-container .form input[name$="email"]').first().val()
};
return settings.saveAccountInfo(params, function() {
return $('#header-container .hello .greating').text('Hi there, ' + (params.username.length > 0 ? params.username : '%username%') + '!');
});
}
});
}).call(this);

View File

@ -1,121 +1,127 @@
/* DO NOT MODIFY. This file was compiled Mon, 27 Jun 2011 17:49:39 GMT from var Vkontakte;
* /Users/chez/Sites/beathaven/app/coffeescripts/vkontakte.coffee Vkontakte = (function() {
*/ Vkontakte.prototype.qr = null;
function Vkontakte(api_id) {
(function() { this.api_id = api_id;
var Vkontakte; }
Vkontakte = (function() { Vkontakte.prototype.init = function() {
Vkontakte.prototype.qr = []; this.qr = [];
function Vkontakte(api_id) { VK.init({
this.api_id = api_id; apiId: this.api_id
} });
Vkontakte.prototype.init = function() { return VK.Auth.getLoginStatus(this.authInfo);
VK.init({ };
apiId: this.api_id, Vkontakte.prototype.authInfo = function(response) {
nameTransportPath: '/xd_receiver.html' var _session;
if (typeof response !== 'undefined' && response.session) {
_session = new Session(response.session);
$('#vk_login, .auth_notice').hide();
$('#vk_logout').css({
display: 'block'
}); });
return VK.Auth.getLoginStatus(this.authInfo); if ($('#search_field').length > 0) {
}; $('#search_field').focus();
Vkontakte.prototype.authInfo = function(response) { }
if (typeof response !== 'undefined' && response.session) { _session.query('/user/auth', {}, function(ar) {
session.setVkParams(response.session); if (ar.newbie) {
$('#vk_login, .auth_notice').hide(); VK.Api.call('getVariable', {
$('#vk_logout').css({ key: 1281
display: 'block' }, function(r) {
}); return _session.query('/user/update', {
if ($('#search_field').length > 0) { name: r.response
$('#search_field').focus(); }, function(ar2) {
} _session.setUser(ar2.user);
return session.query('/user/auth', {}, function(ar) { return $('.header-container .hello .greating').text('Hi there, ' + (_session.getUser().name ? _session.getUser().name : '%username%') + '!');
if (ar.newbie) {
VK.Api.call('getVariable', {
key: 1281
}, function(r) {
return Session.query('/user/update', {
name: r.response
}, function(ar2) {
session.user = ar2.user;
return $('#header-container .hello .greating').text('Hi there, ' + (session.user.name ? session.user.name : '%username%') + '!');
});
}); });
} else { });
session.user = ar.user;
}
return $('#header-container .hello .greating').text('Hi there, ' + (session.user.name ? session.user.name : '%username%') + '!');
});
} else {
$('#vk_login, .auth_notice').css({
display: 'block'
});
return $('#vk_logout').hide();
}
};
Vkontakte.prototype.loadTracksData = function(artist, track, duration, callback) {
var query, track_prepared;
track_prepared = track.replace(/\(.*\)/i, '').split('/')[0];
query = artist(+' ' + track_prepared);
if (this.qr[query] != null) {
return callback(this.qr[query]);
} else {
return VK.Api.call('audio.search', {
q: query
}, function(r) {
var url;
url = this.matchPerfectResult(r.response, artist, track, duration);
this.qr[query] = url;
return callback(url);
});
}
};
Vkontakte.prototype.matchPerfectResult = function(data, artist, track, duration) {
var best_result, best_score, delta, item, score, _i, _len;
duration = duration.split(':');
duration = parseInt(duration[0], 10) * 60 + parseInt(duration[1], 10);
best_score = 0;
best_result = null;
for (_i = 0, _len = data.length; _i < _len; _i++) {
item = data[_i];
score = 0;
item.artist = item.artist.trim();
item.title = item.title.trim();
if (item.artist === artist) {
score += 10;
} else if (item.artist.split(artist).length === 2) {
score += 5;
} else if (item.title.split(artist).length === 2) {
score += 4;
}
if (item.title === track) {
score += 10;
} else if (item.title.split(track).length === 2) {
score += 5;
}
if (parseInt(item.duration, 10) === duration) {
score += 15;
} else { } else {
delta = Math.abs(parseInt(item.duration, 10) - duration); _session.setUser(ar.user);
if (delta < 10) {
score += 10 - delta;
}
} }
if (score > best_score) { return $('.header-container .hello .greating').text('Hi there, ' + (_session.getUser().name ? _session.getUser().name : '%username%') + '!');
best_score = score; });
best_result = item; } else {
} _session = new Session({});
if (score === 35) { $('#vk_login, .auth_notice').css({
return best_result.url; display: 'block'
});
$('#vk_logout').hide();
}
return window._session = _session;
};
Vkontakte.prototype.loadTracksData = function(artist, track, duration, callback) {
var query, track_prepared, url;
track_prepared = track.replace(/\(.*\)/i, '').split('/')[0];
query = artist + ' ' + track_prepared;
if (url = _vkontakte.getQR(query)) {
return callback(url);
} else {
return VK.Api.call('audio.search', {
q: query
}, function(r) {
r.response.splice(0, 1);
url = _vkontakte.matchPerfectResult(r.response, artist, track, duration);
_vkontakte.addQR(query, url);
return callback(url);
});
}
};
Vkontakte.prototype.matchPerfectResult = function(data, artist, track, duration) {
var best_result, best_score, delta, item, score, _i, _len;
duration = duration.split(':');
duration = parseInt(duration[0], 10) * 60 + parseInt(duration[1], 10);
best_score = 0;
best_result = null;
for (_i = 0, _len = data.length; _i < _len; _i++) {
item = data[_i];
score = 0;
item.artist = item.artist.trim();
item.title = item.title.trim();
if (item.artist === artist) {
score += 10;
} else if (item.artist.split(artist).length === 2) {
score += 5;
} else if (item.title.split(artist).length === 2) {
score += 4;
}
if (item.title === track) {
score += 10;
} else if (item.title.split(track).length === 2) {
score += 5;
}
if (parseInt(item.duration, 10) === duration) {
score += 15;
} else {
delta = Math.abs(parseInt(item.duration, 10) - duration);
if (delta < 10) {
score += 10 - delta;
} }
} }
return best_result.url; if (score > best_score) {
}; best_score = score;
return Vkontakte; best_result = item;
})(); }
$(function() { if (score === 35) {
$('#vk_login').click(function() { return best_result.url;
return VK.Auth.login(vkontakte.authInfo, 8); }
}); }
return $('#vk_logout').click(function() { return best_result.url;
return VK.Auth.logout(vkontakte.authInfo); };
}); Vkontakte.prototype.addQR = function(query, url) {
return this.qr[query] = url;
};
Vkontakte.prototype.getQR = function(query) {
if (this.qr[query] != null) {
this.qr[query];
}
return false;
};
return Vkontakte;
})();
$(function() {
$('#vk_login').click(function() {
return VK.Auth.login(_vkontakte.authInfo(), 8);
}); });
}).call(this); return $('#vk_logout').click(function() {
return VK.Auth.logout(_vkontakte.authInfo());
});
});