Upgrade to 3.1 step 2 - js

This commit is contained in:
magnolia-fan 2011-09-08 03:47:11 +04:00
parent 6982e0cb32
commit e59f959bac
27 changed files with 49 additions and 1170 deletions

View File

@ -120,6 +120,9 @@ GEM
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.29)
uglifier (1.0.3)
execjs (>= 0.3.0)
multi_json (>= 1.0.2)
xml-simple (1.1.0)
PLATFORMS
@ -138,3 +141,4 @@ DEPENDENCIES
sass
sqlite3
therubyracer
uglifier

View File

@ -1,4 +1,4 @@
class Ajax
class window.Ajax
referer: false

View File

@ -0,0 +1,14 @@
//= require jquery/jquery.autocomplete
//= require jquery/jquery.jplayer
//= require jquery/jquery.scroll
//= require locale
//= require vkontakte
//= require session
//= require ajax
//= require player
//= require search
//= require pages
//= require settings
//= require beathaven

View File

@ -1,27 +1,27 @@
# Registering global objects
_beathaven = null
_session = 1
_vkontakte = null
_ajax = null
_player = null
_search = null
_pages = null
_settings = null
window._beathaven = null
window._session = 1
window._vkontakte = null
window._ajax = null
window._player = null
window._search = null
window._pages = null
window._settings = null
$ ->
l = document.location
if l.host not in ['beathaven.org', 'dev.beathaven.org']
if l.hostname not in ['beathaven.org', 'dev.beathaven.org']
l.href = 'http://beathaven.org/'+ l.hash
_beathaven = new BeatHaven()
_beathaven.init()
window._beathaven = new BeatHaven()
window._beathaven.init()
$(window).resize ->
_beathaven.adjustSizes()
_beathaven.redrawScrollbar()
false
window.setTimeout ->
_beathaven.checkRedrawScrollbar()
window._beathaven.checkRedrawScrollbar()
false
, 500
@ -35,19 +35,19 @@ class BeatHaven
this.checkRedrawScrollbar()
# if document.location.host == 'beathaven.org' then 2335068 else 2383163
_vkontakte = new Vkontakte(2335068)
_vkontakte.init()
window._vkontakte = new Vkontakte(2335068)
window._vkontakte.init()
_ajax = new Ajax()
window._ajax = new Ajax()
_player = new Player()
_player.initJplayer()
window._player = new Player()
window._player.initJplayer()
_search = new Search()
window._search = new Search()
_pages = new Pages()
window._pages = new Pages()
_settings = new Settings()
window._settings = new Settings()
false

View File

@ -1,4 +1,4 @@
_locale =
window._locale =
# Global
SEARCH:
en: "Search"

View File

@ -1,4 +1,4 @@
class Pages
class window.Pages
renderArtist: (data) ->
artist_info = $ '

View File

@ -1,4 +1,4 @@
class Player
class window.Player
bar_width: 330
jp: null

View File

@ -1,4 +1,4 @@
class Search
class window.Search
pics: []

View File

@ -1,4 +1,4 @@
class Session
class window.Session
vk_params: null
user: null

View File

@ -1,4 +1,4 @@
class Settings
class window.Settings
getAccountInfo: (callback) ->
_session.query '/user/update/', {}, callback

View File

@ -1,4 +1,4 @@
class Vkontakte
class window.Vkontakte
qr: null
api_id: null

View File

@ -7,18 +7,7 @@
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/beathaven.css" />
<%= javascript_include_tag "http://code.jquery.com/jquery.min.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "http://code.jquery.com/ui/1.8.14/jquery-ui.min.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "jquery/jquery.autocomplete.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "jquery/jquery.jplayer.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "jquery/jquery.scroll.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "coffee/beathaven.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "coffee/locale.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/search.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "coffee/pages.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "coffee/settings.js", :type => "text/javascript", :charset => "utf-8" %>
<%= javascript_include_tag "application", :type => "text/javascript", :charset => "utf-8" %>
</head>
<body>
<div class="player-container">

View File

@ -2,10 +2,10 @@
Barista.configure do |c|
# Change the root to use app/scripts
c.root = Rails.root.join("app", "coffeescripts")
# c.root = Rails.root.join("app", "coffeescripts")
# Change the output root, causing Barista to compile into public/coffeescripts
c.output_root = Rails.root.join("public", "javascripts", "coffee")
# c.output_root = Rails.root.join("public", "assets", "coffee")
#
# Disable auto compile, use generated file directly:
# c.auto_compile = false

View File

@ -1,95 +0,0 @@
var Ajax;
Ajax = (function() {
function Ajax() {}
Ajax.prototype.referer = false;
Ajax.prototype.loadArtistData = function(name) {
_search.showSpinner();
name = name.split(' ').join('+');
$.get('/artist/' + name + '/', function(data) {
if (data.status != null) {
if (data.status === 'loading') {
_search.showArtistPics(data.pics);
setTimeout(function() {
return _ajax.loadArtistData(name);
}, 3000);
} else if (data.status === 'corrected') {
_ajax.loadArtistData(data.page);
} else if (data.status === 'suggestions') {
_search.hideSpinner();
_search.showSuggestions(data.values);
} else if (data.status === 'loading_failed') {
_search.hideSpinner();
_search.showError();
}
_beathaven.redrawScrollbar();
} else {
_ajax.setArchor('/artist/' + name + '/');
_pages.renderArtist(data);
}
return _search.hideSpinner();
});
return false;
};
Ajax.prototype.loadSearchPage = function() {
return false;
};
Ajax.prototype.loadSettingsPage = function() {
$.get('/templates/settings.html', function(data) {
_ajax.setArchor('/settings/');
return _pages.renderSettings(_beathaven.localizeHTML($(data)));
});
return false;
};
Ajax.prototype.load404Page = function() {
$.get('/404.html', function(data) {
$('.data-container .inner').html(data);
return _beathaven.redrawScrollbar();
});
return false;
};
Ajax.prototype.loadAboutPage = function() {
$.get('/templates/about.html', function(data) {
_pages.renderTextpage(data);
return _ajax.setTitle('About');
});
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 if (_ajax.getAnchor().match(/\/about\//)) {
_ajax.loadAboutPage();
} 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,141 +0,0 @@
var BeatHaven, _ajax, _beathaven, _pages, _player, _search, _session, _settings, _vkontakte;
_beathaven = null;
_session = 1;
_vkontakte = null;
_ajax = null;
_player = null;
_search = null;
_pages = null;
_settings = null;
$(function() {
var l, _ref;
l = document.location;
if ((_ref = l.host) !== 'beathaven.org' && _ref !== 'dev.beathaven.org') {
l.href = 'http://beathaven.org/' + l.hash;
}
_beathaven = new BeatHaven();
_beathaven.init();
$(window).resize(function() {
_beathaven.adjustSizes();
_beathaven.redrawScrollbar();
return false;
});
return window.setTimeout(function() {
_beathaven.checkRedrawScrollbar();
return false;
}, 500);
});
BeatHaven = (function() {
function BeatHaven() {}
BeatHaven.prototype.last_height = false;
BeatHaven.prototype.lang = 'ru';
BeatHaven.prototype.init = function() {
this.adjustSizes();
this.checkRedrawScrollbar();
_vkontakte = new Vkontakte(2335068);
_vkontakte.init();
_ajax = new Ajax();
_player = new Player();
_player.initJplayer();
_search = new Search();
_pages = new Pages();
_settings = new Settings();
return false;
};
BeatHaven.prototype.adjustSizes = function() {
$('.data-container').height($(window).height() - $('.header-container').height() - $('.pulldown').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();
$('.playlist').scrollbar();
return false;
};
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 !== _beathaven.last_height) {
_beathaven.last_height = outer_height;
_beathaven.redrawScrollbar();
}
if (focused_id) {
document.getElementById(focused_id).focus();
focused_id = false;
}
window.setTimeout(function() {
_beathaven.checkRedrawScrollbar();
return false;
}, 500);
return false;
};
BeatHaven.prototype.redrawScrollbar = function() {
$('.data-container').html($('.data-container').find('.inner').first());
$('.data-container').scrollbar();
return false;
};
BeatHaven.prototype.localizeHTML = function(obj, lang) {
if (obj == null) {
obj = $('body');
}
if (lang == null) {
lang = _beathaven.lang;
}
$(obj).find('[data-ls]').each(function() {
if ((_locale[$(this).attr('data-ls')] != null) && (_locale[$(this).attr('data-ls')][lang] != null)) {
if (this.nodeName === 'INPUT') {
return $(this).val(_locale[$(this).attr('data-ls')][lang]);
} else {
return $(this).text(_locale[$(this).attr('data-ls')][lang]);
}
}
});
return obj;
};
BeatHaven.prototype.ls = function(id, lang) {
if (lang == null) {
lang = _beathaven.lang;
}
if ((_locale[id] != null) && (_locale[id][lang] != null)) {
return _locale[id][lang];
} else {
return id;
}
};
BeatHaven.prototype.pdShowSpinner = function() {
$('.pulldown').html('<div class="pd-spinner"><img src="/images/loader.gif" alt=""/></div>');
return false;
};
BeatHaven.prototype.pdHideSpinner = function() {
$('.pulldown').html('');
return false;
};
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,99 +0,0 @@
var _locale;
_locale = {
SEARCH: {
en: "Search",
ru: "Поиск"
},
NEWS: {
en: "News",
ru: "Новости"
},
ABOUT: {
en: "About",
ru: "О проекте"
},
LOGIN: {
en: "Log in",
ru: "Войти"
},
LOGOUT: {
en: "Log out",
ru: "Выйти"
},
ADD_SOME_MUSIC: {
en: "Add some music to playlist",
ru: "Добавьте музыку в плей-лист"
},
LOGIN_PLEASE: {
en: "Don't forget to log in, please. It's simple.",
ru: "Авторизуйтесь, пожалуйста. Это действительно просто."
},
REPEAT: {
en: "Repeat",
ru: "Повторять"
},
SHUFFLE: {
en: "Shuffle",
ru: "Перемешать"
},
EMPTY_PLAYLIST: {
en: "Empty playlist",
ru: "Очистить"
},
HELLO: {
en: "Hi there",
ru: "Привет"
},
ARTIST_LOADING_FAILED: {
en: "Something very bad happened while we tried out to load some info about this artist. How about some other one?",
ru: "Что-то ужасное произошло пока мы собирали информацию об этом исполнителе. Может пока поищем другого?"
},
ARTIST_LOADING_IN_PROCESS: {
en: "Artist info is loading for the first time now. Usually it takes less than a minute, please wait a bit.",
ru: "Прямо сейчас мы собираем всю возможною информацию об этом исполнителе в первый раз. Обычно это занимает меньше минуты."
},
MISSPELLED: {
en: "Misspelled?",
ru: "Опечатались?"
},
SETTINGS_ACCOUNT: {
en: "Account",
ru: "Аккаунт"
},
SETTINGS_LASTFM: {
en: "Last.fm",
ru: "Last.fm"
},
USERNAME: {
en: "Username",
ru: "Имя"
},
EMAIL: {
en: "Email",
ru: "Почта"
},
LANG: {
en: "Language",
ru: "Язык"
},
USELESS_BUTTON: {
en: "Hello, my name is Useless Button",
ru: "Привет, меня зовут Бесполезная Кнопка"
},
NOT_CONNECTED: {
en: "Not connected",
ru: "Не подключен"
},
CONNECT: {
en: "Connect",
ru: "Подключить"
},
WINDOW_LANG_RELOAD: {
en: "To change application language it is needed to reload page. Your current playlist will be emptied and music will stop. Do you really wish to continue?",
ru: "Чтобы изменить язык приложения, необходимо перезагрузить страницу. Ваш текущий плей-лист будет очищен и музыка остановится. Вы действительно хотите продолжить?"
},
ADD_TO_NOW_PLAYING: {
en: "Add to Now Playing",
ru: "Добавить в плей-лист"
}
};

View File

@ -1,104 +0,0 @@
var Pages;
Pages = (function() {
function Pages() {}
Pages.prototype.renderArtist = function(data) {
var albums_info, artist_info;
artist_info = $('\
<div class="artist-info">\
<div class="pic">\
<img src="' + data.artist.pic + '" alt="' + data.artist.name + '" width="250" />\
</div>\
<h1 class="name" data-id="' + data.artist.id + '">' + data.artist.name + '</h1>\
<div class="info">\
' + data.artist.desc + '\
</div>\
</div>');
albums_info = $('<div class="albums"></div>');
$.each(data.albums, function(i, album) {
var album_info;
if (album.year != null) {
album_info = $('\
<div class="album">\
<h2 class="name" data-id="' + album.id + '">' + album.name + ' (' + album.year + ')</h2>\
<div class="pic">\
<img src="' + (album.pic ? album.pic : '/images/kitteh.png') + '" alt="' + album.name + ' by ' + data.artist.name + '" width="250" height="250"/>\
<div class="add-album-button-container">\
<div class="add-album button gray">' + _beathaven.ls('ADD_TO_NOW_PLAYING') + '</div>\
</div>\
</div>\
<div class="tracklist"><ul></ul></div>\
</div>\
<div class="kaboom"></div>');
$.each(album.tracks.album, function(i, track) {
var track_info;
track_info = $('\
<li data-id="' + track.id + '">\
<div class="add-track button gray">+</div>\
<div class="track-container">\
<div class="fade"></div>\
<span class="index">' + (i + 1) + '</span>\
<div class="trackname" title="' + track.name.htmlsafe() + '">' + track.name + '</div>\
<div class="length">' + track.duration + '</div>\
</div>\
</li>');
return $(album_info).find('.tracklist ul').append(track_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);
_beathaven.redrawScrollbar();
return false;
};
Pages.prototype.renderSearch = function(data) {
$('.pulldown').html(data);
setTimeout(function() {
$('.search_field').first().bh_autocomplete({
serviceUrl: '/artist/autocomplete',
minChars: 2,
delimiter: /(,|;)\s*/,
maxHeight: 400,
width: 415,
zIndex: 9999,
deferRequestBy: 500,
onSelect: function() {
return _ajax.loadArtistData($('.search_field').first().val());
}
});
return $('.search_field').first().focus();
}, 1);
return false;
};
Pages.prototype.renderSettings = function(data) {
if (_session.getUser().id == null) {
_ajax.go('/search/');
return false;
}
$('.data-container').css({
background: 'none'
});
$('.data-container .inner').html(data);
yaCounter7596904.hit(_ajax.getAnchor(), 'Settings', _ajax.referer);
_ajax.setTitle('Settings');
$('.settings-container .tabs .tab').first().trigger('click');
return false;
};
Pages.prototype.renderTextpage = function(data) {
$('.data-container').css({
background: 'url(/images/concrete_wall_2.png) 0 -30px repeat'
});
$('.data-container .inner').html(data);
_beathaven.redrawScrollbar();
return false;
};
return Pages;
})();
$('.about').live('click', function() {
_ajax.go('/about/');
return false;
});

View File

@ -1,307 +0,0 @@
var Player;
Player = (function() {
function Player() {}
Player.prototype.bar_width = 330;
Player.prototype.jp = null;
Player.prototype.scrobbled = false;
Player.prototype.initJplayer = function() {
var self;
self = this;
this.jp = $("#jplayer");
this.jp.jPlayer({
swfPath: "/js",
supplied: "mp3",
cssSelectorAncestor: "",
cssSelector: {
play: ".player .play",
pause: ".player .pause",
stop: "",
videoPlay: "",
seekBar: "",
playBar: "",
mute: "",
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.addTracks = function(tracks, autoplay) {
var initial_count, item, _i, _len;
if (!(autoplay != null)) {
autoplay = false;
}
initial_count = $('.playlist-tracks li').length;
for (_i = 0, _len = tracks.length; _i < _len; _i++) {
item = tracks[_i];
$('.playlist-tracks').append('\
<li id="i' + Math.round(Math.random() * 999999) + '" data-id="' + item.id + '" data-artist="' + item.artist.trim() + '" data-album="' + item.album.trim() + '" data-track="' + item.name.trim() + '" data-length="' + item.length + '">\
<div class="item">\
<div class="fade"></div>\
<div class="dragbox"></div>\
<span class="title">\
<span class="data artist" title="Open ' + item.artist.htmlsafe() + '\'s page">' + item.artist + '</span>\
&mdash;\
<span class="playtrack" title="Play ' + item.name.htmlsafe() + ' by ' + item.artist.htmlsafe() + '">' + item.name + '</span>\
</span>\
<span class="duration">' + item.length + '</span>\
<div class="remove">remove</div>\
</div>\
</li>');
}
$('.playlist').html($('.playlist-tracks')).scrollbar();
$('.playlist-tracks').sortable({
axis: 'y',
handle: '.dragbox'
});
if (autoplay) {
_player.setTrack($('.playlist-tracks li').last().attr('id').split('i')[1]);
} else if (initial_count === 0 && !_player.hasTrack()) {
_player.setTrack($('.playlist-tracks li').first().attr('id').split('i')[1]);
}
return false;
};
Player.prototype.getDataFromLi = function(obj) {
var id, length, track_name;
id = $(obj).attr('data-id');
track_name = $(obj).find('.trackname').html();
length = $(obj).find('.length').html();
return {
id: id,
name: track_name,
length: length
};
};
Player.prototype.setTrack = function(id) {
var $obj, query;
$obj = $('#i' + id);
query = $obj.attr('data-artist') + ' &mdash; ' + $obj.attr('data-track');
$('.player .loaded, .player .played').width(0);
$('.player .now-playing').html(query + '<div class="fade"></div>');
$('.playlist-tracks li').removeClass('now');
$obj.addClass('now');
$('.tracklist li').removeClass('now');
$('.tracklist li[data-id="' + $obj.attr('data-id') + '"]').addClass('now');
_vkontakte.loadTracksData($obj.attr('data-artist'), $obj.attr('data-track'), $obj.attr('data-length'), function(url) {
return _player.playSource(url);
});
this.updateNowListening($obj.attr('data-artist'), $obj.attr('data-album'), $obj.attr('data-track'));
return false;
};
Player.prototype.hasTrack = function() {
if ($('#jplayer audio').length > 0) {
return ($('#jplayer audio').attr('src') != null) && $('#jplayer audio').attr('src') !== '';
} else if ($('#jplayer object').length > 0) {
$('#jplayer').jPlayer('play');
true;
}
return false;
};
Player.prototype.playSource = function(url) {
this.scrobbled = false;
$('#jplayer').jPlayer('setMedia', {
mp3: url
});
$('#jplayer').jPlayer('play');
return 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 {
false;
}
} else {
return $('.playlist-tracks .now').next().attr('id').split('i')[1];
}
} else if (cnt === 1) {
return $('.playlist-tracks li').first().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.prevTrack = function() {
var $li, cnt, rnd;
cnt = $('.playlist-tracks li').length;
if (!_player.onShuffle()) {
if ($('.playlist-tracks .now').prev().length === 0) {
return $('.playlist-tracks li').last().attr('id').split('i')[1];
} else {
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 {
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.getUser().lastfm_username) {
_session.query('/lastfm/listening?r=' + Math.random(), {
artist: artist,
album: album,
track: track
});
}
return false;
};
Player.prototype.scrobble = function(artist, album, track) {
if (_session.getUser().lastfm_username) {
_session.query('/lastfm/scrobble?r=' + Math.random(), {
artist: artist,
album: album,
track: track
});
}
return false;
};
return Player;
})();
$('.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;
});
$('.player .progress').live('click', function(e) {
$('#jplayer').jPlayer('playHead', Math.round((e.offsetX / _player.bar_width) * 100));
return false;
});
$('#repeat, #shuffle').live('click', function() {
$(this).toggleClass('active');
return false;
});
$('#empty-playlist').live('click', function() {
if (confirm('Are you sure?')) {
$('.playlist-tracks li').remove();
$('#jplayer').jPlayer('clearMedia');
$('.player .now-playing').text('Add some music to playlist');
$('.player .loaded, .player .played').width(0);
}
return false;
});
$('.playlist-tracks li .fade, .playlist-tracks li .duration, .playlist-tracks li .remove').live('mousemove mouseover mouseout', function(e) {
var _ref;
if (((_ref = e.type) === 'mouseover' || _ref === 'mousemove') && ($(window).width() - e.clientX) < 60) {
$(this).parent().find('.duration').hide();
$(this).parent().find('.remove').show();
} else {
$(this).parent().find('.remove').hide();
$(this).parent().find('.duration').show();
}
return false;
});
$('.playlist-tracks li .remove').live('click', function() {
var $li;
$li = $(this).parent().parent();
if ($li.hasClass('now')) {
$('#jplayer').jPlayer('clearMedia');
$('.player .now-playing').text('...');
$('.player .loaded, .player .played').width(0);
}
$li.remove();
return false;
});
$('.playlist-tracks li .title .playtrack').live('click', function() {
_player.setTrack($(this).parent().parent().parent().attr('id').split('i')[1]);
return false;
});
$('.add-album').live('click', function() {
var album, artist, item, track, tracks, _i, _len, _ref;
artist = $('.artist-info .name').html();
album = $(this).parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, '');
tracks = [];
_ref = $(this).parent().parent().parent().find('.tracklist li');
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
item = _ref[_i];
track = _player.getDataFromLi(item);
track['artist'] = artist;
track['album'] = album;
tracks.push(track);
}
_player.addTracks(tracks);
return false;
});
$('.add-track').live('click', function() {
var track;
track = _player.getDataFromLi($(this).parent());
track['artist'] = $('.artist-info .name').html();
track['album'] = $(this).parent().parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, '');
_player.addTracks([track]);
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('click', function(e) {
var track;
track = _player.getDataFromLi(this);
track['artist'] = $('.artist-info .name').html();
track['album'] = $(this).parent().parent().parent().find('h2.name').text().replace(/\s\([\d]{4}\)$/, '');
_player.addTracks([track], true);
return false;
});

View File

@ -1,93 +0,0 @@
var Search;
Search = (function() {
function Search() {}
Search.prototype.pics = [];
Search.prototype.showSpinner = function() {
$('.search-container input').first().attr({
disabled: 'disabled'
}).blur();
$('.search-container img').first().show();
$('.autocomplete-container').hide();
$('.artist_loading.failed').first().hide();
this.hideSuggestions();
return false;
};
Search.prototype.hideSpinner = function() {
$('.search-container input').first().removeAttr('disabled');
$('.search_field').first().focus();
$('.search-container img').first().hide();
return false;
};
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>\
<a class="data artist">' + item.name + '</a>\
' + (item.desc != null ? '<br/><span>' + item.desc + '</span>' : '') + '\
</li>');
}
$('.suggestions').show();
return false;
};
Search.prototype.hideSuggestions = function() {
$('.suggestions ul li').remove();
$('.suggestions').hide();
return false;
};
Search.prototype.showArtistPics = function(pics) {
var pic, _i, _len;
$('.artist_loading.ok, .artist_pics').show();
for (_i = 0, _len = pics.length; _i < _len; _i++) {
pic = pics[_i];
if (this.pics.indexOf(pic) === -1) {
this.pics.push(pic);
$('.artist_pics').append('\
<div class="pic">\
<img src="' + pic + '" alt=""/>\
</div>');
}
}
return false;
};
Search.prototype.showError = function() {
$('.artist_loading.ok, .artist_pics').hide();
$('.artist_loading.failed').show();
return this.pics = [];
};
return Search;
})();
$('.search').live('click', function() {
if ($('.pulldown').css('display') === 'none') {
$('.pulldown').width($('.data-container').width() - 50);
$('.pulldown').height(300);
$('.pulldown').slideDown('fast', function() {
var data;
data = '<div class="search-container">' + $('.subpages .search-container').html() + '</div>';
_pages.renderSearch(_beathaven.localizeHTML($(data)));
_beathaven.adjustSizes();
return _beathaven.redrawScrollbar();
});
} else {
$('.pulldown').slideUp('fast', function() {
$('.pulldown').height(0);
_beathaven.adjustSizes();
return _beathaven.redrawScrollbar();
});
}
return false;
});
$('.search_form').live('submit', function() {
$('.autocomplete-container').remove();
_ajax.loadArtistData($('.search_field').first().val());
return false;
});
$('.suggestions a').live('click', function() {
$('.search_field').first().val($(this).text());
return false;
});
$('.data.artist').live('click', function() {
_ajax.go('/artist/' + $(this).text().replace(' ', '+') + '/');
return false;
});

View File

@ -1,40 +0,0 @@
var Session;
Session = (function() {
Session.prototype.vk_params = null;
Session.prototype.user = null;
function Session(params) {
var attrs, key, _i, _len, _params;
attrs = ['expire', 'mid', 'secret', 'sid', 'sig'];
_params = {};
for (_i = 0, _len = attrs.length; _i < _len; _i++) {
key = attrs[_i];
if (params[key] != null) {
_params[key] = params[key];
}
}
this.vk_params = _params;
}
Session.prototype.setUser = function(user) {
this.user = user;
_beathaven.lang = this.user.lang || 'ru';
_beathaven.localizeHTML();
return false;
};
Session.prototype.getUser = function() {
return this.user;
};
Session.prototype.query = function(url, params, callback) {
var q_params;
q_params = $.extend({}, this.vk_params, params);
$.post(url, q_params, callback);
return false;
};
Session.prototype.reloadSession = function() {
_session.query('/user/auth', {}, function(ar) {
_session.setUser(ar.user);
return false;
});
return false;
};
return Session;
})();

View File

@ -1,79 +0,0 @@
var Settings;
Settings = (function() {
function Settings() {}
Settings.prototype.getAccountInfo = function(callback) {
_session.query('/user/update/', {}, callback);
return false;
};
Settings.prototype.saveAccountInfo = function(params, callback) {
_session.query('/user/update', params, callback);
return false;
};
Settings.prototype.loadFormData = function(form) {
if (form === 'account') {
$('.settings-container .form input[name$="username"]').val(_session.getUser().name);
$('.settings-container .form input[name$="email"]').val(_session.getUser().email);
$('.settings-container .form select').val(_session.getUser().lang);
} else if (form === 'lastfm') {
if (_session.getUser().lastfm_username) {
$('.form-container input[name$="username"]').first().val(_session.getUser().lastfm_username);
}
}
return false;
};
Settings.prototype.updateLastfmLogin = function() {
if (window.lastfm_popup.closed) {
_session.query('/user/auth', {}, function(ar) {
_session.setUser(ar.user);
return _settings.loadFormData('lastfm');
});
} else {
setTimeout(_settings.updateLastfmLogin, 100);
}
return false;
};
return Settings;
})();
$('.settings').live('click', function() {
_ajax.go('/settings/');
return false;
});
$('.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());
_settings.loadFormData($(this).attr('data-fieldset'));
}
return false;
});
$('.lastfm-connect').live('click', function() {
window.lastfm_popup = window.open(_session.getUser().lastfm_login_url);
setTimeout(_settings.updateLastfmLogin, 100);
return false;
});
$('.settings-container .form input, .settings-container .form select').live('blur', function() {
var active_tab, lang_changed, 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(),
lang: $('.settings-container .form select').first().val()
};
lang_changed = params.lang !== _session.getUser().lang;
if (lang_changed) {
if (!confirm(_beathaven.ls('WINDOW_LANG_RELOAD', params.lang))) {
$('.settings-container .form select').val(_session.getUser().lang);
}
}
_settings.saveAccountInfo(params, function() {
if (lang_changed) {
window.location.reload();
}
$('.header-container .hello .greating span').text((params.username.length > 0 ? params.username : '%username%'));
return false;
});
}
return false;
});

View File

@ -1,170 +0,0 @@
var Vkontakte;
Vkontakte = (function() {
Vkontakte.prototype.qr = null;
Vkontakte.prototype.api_id = null;
function Vkontakte(api_id) {
this.api_id = api_id;
}
Vkontakte.prototype.getApiId = function() {
return this.api_id;
};
Vkontakte.prototype.init = function() {
this.qr = [];
window.vkAsyncInit = function() {
VK.init({
apiId: _vkontakte.getApiId()
});
return VK.Auth.getLoginStatus(function(response) {
return _vkontakte.authInfo(response);
});
};
return setTimeout(function() {
return $('#vk_api_transport').append('<script async="async" type="text/javascript" src="http://vkontakte.ru/js/api/openapi.js"></script>');
}, 0);
};
Vkontakte.prototype.authInfo = function(response) {
var _session;
if (typeof response !== 'undefined' && response.session) {
_session = new Session(response.session);
$('#vk_login, .auth-notice').hide();
$('#vk_logout').css({
display: 'block'
});
if ($('#search_field').length > 0) {
$('#search_field').focus();
}
_session.query('/user/auth', {}, function(ar) {
if (ar.newbie) {
VK.Api.call('getVariable', {
key: 1281
}, function(r) {
return _session.query('/user/update', {
name: r.response
}, function(ar2) {
_session.setUser(ar2.user);
$('.header-container .hello .greating').html(_beathaven.ls('HELLO') + ', <span class="settings">' + (_session.getUser().name ? _session.getUser().name : '%username%') + '</span>!');
window._session = _session;
_ajax.detectPage();
return $('.fullscreen').hide();
});
});
} else {
_session.setUser(ar.user);
}
$('.header-container .hello').show();
$('.header-container .hello .greating').html(_beathaven.ls('HELLO') + ', <span class="settings">' + (_session.getUser().name ? _session.getUser().name : '%username%') + '</span>!');
window._session = _session;
_ajax.detectPage();
return $('.fullscreen').hide();
});
if (response.session.expire != null) {
return setTimeout(function() {
_vkontakte.auth();
return false;
}, response.session.expire * 1000 - new Date().getTime() + 1000);
}
} else {
_session = new Session({});
_session.setUser({});
$('#vk_login').css({
display: 'block'
});
$('.auth-notice').css('left', $('#vk_login').offset().left).show();
$('.header-container .hello').hide();
window._session = _session;
_ajax.detectPage();
return $('.fullscreen').hide();
}
};
Vkontakte.prototype.auth = function() {
VK.Auth.getLoginStatus(function(response) {
_vkontakte.authInfo(response);
return false;
}, 8);
return false;
};
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) {
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];
if (typeof item === 'object') {
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;
}
}
if (score > best_score) {
best_score = score;
best_result = item;
}
if (score === 35) {
return best_result.url;
}
}
}
return best_result.url;
};
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;
})();
$('#vk_login, .auth-notice').live('click', function() {
VK.Auth.login(function(response) {
_vkontakte.authInfo(response);
return false;
}, 8);
return false;
});
$('#vk_logout').live('click', function() {
_ajax.go('/search/');
VK.Auth.logout(function(response) {
_vkontakte.authInfo(response);
return false;
});
return false;
});