(function (context, $) { "use strict"; context.JK = context.JK || {}; context.JK.ProfileScreen = function (app) { var logger = context.JK.logger; var userId; var user = null; var userDefer = null; var rest = context.JK.Rest(); var decrementedFriendCountOnce = false; var sentFriendRequest = false; var textMessageDialog = null; var feed = null; var player = null; var profileUtils = context.JK.ProfileUtils; var EVENTS = context.JK.EVENTS; var NOT_SPECIFIED_TEXT = 'Not specified'; var $screen = $('#user-profile'); var $biography = $screen.find('#biography'); // musical experience var $instruments = $screen.find('.instruments-holder'); var $musicianStatus = $screen.find('#musician-status'); var $genres = $screen.find('#genres'); var $concertCount = $screen.find('#concert-count'); var $studioCount = $screen.find('#studio-count'); // performance samples var $noSamples = $screen.find('.no-samples'); var $jamkazamSamples = $screen.find('.jamkazam-samples'); var $soundCloudSamples = $screen.find('.soundcloud-samples'); var $youTubeSamples = $screen.find('.youtube-samples'); // online presence var $userWebsite = $screen.find('.user-website'); var $soundCloudPresence = $screen.find('.soundcloud-presence'); var $reverbNationPresence = $screen.find('.reverbnation-presence'); var $bandCampPresence = $screen.find('.bandcamp-presence'); var $fandalismPresence = $screen.find('.fandalism-presence'); var $youTubePresence = $screen.find('.youtube-presence'); var $facebookPresence = $screen.find('.facebook-presence'); var $twitterPresence = $screen.find('.twitter-presence'); // current interests var $noInterests = $screen.find('#no-interests'); var $paidGigSection = $screen.find('#paid-gigs'); var $paidGigDetails = $screen.find('#paid-gig-details'); var $freeGigSection = $screen.find('#free-gigs'); var $freeGigDetails = $screen.find('#free-gig-details'); var $cowritingSection = $screen.find('#cowriting'); var $cowritingDetails = $screen.find('#cowriting-details'); var $traditionalBandSection = $screen.find('#traditional-band'); var $traditionalBandDetails = $screen.find('#traditional-band-details'); var $virtualBandSection = $screen.find('#virtual-band'); var $virtualBandDetails = $screen.find('#virtual-band-details'); // tabs var $aboutLink = $screen.find('#about-link'); var $aboutContent = $screen.find('#about-content'); var $historyLink = $screen.find('#history-link'); var $historyContent = $screen.find('#history-content'); var $bandsLink = $screen.find('#bands-link'); var $bandsContent = $screen.find('#bands-content'); var $socialLink = $screen.find('#social-link'); var $socialContent = $screen.find('#social-content'); var $favoritesLink = $screen.find('#favorites-link'); var $favoritesContent = $screen.find('#favorites-content'); // stats var $friendStats = $screen.find('#friend-stats'); var $followerStats = $screen.find('#follower-stats'); var $sessionStats = $screen.find('#session-stats'); var $recordingStats = $screen.find('#recording-stats'); var $followingStats = $screen.find('#following-stats'); var $favoriteStats = $screen.find('#favorite-stats'); // miscellaneous var $userName = $screen.find('#username'); var $avatar = $screen.find('#avatar'); var $typeLabel = $screen.find('#type-label'); var $location = $screen.find('#location'); var $age = $screen.find('#age'); // buttons var $profileActions = $screen.find('.profile-actions') var $btnEdit = $screen.find('.edit-profile-btn'); var $btnTeacherProfileEdit = $screen.find('.edit-teacher-profile-btn'); var $btnTeacherProfileView = $screen.find('.view-teacher-profile-btn'); var $toggleTeacherSearchEnabled = $screen.find('.teacher-search-enabled') var $btnAddFriend = $screen.find('#btn-add-friend'); var $btnFollowUser = $screen.find('#btn-follow-user'); var $btnMessageUser = $screen.find('#btn-message-user'); var $btnEditBio = $screen.find(".add-bio"); var $btnAddRecordings = $screen.find('.add-recordings'); var $btnAddSites = $screen.find('.add-sites'); var $btnAddInterests = $screen.find('.add-interests'); var $btnAddExperiences = $screen.find('.add-experiences') // social var $socialLeft = $screen.find('.profile-social-left'); var $socialFriends = $screen.find('#social-friends'); var $socialFollowings = $screen.find('#social-followings'); var $socialFollowers = $screen.find('#social-followers'); var instrument_logo_map = context.JK.getInstrumentIconMap24(); function beforeShow(data) { userId = data.id; feed.setUser(userId); } function afterShow(data) { initUser(); resetForm(); renderAllStats(); autoShowRatingDialogIfNeeded(); } function autoShowRatingDialogIfNeeded() { if ($.QueryString['selected']) { var rewrite = true app.layout.showDialog('rate-user-dialog', {d1: "student_" + userId}).one(EVENTS.DIALOG_CLOSED, function (e, data) { if (!data.canceled) { } }) } if (rewrite) { if (window.history.replaceState) {//ie9 proofing window.history.replaceState({}, "", "/client#/profile/" + userId) } } } function beforeHide(data) { feed.setUser(null); } function resetForm() { //$instruments.empty(); $aboutContent.show(); $historyContent.hide(); $bandsContent.hide(); $socialContent.hide(); $favoritesContent.hide(); $('.profile-nav a.active').removeClass('active'); $aboutLink.addClass('active'); } function initUser() { user = null; decrementedFriendCountOnce = false; sentFriendRequest = false; userDefer = rest.getUserProfile({id: userId, show_teacher: true}) .done(function (response) { user = response; configureUserType(); renderActive(); renderAllStats(); }) .fail(function (jqXHR) { if (jqXHR.status >= 500) { context.JK.fetchUserNetworkOrServerFailure(); } else if (jqXHR.status == 404) { context.JK.entityNotFound("User"); } else { app.ajaxError(arguments); } }); } function isMusician() { return user.musician; } function isTeacher() { return user.teacher; } function isCurrentUser() { return userId === context.JK.currentUserId; } function configureUserType() { if (isMusician()) { $historyLink.show(); $bandsLink.show(); $instruments.show(); $sessionStats.show(); $recordingStats.show(); // $followingStats.hide(); // $favoriteStats.hide(); $socialLeft.show(); $typeLabel.text('musician'); $location.text('Location'); } else { $historyLink.hide(); $bandsLink.hide(); $instruments.hide(); $sessionStats.hide(); $recordingStats.hide(); // $followingStats.show(); // $favoriteStats.show(); $socialLeft.hide(); $typeLabel.text('fan'); $location.text('Presence'); } if (isCurrentUser()) { $profileActions.show() $btnEdit.show(); $btnTeacherProfileEdit.show(); if (isTeacher()) { $btnTeacherProfileView.show(); $toggleTeacherSearchEnabled.show() } else { $btnTeacherProfileView.hide(); $toggleTeacherSearchEnabled.hide() } $btnAddFriend.hide(); $btnFollowUser.hide(); $btnMessageUser.hide(); } else { configureFriendFollowersControls(); $profileActions.hide(); $btnEdit.hide(); $btnTeacherProfileEdit.hide(); $btnTeacherProfileView.show(); $btnAddFriend.show(); $btnFollowUser.show(); $btnMessageUser.show(); } } function configureFriendFollowersControls() { // wire up Add Friend click configureFriendButton(); // wire up Follow click configureFollowingButton(); } /****************** MAIN PORTION OF SCREEN *****************/ // events for main screen function events() { // wire up panel clicks -- these need to check deferred because they can't be hidden when in an invalid state $aboutLink.click(function () { renderTabDeferred(renderAbout) }); $historyLink.click(function () { renderTabDeferred(renderHistory) }); $bandsLink.click(function () { renderTabDeferred(renderBands) }); $socialLink.click(function () { renderTabDeferred(renderSocial) }); $favoritesLink.click(function () { renderTabDeferred(renderFavorites) }); // this doesn't need deferred because it's only shown when valid $btnAddFriend.click(handleFriendChange); $btnFollowUser.click(handleFollowingChange); $btnMessageUser.click(handleMessageMusician); // Hook up soundcloud player: $soundCloudSamples.off("click", "a.sound-cloud-playable").on("click", "a.sound-cloud-playable", playSoundCloudFile) $btnEdit.click(function (e) { e.preventDefault() window.ProfileActions.startProfileEdit(null, false) return false; }) $btnTeacherProfileEdit.click(function (e) { e.preventDefault() window.ProfileActions.startTeacherEdit(null, false) return false; }) $btnTeacherProfileView.click(function (e) { e.preventDefault() context.location = '/client#/profile/teacher/' + context.JK.currentUserId; return false; }) $btnEditBio.click(function (e) { e.preventDefault() window.ProfileActions.startProfileEdit(null, true) return false; }) $btnAddRecordings.click(function (e) { e.preventDefault() window.ProfileActions.startProfileEdit('samples', true) return false; }) $btnAddSites.click(function (e) { e.preventDefault() window.ProfileActions.startProfileEdit('samples', true) return false; }) $btnAddInterests.click(function (e) { e.preventDefault() window.ProfileActions.startProfileEdit('interests', true) return false; }); $btnAddExperiences.click(function (e) { e.preventDefault() window.ProfileActions.startProfileEdit('experience', true) return false; }) $toggleTeacherSearchEnabled.find('input').change(function(e) { var $check = $(this) rest.updateTeacher({id: user.teacher.id, is_searchable: $check.is(':checked')}) .fail(app.ajaxError); }) } function playSoundCloudFile(e) { e.preventDefault(); var url = $(this).attr("soundcloud_url") var cap = $(this).text() player.initialize(url, cap); app.layout.showDialog('sound-cloud-player-dialog'); return false; } function handleFriendChange(evt) { if (isFriend()) { removeFriend(evt); } else { sendFriendRequest(evt); } return false; } function handleFollowingChange(evt) { if (isFollowing()) { removeFollowing(false, userId); } else { addFollowing(); } return false; } function handleMessageMusician(evt) { app.layout.showDialog('text-message', {d1: userId}); return false; } function sendFriendRequest(evt) { evt.stopPropagation(); setFriend(true); // TODO: you aren't a friend yet. just a request to be one really there are 3 states here. sentFriendRequest = true; rest.sendFriendRequest(app, userId, friendRequestCallback); } function removeFriend(evt) { evt.stopPropagation(); rest.removeFriend({friend_id: userId}) .done(function () { updateFriendCount(-1); setFriend(false); configureFriendButton(); }) .fail(app.ajaxError); } function isFriend() { return user.is_friend; } function setFriend(isFriend) { user.is_friend = isFriend; } function friendRequestCallback() { configureFriendButton(); } function configureFriendButton() { if (isFriend()) { $btnAddFriend.text('DISCONNECT'); } else { $btnAddFriend.text('CONNECT'); } } function addFollowing() { rest.addFollowing({user_id: userId}) .done(function () { updateFollowingCount(1); setFollowing(true); configureFollowingButton(); context.JK.GA.trackJKSocial(context.JK.GA.Categories.jkFollow, isMusician() ? context.JK.GA.JKSocialTargets.musician : context.JK.GA.JKSocialTargets.fan); }) .fail(app.ajaxError); } function removeFollowing(isBand, id) { rest.removeFollowing(id) .done(function () { if (!isBand) { updateFollowingCount(-1); setFollowing(false); configureFollowingButton(); } else { updateBandFollowingCount(id, -1); // refresh stats configureBandFollowingButton(false, id); } }) .fail(app.ajaxError); } function isFollowing() { return user.is_following; } function setFollowing(isFollowing) { user.is_following = isFollowing; } function configureFollowingButton() { if (isFollowing()) { $btnFollowUser.text('UNFOLLOW'); } else { $btnFollowUser.text('FOLLOW'); } } function configureEditProfileButton() { $btnFollowUser.click(addFollowing); } // refreshes the currently active tab function renderActive() { if ($aboutLink.hasClass('active')) { renderAbout(); } else if ($historyLink.hasClass('active')) { renderHistory(); } else if ($bandsLink.hasClass('active')) { renderBands(); } else if ($socialLink.hasClass('active')) { renderSocial(); } else if ($favoritesLink.hasClass('active')) { renderFavorites(); } } function renderTabDeferred(tabRenderer) { userDefer .done(function () { tabRenderer(); }) .fail(function () { // try again initUser(); }) } function hideElements(elements) { $.each(elements, function (index, val) { val.hide(); }); } /****************** ABOUT TAB *****************/ function renderAbout() { //$instruments.empty(); $aboutContent.show(); $historyContent.hide(); $bandsContent.hide(); $socialContent.hide(); $favoritesContent.hide(); $('.profile-nav a.active').removeClass('active'); $aboutLink.addClass('active'); } function renderAllStats() { if (!isCurrentUser()) { $btnEditBio.hide(); $btnAddRecordings.hide(); $btnAddSites.hide(); $btnAddInterests.hide(); } if (user && $userName) { renderNameLocationStats(); renderBio(); renderMusicalExperience(); renderPerformanceSamples(); renderOnlinePresence(); renderInterests(); renderTeacherSearch(); } } function renderNameLocationStats() { // name $userName.html(user.name); // avatar $avatar.attr('src', context.JK.resolveAvatarUrl(user.photo_url)); // location $location.html(user.location); //$age.html(user.age ? user.age + " years old" : ""); // stats var text = user.friend_count > 1 || user.friend_count === 0 ? " Friends" : " Friend"; $friendStats.html('' + user.friend_count + '' + text); text = user.follower_count > 1 || user.follower_count === 0 ? " Followers" : " Follower"; $followerStats.html('' + user.follower_count + '' + text); if (isMusician()) { text = user.session_count > 1 || user.session_count === 0 ? " Sessions" : " Session"; $sessionStats.html(user.session_count + text); text = user.recording_count > 1 || user.recording_count === 0 ? " Recordings" : " Recording"; $recordingStats.html(user.recording_count + text); } else { text = " Following"; $followingStats.html(user.following_count + text); text = user.favorite_count > 1 || user.favorite_count === 0 ? " Favorites" : " Favorite"; $favoriteStats.html(user.favorite_count + text); } } function renderBio() { $biography.html(user.biography ? user.biography : NOT_SPECIFIED_TEXT); if (isCurrentUser()) { $btnEditBio.show(); } else { $btnEditBio.hide(); } } function renderTeacherSearch() { if(isTeacher()) { if(user.teacher.is_searchable ) { $toggleTeacherSearchEnabled.find('input').attr('checked', 'checked') } else { $toggleTeacherSearchEnabled.find('input').removeAttr('checked') } } } function renderMusicalExperience() { profileUtils.renderMusicalExperience(user, $screen, isCurrentUser()) } function renderPerformanceSamples() { profileUtils.renderPerformanceSamples(user, $screen, isCurrentUser()) } function renderOnlinePresence() { profileUtils.renderOnlinePresence(user, $screen, isCurrentUser()) } function renderInterests() { // current interests if (isCurrentUser()) { $btnAddInterests.show(); } else { $btnAddInterests.hide(); } var noInterests = !user.paid_sessions && !user.free_sessions && !user.cowriting && !user.virtual_band && !user.traditional_band; if (noInterests) { $noInterests.show(); $paidGigSection.hide(); $freeGigSection.hide(); $cowritingSection.hide(); $traditionalBandSection.hide(); $virtualBandSection.hide(); } else { $noInterests.hide(); // paid sessions if (user.paid_sessions) { $paidGigSection.show(); var genreList = profileUtils.paidSessionGenreList(user.genres); $paidGigDetails.find("ul").html(""); $paidGigDetails.find("ul").append('