(function() { socket.emit('api:updateHeader', { fields: ['username', 'picture', 'userslug'] }); socket.on('api:updateHeader', function(data) { jQuery('#search-button').on('click', function() { jQuery('#search-fields').removeClass('hide').show(); jQuery(this).hide(); jQuery('#search-fields input').focus() jQuery('#search-form').on('submit', function() { jQuery('#search-fields').hide(); jQuery('#search-button').show(); }); $('#search-fields input').on('blur', function() { $('#search-fields').hide(); $('#search-button').show(); }); }); var loggedInMenu = $('#logged-in-menu'), isLoggedIn = data.uid > 0; if (isLoggedIn) { jQuery('.nodebb-loggedin').show(); jQuery('.nodebb-loggedout').hide(); $('#logged-out-menu').addClass('hide'); $('#logged-in-menu').removeClass('hide'); $('#search-button').show(); var userLabel = loggedInMenu.find('#user_label'); if (userLabel.length) { if (data['userslug']) userLabel.find('#user-profile-link').attr('href', '/user/' + data['userslug']); if (data['picture']) userLabel.find('img').attr('src', data['picture']); if (data['username']) userLabel.find('span').html(data['username']); $('#logout-link').on('click', app.logout); } } else { $('#search-button').hide(); jQuery('.nodebb-loggedin').hide(); jQuery('.nodebb-loggedout').show(); $('#logged-out-menu').removeClass('hide'); $('#logged-in-menu').addClass('hide'); } $('#main-nav a,#user-control-list a,#logged-out-menu .dropdown-menu a').off('click').on('click', function() { if($('.navbar .navbar-collapse').hasClass('in')) $('.navbar-header button').click(); }); }); // Notifications dropdown var notifContainer = document.getElementsByClassName('notifications')[0], notifTrigger = notifContainer.querySelector('a'), notifList = document.getElementById('notif-list'), notifIcon = $('.notifications a'); notifTrigger.addEventListener('click', function(e) { e.preventDefault(); if (notifContainer.className.indexOf('open') === -1) { socket.emit('api:notifications.get', null, function(data) { var notifFrag = document.createDocumentFragment(), notifEl = document.createElement('li'), numRead = data.read.length, numUnread = data.unread.length, x; notifList.innerHTML = ''; if ((data.read.length + data.unread.length) > 0) { for (x = 0; x < numUnread; x++) { notifEl.setAttribute('data-nid', data.unread[x].nid); notifEl.className = 'unread'; notifEl.innerHTML = '<a href="' + data.unread[x].path + '"><span class="pull-right">' + utils.relativeTime(data.unread[x].datetime, true) + '</span>' + data.unread[x].text + '</a>'; notifFrag.appendChild(notifEl.cloneNode(true)); } for (x = 0; x < numRead; x++) { notifEl.setAttribute('data-nid', data.read[x].nid); notifEl.className = ''; notifEl.innerHTML = '<a href="' + data.read[x].path + '"><span class="pull-right">' + utils.relativeTime(data.read[x].datetime, true) + '</span>' + data.read[x].text + '</a>'; notifFrag.appendChild(notifEl.cloneNode(true)); } } else { notifEl.className = 'no-notifs'; notifEl.innerHTML = '<a>You have no notifications</a>'; notifFrag.appendChild(notifEl.cloneNode(true)); } // Add dedicated link to /notifications notifEl.removeAttribute('data-nid'); notifEl.className = 'pagelink'; notifEl.innerHTML = '<a href="' + RELATIVE_PATH + '/notifications">See all Notifications</a>'; notifFrag.appendChild(notifEl.cloneNode(true)); notifList.appendChild(notifFrag); if (data.unread.length > 0) { notifIcon.toggleClass('active', true); } else { notifIcon.toggleClass('active', false); } socket.emit('api:notifications.mark_all_read', null, function() { notifIcon.toggleClass('active', false); app.refreshTitle(); // Update favicon + local count Tinycon.setBubble(0); localStorage.setItem('notifications:count', 0); }); }); } }); notifList.addEventListener('click', function(e) { var target; switch (e.target.nodeName) { case 'SPAN': target = e.target.parentNode.parentNode; break; case 'A': target = e.target.parentNode; break; case 'li': target = e.target; break; } if (target) { var nid = parseInt(target.getAttribute('data-nid')); if (nid > 0) socket.emit('api:notifications.mark_read', nid); } }); var updateNotifCount = function(count) { // Update notification icon, if necessary if (count > 0) { notifIcon.toggleClass('active', true); } else { notifIcon.toggleClass('active', false); } // Update the favicon + saved local count Tinycon.setBubble(count); localStorage.setItem('notifications:count', count); }; socket.emit('api:notifications.getCount', function(err, count) { if (!err) { updateNotifCount(count); } else { updateNotifCount(0); } }); socket.on('event:new_notification', function() { notifIcon.toggleClass('active', true); app.alert({ alert_id: 'new_notif', title: 'New notification', message: 'You have unread notifications.', type: 'warning', timeout: 2000 }); app.refreshTitle(); if (ajaxify.currentPage === 'notifications') { ajaxify.refresh(); } // Update the favicon + local storage var savedCount = parseInt(localStorage.getItem('notifications:count'),10) || 0; updateNotifCount(savedCount+1); }); socket.on('event:notifications.updateCount', function(count) { updateNotifCount(count); }); // Chats Dropdown var chatsToggleEl = $('#chat_dropdown'), chatsListEl = $('#chat-list'), chatDropdownEl = chatsToggleEl.parent(); chatsToggleEl.on('click', function() { if (chatDropdownEl.hasClass('open')) { return; } socket.emit('api:chats.list', function(chats) { var chatsFrag = document.createDocumentFragment(), chatEl = document.createElement('li'), numChats = chats.length, x, userObj; if (numChats > 0) { for(x=0;x<numChats;x++) { userObj = chats[x]; chatEl.setAttribute('data-uid', userObj.uid); chatEl.innerHTML = '<a href="javascript:app.openChat(\'' + userObj.username + '\', ' + userObj.uid + ');"><img src="' + userObj.picture + '" title="' + userObj.username + '" />' + userObj.username + '</a>'; chatsFrag.appendChild(chatEl.cloneNode(true)); } } else { chatEl.innerHTML = '<a href="#">No Recent Chats</a>'; chatsFrag.appendChild(chatEl.cloneNode(true)); } chatsListEl.empty(); chatsListEl.html(chatsFrag); }); }); socket.on('event:chats.receive', function(data) { require(['chat'], function(chat) { var modal = null; if (chat.modalExists(data.fromuid)) { modal = chat.getModal(data.fromuid); chat.appendChatMessage(modal, data.message, data.timestamp); if (modal.is(":visible")) { chat.load(modal.attr('UUID')); } else { chat.toggleNew(modal.attr('UUID'), true); } if (!modal.is(":visible") || !app.isFocused) { app.alternatingTitle(data.username + ' has messaged you'); } } else { modal = chat.createModal(data.username, data.fromuid); chat.toggleNew(modal.attr('UUID'), true); app.alternatingTitle(data.username + ' has messaged you'); } }); }); function updateUnreadCount(count) { var badge = $('#numUnreadBadge'); badge.html(count > 20 ? '20+' : count); if (count > 0) { badge .removeClass('badge-inverse') .addClass('badge-important'); } else { badge .removeClass('badge-important') .addClass('badge-inverse'); } } socket.on('event:unread.updateCount', updateUnreadCount); socket.emit('api:unread.count', updateUnreadCount); require(['mobileMenu'], function(mobileMenu) { mobileMenu.init(); }); }());