diff --git a/web/app/assets/javascripts/feed.js b/web/app/assets/javascripts/feed.js
index da4c107cb..486b9e604 100644
--- a/web/app/assets/javascripts/feed.js
+++ b/web/app/assets/javascripts/feed.js
@@ -5,407 +5,15 @@
context.JK.FeedScreen = function(app) {
var logger = context.JK.logger;
- var rest = new context.JK.Rest();
- var ui = new context.JK.UIHelper(JK.app);
- var currentQuery = null;
- var currentPage = 0;
- var LIMIT = 20;
- var $screen = null;
- var $next = null;
- var $scroller = null;
- var $content = null;
- var $noMoreFeeds = null;
- var $refresh = null;
- var $sortFeedBy = null;
- var $includeDate = null;
- var $includeType = null;
- var next = null;
- function defaultQuery() {
- var query = { limit:LIMIT, page:currentPage};
-
- if(next) {
- query.since = next;
- }
-
- return query;
- }
-
- function buildQuery() {
- currentQuery = defaultQuery();
-
- // specify search criteria based on form
- currentQuery.sort = $sortFeedBy.val();
- currentQuery.time_range = $includeDate.val();
- currentQuery.type = $includeType.val();
-
- return currentQuery;
- }
+ var feed = null;
function beforeShow(data) {
}
function afterShow(data) {
- refresh();
- }
-
- function clearResults() {
- currentPage = 0;
- $content.empty(); // TODO: do we need to delete audio elements?
- $noMoreFeeds.hide();
- next = null;
- }
-
- function handleFeedResponse(response) {
- next = response.next;
-
- renderFeeds(response);
-
- if(response.next == null) {
- // if we less results than asked for, end searching
- $scroller.infinitescroll('pause');
- logger.debug("end of feeds")
-
- if(currentPage > 0) {
- $noMoreFeeds.show();
- // there are bugs with infinitescroll not removing the 'loading'.
- // it's most noticeable at the end of the list, so whack all such entries
- $('.infinite-scroll-loader').remove();
- }
- }
- else {
- currentPage++;
- buildQuery();
- registerInfiniteScroll();
- }
- }
-
- function refresh() {
-
- clearResults();
-
- currentQuery = buildQuery();
- rest.getFeeds(currentQuery)
- .done(function(response) {
- handleFeedResponse(response);
- })
- .fail(function(jqXHR) {
- app.notifyServerError(jqXHR, 'Feed Unavailable')
- })
- }
-
- function registerInfiniteScroll() {
-
- $scroller.infinitescroll({
- behavior: 'local',
- navSelector: '#feedScreen .btn-next-pager',
- nextSelector: '#feedScreen .btn-next-pager',
- binder: $scroller,
- dataType: 'json',
- appendCallback: false,
- prefill: false,
- bufferPx:100,
- loading: {
- msg: $('
Loading ...
'),
- img: '/assets/shared/spinner.gif'
- },
- path: function(page) {
- return '/api/feeds?' + $.param(buildQuery());
- }
- },function(json, opts) {
- handleFeedResponse(json);
- });
- $scroller.infinitescroll('resume');
- }
-
-
- function toggleSessionDetails() {
- var $detailsLink = $(this);
- var $feedItem = $detailsLink.closest('.feed-entry');
- var $musicians = $feedItem.find('.musician-detail');
- var $description = $feedItem.find('.description');
- var toggledOpen = $detailsLink.data('toggledOpen');
-
- if(toggledOpen) {
- $feedItem.css('height', $feedItem.height() + 'px')
- $feedItem.animate({'height': $feedItem.data('original-max-height')}).promise().done(function() {
- $feedItem.css('height', 'auto').css('max-height', $feedItem.data('original-max-height'));
-
- $musicians.hide();
- $description.css('height', $description.data('original-height'));
- $description.dotdotdot();
- });
- }
- else {
- $description.trigger('destroy.dot');
- $description.data('original-height', $description.css('height')).css('height', 'auto');
- $musicians.show();
- $feedItem.animate({'max-height': '1000px'});
- }
-
- toggledOpen = !toggledOpen;
- $detailsLink.data('toggledOpen', toggledOpen);
- return false;
- }
-
- function startSessionPlay($feedItem) {
- var img = $('.play-icon', $feedItem);
- var $controls = $feedItem.find('.session-controls');
- img.attr('src', '/assets/content/icon_pausebutton.png');
- $controls.trigger('play.listenBroadcast');
- $feedItem.data('playing', true);
- }
-
- function stopSessionPlay($feedItem) {
- var img = $('.play-icon', $feedItem);
- var $controls = $feedItem.find('.session-controls');
- img.attr('src', '/assets/content/icon_playbutton.png');
- $controls.trigger('pause.listenBroadcast');
- $feedItem.data('playing', false);
- }
-
- function toggleSessionPlay() {
- var $playLink = $(this);
- var $feedItem = $playLink.closest('.feed-entry');
-
- var $status = $feedItem.find('.session-status')
- var playing = $feedItem.data('playing');
-
- if(playing) {
- $status.text('SESSION IN PROGRESS');
- stopSessionPlay($feedItem);
- }
- else {
- startSessionPlay($feedItem);
- }
- return false;
- }
-
- function stateChangeSession(e, data) {
- var $controls = data.element;
- var $feedItem = $controls.closest('.feed-entry');
- var $status = $feedItem.find('.session-status');
-
- if(data.displayText) $status.text(data.displayText);
-
- if(data.isEnd) stopSessionPlay();
-
- if(data.isSessionOver) {
- $controls.removeClass('inprogress').addClass('ended')
- }
- }
-
- function startRecordingPlay($feedItem) {
- var img = $('.play-icon', $feedItem);
- var $controls = $feedItem.find('.recording-controls');
- img.attr('src', '/assets/content/icon_pausebutton.png');
- $controls.trigger('play.listenRecording');
- $feedItem.data('playing', true);
- }
-
- function stopRecordingPlay($feedItem) {
- var img = $('.play-icon', $feedItem);
- var $controls = $feedItem.find('.recording-controls');
- img.attr('src', '/assets/content/icon_playbutton.png');
- $controls.trigger('pause.listenRecording');
- $feedItem.data('playing', false);
- }
-
- function toggleRecordingPlay() {
-
- var $playLink = $(this);
- var $feedItem = $playLink.closest('.feed-entry');
- var playing = $feedItem.data('playing');
-
- if(playing) {
- stopRecordingPlay($feedItem);
- }
- else {
- startRecordingPlay($feedItem);
- }
- return false;
- }
-
-
- function stateChangeRecording(e, data) {
- var $controls = data.element;
- var $feedItem = $controls.closest('.feed-entry');
-
- var $sliderBar = $('.recording-position', $feedItem);
- var $statusBar = $('.recording-status', $feedItem);
- var $currentTime = $('.recording-current', $feedItem);
- var $status = $('.status-text', $feedItem);
- var $playButton = $('.play-button', $feedItem);
-
- if(data.isEnd) stopRecordingPlay($feedItem);
- if(data.isError) {
- $sliderBar.hide();
- $playButton.hide();
- $currentTime.hide();
- $statusBar.show();
- $status.text(data.displayText);
- }
- }
-
- function toggleRecordingDetails() {
- var $detailsLink = $(this);
- var $feedItem = $detailsLink.closest('.feed-entry');
- var $musicians = $feedItem.find('.musician-detail');
- var $description = $feedItem.find('.description');
- var $name = $feedItem.find('.name');
- var toggledOpen = $detailsLink.data('toggledOpen');
-
- if(toggledOpen) {
- $feedItem.css('height', $feedItem.height() + 'px')
- $feedItem.animate({'height': $feedItem.data('original-max-height')}).promise().done(function() {
- $feedItem.css('height', 'auto').css('max-height', $feedItem.data('original-max-height'));
-
- $musicians.hide();
- $description.css('height', $description.data('original-height'));
- $description.dotdotdot();
- $name.css('height', $name.data('original-height'));
- $name.dotdotdot();
- });
- }
- else {
- $description.trigger('destroy.dot');
- $description.data('original-height', $description.css('height')).css('height', 'auto');
- $name.trigger('destroy.dot');
- $name.data('original-height', $name.css('height')).css('height', 'auto');
- $musicians.show();
- $feedItem.animate({'max-height': '1000px'});
- }
-
- toggledOpen = !toggledOpen;
- $detailsLink.data('toggledOpen', toggledOpen);
-
- return false;
- }
-
- function renderFeeds(feeds) {
-
- $.each(feeds.entries, function(i, feed) {
- if(feed.type == 'music_session') {
- var options = {
- feed_item: feed,
- status_class: feed['is_over?'] ? 'ended' : 'inprogress',
- mount_class: feed['has_mount?'] ? 'has-mount' : 'no-mount'
- }
- var $feedItem = $(context._.template($('#template-feed-music-session').html(), options, {variable: 'data'}));
- var $controls = $feedItem.find('.session-controls');
-
- // do everything we can before we attach the item to the page
- $('.timeago', $feedItem).timeago();
- context.JK.prettyPrintElements($('.duration', $feedItem).show());
- context.JK.setInstrumentAssetPath($('.instrument-icon', $feedItem));
- $('.details', $feedItem).click(toggleSessionDetails);
- $('.details-arrow', $feedItem).click(toggleSessionDetails);
- $('.play-button', $feedItem).click(toggleSessionPlay);
-
- if (!feed.session_removed_at)
- {
- $('.btn-share', $feedItem).click(function() {
- ui.launchShareDialog(feed.id, 'session');
- });
- }
- else {
- $('.btn-share', $feedItem).hide();
- }
-
- $('.btn-comment', $feedItem).click(function() {
- ui.launchCommentDialog({
- session_id: feed.id,
- entity_type: 'session'
- });
- });
-
- $('.btn-like', $feedItem).click(function() {
- ui.addSessionLike(feed.id, JK.currentUserId, $('.likes', $feedItem), $('.btn-like', $feedItem))
- });
-
- // put the feed item on the page
- renderFeed($feedItem);
-
- // these routines need the item to have height to work (must be after renderFeed)
- $controls.listenBroadcast();
- $controls.bind('statechange.listenBroadcast', stateChangeSession);
- $('.dotdotdot', $feedItem).dotdotdot();
- $feedItem.data('original-max-height', $feedItem.css('height'));
- context.JK.bindHoverEvents($feedItem);
- context.JK.bindProfileClickEvents($feedItem);
- }
- else if(feed.type == 'recording') {
- if(feed.claimed_recordings.length == 0) {
- logger.error("a recording in the feed should always have one claimed_recording")
- return;
- }
- var options = {
- feed_item: feed,
- candidate_claimed_recording: feed.claimed_recordings[0],
- mix_class: feed['has_mix?'] ? 'has-mix' : 'no-mix',
- }
-
- var $feedItem = $(context._.template($('#template-feed-recording').html(), options, {variable: 'data'}));
- var $controls = $feedItem.find('.recording-controls');
-
- $('.timeago', $feedItem).timeago();
- context.JK.prettyPrintElements($('.duration', $feedItem));
- context.JK.setInstrumentAssetPath($('.instrument-icon', $feedItem));
- $('.details', $feedItem).click(toggleRecordingDetails);
- $('.details-arrow', $feedItem).click(toggleRecordingDetails);
- $('.play-button', $feedItem).click(toggleRecordingPlay);
-
- $('.btn-share', $feedItem).click(function() {
- ui.launchShareDialog(options.candidate_claimed_recording.id, 'recording');
- });
-
- $('.btn-comment', $feedItem).click(function() {
- ui.launchCommentDialog({
- recording_id: feed.id,
- claimed_recording_id: options.candidate_claimed_recording.id,
- entity_type: 'recording'
- });
- });
-
- $('.btn-like', $feedItem).click(function() {
- ui.addRecordingLike(feed.id, options.candidate_claimed_recording.id, JK.currentUserId, $('.likes', $feedItem), $('.btn-like', $feedItem));
- });
-
- // put the feed item on the page
- renderFeed($feedItem);
-
- // these routines need the item to have height to work (must be after renderFeed)
- $controls.listenRecording({recordingId: feed.id, claimedRecordingId: options.candidate_claimed_recording.id, sliderSelector:'.recording-slider', sliderBarSelector: '.recording-playback', currentTimeSelector:'.recording-current'});
- $controls.bind('statechange.listenRecording', stateChangeRecording);
- $('.dotdotdot', $feedItem).dotdotdot();
- $feedItem.data('original-max-height', $feedItem.css('height'));
- context.JK.bindHoverEvents($feedItem);
- context.JK.bindProfileClickEvents($feedItem);
- }
- else {
- logger.warn("skipping feed type: " + feed.type);
- }
-
- context.JK.bindProfileClickEvents();
- });
- }
-
- function renderFeed(feed) {
- $content.append(feed);
- }
-
- function search() {
- logger.debug("Searching for feeds...");
- refresh();
- return false;
- }
-
- function events() {
- $refresh.on("click", search);
- $sortFeedBy.on('change', search);
- $includeDate.on('change', search);
- $includeType.on('change', search);
+ feed.refresh();
}
function initialize() {
@@ -415,21 +23,17 @@
};
app.bindScreen('feed', screenBindings);
- $screen = $('[layout-id="feed"]');
- $scroller = $screen.find('.content-body-scroller');
- $content = $screen.find('.feed-content');
- $noMoreFeeds = $('#end-of-feeds-list');
- $refresh = $screen.find('#btn-refresh-feed');
- $sortFeedBy = $screen.find('#feed_order_by');
- $includeDate = $screen.find('#feed_date');
- $includeType = $screen.find('#feed_show');
+ var $screen = $('[layout-id="feed"]');
+ var $scroller = $screen.find('.content-body-scroller');
+ var $content = $screen.find('.feed-content');
+ var $noMoreFeeds = $('#end-of-feeds-list');
+ var $refresh = $screen.find('#btn-refresh-feed');
+ var $sortFeedBy = $screen.find('#feed_order_by');
+ var $includeDate = $screen.find('#feed_date');
+ var $includeType = $screen.find('#feed_show');
- // set default search criteria
- $sortFeedBy.val('date')
- $includeDate.val('month')
- $includeType.val('all')
-
- events();
+ feed = new context.JK.Feed(app);
+ feed.initialize($screen, $scroller, $content, $noMoreFeeds, $refresh, $sortFeedBy, $includeDate, $includeType);
}
this.initialize = initialize;
diff --git a/web/app/assets/javascripts/feedHelper.js b/web/app/assets/javascripts/feedHelper.js
new file mode 100644
index 000000000..088a8c37e
--- /dev/null
+++ b/web/app/assets/javascripts/feedHelper.js
@@ -0,0 +1,437 @@
+(function (context, $) {
+
+ "use strict";
+
+ context.JK = context.JK || {};
+ context.JK.Feed = function (app) {
+
+ var logger = context.JK.logger;
+ var rest = new context.JK.Rest();
+ var ui = new context.JK.UIHelper(JK.app);
+ var currentQuery = null;
+ var currentPage = 0;
+ var LIMIT = 20;
+ var $next = null;
+ var $screen = null;
+ var $scroller = null;
+ var $content = null;
+ var $noMoreFeeds = null;
+ var $refresh = null;
+ var $sortFeedBy = null;
+ var $includeDate = null;
+ var $includeType = null;
+ var next = null;
+
+ function defaultQuery() {
+ var query = { limit:LIMIT, page:currentPage};
+
+ if(next) {
+ query.since = next;
+ }
+
+ return query;
+ }
+
+ function buildQuery() {
+ currentQuery = defaultQuery();
+
+ // specify search criteria based on form
+ currentQuery.sort = $sortFeedBy.val();
+ currentQuery.time_range = $includeDate.val();
+ currentQuery.type = $includeType.val();
+
+ return currentQuery;
+ }
+
+
+ function clearResults() {
+ currentPage = 0;
+ $content.empty(); // TODO: do we need to delete audio elements?
+ $noMoreFeeds.hide();
+ next = null;
+ }
+
+ function handleFeedResponse(response) {
+ next = response.next;
+
+ renderFeeds(response);
+
+ if(response.next == null) {
+ // if we less results than asked for, end searching
+ $scroller.infinitescroll('pause');
+ logger.debug("end of feeds")
+
+ if(currentPage > 0) {
+ $noMoreFeeds.show();
+ // there are bugs with infinitescroll not removing the 'loading'.
+ // it's most noticeable at the end of the list, so whack all such entries
+ $('.infinite-scroll-loader').remove();
+ }
+ }
+ else {
+ currentPage++;
+ buildQuery();
+ registerInfiniteScroll();
+ }
+ }
+
+ function refresh() {
+
+ clearResults();
+
+ currentQuery = buildQuery();
+ rest.getFeeds(currentQuery)
+ .done(function(response) {
+ handleFeedResponse(response);
+ })
+ .fail(function(jqXHR) {
+ app.notifyServerError(jqXHR, 'Feed Unavailable')
+ })
+ }
+
+ function registerInfiniteScroll() {
+
+ $scroller.infinitescroll({
+ behavior: 'local',
+ navSelector: '#feedScreen .btn-next-pager',
+ nextSelector: '#feedScreen .btn-next-pager',
+ binder: $scroller,
+ dataType: 'json',
+ appendCallback: false,
+ prefill: false,
+ bufferPx:100,
+ loading: {
+ msg: $('Loading ...
'),
+ img: '/assets/shared/spinner.gif'
+ },
+ path: function(page) {
+ return '/api/feeds?' + $.param(buildQuery());
+ }
+ },function(json, opts) {
+ handleFeedResponse(json);
+ });
+ $scroller.infinitescroll('resume');
+ }
+
+
+ function toggleSessionDetails() {
+ var $detailsLink = $(this);
+ var $feedItem = $detailsLink.closest('.feed-entry');
+ var $musicians = $feedItem.find('.musician-detail');
+ var $description = $feedItem.find('.description');
+ var toggledOpen = $detailsLink.data('toggledOpen');
+
+ if(toggledOpen) {
+ $feedItem.css('height', $feedItem.height() + 'px')
+ $feedItem.animate({'height': $feedItem.data('original-max-height')}).promise().done(function() {
+ $feedItem.css('height', 'auto').css('max-height', $feedItem.data('original-max-height'));
+
+ $musicians.hide();
+ $description.css('height', $description.data('original-height'));
+ $description.dotdotdot();
+ });
+ }
+ else {
+ $description.trigger('destroy.dot');
+ $description.data('original-height', $description.css('height')).css('height', 'auto');
+ $musicians.show();
+ $feedItem.animate({'max-height': '1000px'});
+ }
+
+ toggledOpen = !toggledOpen;
+ $detailsLink.data('toggledOpen', toggledOpen);
+ return false;
+ }
+
+ function startSessionPlay($feedItem) {
+ var img = $('.play-icon', $feedItem);
+ var $controls = $feedItem.find('.session-controls');
+ img.attr('src', '/assets/content/icon_pausebutton.png');
+ $controls.trigger('play.listenBroadcast');
+ $feedItem.data('playing', true);
+ }
+
+ function stopSessionPlay($feedItem) {
+ var img = $('.play-icon', $feedItem);
+ var $controls = $feedItem.find('.session-controls');
+ img.attr('src', '/assets/content/icon_playbutton.png');
+ $controls.trigger('pause.listenBroadcast');
+ $feedItem.data('playing', false);
+ }
+
+ function toggleSessionPlay() {
+ var $playLink = $(this);
+ var $feedItem = $playLink.closest('.feed-entry');
+
+ var $status = $feedItem.find('.session-status')
+ var playing = $feedItem.data('playing');
+
+ if(playing) {
+ $status.text('SESSION IN PROGRESS');
+ stopSessionPlay($feedItem);
+ }
+ else {
+ startSessionPlay($feedItem);
+ }
+ return false;
+ }
+
+ function stateChangeSession(e, data) {
+ var $controls = data.element;
+ var $feedItem = $controls.closest('.feed-entry');
+ var $status = $feedItem.find('.session-status');
+
+ if(data.displayText) $status.text(data.displayText);
+
+ if(data.isEnd) stopSessionPlay();
+
+ if(data.isSessionOver) {
+ $controls.removeClass('inprogress').addClass('ended')
+ }
+ }
+
+ function startRecordingPlay($feedItem) {
+ var img = $('.play-icon', $feedItem);
+ var $controls = $feedItem.find('.recording-controls');
+ img.attr('src', '/assets/content/icon_pausebutton.png');
+ $controls.trigger('play.listenRecording');
+ $feedItem.data('playing', true);
+ }
+
+ function stopRecordingPlay($feedItem) {
+ var img = $('.play-icon', $feedItem);
+ var $controls = $feedItem.find('.recording-controls');
+ img.attr('src', '/assets/content/icon_playbutton.png');
+ $controls.trigger('pause.listenRecording');
+ $feedItem.data('playing', false);
+ }
+
+ function toggleRecordingPlay() {
+
+ var $playLink = $(this);
+ var $feedItem = $playLink.closest('.feed-entry');
+ var playing = $feedItem.data('playing');
+
+ if(playing) {
+ stopRecordingPlay($feedItem);
+ }
+ else {
+ startRecordingPlay($feedItem);
+ }
+ return false;
+ }
+
+
+ function stateChangeRecording(e, data) {
+ var $controls = data.element;
+ var $feedItem = $controls.closest('.feed-entry');
+
+ var $sliderBar = $('.recording-position', $feedItem);
+ var $statusBar = $('.recording-status', $feedItem);
+ var $currentTime = $('.recording-current', $feedItem);
+ var $status = $('.status-text', $feedItem);
+ var $playButton = $('.play-button', $feedItem);
+
+ if(data.isEnd) stopRecordingPlay($feedItem);
+ if(data.isError) {
+ $sliderBar.hide();
+ $playButton.hide();
+ $currentTime.hide();
+ $statusBar.show();
+ $status.text(data.displayText);
+ }
+ }
+
+ function toggleRecordingDetails() {
+ var $detailsLink = $(this);
+ var $feedItem = $detailsLink.closest('.feed-entry');
+ var $musicians = $feedItem.find('.musician-detail');
+ var $description = $feedItem.find('.description');
+ var $name = $feedItem.find('.name');
+ var toggledOpen = $detailsLink.data('toggledOpen');
+
+ if(toggledOpen) {
+ $feedItem.css('height', $feedItem.height() + 'px')
+ $feedItem.animate({'height': $feedItem.data('original-max-height')}).promise().done(function() {
+ $feedItem.css('height', 'auto').css('max-height', $feedItem.data('original-max-height'));
+
+ $musicians.hide();
+ $description.css('height', $description.data('original-height'));
+ $description.dotdotdot();
+ $name.css('height', $name.data('original-height'));
+ $name.dotdotdot();
+ });
+ }
+ else {
+ $description.trigger('destroy.dot');
+ $description.data('original-height', $description.css('height')).css('height', 'auto');
+ $name.trigger('destroy.dot');
+ $name.data('original-height', $name.css('height')).css('height', 'auto');
+ $musicians.show();
+ $feedItem.animate({'max-height': '1000px'});
+ }
+
+ toggledOpen = !toggledOpen;
+ $detailsLink.data('toggledOpen', toggledOpen);
+
+ return false;
+ }
+
+ function renderFeeds(feeds) {
+
+ $.each(feeds.entries, function(i, feed) {
+ if(feed.type == 'music_session') {
+ var options = {
+ feed_item: feed,
+ status_class: feed['is_over?'] ? 'ended' : 'inprogress',
+ mount_class: feed['has_mount?'] ? 'has-mount' : 'no-mount'
+ }
+ var $feedItem = $(context._.template($('#template-feed-music-session').html(), options, {variable: 'data'}));
+ var $controls = $feedItem.find('.session-controls');
+
+ // do everything we can before we attach the item to the page
+ $('.timeago', $feedItem).timeago();
+ context.JK.prettyPrintElements($('.duration', $feedItem).show());
+ context.JK.setInstrumentAssetPath($('.instrument-icon', $feedItem));
+ $('.details', $feedItem).click(toggleSessionDetails);
+ $('.details-arrow', $feedItem).click(toggleSessionDetails);
+ $('.play-button', $feedItem).click(toggleSessionPlay);
+
+ if (!feed.session_removed_at)
+ {
+ $('.btn-share', $feedItem).click(function() {
+ ui.launchShareDialog(feed.id, 'session');
+ });
+ }
+ else {
+ $('.btn-share', $feedItem).hide();
+ }
+
+ $('.btn-comment', $feedItem).click(function() {
+ ui.launchCommentDialog({
+ session_id: feed.id,
+ entity_type: 'session'
+ });
+ });
+
+ $('.btn-like', $feedItem).click(function() {
+ ui.addSessionLike(feed.id, JK.currentUserId, $('.likes', $feedItem), $('.btn-like', $feedItem))
+ });
+
+ // put the feed item on the page
+ renderFeed($feedItem);
+
+ // these routines need the item to have height to work (must be after renderFeed)
+ $controls.listenBroadcast();
+ $controls.bind('statechange.listenBroadcast', stateChangeSession);
+ $('.dotdotdot', $feedItem).dotdotdot();
+ $feedItem.data('original-max-height', $feedItem.css('height'));
+ context.JK.bindHoverEvents($feedItem);
+ context.JK.bindProfileClickEvents($feedItem);
+ }
+ else if(feed.type == 'recording') {
+ if(feed.claimed_recordings.length == 0) {
+ logger.error("a recording in the feed should always have one claimed_recording")
+ return;
+ }
+ var options = {
+ feed_item: feed,
+ candidate_claimed_recording: feed.claimed_recordings[0],
+ mix_class: feed['has_mix?'] ? 'has-mix' : 'no-mix',
+ }
+
+ var $feedItem = $(context._.template($('#template-feed-recording').html(), options, {variable: 'data'}));
+ var $controls = $feedItem.find('.recording-controls');
+
+ $('.timeago', $feedItem).timeago();
+ context.JK.prettyPrintElements($('.duration', $feedItem));
+ context.JK.setInstrumentAssetPath($('.instrument-icon', $feedItem));
+ $('.details', $feedItem).click(toggleRecordingDetails);
+ $('.details-arrow', $feedItem).click(toggleRecordingDetails);
+ $('.play-button', $feedItem).click(toggleRecordingPlay);
+
+ $('.btn-share', $feedItem).click(function() {
+ ui.launchShareDialog(options.candidate_claimed_recording.id, 'recording');
+ });
+
+ $('.btn-comment', $feedItem).click(function() {
+ ui.launchCommentDialog({
+ recording_id: feed.id,
+ claimed_recording_id: options.candidate_claimed_recording.id,
+ entity_type: 'recording'
+ });
+ });
+
+ $('.btn-like', $feedItem).click(function() {
+ ui.addRecordingLike(feed.id, options.candidate_claimed_recording.id, JK.currentUserId, $('.likes', $feedItem), $('.btn-like', $feedItem));
+ });
+
+ // put the feed item on the page
+ renderFeed($feedItem);
+
+ // these routines need the item to have height to work (must be after renderFeed)
+ $controls.listenRecording({recordingId: feed.id, claimedRecordingId: options.candidate_claimed_recording.id, sliderSelector:'.recording-slider', sliderBarSelector: '.recording-playback', currentTimeSelector:'.recording-current'});
+ $controls.bind('statechange.listenRecording', stateChangeRecording);
+ $('.dotdotdot', $feedItem).dotdotdot();
+ $feedItem.data('original-max-height', $feedItem.css('height'));
+ context.JK.bindHoverEvents($feedItem);
+ context.JK.bindProfileClickEvents($feedItem);
+ }
+ else {
+ logger.warn("skipping feed type: " + feed.type);
+ }
+
+ context.JK.bindProfileClickEvents();
+ });
+ }
+
+ function renderFeed(feed) {
+ $content.append(feed);
+ }
+
+ function search() {
+ logger.debug("Searching for feeds...");
+ refresh();
+ return false;
+ }
+
+ function events() {
+ $refresh.on("click", search);
+ $sortFeedBy.on('change', search);
+ $includeDate.on('change', search);
+ $includeType.on('change', search);
+ }
+
+ function initialize(_$parent, _$scroller, _$content, _$noMorefeeds, _$refresh, _$sortFeedBy, _$includeDate, _$includeType) {
+ $screen = _$parent;
+ $scroller = _$scroller;
+ $content = _$content;
+ $noMoreFeeds = _$noMorefeeds;
+ $refresh = _$refresh;
+ $sortFeedBy = _$sortFeedBy;
+ $includeDate = _$includeDate;
+ $includeType = _$includeType;
+
+ if($screen.length == 0) throw "$screen must be specified";
+ if($scroller.length == 0) throw "$scroller must be specified";
+ if($content.length == 0) throw "$content must be specified";
+ if($noMoreFeeds.length == 0) throw "$noMoreFeeds must be specified";
+ if($refresh.length == 0) throw "$refresh must be specified";
+ if($sortFeedBy.length == 0) throw "$sortFeedBy must be specified";
+ if($includeDate.length == 0) throw "$includeDate must be specified";
+ if($includeType.length ==0) throw "$includeType must be specified";
+
+ // set default search criteria
+ $sortFeedBy.val('date')
+ $includeDate.val('month')
+ $includeType.val('all')
+
+ events();
+ }
+
+ this.initialize = initialize;
+ this.refresh = refresh;
+
+ return this;
+ }
+})(window, jQuery)
\ No newline at end of file