setTimeout(_resizeIframe, 100, obj, ch);
}
-function getCookie(name) {
- var value = "; " + document.cookie;
- var parts = value.split("; " + name + "=");
-
- if (parts.length == 2) {
- return parts.pop().split(";").shift();
- }
-}
-
function initWidget(inflated, deflated) {
var elInf = document.getElementById(inflated);
var elDef = document.getElementById(deflated);
if (!elInf || !elDef) {
return;
}
- if (getCookie(window.location.pathname + ":" + inflated) != "none") {
+ if (localStorage.getItem(window.location.pathname.split("/")[1] + ":" + inflated) != "none") {
elInf.style.display = "block";
elDef.style.display = "none";
} else {
if (window.getComputedStyle(elInf).display === "none") {
elInf.style.display = "block";
elDef.style.display = "none";
- document.cookie = window.location.pathname + ":" + inflated + "=block";
+ localStorage.setItem(window.location.pathname.split("/")[1] + ":" + inflated, "block");
} else {
elInf.style.display = "none";
elDef.style.display = "block";
- document.cookie = window.location.pathname + ":" + inflated + "=none";
+ localStorage.setItem(window.location.pathname.split("/")[1] + ":" + inflated, "none");
}
}
return txt.value;
}
+/**
+ * Retrieves a single named query string parameter
+ *
+ * @param {string} name
+ * @returns {string}
+ * @see https://davidwalsh.name/query-string-javascript
+ */
+function getUrlParameter(name) {
+ name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
+ var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
+ var results = regex.exec(location.search);
+ return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
+};
+
var src = null;
var prev = null;
var livetime = null;
var last_popup_menu = null;
var last_popup_button = null;
var lockLoadContent = false;
+var originalTitle = document.title;
const urlRegex = /^(?:https?:\/\/|\s)[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})(?:\/+[a-z0-9_.:;-]*)*(?:\?[&%|+a-z0-9_=,.:;-]*)?(?:[&%|+&a-z0-9_=,:;.-]*)(?:[!#\/&%|+a-z0-9_=,:;.-]*)}*$/i;
/* event from comment textarea button popups */
/* insert returned bbcode at cursor position or replace selected text */
- $("body").on("fbrowser.image.comment", function(e, filename, bbcode, id) {
+ $('body').on('fbrowser.photo.comment', function(e, filename, bbcode, id) {
$.colorbox.close();
var textarea = document.getElementById("comment-edit-text-" +id);
var start = textarea.selectionStart;
$(textarea).trigger('change');
});
- /* setup onoff widgets */
- $(".onoff input").each(function() {
- val = $(this).val();
- id = $(this).attr("id");
- $("#"+id+"_onoff ." + (val == 0 ? "on":"off")).addClass("hidden");
- });
+ $(".comment-edit-wrapper textarea, .wall-item-comment-wrapper textarea")
+ .editor_autocomplete(baseurl + '/search/acl')
+ .bbco_autocomplete('bbcode');
- $(".onoff > a").click(function(event) {
- event.preventDefault();
- var input = $(this).siblings("input");
- var val = 1-input.val();
- var id = input.attr("id");
- $("#"+id+"_onoff ." + (val == 0 ? "on":"off")).addClass("hidden");
- $("#"+id+"_onoff ." + (val == 1 ? "on":"off")).removeClass("hidden");
- input.val(val);
+ // Ensures asynchronously-added comment forms recognize mentions, tags and BBCodes as well
+ document.addEventListener("postprocess_liveupdate", function() {
+ $(".comment-edit-wrapper textarea, .wall-item-comment-wrapper textarea")
+ .editor_autocomplete(baseurl + '/search/acl')
+ .bbco_autocomplete('bbcode');
});
/* popup menus */
});
/* notifications template */
- var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html());
var notifications_all = unescape($('<div>').append($("#nav-notifications-see-all").clone()).html()); //outerHtml hack
var notifications_mark = unescape($('<div>').append($("#nav-notifications-mark-all").clone()).html()); //outerHtml hack
var notifications_empty = unescape($("#nav-notifications-menu").html());
window.location.href=window.location.href
}
- ['net', 'home', 'intro', 'mail', 'events', 'birthdays', 'notify'].forEach(function(type) {
+ let tabNotifications = data.mail + data.notification;
+ if (tabNotifications > 0) {
+ document.title = '(' + tabNotifications + ') ' + originalTitle;
+ } else {
+ document.title = originalTitle;
+ }
+
+ ['net', 'home', 'intro', 'mail', 'events', 'birthdays', 'notification'].forEach(function(type) {
var number = data[type];
if (number == 0) {
number = '';
$('#mail-update-li').html(mail);
- $(".sidebar-group-li .notify").removeClass("show");
- $(data.groups).each(function(key, group) {
- var gid = group.id;
- var gcount = group.count;
- $(".group-"+gid+" .notify").addClass("show").text(gcount);
+ $(".sidebar-circle-li .notify").removeClass("show");
+ $(data.circles).each(function(key, circle) {
+ var gid = circle.id;
+ var gcount = circle.count;
+ $(".circle-"+gid+" .notify").addClass("show").text(gcount);
});
- $(".forum-widget-entry .notify").removeClass("show");
- $(data.forums).each(function(key, forum) {
- var fid = forum.id;
- var fcount = forum.count;
- $(".forum-"+fid+" .notify").addClass("show").text(fcount);
+ $(".group-widget-entry .notify").removeClass("show");
+ $(data.groups).each(function(key, group) {
+ var fid = group.id;
+ var fcount = group.count;
+ $(".group-"+fid+" .notify").addClass("show").text(fcount);
});
if (data.notifications.length == 0) {
var notification_id = 0;
// Insert notifs into the notifications-menu
- $(data.notifications).each(function(key, notif) {
- var text = notif.message.format('<span class="contactname">' + notif.name + '</span>');
- var contact = ('<a href="' + notif.url + '"><span class="contactname">' + notif.name + '</span></a>');
- var seenclass = (notif.seen == 1) ? "notify-seen" : "notify-unseen";
- var html = notifications_tpl.format(
- notif.href, // {0} // link to the source
- notif.photo, // {1} // photo of the contact
- text, // {2} // preformatted text (autor + text)
- notif.date, // {3} // date of notification (time ago)
- seenclass, // {4} // visited status of the notification
- new Date(notif.timestamp*1000), // {5} // date of notification
- notif.url, // {6} // profile url of the contact
- notif.message.format(contact), // {7} // preformatted html (text including author profile url)
- '' // {8} // Deprecated
- );
- nnm.append(html);
+ $(data.notifications).each(function(key, navNotif) {
+ nnm.append(navNotif.html);
});
// Desktop Notifications
- $(data.notifications.reverse()).each(function(key, e) {
- notification_id = parseInt(e.timestamp);
- if (notification_lastitem !== null && notification_id > notification_lastitem && Number(e.seen) === 0) {
+ $(data.notifications.reverse()).each(function(key, navNotif) {
+ notification_id = parseInt(navNotif.timestamp);
+ if (notification_lastitem !== null && notification_id > notification_lastitem && Number(navNotif.seen) === 0) {
if (getNotificationPermission() === "granted") {
var notification = new Notification(document.title, {
- body: decodeHtml(e.message.replace('→ ', '').format(e.name)),
- icon: e.photo,
- });
- notification['url'] = e.href;
+ body: decodeHtml(navNotif.plaintext),
+ icon: navNotif.contact.photo,
+ });
+ notification['url'] = navNotif.href;
notification.addEventListener("click", function(ev) {
window.location = ev.target.url;
});
});
}
- var notif = data['notify'];
+ var notif = data['notification'];
if (notif > 0) {
$("#nav-notifications-linkmenu").addClass("on");
} else {
function NavUpdate() {
if (!stopped) {
- var pingCmd = 'ping?format=json' + ((localUser != 0) ? '&f=&uid=' + localUser : '');
+ var pingCmd = 'ping';
$.get(pingCmd, function(data) {
if (data.result) {
// send nav-update event
var ident = $(this).attr('id');
// Add new top-level item.
- if ($('#' + ident).length == 0 && profile_page == 1) {
+ if ($('#' + ident).length === 0
+ && (!getUrlParameter('page')
+ && !getUrlParameter('max_id')
+ && !getUrlParameter('min_id')
+ || getUrlParameter('page') === '1'
+ )
+ ) {
$('#' + prev).after($(this));
// Replace already existing thread.
commentBusy = false;
$('body').css('cursor', 'auto');
}
- /* autocomplete @nicknames */
- $(".comment-edit-form textarea").editor_autocomplete(baseurl + '/search/acl');
- /* autocomplete bbcode */
- $(".comment-edit-form textarea").bbco_autocomplete('bbcode');
}
function liveUpdate(src) {
in_progress = true;
- if ($(document).scrollTop() == 0) {
- force_update = true;
- }
+ let force = force_update || $(document).scrollTop() === 0;
var orgHeight = $("section").height();
var udargs = ((netargs.length) ? '/' + netargs : '');
- var update_url = 'update_' + src + udargs + '&p=' + profile_uid + '&page=' + profile_page + '&force=' + ((force_update) ? 1 : 0) + '&item=' + update_item;
- $.get(update_url,function(data) {
- in_progress = false;
+ var update_url = 'update_' + src + udargs + '&p=' + profile_uid + '&force=' + (force ? 1 : 0) + '&item=' + update_item;
+
+ if (force_update) {
force_update = false;
+ }
+
+ if (getUrlParameter('page')) {
+ update_url += '&page=' + getUrlParameter('page');
+ }
+ if (getUrlParameter('min_id')) {
+ update_url += '&min_id=' + getUrlParameter('min_id');
+ }
+ if (getUrlParameter('max_id')) {
+ update_url += '&max_id=' + getUrlParameter('max_id');
+ }
+
+ $.get(update_url, function(data) {
+ in_progress = false;
update_item = 0;
+ if ($('.wall-item-body', data).length == 0) {
+ return;
+ }
+
$('.wall-item-body', data).imagesLoaded(function() {
updateConvItems(data);
// trickery. This still could cause confusion if the "like" ajax call
// is delayed and NavUpdate runs before it completes.
-function dolike(ident,verb) {
+/**
+ * @param {int} ident The id of the relevant item
+ * @param {string} verb The verb of the action
+ * @param {boolean} un Whether to perform an activity removal instead of creation
+ */
+function doActivityItem(ident, verb, un) {
unpause();
$('#like-rotator-' + ident.toString()).show();
- $.get('like/' + ident.toString() + '?verb=' + verb, NavUpdate);
+ verb = un ? 'un' + verb : verb;
+ $.post('item/' + ident.toString() + '/activity/' + verb, NavUpdate);
liking = 1;
force_update = true;
update_item = ident.toString();
}
-function dosubthread(ident) {
+function doFollowThread(ident) {
unpause();
$('#like-rotator-' + ident.toString()).show();
- $.get('subthread/' + ident.toString(), NavUpdate);
+ $.post('item/' + ident.toString() + '/follow', NavUpdate);
liking = 1;
+ force_update = true;
+ update_item = ident.toString();
}
-function dostar(ident) {
+function doStar(ident) {
ident = ident.toString();
$('#like-rotator-' + ident).show();
- $.get('starred/' + ident, function(data) {
- if (data.match(/1/)) {
- $('#starred-' + ident).addClass('starred');
- $('#starred-' + ident).removeClass('unstarred');
+ $.post('item/' + ident + '/star')
+ .then(function(data) {
+ if (data.state === 1) {
+ $('#starred-' + ident)
+ .addClass('starred')
+ .removeClass('unstarred');
$('#star-' + ident).addClass('hidden');
$('#unstar-' + ident).removeClass('hidden');
} else {
- $('#starred-' + ident).addClass('unstarred');
- $('#starred-' + ident).removeClass('starred');
+ $('#starred-' + ident)
+ .addClass('unstarred')
+ .removeClass('starred');
$('#star-' + ident).removeClass('hidden');
$('#unstar-' + ident).addClass('hidden');
}
+ })
+ .always(function () {
$('#like-rotator-' + ident).hide();
});
}
-function dopin(ident) {
+function doPin(ident) {
ident = ident.toString();
$('#like-rotator-' + ident).show();
- $.get('pinned/' + ident, function(data) {
- if (data.match(/1/)) {
- $('#pinned-' + ident).addClass('pinned');
- $('#pinned-' + ident).removeClass('unpinned');
+ $.post('item/' + ident + '/pin')
+ .then(function(data) {
+ if (data.state === 1) {
+ $('#pinned-' + ident)
+ .addClass('pinned')
+ .removeClass('unpinned');
$('#pin-' + ident).addClass('hidden');
$('#unpin-' + ident).removeClass('hidden');
} else {
- $('#pinned-' + ident).addClass('unpinned');
- $('#pinned-' + ident).removeClass('pinned');
+ $('#pinned-' + ident)
+ .addClass('unpinned')
+ .removeClass('pinned');
$('#pin-' + ident).removeClass('hidden');
$('#unpin-' + ident).addClass('hidden');
}
+ })
+ .always(function () {
$('#like-rotator-' + ident).hide();
});
}
-function doignore(ident) {
+function doIgnoreThread(ident) {
ident = ident.toString();
$('#like-rotator-' + ident).show();
- $.get('item/ignore/' + ident, function(data) {
- if (data === 1) {
+ $.post('item/' + ident + '/ignore', function(data) {
+ if (data.state === 1) {
$('#ignored-' + ident)
.addClass('ignored')
.removeClass('unignored');
var lockvisible = false;
-function lockview(event,id) {
+function lockview(event, type, id) {
event = event || window.event;
cursor = getPosition(event);
if (lockvisible) {
- lockviewhide();
+ lockvisible = false;
+ $('#panel').hide();
} else {
lockvisible = true;
- $.get('lockview/' + id, function(data) {
- $('#panel').html(data);
- $('#panel').css({'left': cursor.x + 5 , 'top': cursor.y + 5});
- $('#panel').show();
+ $.get('permission/tooltip/' + type + '/' + id, function(data) {
+ $('#panel')
+ .html(data)
+ .css({'left': cursor.x + 5 , 'top': cursor.y + 5})
+ .show();
});
}
}
-function lockviewhide() {
- lockvisible = false;
- $('#panel').hide();
-}
-
function post_comment(id) {
unpause();
commentBusy = true;
$("#scroll-loader").fadeIn('normal');
- // the page number to load is one higher than the actual
- // page number
- infinite_scroll.pageno+=1;
-
match = $("span.received").last();
if (match.length > 0) {
received = match[0].innerHTML;
commented = "0000-00-00 00:00:00";
}
- match = $("span.id").last();
+ match = $("span.uriid").last();
if (match.length > 0) {
- id = match[0].innerHTML;
+ uriid = match[0].innerHTML;
} else {
- id = "0";
+ uriid = "0";
}
// get the raw content from the next page and insert this content
// right before "#conversation-end"
- $.get(infinite_scroll.reload_uri + '&mode=raw&last_received=' + received + '&last_commented=' + commented + '&last_created=' + created + '&last_id=' + id + '&page=' + infinite_scroll.pageno, function(data) {
+ $.get({
+ url: infinite_scroll.reload_uri,
+ data: {
+ 'mode' : 'raw',
+ 'last_received' : received,
+ 'last_commented': commented,
+ 'last_created' : created,
+ 'last_uriid' : uriid
+ }
+ })
+ .done(function(data) {
$("#scroll-loader").hide();
if ($(data).length > 0) {
$(data).insertBefore('#conversation-end');
- lockLoadContent = false;
} else {
$("#scroll-end").fadeIn('normal');
}
document.dispatchEvent(new Event('postprocess_liveupdate'));
+ })
+ .always(function () {
+ $("#scroll-loader").hide();
+ lockLoadContent = false;
});
}
return a.join('');
}
-function groupChangeMember(gid, cid, sec_token) {
- $('body .fakelink').css('cursor', 'wait');
- $.get('group/' + gid + '/' + cid + "?t=" + sec_token, function(data) {
- $('#group-update-wrapper').html(data);
- $('body .fakelink').css('cursor', 'auto');
- });
-}
-
-function profChangeMember(gid,cid) {
+function circleChangeMember(gid, cid, sec_token) {
$('body .fakelink').css('cursor', 'wait');
- $.get('profperm/' + gid + '/' + cid, function(data) {
- $('#prof-update-wrapper').html(data);
+ $.get('circle/' + gid + '/' + cid + "?t=" + sec_token, function(data) {
+ $('#circle-update-wrapper').html(data);
$('body .fakelink').css('cursor', 'auto');
});
}
-function contactgroupChangeMember(checkbox, gid, cid) {
+function contactCircleChangeMember(checkbox, gid, cid) {
let url;
// checkbox.checked is the checkbox state after the click
if (checkbox.checked) {
- url = 'group/' + gid + '/add/' + cid;
+ url = 'circle/' + gid + '/add/' + cid;
} else {
- url = 'group/' + gid + '/remove/' + cid;
+ url = 'circle/' + gid + '/remove/' + cid;
}
$('body').css('cursor', 'wait');
$.post(url)
}
}
-function notifyMarkAll() {
- $.get('notify/mark/all', function(data) {
+function notificationMarkAll() {
+ $.get('notification/mark/all', function(data) {
if (timer) {
clearTimeout(timer);
}
function previewTheme(elm) {
theme = $(elm).val();
- $.getJSON('pretheme?f=&theme=' + theme,function(data) {
+ $.getJSON('pretheme?theme=' + theme,function(data) {
$('#theme-preview').html('<div id="theme-desc">' + data.desc + '</div><div id="theme-version">' + data.version + '</div><div id="theme-credits">' + data.credits + '</div><a href="' + data.img + '"><img src="' + data.img + '" width="320" height="240" alt="' + theme + '" /></a>');
});
* to the event handler
*/
doImageBrowser : function (name, id) {
- var url = Dialog._get_url("image",name,id);
+ var url = Dialog._get_url('photo', name, id);
return Dialog.show(url);
},
* to the event handler
*/
doFileBrowser : function (name, id) {
- var url = Dialog._get_url("file",name,id);
+ var url = Dialog._get_url('attachment', name, id);
return Dialog.show(url);
},
if (id !== undefined) {
hash = hash + "-" + id;
}
- return baseurl + "/fbrowser/"+type+"/?mode=minimal#"+hash;
+ return 'media/' + type + '/browser?mode=minimal#' + hash;
},
_get_size: function() {