define(function() { var Notifications = {}; Notifications.prepareDOM = function() { // 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 = '' + utils.relativeTime(data.unread[x].datetime, true) + '' + data.unread[x].text + ''; notifFrag.appendChild(notifEl.cloneNode(true)); } for (x = 0; x < numRead; x++) { notifEl.setAttribute('data-nid', data.read[x].nid); notifEl.className = ''; notifEl.innerHTML = '' + utils.relativeTime(data.read[x].datetime, true) + '' + data.read[x].text + ''; notifFrag.appendChild(notifEl.cloneNode(true)); } } else { notifEl.className = 'no-notifs'; notifEl.innerHTML = 'You have no notifications'; notifFrag.appendChild(notifEl.cloneNode(true)); } // Add dedicated link to /notifications notifEl.removeAttribute('data-nid'); notifEl.className = 'pagelink'; notifEl.innerHTML = 'See all Notifications'; 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:modules.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:modules.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); }); }; return Notifications; });