OC.notify = { //TODO don't hardcode this!! refreshInterval: 30, autoRefresh: true, dom: { icon: $('' + t('notify', 'Notifications') + ''), counter: $('0'), listContainer: $('
' + t('notify', 'Notifications') + '
' + t('notify', 'Preferences') + '' + t('notify', 'Mark all as read') + '' + t('notify', 'Delete all read notifications') + '
'), list: $(''), notificationTemplate: $('
  • delete
  • '), fitContainerSize: function() { if(OC.notify.dom.listContainer.is(':hidden')) { return; } if(window.innerHeight - OC.notify.dom.listContainer.get(0).offsetTop - OC.notify.dom.listContainer.removeClass('full-height').height() < 16) { OC.notify.dom.listContainer.addClass('full-height'); } } }, notifications: [], addNotification: function(notification) { OC.notify.notifications[parseInt(notification.id)] = notification; var el = OC.notify.dom.notificationTemplate.clone().attr({ 'data-id': parseInt(notification.id), 'title': notification.moment, 'data-read': notification.read }).addClass(notification.app + '_' + notification.class).appendTo(OC.notify.dom.list); var content = el.find('a.content').attr('href', OC.linkTo('notify', 'go.php') + '?id=' + notification.id).html(notification.content).click(function(e) { //make the href actually work: e.stopPropagation(); }); if(typeof(notification.img) != 'undefined') { content.prepend(''); } for(var param in notification.params) { if(param == "class") { el.addClass(notification.params[param]); } else { el.attr('data-' + param, notification.params[param]); } } OC.notify.dom.fitContainerSize(); }, timeoutId: null, loaded: false, updated: false, setCount: function(count) { if(count < 0) { count = 0; } OC.notify.dom.counter.attr("data-count", count).text(count); OC.notify.setDocTitle(); }, changeCount: function(diff) { var count = parseInt(OC.notify.dom.counter.attr("data-count")); OC.notify.setCount(count + diff); }, originalDocTitle: document.title, setDocTitle: function() { if(!document.title.match(/^\([0-9]+\) /)) { OC.notify.originalDocTitle = document.title; } var count = parseInt(OC.notify.dom.counter.attr("data-count")); if(count > 0) { document.title = "(" + count + ") " + OC.notify.originalDocTitle; } else { document.title = OC.notify.originalDocTitle; } }, startRefresh: function(msec) { OC.notify.stopRefresh(); if(typeof(msec) == 'undefined') { msec = parseInt(OC.notify.refreshInterval) * 1000; } OC.notify.timeoutId = window.setTimeout(OC.notify.refresh, msec, msec); }, refresh: function(msec) { OC.notify.getCount().success(function(data) { OC.notify.timeoutId = window.setTimeout(OC.notify.refresh, msec, msec); }); }, stopRefresh: function() { if(typeof(OC.notify.timeoutId) == 'number') { window.clearTimeout(OC.notify.timeoutId); OC.notify.timeoutId = null; } }, toggleRefresh: function(sw) { if(typeof(sw) != 'boolean') { return OC.notify.toggleRefresh(!OC.notify.autoRefresh); } else { OC.notify.autoRefresh = sw; OC.notify.dom.listContainer.toggleClass('autorefresh', sw); if(sw) { OC.notify.startRefresh(); } else { OC.notify.stopRefresh(); } return $.post( OC.filePath('notify', 'ajax', 'setAutoRefresh.php'), {flag: sw ? 1 : 0} ); } }, markRead: function(id, read) { console.log("markRead", id, read); var notify = $('.notification[data-id="' + id + '"]'); if(typeof(read) == "undefined") { read = (notify.attr('data-read') == '0'); } return $.post( OC.filePath('notify', 'ajax', 'markRead.php'), {id: id, read: read ? 1 : 0}, function(data) { if(data.status == "success") { notify.attr('data-read', read ? 1 : 0); OC.notify.setCount(data.unread); } } ); }, markAllRead: function() { return $.post( OC.filePath('notify', 'ajax', 'markAllRead.php'), null, function(data) { if(data.status == 'success') { $('.notification').attr('data-read', 1); OC.notify.setCount(0); OC.notify.dom.listContainer.slideUp(); } } ); }, delete: function(id) { console.log("delete", id); var notify = $('.notification[data-id="' + id + '"]'); return $.post( OC.filePath('notify', 'ajax', 'delete.php'), {id: id}, function(data) { if(data.status == "success" && parseInt(data.num)) { if(notify.attr('data-read') == "0") { OC.notify.changeCount(-1); } notify.fadeOut('slow', function() { $(this).remove(); OC.notify.dom.fitContainerSize(); }); delete OC.notify.notifications[parseInt(id)]; } } ); }, deleteRead: function() { return $.post( OC.filePath('notify', 'ajax', 'deleteRead.php'), {read: true}, function(data) { if(data.status == "success") { $('.notification[data-read="1"]').fadeOut('slow', function() { $(this).remove(); }).each(function(i, e) { delete OC.notify.notifications[$(e).attr('data-id')]; }); if(OC.notify.notifications.length == 0) { OC.notify.dom.listContainer.slideUp(); } else { OC.notify.dom.fitContainerSize(); } } } ); }, getCount: function() { var current = parseInt(OC.notify.dom.counter.attr("data-count")); return $.post( OC.filePath('notify','ajax','getCount.php'), null, function(data) { var count = parseInt(data); if(count != current) { OC.notify.setCount(parseInt(data)); OC.notify.updated = true; if(!OC.notify.dom.listContainer.is(':hidden')) { OC.notify.loadNotifications(); } } } ); }, getNotifications: function() { return $.post( OC.filePath('notify','ajax','getNotifications.php'), null, function(data) { OC.notify.notifications = new Array(); OC.notify.dom.list.empty(); $(data).each(function(i, n) { OC.notify.addNotification(n); }); OC.notify.loaded = true; OC.notify.updated = false; //TODO: trigger custom events!! } ); }, loadNotifications: function() { $('#notify-loading').fadeIn(function() { OC.notify.getNotifications().complete(function() { $('#notify-loading').fadeOut(); }); }); } }; $(document).ready(function() { OC.notify.dom.icon.append(OC.notify.dom.counter).click(function(event) { if(!OC.notify.loaded || OC.notify.updated) { OC.notify.loadNotifications(); } OC.notify.dom.listContainer.slideToggle('slow', OC.notify.dom.fitContainerSize); return false; }).attr('title', t('notify', 'Notifications')) .children('img').attr('alt', t('notify', 'Notifications')).attr('src', OC.imagePath('notify', 'headerIcon.svg')); OC.notify.dom.listContainer.append(OC.notify.dom.list).click(false).on('click', '.readicon', function(e) { OC.notify.markRead($(this).parentsUntil('.notification').parent().attr('data-id'), $(this).hasClass('unread')); return false; }).on('click', '.deleteicon', function(e) { OC.notify.delete($(this).parentsUntil('.notification').parent().attr('data-id')); return false; }); $(window).click(function(e) { OC.notify.dom.listContainer.slideUp(); }).resize(OC.notify.dom.fitContainerSize); //TODO: do it right and tipsy //OC.notify.dom.listContainer.find('.actionicons span').tipsy(); OC.notify.dom.listContainer.find('#notify-config').click(function(e) { this.href = OC.Router.generate('settings_personal') + '#notify';e.stopPropagation(); }); OC.notify.dom.listContainer.find('#notify-refresh').click(OC.notify.loadNotifications); OC.notify.dom.listContainer.find('#notify-readall').click(OC.notify.markAllRead); OC.notify.dom.listContainer.find('#notify-deleteread').click(OC.notify.deleteRead); OC.notify.dom.listContainer.find('.notify-autorefresh').click(OC.notify.toggleRefresh); OC.notify.dom.icon.appendTo('body:not(#body-login) #header').after(OC.notify.dom.listContainer); OC.notify.setDocTitle(); OC.notify.getCount(); $.post(OC.filePath('notify', 'ajax', 'getAutoRefresh.php'), null, function(response) { if(response) { OC.notify.startRefresh(); OC.notify.autoRefresh = true; } else { OC.notify.stopRefresh(); OC.notify.autoRefresh = false; } OC.notify.dom.listContainer.toggleClass('autorefresh', OC.notify.autoRefresh); }); });