X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=view%2Fjs%2Fmain.js;h=e2cee43d54464c12b0d07707c208d3ff5a293437;hb=c32fb1547f6a8ea008a7be68a2a2b2c901ca261e;hp=77c240f3733c758b6991cf181f80e93977b7d6f5;hpb=cd392db0785fcc8dfc95af99bee934a231ba9016;p=friendica.git diff --git a/view/js/main.js b/view/js/main.js index 77c240f373..e2cee43d54 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -1,813 +1,847 @@ - function resizeIframe(obj) { - //obj.style.height = 0; - _resizeIframe(obj, 0); +// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPLv3-or-later + +// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill +if (!Element.prototype.matches) { + Element.prototype.matches = + Element.prototype.matchesSelector || + Element.prototype.mozMatchesSelector || + Element.prototype.msMatchesSelector || + Element.prototype.oMatchesSelector || + Element.prototype.webkitMatchesSelector || + function(s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = matches.length; + while (--i >= 0 && matches.item(i) !== this) {} + return i > -1; + }; +} + +function resizeIframe(obj) { + _resizeIframe(obj, 0); +} + +function _resizeIframe(obj, desth) { + var h = obj.style.height; + var ch = obj.contentWindow.document.body.scrollHeight; + + if (h == (ch + 'px')) { + return; } + if (desth == ch && ch > 0) { + obj.style.height = ch + 'px'; + } + setTimeout(_resizeIframe, 100, obj, ch); +} - function _resizeIframe(obj, desth) { - var h = obj.style.height; - var ch = obj.contentWindow.document.body.scrollHeight; - if (h == (ch + 'px')) { - return; - } - if (desth == ch && ch>0) { - obj.style.height = ch + 'px'; +function openClose(theID) { + var el = document.getElementById(theID); + if (el) { + if (window.getComputedStyle(el).display === "none") { + openMenu(theID); + } else { + closeMenu(theID); } - setTimeout(_resizeIframe, 100, obj, ch); } +} - function openClose(theID) { - if(document.getElementById(theID).style.display == "block") { - document.getElementById(theID).style.display = "none" - } - else { - document.getElementById(theID).style.display = "block" +function openMenu(theID) { + var el = document.getElementById(theID); + if (el) { + if (!el.dataset.display) { + el.dataset.display = 'block'; } + el.style.display = el.dataset.display; } +} - function openMenu(theID) { - var el = document.getElementById(theID) - if (el) { - el.style.display = "block"; - } +function closeMenu(theID) { + var el = document.getElementById(theID); + if (el) { + el.dataset.display = window.getComputedStyle(el).display; + el.style.display = "none"; } +} + +function decodeHtml(html) { + var txt = document.createElement("textarea"); + + txt.innerHTML = html; + return txt.value; +} - function closeMenu(theID) { - var el = document.getElementById(theID) - if (el) { - el.style.display = "none"; +var src = null; +var prev = null; +var livetime = null; +var force_update = false; +var update_item = 0; +var stopped = false; +var totStopped = false; +var timer = null; +var pr = 0; +var liking = 0; +var in_progress = false; +var langSelect = false; +var commentBusy = false; +var last_popup_menu = null; +var last_popup_button = null; +var lockLoadContent = false; + +$(function() { + $.ajaxSetup({cache: false}); + + /* setup comment textarea buttons */ + /* comment textarea buttons needs some "data-*" attributes to work: + * data-role="insert-formatting" : to mark the element as a formatting button + * data-bbcode="" : name of the bbcode element to insert. insertFormatting() will insert it as "[name][/name]" + * data-id="" : id of the comment, used to find other comment-related element, like the textarea + * */ + $('body').on('click','[data-role="insert-formatting"]', function(e) { + e.preventDefault(); + var o = $(this); + var bbcode = o.data('bbcode'); + var id = o.data('id'); + if (bbcode == "img") { + Dialog.doImageBrowser("comment", id); + return; } - } - function decodeHtml(html) { - var txt = document.createElement("textarea"); - txt.innerHTML = html; - return txt.value; - } + if (bbcode == "imgprv") { + bbcode = "img"; + } + insertFormatting(bbcode, id); + }); - var src = null; - var prev = null; - var livetime = null; - var force_update = false; - var stopped = false; - var totStopped = false; - var timer = null; - var pr = 0; - var liking = 0; - var in_progress = false; - var langSelect = false; - var commentBusy = false; - var last_popup_menu = null; - var last_popup_button = null; - var lockLoadContent = false; - - $(function() { - $.ajaxSetup({cache: false}); - - /* setup comment textarea buttons */ - /* comment textarea buttons needs some "data-*" attributes to work: - * data-role="insert-formatting" : to mark the element as a formatting button - * data-bbcode="" : name of the bbcode element to insert. insertFormatting() will insert it as "[name][/name]" - * data-id="" : id of the comment, used to find other comment-related element, like the textarea - * */ - $('body').on('click','[data-role="insert-formatting"]', function(e) { - e.preventDefault(); - var o = $(this); - var bbcode = o.data('bbcode'); - var id = o.data('id'); - if (bbcode=="img") { - Dialog.doImageBrowser("comment", id); - return; - } - insertFormatting(bbcode, id); - }); + /* 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) { + $.colorbox.close(); + var textarea = document.getElementById("comment-edit-text-" +id); + var start = textarea.selectionStart; + var end = textarea.selectionEnd; + textarea.value = textarea.value.substring(0, start) + bbcode + textarea.value.substring(end, textarea.value.length); + $(textarea).trigger('change'); + }); - /* 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) { - $.colorbox.close(); - var textarea = document.getElementById("comment-edit-text-" +id); - var start = textarea.selectionStart; - var end = textarea.selectionEnd; - textarea.value = textarea.value.substring(0, start) + bbcode + textarea.value.substring(end, textarea.value.length); - $(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"); + }); + $(".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); + }); + /* popup menus */ + function close_last_popup_menu() { + if (last_popup_menu) { + last_popup_menu.hide(); + last_popup_menu.off('click', function(e) {e.stopPropagation()}); + last_popup_button.removeClass("selected"); + last_popup_menu = null; + last_popup_button = null; + } + } + $('a[rel^="#"]').click(function(e) { + e.preventDefault(); + var parent = $(this).parent(); + var isSelected = (last_popup_button && parent.attr('id') == last_popup_button.attr('id')); + close_last_popup_menu(); + if (isSelected) { + return false; + } + menu = $($(this).attr('rel')); + e.preventDefault(); + e.stopPropagation(); + if (menu.attr('popup') == "false") { + return false; + } + parent.toggleClass("selected"); + menu.toggle(); + if (menu.css("display") == "none") { + last_popup_menu = null; + last_popup_button = null; + } else { + last_popup_menu = menu; + last_popup_menu.on('click', function(e) {e.stopPropagation()}); + last_popup_button = parent; + $('#nav-notifications-menu').perfectScrollbar('update'); + } + return false; + }); + $('html').click(function() { + close_last_popup_menu(); + }); - /* setup onoff widgets */ - $(".onoff input").each(function(){ - val = $(this).val(); - id = $(this).attr("id"); - $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden"); + // fancyboxes + $("a.popupbox").colorbox({ + 'inline' : true, + 'transition' : 'elastic', + 'maxWidth' : '100%' + }); + $("a.ajax-popupbox").colorbox({ + 'transition' : 'elastic', + 'maxWidth' : '100%' + }); - }); - $(".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); - }); + /* notifications template */ + var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html()); + var notifications_all = unescape($('
').append($("#nav-notifications-see-all").clone()).html()); //outerHtml hack + var notifications_mark = unescape($('
').append($("#nav-notifications-mark-all").clone()).html()); //outerHtml hack + var notifications_empty = unescape($("#nav-notifications-menu").html()); - /* popup menus */ - function close_last_popup_menu() { - if(last_popup_menu) { - last_popup_menu.hide(); - last_popup_menu.off('click', function(e) {e.stopPropagation()}); - last_popup_button.removeClass("selected"); - last_popup_menu = null; - last_popup_button = null; - } + /* enable perfect-scrollbars for different elements */ + $('#nav-notifications-menu, aside').perfectScrollbar(); + + /* nav update event */ + $('nav').bind('nav-update', function(e, data) { + var invalid = data.invalid || 0; + if (invalid == 1) { + window.location.href=window.location.href } - $('a[rel^="#"]').click(function(e){ - e.preventDefault(); - var parent = $(this).parent(); - var isSelected = (last_popup_button && parent.attr('id') == last_popup_button.attr('id')); - close_last_popup_menu(); - if(isSelected) return false; - menu = $( $(this).attr('rel') ); - e.preventDefault(); - e.stopPropagation(); - if (menu.attr('popup')=="false") return false; - parent.toggleClass("selected"); - menu.toggle(); - if (menu.css("display") == "none") { - last_popup_menu = null; - last_popup_button = null; + + ['net', 'home', 'intro', 'mail', 'events', 'birthdays', 'notify'].forEach(function(type) { + var number = data[type]; + if (number == 0) { + number = ''; + $('#' + type + '-update').removeClass('show'); } else { - last_popup_menu = menu; - last_popup_menu.on('click', function(e) {e.stopPropagation()}); - last_popup_button = parent; - $('#nav-notifications-menu').perfectScrollbar('update'); + $('#' + type + '-update').addClass('show'); } - return false; - }); - $('html').click(function() { - close_last_popup_menu(); + $('#' + type + '-update').text(number); }); - // fancyboxes - $("a.popupbox").colorbox({ - 'inline' : true, - 'transition' : 'elastic', - 'maxWidth' : '100%' - }); - $("a.ajax-popupbox").colorbox({ - 'transition' : 'elastic', - 'maxWidth' : '100%' - }); + var intro = data['intro']; + if (intro == 0) { + intro = ''; $('#intro-update-li').removeClass('show') + } else { + $('#intro-update-li').addClass('show') + } - /* notifications template */ - var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html()); - var notifications_all = unescape($('
').append( $("#nav-notifications-see-all").clone() ).html()); //outerHtml hack - var notifications_mark = unescape($('
').append( $("#nav-notifications-mark-all").clone() ).html()); //outerHtml hack - var notifications_empty = unescape($("#nav-notifications-menu").html()); - - /* enable perfect-scrollbars for different elements */ - $('#nav-notifications-menu, aside').perfectScrollbar(); - - /* nav update event */ - $('nav').bind('nav-update', function(e, data){ - var invalid = data.invalid || 0; - if(invalid == 1) { window.location.href=window.location.href } - - ['net', 'home', 'intro', 'mail', 'events', 'birthdays', 'notify'].forEach(function(type) { - var number = data[type]; - if (number == 0) { - number = ''; - $('#' + type + '-update').removeClass('show'); - } else { - $('#' + type + '-update').addClass('show'); - } - $('#' + type + '-update').text(number); - }); + $('#intro-update-li').html(intro); - var intro = data['intro']; - if(intro == 0) { intro = ''; $('#intro-update-li').removeClass('show') } else { $('#intro-update-li').addClass('show') } - $('#intro-update-li').html(intro); + var mail = data['mail']; + if (mail == 0) { + mail = ''; $('#mail-update-li').removeClass('show') + } else { + $('#mail-update-li').addClass('show') + } - var mail = data['mail']; - if(mail == 0) { mail = ''; $('#mail-update-li').removeClass('show') } else { $('#mail-update-li').addClass('show') } - $('#mail-update-li').html(mail); + $('#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-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); + }); - $(".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); - }); + $(".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); + }); - if (data.notifications.length == 0) { - $("#nav-notifications-menu").html(notifications_empty); - } else { - var nnm = $("#nav-notifications-menu"); - nnm.html(notifications_all + notifications_mark); - - var lastItemStorageKey = "notification-lastitem:" + localUser; - var notification_lastitem = parseInt(localStorage.getItem(lastItemStorageKey)); - var notification_id = 0; - - // Insert notifs into the notifications-menu - $(data.notifications).each(function(key, notif){ - var text = notif.message.format('' + notif.name + ''); - var contact = ('' + notif.name + ''); - 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); - }); + if (data.notifications.length == 0) { + $("#nav-notifications-menu").html(notifications_empty); + } else { + var nnm = $("#nav-notifications-menu"); + nnm.html(notifications_all + notifications_mark); + + var lastItemStorageKey = "notification-lastitem:" + localUser; + var notification_lastitem = parseInt(localStorage.getItem(lastItemStorageKey)); + var notification_id = 0; + + // Insert notifs into the notifications-menu + $(data.notifications).each(function(key, notif) { + var text = notif.message.format('' + notif.name + ''); + var contact = ('' + notif.name + ''); + 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); + }); - // 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) { - if (getNotificationPermission() === "granted") { - var notification = new Notification(document.title, { - body: decodeHtml(e.message.replace('→ ', '').format(e.name)), - icon: e.photo, - }); - notification['url'] = e.href; - notification.addEventListener("click", function(ev){ - window.location = ev.target.url; - }); - } + // 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) { + if (getNotificationPermission() === "granted") { + var notification = new Notification(document.title, { + body: decodeHtml(e.message.replace('→ ', '').format(e.name)), + icon: e.photo, + }); + notification['url'] = e.href; + notification.addEventListener("click", function(ev) { + window.location = ev.target.url; + }); } + } - }); - notification_lastitem = notification_id; - localStorage.setItem(lastItemStorageKey, notification_lastitem) - - $("img[data-src]", nnm).each(function(i, el){ - // Add src attribute for images with a data-src attribute - // However, don't bother if the data-src attribute is empty, because - // an empty "src" tag for an image will cause some browsers - // to prefetch the root page of the Friendica hub, which will - // unnecessarily load an entire profile/ or network/ page - if($(el).data("src") != '') $(el).attr('src', $(el).data("src")); - }); - } - - var notif = data['notify']; - if (notif > 0){ - $("#nav-notifications-linkmenu").addClass("on"); - } else { - $("#nav-notifications-linkmenu").removeClass("on"); - } - - $(data.sysmsgs.notice).each(function(key, message){ - $.jGrowl(message, {sticky: true, theme: 'notice'}); }); - $(data.sysmsgs.info).each(function(key, message){ - $.jGrowl(message, {sticky: false, theme: 'info', life: 5000}); + notification_lastitem = notification_id; + localStorage.setItem(lastItemStorageKey, notification_lastitem) + + $("img[data-src]", nnm).each(function(i, el) { + // Add src attribute for images with a data-src attribute + // However, don't bother if the data-src attribute is empty, because + // an empty "src" tag for an image will cause some browsers + // to prefetch the root page of the Friendica hub, which will + // unnecessarily load an entire profile/ or network/ page + if ($(el).data("src") != '') { + $(el).attr('src', $(el).data("src")); + } }); + } - // Update the js scrollbars - $('#nav-notifications-menu').perfectScrollbar('update'); + var notif = data['notify']; + if (notif > 0) { + $("#nav-notifications-linkmenu").addClass("on"); + } else { + $("#nav-notifications-linkmenu").removeClass("on"); + } + $(data.sysmsgs.notice).each(function(key, message) { + $.jGrowl(message, {sticky: true, theme: 'notice'}); + }); + $(data.sysmsgs.info).each(function(key, message) { + $.jGrowl(message, {sticky: false, theme: 'info', life: 5000}); }); - NavUpdate(); - // Allow folks to stop the ajax page updates with the pause/break key - $(document).keydown(function(event) { - if(event.keyCode == '8') { - var target = event.target || event.srcElement; - if (!/input|textarea/i.test(target.nodeName)) { - return false; - } + // Update the js scrollbars + $('#nav-notifications-menu').perfectScrollbar('update'); + }); + + // Asynchronous calls are deferred until the very end of the page load to ease on slower connections + window.addEventListener("load", function(){ + NavUpdate(); + if (typeof acl !== 'undefined') { + acl.get(0, 100); + } + }); + + // Allow folks to stop the ajax page updates with the pause/break key + $(document).keydown(function(event) { + if (event.keyCode == '8') { + var target = event.target || event.srcElement; + if (!/input|textarea/i.test(target.nodeName)) { + return false; } - if(event.keyCode == '19' || (event.ctrlKey && event.which == '32')) { - event.preventDefault(); - if(stopped == false) { - stopped = true; - if (event.ctrlKey) { - totStopped = true; - } - $('#pause').html('pause'); - } else { - unpause(); + } + + if (event.keyCode == '19' || (event.ctrlKey && event.which == '32')) { + event.preventDefault(); + if (stopped == false) { + stopped = true; + if (event.ctrlKey) { + totStopped = true; } + $('#pause').html('pause'); } else { - if (!totStopped) { - unpause(); - } + unpause(); } - }); + } else if (!totStopped) { + unpause(); + } + }); - // Scroll to the next/previous thread when pressing J and K - $(document).keydown(function (event) { - var threads = $('.thread_level_1'); - if ((event.keyCode === 74 || event.keyCode === 75) && !$(event.target).is('textarea, input')) { - var scrollTop = $(window).scrollTop(); - if (event.keyCode === 75) { - threads = $(threads.get().reverse()); - } - threads.each(function(key, item) { - var comparison; - var top = $(item).offset().top - 100; - if (event.keyCode === 74) { - comparison = top > scrollTop + 1; - } else if (event.keyCode === 75) { - comparison = top < scrollTop - 1; - } - if (comparison) { - $('html, body').animate({ scrollTop: top }, 200); - return false; - } - }); + // Scroll to the next/previous thread when pressing J and K + $(document).keydown(function (event) { + var threads = $('.thread_level_1'); + if ((event.keyCode === 74 || event.keyCode === 75) && !$(event.target).is('textarea, input')) { + var scrollTop = $(window).scrollTop(); + if (event.keyCode === 75) { + threads = $(threads.get().reverse()); } - }); - - // Set an event listener for infinite scroll - if(typeof infinite_scroll !== 'undefined') { - $(window).scroll(function(e){ - if ($(document).height() != $(window).height()) { - // First method that is expected to work - but has problems with Chrome - if ($(window).scrollTop() > ($(document).height() - $(window).height() * 1.5)) - loadScrollContent(); - } else { - // This method works with Chrome - but seems to be much slower in Firefox - if ($(window).scrollTop() > (($("section").height() + $("header").height() + $("footer").height()) - $(window).height() * 1.5)) - loadScrollContent(); + threads.each(function(key, item) { + var comparison; + var top = $(item).offset().top - 100; + if (event.keyCode === 74) { + comparison = top > scrollTop + 1; + } else if (event.keyCode === 75) { + comparison = top < scrollTop - 1; + } + if (comparison) { + $('html, body').animate({scrollTop: top}, 200); + return false; } }); } - - }); - function NavUpdate() { - - if (!stopped) { - var pingCmd = 'ping?format=json' + ((localUser != 0) ? '&f=&uid=' + localUser : ''); - $.get(pingCmd, function(data) { - if (data.result) { - // send nav-update event - $('nav').trigger('nav-update', data.result); - - // start live update - ['network', 'profile', 'community', 'notes', 'display'].forEach(function (src) { - if ($('#live-' + src).length) { - liveUpdate(src); - } - }); - if ($('#live-photos').length) { - if (liking) { - liking = 0; - window.location.href = window.location.href; - } - } + // Set an event listener for infinite scroll + if (typeof infinite_scroll !== 'undefined') { + $(window).scroll(function(e) { + if ($(document).height() != $(window).height()) { + // First method that is expected to work - but has problems with Chrome + if ($(window).scrollTop() > ($(document).height() - $(window).height() * 1.5)) + loadScrollContent(); + } else { + // This method works with Chrome - but seems to be much slower in Firefox + if ($(window).scrollTop() > (($("section").height() + $("header").height() + $("footer").height()) - $(window).height() * 1.5)) { + loadScrollContent(); } - }) ; - } - timer = setTimeout(NavUpdate, updateInterval); - } - - function liveUpdate(src) { - if((src == null) || (stopped) || (! profile_uid)) { $('.like-rotator').hide(); return; } - if(($('.comment-edit-text-full').length) || (in_progress)) { - if(livetime) { - clearTimeout(livetime); } - livetime = setTimeout(function() {liveUpdate(src)}, 5000); - return; - } - if(livetime != null) - livetime = null; - - prev = 'live-' + src; - - in_progress = true; - - if ($(document).scrollTop() == 0) - force_update = true; - - var udargs = ((netargs.length) ? '/' + netargs : ''); - var update_url = 'update_' + src + udargs + '&p=' + profile_uid + '&page=' + profile_page + '&force=' + ((force_update) ? 1 : 0); - - $.get(update_url,function(data) { - in_progress = false; - force_update = false; - // $('.collapsed-comments',data).each(function() { - // var ident = $(this).attr('id'); - // var is_hidden = $('#' + ident).is(':hidden'); - // if($('#' + ident).length) { - // $('#' + ident).replaceWith($(this)); - // if(is_hidden) - // $('#' + ident).hide(); - // } - //}); - - // add a new thread - $('.toplevel_item',data).each(function() { - var ident = $(this).attr('id'); - - if($('#' + ident).length == 0 && profile_page == 1) { - $('img',this).each(function() { - $(this).attr('src',$(this).attr('dst')); - }); - $('#' + prev).after($(this)); - } - else { - // Find out if the hidden comments are open, so we can keep it that way - // if a new comment has been posted - var id = $('.hide-comments-total', this).attr('id'); - if(typeof id != 'undefined') { - id = id.split('-')[3]; - var commentsOpen = $("#collapsed-comments-" + id).is(":visible"); + }); + } +}); + +function NavUpdate() { + if (!stopped) { + var pingCmd = 'ping?format=json' + ((localUser != 0) ? '&f=&uid=' + localUser : ''); + $.get(pingCmd, function(data) { + if (data.result) { + // send nav-update event + $('nav').trigger('nav-update', data.result); + + // start live update + ['network', 'profile', 'community', 'notes', 'display', 'contact'].forEach(function (src) { + if ($('#live-' + src).length) { + liveUpdate(src); } - - $('img',this).each(function() { - $(this).attr('src',$(this).attr('dst')); - }); - //vScroll = $(document).scrollTop(); - $('html').height($('html').height()); - $('#' + ident).replaceWith($(this)); - - if(typeof id != 'undefined') { - if(commentsOpen) showHideComments(id); + }); + if ($('#live-photos').length) { + if (liking) { + liking = 0; + window.location.href = window.location.href; } - $('html').height('auto'); - //$(document).scrollTop(vScroll); } - prev = ident; - }); + } + }); + } + timer = setTimeout(NavUpdate, updateInterval); +} - // reset vars for inserting individual items +function updateConvItems(data) { + // add a new thread + $('.toplevel_item',data).each(function() { + var ident = $(this).attr('id'); - /* prev = 'live-' + src; + // Add new top-level item. + if ($('#' + ident).length == 0 && profile_page == 1) { + $('#' + prev).after($(this)); - $('.wall-item-outside-wrapper',data).each(function() { - var ident = $(this).attr('id'); + // Replace already existing thread. + } else { + // Find out if the hidden comments are open, so we can keep it that way + // if a new comment has been posted + var id = $('.hide-comments-total', this).attr('id'); + if (typeof id != 'undefined') { + id = id.split('-')[3]; + var commentsOpen = $("#collapsed-comments-" + id).is(":visible"); + } - if($('#' + ident).length == 0 && prev != 'live-' + src) { - $('img',this).each(function() { - $(this).attr('src',$(this).attr('dst')); - }); - $('#' + prev).after($(this)); - } - else { - $('#' + ident + ' ' + '.wall-item-ago').replaceWith($(this).find('.wall-item-ago')); - if($('#' + ident + ' ' + '.comment-edit-text-empty').length) - $('#' + ident + ' ' + '.wall-item-comment-wrapper').replaceWith($(this).find('.wall-item-comment-wrapper')); - $('#' + ident + ' ' + '.hide-comments-total').replaceWith($(this).find('.hide-comments-total')); - $('#' + ident + ' ' + '.wall-item-like').replaceWith($(this).find('.wall-item-like')); - $('#' + ident + ' ' + '.wall-item-dislike').replaceWith($(this).find('.wall-item-dislike')); - $('#' + ident + ' ' + '.my-comment-photo').each(function() { - $(this).attr('src',$(this).attr('dst')); - }); + $('#' + ident).replaceWith($(this)); + + if (typeof id != 'undefined') { + if (commentsOpen) { + showHideComments(id); } - prev = ident; - }); - */ - $('.like-rotator').hide(); - if(commentBusy) { - commentBusy = false; - $('body').css('cursor', 'auto'); } - /* autocomplete @nicknames */ - $(".comment-edit-form textarea").editor_autocomplete(baseurl+"/acl"); - /* autocomplete bbcode */ - $(".comment-edit-form textarea").bbco_autocomplete('bbcode'); - }); - } + } + prev = ident; + }); - function imgbright(node) { - $(node).removeClass("drophide").addClass("drop"); + $('.like-rotator').hide(); + if (commentBusy) { + 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 imgdull(node) { - $(node).removeClass("drop").addClass("drophide"); +function liveUpdate(src) { + if ((src == null) || stopped || !profile_uid) { + $('.like-rotator').hide(); return; } - // Since our ajax calls are asynchronous, we will give a few - // seconds for the first ajax call (setting like/dislike), then - // run the updater to pick up any changes and display on the page. - // The updater will turn any rotators off when it's done. - // This function will have returned long before any of these - // events have completed and therefore there won't be any - // visible feedback that anything changed without all this - // trickery. This still could cause confusion if the "like" ajax call - // is delayed and NavUpdate runs before it completes. - - function dolike(ident,verb) { - unpause(); - $('#like-rotator-' + ident.toString()).show(); - $.get('like/' + ident.toString() + '?verb=' + verb, NavUpdate ); - liking = 1; - force_update = true; + if (($('.comment-edit-text-full').length) || in_progress) { + if (livetime) { + clearTimeout(livetime); + } + livetime = setTimeout(function() {liveUpdate(src)}, 5000); + return; } - function dosubthread(ident) { - unpause(); - $('#like-rotator-' + ident.toString()).show(); - $.get('subthread/' + ident.toString(), NavUpdate ); - liking = 1; + if (livetime != null) { + livetime = null; } + prev = 'live-' + src; + in_progress = true; - 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'); - $('#star-' + ident).addClass('hidden'); - $('#unstar-' + ident).removeClass('hidden'); - } - else { - $('#starred-' + ident).addClass('unstarred'); - $('#starred-' + ident).removeClass('starred'); - $('#star-' + ident).removeClass('hidden'); - $('#unstar-' + ident).addClass('hidden'); - } - $('#like-rotator-' + ident).hide(); - }); + if ($(document).scrollTop() == 0) { + force_update = true; } - function doignore(ident) { - ident = ident.toString(); - $('#like-rotator-' + ident).show(); - $.get('ignored/' + ident, function(data) { - if(data.match(/1/)) { - $('#ignored-' + ident).addClass('ignored'); - $('#ignored-' + ident).removeClass('unignored'); - $('#ignore-' + ident).addClass('hidden'); - $('#unignore-' + ident).removeClass('hidden'); - } - else { - $('#ignored-' + ident).addClass('unignored'); - $('#ignored-' + ident).removeClass('ignored'); - $('#ignore-' + ident).removeClass('hidden'); - $('#unignore-' + ident).addClass('hidden'); - } - $('#like-rotator-' + ident).hide(); - }); - } + var orgHeight = $("section").height(); - function getPosition(e) { - var cursor = {x:0, y:0}; - if ( e.pageX || e.pageY ) { - cursor.x = e.pageX; - cursor.y = e.pageY; - } - else { - if( e.clientX || e.clientY ) { - cursor.x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft; - cursor.y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop; - } - else { - if( e.x || e.y ) { - cursor.x = e.x; - cursor.y = e.y; - } - } - } - return cursor; - } + 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; - var lockvisible = false; + $.get(update_url,function(data) { + in_progress = false; + force_update = false; + update_item = 0; - function lockview(event,id) { - event = event || window.event; - cursor = getPosition(event); - if(lockvisible) { - lockviewhide(); - } - else { - lockvisible = true; - $.get('lockview/' + id, function(data) { - $('#panel').html(data); - $('#panel').css({ 'left': cursor.x + 5 , 'top': cursor.y + 5}); - $('#panel').show(); - }); - } - } + $('.wall-item-body', data).imagesLoaded(function() { + updateConvItems(data); - function lockviewhide() { - lockvisible = false; - $('#panel').hide(); - } + document.dispatchEvent(new Event('postprocess_liveupdate')); - function post_comment(id) { - unpause(); - commentBusy = true; - $('body').css('cursor', 'wait'); - $("#comment-preview-inp-" + id).val("0"); - $.post( - "item", - $("#comment-edit-form-" + id).serialize(), - function(data) { - if(data.success) { - $("#comment-edit-wrapper-" + id).hide(); - $("#comment-edit-text-" + id).val(''); - var tarea = document.getElementById("comment-edit-text-" + id); - if(tarea) - commentClose(tarea,id); - if(timer) clearTimeout(timer); - timer = setTimeout(NavUpdate,10); - force_update = true; - } - if(data.reload) { - window.location.href=data.reload; - } - }, - "json" - ); - return false; - } + // Update the scroll position. + $(window).scrollTop($(window).scrollTop() + $("section").height() - orgHeight); + }); + }); +} +function imgbright(node) { + $(node).removeClass("drophide").addClass("drop"); +} - function preview_comment(id) { - $("#comment-preview-inp-" + id).val("1"); - $("#comment-edit-preview-" + id).show(); - $.post( - "item", - $("#comment-edit-form-" + id).serialize(), - function(data) { - if(data.preview) { - $("#comment-edit-preview-" + id).html(data.preview); - $("#comment-edit-preview-" + id + " a").click(function() { return false; }); - } - }, - "json" - ); - return true; - } +function imgdull(node) { + $(node).removeClass("drop").addClass("drophide"); +} + +// Since our ajax calls are asynchronous, we will give a few +// seconds for the first ajax call (setting like/dislike), then +// run the updater to pick up any changes and display on the page. +// The updater will turn any rotators off when it's done. +// This function will have returned long before any of these +// events have completed and therefore there won't be any +// visible feedback that anything changed without all this +// trickery. This still could cause confusion if the "like" ajax call +// is delayed and NavUpdate runs before it completes. + +function dolike(ident,verb) { + unpause(); + $('#like-rotator-' + ident.toString()).show(); + $.get('like/' + ident.toString() + '?verb=' + verb, NavUpdate); + liking = 1; + force_update = true; + update_item = ident.toString(); +} +function dosubthread(ident) { + unpause(); + $('#like-rotator-' + ident.toString()).show(); + $.get('subthread/' + ident.toString(), NavUpdate); + liking = 1; +} +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'); + $('#star-' + ident).addClass('hidden'); + $('#unstar-' + ident).removeClass('hidden'); + } else { + $('#starred-' + ident).addClass('unstarred'); + $('#starred-' + ident).removeClass('starred'); + $('#star-' + ident).removeClass('hidden'); + $('#unstar-' + ident).addClass('hidden'); + } + $('#like-rotator-' + ident).hide(); + }); +} - function showHideComments(id) { - if( $("#collapsed-comments-" + id).is(":visible")) { - $("#collapsed-comments-" + id).hide(); - $("#hide-comments-" + id).html(window.showMore); +function doignore(ident) { + ident = ident.toString(); + $('#like-rotator-' + ident).show(); + $.get('ignored/' + ident, function(data) { + if (data.match(/1/)) { + $('#ignored-' + ident).addClass('ignored'); + $('#ignored-' + ident).removeClass('unignored'); + $('#ignore-' + ident).addClass('hidden'); + $('#unignore-' + ident).removeClass('hidden'); + } else { + $('#ignored-' + ident).addClass('unignored'); + $('#ignored-' + ident).removeClass('ignored'); + $('#ignore-' + ident).removeClass('hidden'); + $('#unignore-' + ident).addClass('hidden'); } - else { - $("#collapsed-comments-" + id).show(); - $("#hide-comments-" + id).html(window.showFewer); + $('#like-rotator-' + ident).hide(); + }); +} + +function getPosition(e) { + var cursor = {x:0, y:0}; + + if (e.pageX || e.pageY) { + cursor.x = e.pageX; + cursor.y = e.pageY; + } else { + if (e.clientX || e.clientY) { + cursor.x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft; + cursor.y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop; + } else if (e.x || e.y) { + cursor.x = e.x; + cursor.y = e.y; } } + return cursor; +} +var lockvisible = false; + +function lockview(event,id) { + event = event || window.event; + cursor = getPosition(event); + if (lockvisible) { + lockviewhide(); + } else { + lockvisible = true; + $.get('lockview/' + id, function(data) { + $('#panel').html(data); + $('#panel').css({'left': cursor.x + 5 , 'top': cursor.y + 5}); + $('#panel').show(); + }); + } +} +function lockviewhide() { + lockvisible = false; + $('#panel').hide(); +} - function preview_post() { - $("#jot-preview").val("1"); - $("#jot-preview-content").show(); - $.post( - "item", - $("#profile-jot-form").serialize(), - function(data) { - if(data.preview) { - $("#jot-preview-content").html(data.preview); - $("#jot-preview-content" + " a").click(function() { return false; }); +function post_comment(id) { + unpause(); + commentBusy = true; + $('body').css('cursor', 'wait'); + $.post( + "item", + $("#comment-edit-form-" + id).serialize(), + function(data) { + if (data.success) { + $("#comment-edit-wrapper-" + id).hide(); + $("#comment-edit-text-" + id).val(''); + var tarea = document.getElementById("comment-edit-text-" + id); + if (tarea) { + commentClose(tarea,id); } - }, - "json" - ); - $("#jot-preview").val("0"); - return true; + if (timer) { + clearTimeout(timer); + } + timer = setTimeout(NavUpdate,10); + force_update = true; + update_item = id; + } + if (data.reload) { + window.location.href=data.reload; + } + }, + "json" + ); + return false; +} + +function preview_comment(id) { + $("#comment-edit-preview-" + id).show(); + $.post( + "item", + $("#comment-edit-form-" + id).serialize() + '&preview=1', + function(data) { + if (data.preview) { + $("#comment-edit-preview-" + id).html(data.preview); + $("#comment-edit-preview-" + id + " a").click(function() {return false;}); + } + }, + "json" + ); + return true; +} + +function showHideComments(id) { + if ($('#collapsed-comments-' + id).is(':visible')) { + $('#collapsed-comments-' + id).slideUp(); + $('#hide-comments-' + id).hide(); + $('#hide-comments-total-' + id).show(); + } else { + $('#collapsed-comments-' + id).slideDown(); + $('#hide-comments-' + id).show(); + $('#hide-comments-total-' + id).hide(); } +} + +function preview_post() { + $("#jot-preview").val("1"); + $("#jot-preview-content").show(); + $.post( + "item", + $("#profile-jot-form").serialize(), + function(data) { + if (data.preview) { + $("#jot-preview-content").html(data.preview); + $("#jot-preview-content" + " a").click(function() {return false;}); + document.dispatchEvent(new Event('postprocess_liveupdate')); + } + }, + "json" + ); + $("#jot-preview").val("0"); + return true; +} +function unpause() { + // unpause auto reloads if they are currently stopped + totStopped = false; + stopped = false; + $('#pause').html(''); +} - function unpause() { - // unpause auto reloads if they are currently stopped - totStopped = false; - stopped = false; - $('#pause').html(''); +// load more network content (used for infinite scroll) +function loadScrollContent() { + if (lockLoadContent) { + return; } + lockLoadContent = true; - // load more network content (used for infinite scroll) - function loadScrollContent() { - if (lockLoadContent) return; - lockLoadContent = true; + $("#scroll-loader").fadeIn('normal'); - $("#scroll-loader").fadeIn('normal'); + // the page number to load is one higher than the actual + // page number + infinite_scroll.pageno+=1; - // 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; + } else { + received = "0000-00-00 00:00:00"; + } - match = $("span.received").last(); - if (match.length > 0) { - received = match[0].innerHTML; - } else { - received = "0000-00-00 00:00:00"; - } + match = $("span.created").last(); + if (match.length > 0) { + created = match[0].innerHTML; + } else { + created = "0000-00-00 00:00:00"; + } - match = $("span.created").last(); - if (match.length > 0) { - created = match[0].innerHTML; - } else { - created = "0000-00-00 00:00:00"; - } + match = $("span.commented").last(); + if (match.length > 0) { + commented = match[0].innerHTML; + } else { + commented = "0000-00-00 00:00:00"; + } - match = $("span.commented").last(); - if (match.length > 0) { - commented = match[0].innerHTML; - } else { - commented = "0000-00-00 00:00:00"; - } + match = $("span.id").last(); + if (match.length > 0) { + id = match[0].innerHTML; + } else { + id = "0"; + } - match = $("span.id").last(); - if (match.length > 0) { - id = match[0].innerHTML; + // 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) { + $("#scroll-loader").hide(); + if ($(data).length > 0) { + $(data).insertBefore('#conversation-end'); + lockLoadContent = false; } else { - id = "0"; + $("#scroll-end").fadeIn('normal'); } - // console.log("Received: " + received + " - Commented: " + commented+ " - Created: " + created + " - ID: " + id); - // get the raw content from the next page and insert this content - // right before "#conversation-end" - $.get('network?mode=raw' + infinite_scroll.reload_uri + '&last_received=' + received + '&last_commented=' + commented + '&last_created=' + created + '&last_id=' + id + '&page=' + infinite_scroll.pageno, function(data) { - $("#scroll-loader").hide(); - if ($(data).length > 0) { + document.dispatchEvent(new Event('postprocess_liveupdate')); + }); +} - $(data).insertBefore('#conversation-end'); - lockLoadContent = false; - } else { - $("#scroll-end").fadeIn('normal'); - } - }); +function bin2hex(s) { + // Converts the binary representation of data to hex + // + // version: 812.316 + // discuss at: http://phpjs.org/functions/bin2hex + // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // + bugfixed by: Onno Marsman + // + bugfixed by: Linuxworld + // * example 1: bin2hex('Kev'); + // * returns 1: '4b6576' + // * example 2: bin2hex(String.fromCharCode(0x00)); + // * returns 2: '00' + var v,i, f = 0, a = []; + s += ''; + f = s.length; + + for (i = 0; i