2013-03-04 03:38:12 +00:00
|
|
|
(function(context,$) {
|
|
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
|
|
context.JK = context.JK || {};
|
|
|
|
|
context.JK.Sidebar = function(app) {
|
|
|
|
|
var logger = context.JK.logger;
|
2013-03-31 13:54:00 +00:00
|
|
|
var friends = [];
|
2013-03-04 03:38:12 +00:00
|
|
|
|
2013-03-10 03:00:34 +00:00
|
|
|
function initializeFriendsPanel() {
|
2013-03-04 03:38:12 +00:00
|
|
|
|
2013-03-10 01:57:09 +00:00
|
|
|
$('#sidebar-search-header').hide();
|
|
|
|
|
|
2013-03-04 03:38:12 +00:00
|
|
|
var url = "/api/users/" + context.JK.currentUserId + "/friends"
|
|
|
|
|
$.ajax({
|
|
|
|
|
type: "GET",
|
|
|
|
|
dataType: "json",
|
|
|
|
|
contentType: 'application/json',
|
|
|
|
|
url: url,
|
|
|
|
|
processData: false,
|
|
|
|
|
success: function(response) {
|
2013-03-10 01:57:09 +00:00
|
|
|
|
2013-03-31 13:54:00 +00:00
|
|
|
friends = response;
|
|
|
|
|
updateFriendList(response);
|
2013-03-10 01:57:09 +00:00
|
|
|
|
2013-03-31 13:54:00 +00:00
|
|
|
// set friend count
|
|
|
|
|
$('#sidebar-friend-count').html(response.length);
|
|
|
|
|
},
|
|
|
|
|
error: app.ajaxError
|
|
|
|
|
});
|
2013-03-10 01:57:09 +00:00
|
|
|
|
2013-03-31 13:54:00 +00:00
|
|
|
return false;
|
|
|
|
|
}
|
2013-03-10 01:57:09 +00:00
|
|
|
|
2013-03-31 13:54:00 +00:00
|
|
|
function updateFriendList(response) {
|
|
|
|
|
$('#sidebar-friend-list').empty();
|
2013-03-10 01:57:09 +00:00
|
|
|
|
2013-03-31 13:54:00 +00:00
|
|
|
// show online friends first (sort by first name within online/offline groups)
|
|
|
|
|
response.sort(function(a, b) {
|
2013-03-04 03:38:12 +00:00
|
|
|
|
2013-03-31 13:54:00 +00:00
|
|
|
var a_online = a.online;
|
|
|
|
|
var b_online = b.online;
|
2013-03-04 03:38:12 +00:00
|
|
|
|
2013-03-31 13:54:00 +00:00
|
|
|
var a_firstname = a.first_name.toLowerCase();
|
|
|
|
|
var b_firstname = b.first_name.toLowerCase();
|
2013-03-04 03:38:12 +00:00
|
|
|
|
2013-03-31 13:54:00 +00:00
|
|
|
if (b_online != a_online) {
|
|
|
|
|
if (b_online < a_online) return -1;
|
|
|
|
|
if (b_online > a_online) return 1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2013-03-04 03:38:12 +00:00
|
|
|
|
2013-03-31 13:54:00 +00:00
|
|
|
if (a_firstname < b_firstname) return -1;
|
|
|
|
|
if (a_firstname > b_firstname) return 1;
|
|
|
|
|
return 0;
|
2013-03-04 03:38:12 +00:00
|
|
|
});
|
|
|
|
|
|
2013-03-31 13:54:00 +00:00
|
|
|
$.each(response, function(index, val) {
|
|
|
|
|
|
|
|
|
|
var css = val.online ? '' : 'offline';
|
|
|
|
|
|
|
|
|
|
friends[val.id] = val;
|
|
|
|
|
|
|
|
|
|
// fill in template for Connect pre-click
|
|
|
|
|
var template = $('#template-friend-panel').html();
|
|
|
|
|
var searchResultHtml = context.JK.fillTemplate(template, {
|
|
|
|
|
userId: val.id,
|
|
|
|
|
cssClass: css,
|
|
|
|
|
avatar_url: context.JK.resolveAvatarUrl(val.photo_url),
|
|
|
|
|
userName: val.name,
|
|
|
|
|
status: val.online ? 'Available' : 'Offline',
|
|
|
|
|
extra_info: '',
|
|
|
|
|
info_image_url: ''
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$('#sidebar-friend-list').append(searchResultHtml);
|
|
|
|
|
});
|
2013-03-04 03:38:12 +00:00
|
|
|
}
|
|
|
|
|
|
2013-03-10 03:00:34 +00:00
|
|
|
function initializeNotificationsPanel() {
|
2013-03-31 13:54:00 +00:00
|
|
|
// pull down pending notifications for this users
|
2013-03-10 03:00:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function initializeChatPanel() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-15 05:18:16 +00:00
|
|
|
// TODO: most of this code is in searchResults.js - REFACTOR
|
2013-03-10 01:57:09 +00:00
|
|
|
function search(query) {
|
|
|
|
|
|
|
|
|
|
logger.debug('query=' + query);
|
|
|
|
|
if (query !== '') {
|
2013-03-15 05:18:16 +00:00
|
|
|
context.JK.search(query, app, onSearchSuccess);
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-03-10 01:57:09 +00:00
|
|
|
|
2013-03-15 05:18:16 +00:00
|
|
|
function onSearchSuccess(response) {
|
|
|
|
|
$.each(response.musicians, function(index, val) {
|
|
|
|
|
|
|
|
|
|
// fill in template for Connect pre-click
|
|
|
|
|
var template = $('#template-sidebar-search-result').html();
|
|
|
|
|
var searchResultHtml = context.JK.fillTemplate(template, {
|
|
|
|
|
userId: val.id,
|
|
|
|
|
avatar_url: context.JK.resolveAvatarUrl(val.photo_url),
|
|
|
|
|
userName: val.name,
|
|
|
|
|
location: val.location
|
2013-03-10 01:57:09 +00:00
|
|
|
});
|
2013-03-15 05:18:16 +00:00
|
|
|
|
|
|
|
|
$('#sidebar-search-results').append(searchResultHtml);
|
|
|
|
|
|
|
|
|
|
// fill in template for Connect post-click
|
|
|
|
|
template = $('#template-sidebar-invitation-sent').html();
|
|
|
|
|
var invitationSentHtml = context.JK.fillTemplate(template, {
|
|
|
|
|
userId: val.id,
|
|
|
|
|
first_name: val.first_name,
|
|
|
|
|
profile_url: "/users/" + val.id
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$('#sidebar-search-results').append(invitationSentHtml);
|
|
|
|
|
|
|
|
|
|
// initialize visibility of the divs
|
|
|
|
|
$('div[layout=sidebar] div[user-id=' + val.id + '].sidebar-search-connected').hide();
|
|
|
|
|
$('div[layout=sidebar] div[user-id=' + val.id + '].sidebar-search-result').show();
|
|
|
|
|
|
|
|
|
|
// wire up button click handler
|
|
|
|
|
$('div[layout=sidebar] div[user-id=' + val.id + ']').find('#btn-connect-friend').click(sendFriendRequest);
|
|
|
|
|
});
|
|
|
|
|
|
2013-03-22 00:17:28 +00:00
|
|
|
// show header
|
2013-03-15 05:18:16 +00:00
|
|
|
$('#sidebar-search-header').show();
|
2013-03-10 01:57:09 +00:00
|
|
|
|
2013-03-22 00:17:28 +00:00
|
|
|
// hide panels
|
2013-03-10 01:57:09 +00:00
|
|
|
$('[layout-panel="contents"]').hide();
|
|
|
|
|
$('[layout-panel="contents"]').css({"height": "1px"});
|
2013-03-22 00:17:28 +00:00
|
|
|
|
|
|
|
|
// resize search results area
|
|
|
|
|
$('#sidebar-search-results').height(getHeight() + 'px');
|
2013-03-10 01:57:09 +00:00
|
|
|
}
|
|
|
|
|
|
2013-03-10 04:28:21 +00:00
|
|
|
function getHeight() {
|
|
|
|
|
// TODO: refactor this - copied from layout.js
|
|
|
|
|
var sidebarHeight = $(context).height() - 75 - 2 * 60 + $('[layout-sidebar-expander]').height();
|
|
|
|
|
var combinedHeaderHeight = $('[layout-panel="contents"]').length * 36;
|
|
|
|
|
var searchHeight = $('.sidebar .search').first().height();
|
|
|
|
|
var expanderHeight = $('[layout-sidebar-expander]').height();
|
|
|
|
|
var expandedPanelHeight = sidebarHeight - (combinedHeaderHeight + expanderHeight + searchHeight);
|
|
|
|
|
return expandedPanelHeight;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function showFriendsPanel() {
|
|
|
|
|
|
|
|
|
|
var $expandedPanelContents = $('[layout-id="panelFriends"] [layout-panel="contents"]');
|
|
|
|
|
var expandedPanelHeight = getHeight();
|
|
|
|
|
|
|
|
|
|
// hide all other contents
|
|
|
|
|
$('[layout-panel="contents"]').hide();
|
|
|
|
|
$('[layout-panel="contents"]').css({"height": "1px"});
|
|
|
|
|
|
|
|
|
|
// show the appropriate contens
|
|
|
|
|
$expandedPanelContents.show();
|
|
|
|
|
$expandedPanelContents.animate({"height": expandedPanelHeight + "px"}, 400);
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-10 01:57:09 +00:00
|
|
|
// TODO: same code is in searchResults.js - REFACTOR
|
2013-03-04 03:38:12 +00:00
|
|
|
function sendFriendRequest(evt) {
|
|
|
|
|
evt.stopPropagation();
|
|
|
|
|
var userId = $(this).parent().attr('user-id');
|
|
|
|
|
|
|
|
|
|
var url = "/api/users/" + context.JK.currentUserId + "/friend_requests";
|
|
|
|
|
$.ajax({
|
|
|
|
|
type: "POST",
|
|
|
|
|
dataType: "json",
|
|
|
|
|
contentType: 'application/json',
|
|
|
|
|
url: url,
|
|
|
|
|
data: '{"friend_id":"' + userId + '"}',
|
|
|
|
|
processData: false,
|
|
|
|
|
success: function(response) {
|
|
|
|
|
// toggle the pre-click and post-click divs
|
2013-03-15 05:18:16 +00:00
|
|
|
logger.debug('userId=' + userId);
|
2013-03-10 01:57:09 +00:00
|
|
|
$('div[layout=sidebar] div[user-id=' + userId + '].sidebar-search-connected').show();
|
2013-03-15 05:18:16 +00:00
|
|
|
$('div[layout=sidebar] div[user-id=' + userId + '].sidebar-search-result').hide();
|
2013-03-04 03:38:12 +00:00
|
|
|
},
|
|
|
|
|
error: app.ajaxError
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-10 01:57:09 +00:00
|
|
|
function hideSearchResults() {
|
|
|
|
|
emptySearchResults();
|
|
|
|
|
$('#search-input').val('');
|
|
|
|
|
$('#sidebar-search-header').hide();
|
2013-03-10 04:28:21 +00:00
|
|
|
showFriendsPanel();
|
2013-03-10 01:57:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function emptySearchResults() {
|
|
|
|
|
$('#sidebar-search-results').empty();
|
2013-03-10 04:28:21 +00:00
|
|
|
$('#sidebar-search-results').height('0px');
|
2013-03-10 01:57:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
|
// (1) optimize so we're not hitting server on each keyup once > 2 characters are entered
|
|
|
|
|
// (2) hide any expanded panels once search starts
|
2013-03-04 03:38:12 +00:00
|
|
|
function events() {
|
2013-03-10 01:57:09 +00:00
|
|
|
$('#search-input').keyup(function(evt) {
|
|
|
|
|
// ENTER KEY
|
|
|
|
|
if (evt.which === 13) {
|
|
|
|
|
return hideSearchResults();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ESCAPE KEY
|
|
|
|
|
if (evt.which === 27) {
|
|
|
|
|
return hideSearchResults();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var query = $(this).val();
|
|
|
|
|
|
|
|
|
|
if (query === '') {
|
|
|
|
|
return hideSearchResults();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (query !== '' && query.length > 2) {
|
|
|
|
|
emptySearchResults();
|
|
|
|
|
search(query);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$('#sidebar-search-expand').click(function(evt) {
|
|
|
|
|
$('#searchForm').submit();
|
|
|
|
|
hideSearchResults();
|
|
|
|
|
});
|
2013-03-31 13:54:00 +00:00
|
|
|
|
|
|
|
|
// wire up FRIEND_UPDATE handler
|
|
|
|
|
context.JK.JamServer.registerMessageCallback(context.JK.MessageType.FRIEND_UPDATE, function(header, payload) {
|
|
|
|
|
logger.debug("Handling FRIEND_UPDATE msg " + JSON.stringify(payload));
|
|
|
|
|
|
|
|
|
|
// update friends panel in sidebar
|
|
|
|
|
friends[payload.user_id].online = payload.online;
|
|
|
|
|
updateFriendList(friends);
|
|
|
|
|
|
|
|
|
|
// display notification
|
|
|
|
|
var online_text = payload.online ? "online" : "offline";
|
|
|
|
|
app.notify({
|
|
|
|
|
"title": "Friend is now " + online_text,
|
|
|
|
|
"text": payload.msg,
|
|
|
|
|
"avatar_url": payload.photo_url
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// wire up FRIEND_REQUEST handler
|
|
|
|
|
context.JK.JamServer.registerMessageCallback(context.JK.MessageType.FRIEND_REQUEST, function(header, payload) {
|
|
|
|
|
logger.debug("Handling FRIEND_REQUEST msg " + JSON.stringify(payload));
|
|
|
|
|
|
|
|
|
|
// update notifications panel in sidebar
|
|
|
|
|
|
|
|
|
|
// display notification
|
|
|
|
|
app.notify({
|
|
|
|
|
"title": "New Friend Request",
|
|
|
|
|
"text": payload.msg,
|
|
|
|
|
"avatar_url": payload.photo_url
|
|
|
|
|
});
|
|
|
|
|
});
|
2013-03-04 03:38:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.initialize = function() {
|
|
|
|
|
events();
|
2013-03-10 03:00:34 +00:00
|
|
|
initializeFriendsPanel();
|
|
|
|
|
initializeChatPanel();
|
|
|
|
|
initializeNotificationsPanel();
|
2013-03-04 03:38:12 +00:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
})(window,jQuery);
|