var src = null;
var prev = null;
var livetime = null;
var msie = 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 scroll_next = false;
var next_page = 1;
var page_load = true;
var loadingPage = true;
var pageHasMoreContent = true;
var divmore_height = 400;
var last_filestorage_id = null;
var mediaPlaying = false;
var contentHeightDiff = 0;
var liveRecurse = 0;
var savedTitle = '';
var followUpPageLoad = false;
var window_needs_alert = true;
var sse_bs_active = false;
var sse_offset = 0;
var sse_type;
var sse_partial_result = false;
var page_cache = {};
// take care of tab/window reloads on channel change
if(localStorage.getItem('uid') !== localUser.toString()) {
localStorage.clear();
sessionStorage.clear();
localStorage.setItem('uid', localUser.toString());
}
window.onstorage = function(e) {
if(e.key === 'uid' && parseInt(e.newValue) !== localUser) {
if(window_needs_alert) {
window_needs_alert = false;
alert("Your identity has changed. Page reload required!");
window.location.reload();
return;
}
}
}
$.ajaxSetup({cache: false});
$(document).ready(function() {
$(document).on('click focus', '.comment-edit-form', handle_comment_form);
$(document).on('click', '.conversation-settings-link', getConversationSettings);
$(document).on('click', '#settings_module_ajax_submit', postConversationSettings);
$(document).on('click focus', '.comment-edit-form textarea', function(e) {
if(! this.autocomplete_handled) {
/* autocomplete @nicknames */
$(this).editor_autocomplete(baseurl+"/acl?f=&n=1");
/* autocomplete bbcode */
$(this).bbco_autocomplete('bbcode');
this.autocomplete_handled = true;
}
});
var tf = new Function('n', 's', 'var k = s.split("/")['+aStr['plural_func']+']; return (k ? k : s);');
jQuery.timeago.settings.strings = {
prefixAgo : aStr['t01'],
prefixFromNow : aStr['t02'],
suffixAgo : aStr['t03'],
suffixFromNow : aStr['t04'],
seconds : aStr['t05'],
minute : aStr['t06'],
minutes : function(value){return tf(value, aStr['t07']);},
hour : aStr['t08'],
hours : function(value){return tf(value, aStr['t09']);},
day : aStr['t10'],
days : function(value){return tf(value, aStr['t11']);},
month : aStr['t12'],
months : function(value){return tf(value, aStr['t13']);},
year : aStr['t14'],
years : function(value){return tf(value, aStr['t15']);},
wordSeparator : aStr['t16'],
numbers : aStr['t17'],
};
jQuery.timeago.settings.allowFuture = true;
if(typeof(window.SharedWorker) === 'undefined') {
// notifications with multiple tabs open will not work very well in this scenario
var evtSource = new EventSource('/sse');
evtSource.addEventListener('notifications', function(e) {
var obj = JSON.parse(e.data);
sse_handleNotifications(obj, false, false);
}, false);
document.addEventListener('visibilitychange', function() {
if (!document.hidden) {
sse_offset = 0;
sse_bs_init();
}
}, false);
}
else {
var myWorker = new SharedWorker('/view/js/sse_worker.js', localUser);
myWorker.port.onmessage = function(e) {
obj = e.data;
console.log(obj);
sse_handleNotifications(obj, false, false);
}
myWorker.onerror = function(e) {
myWorker.port.close();
}
myWorker.port.start();
}
$('.notification-link').on('click', { replace: true, followup: false }, sse_bs_notifications);
$('.notification-filter').on('keypress', function(e) {
if(e.which == 13) { // enter
this.blur();
sse_offset = 0;
$("#nav-" + sse_type + "-menu").html('');
$("#nav-" + sse_type + "-loading").show();
var cn_val = $('#cn-' + sse_type + '-input').length ? $('#cn-' + sse_type + '-input').val().toString().toLowerCase() : '';
$.get('/sse_bs/' + sse_type + '/' + sse_offset + '?nquery=' + encodeURIComponent(cn_val), function(obj) {
console.log('sse: bootstraping ' + sse_type);
console.log(obj);
sse_bs_active = false;
sse_partial_result = true;
sse_offset = obj[sse_type].offset;
if(sse_offset < 0)
$("#nav-" + sse_type + "-loading").hide();
sse_handleNotifications(obj, true, false);
});
}
});
$('.notifications-textinput-clear').on('click', function(e) {
if(! sse_partial_result)
return;
$("#nav-" + sse_type + "-menu").html('');
$("#nav-" + sse_type + "-loading").show();
$.get('/sse_bs/' + sse_type, function(obj) {
console.log('sse: bootstraping ' + sse_type);
console.log(obj);
sse_bs_active = false;
sse_partial_result = false;
sse_offset = obj[sse_type].offset;
if(sse_offset < 0)
$("#nav-" + sse_type + "-loading").hide();
sse_handleNotifications(obj, true, false);
});
});
$('.notification-content').on('scroll', function() {
if(this.scrollTop > this.scrollHeight - this.clientHeight - (this.scrollHeight/7)) {
if(!sse_bs_active)
sse_bs_notifications(sse_type, false, true);
}
});
//mod_mail only
$(".mail-conv-detail .autotime").timeago();
savedTitle = document.title;
updateInit();
// 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('');
} else {
unpause();
}
} else {
if (!totStopped) {
unpause();
}
}
});
var e = document.getElementById('content-complete');
if(e)
pageHasMoreContent = false;
$(document).on('hz:updateConvItems', function(event) {
cache_next_page();
});
});
function getConversationSettings() {
$.get('settings/conversation/?f=&aj=1',function(data) {
$('#conversation_settings_body').html(data);
});
}
function postConversationSettings() {
$.post(
'settings/conversation',
$('#settings_module_ajax_form').serialize() + "&auto_update=" + next_page
);
if(next_page === 1) {
page_load = true;
}
$('#conversation_settings').modal('hide');
if(timer) clearTimeout(timer);
timer = setTimeout(updateInit,100);
return false;
}
function datasrc2src(selector) {
$(selector).each(function(i, el) {
$(el).attr("src", $(el).data("src"));
$(el).removeAttr("data-src");
});
}
function confirmDelete() {
return confirm(aStr.delitem);
}
function handle_comment_form(e) {
e.stopPropagation();
//handle eventual expanded forms
var expanded = $('.comment-edit-text.expanded');
var i = 0;
if(expanded.length) {
expanded.each(function() {
var ex_form = $(expanded[i].form);
var ex_fields = ex_form.find(':input[type=text], textarea');
var ex_fields_empty = true;
ex_fields.each(function() {
if($(this).val() != '')
ex_fields_empty = false;
});
if(ex_fields_empty) {
ex_form.find('.comment-edit-text').removeClass('expanded').attr('placeholder', aStr.comment);
ex_form.find(':not(.comment-edit-text)').hide();
}
i++;
});
}
// handle clicked form
var form = $(this);
var fields = form.find(':input[type=text], textarea');
var fields_empty = true;
if(form.find('.comment-edit-text').length) {
var commentElm = form.find('.comment-edit-text').attr('id');
var submitElm = commentElm.replace(/text/,'submit');
$('#' + commentElm).addClass('expanded').removeAttr('placeholder');
$('#' + commentElm).attr('tabindex','9');
$('#' + submitElm).attr('tabindex','10');
form.find(':not(:visible)').show();
}
// handle click outside of form (close empty forms)
$(document).on('click', function(e) {
fields.each(function() {
if($(this).val() != '')
fields_empty = false;
});
if(fields_empty) {
var emptyCommentElm = form.find('.comment-edit-text').attr('id');
var emptySubmitElm = commentElm.replace(/text/,'submit');
$('#' + emptyCommentElm).removeClass('expanded').attr('placeholder', aStr.comment);
$('#' + emptyCommentElm).removeAttr('tabindex');
$('#' + emptySubmitElm).removeAttr('tabindex');
form.find(':not(.comment-edit-text)').hide();
form.find(':input[name=parent]').val(emptyCommentElm.replace(/\D/g,''));
var btn = form.find(':button[type=submit]').html();
form.find(':button[type=submit]').html(btn.replace(/<[^>]*>/g, '').trim());
form.find(':button[type=submit]').prop('title', '');
}
});
var commentSaveTimer = null;
var emptyCommentElm = form.find('.comment-edit-text').attr('id');
var convId = emptyCommentElm.replace('comment-edit-text-','');
$(document).on('focusout','#' + emptyCommentElm,function(e){
if(commentSaveTimer)
clearTimeout(commentSaveTimer);
commentSaveChanges(convId,true);
commentSaveTimer = null;
});
$(document).on('focusin','#' + emptyCommentElm,function(e){
commentSaveTimer = setTimeout(function () {
commentSaveChanges(convId,false);
},10000);
});
function commentSaveChanges(convId, isFinal) {
if(typeof isFinal === 'undefined')
isFinal = false;
if(auto_save_draft) {
tmp = $('#' + emptyCommentElm).val();
if(tmp) {
localStorage.setItem("comment_body-" + convId, tmp);
}
else {
localStorage.removeItem("comment_body-" + convId);
}
if( !isFinal) {
commentSaveTimer = setTimeout(commentSaveChanges,10000,convId);
}
}
}
}
function commentClose(obj, id) {
if(obj.value === '') {
obj.value = aStr.comment;
$("#comment-edit-text-" + id).removeClass("expanded");
$("#mod-cmnt-wrap-" + id).hide();
$("#comment-tools-" + id).hide();
$("#comment-edit-anon-" + id).hide();
return true;
}
return false;
}
function showHideCommentBox(id) {
if( $('#comment-edit-form-' + id).is(':visible')) {
$('#comment-edit-form-' + id).hide();
} else {
$('#comment-edit-form-' + id).show();
}
}
function commentInsert(obj, id) {
var tmpStr = $("#comment-edit-text-" + id).val();
if(tmpStr == '$comment') {
tmpStr = '';
$("#comment-edit-text-" + id).addClass("expanded");
openMenu("comment-tools-" + id);
}
var ins = $(obj).html();
ins = ins.replace('<','<');
ins = ins.replace('>','>');
ins = ins.replace('&','&');
ins = ins.replace('"','"');
$("#comment-edit-text-" + id).val(tmpStr + ins);
}
function insertbbcomment(comment, BBcode, id) {
// allow themes to override this
if(typeof(insertFormatting) != 'undefined')
return(insertFormatting(comment, BBcode, id));
var urlprefix = ((BBcode == 'url') ? '#^' : '');
var tmpStr = $("#comment-edit-text-" + id).val();
if(tmpStr == comment) {
tmpStr = "";
$("#comment-edit-text-" + id).addClass("expanded");
openMenu("comment-tools-" + id);
$("#comment-edit-text-" + id).val(tmpStr);
}
textarea = document.getElementById("comment-edit-text-" +id);
if (document.selection) {
textarea.focus();
selected = document.selection.createRange();
selected.text = urlprefix+"["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
} else if (textarea.selectionStart || textarea.selectionStart == "0") {
var start = textarea.selectionStart;
var end = textarea.selectionEnd;
textarea.value = textarea.value.substring(0, start) + urlprefix+"["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
}
return true;
}
function inserteditortag(BBcode, id) {
// allow themes to override this
if(typeof(insertEditorFormatting) != 'undefined')
return(insertEditorFormatting(BBcode));
textarea = document.getElementById(id);
if (document.selection) {
textarea.focus();
selected = document.selection.createRange();
selected.text = urlprefix+"["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
} else if (textarea.selectionStart || textarea.selectionStart == "0") {
var start = textarea.selectionStart;
var end = textarea.selectionEnd;
textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
}
return true;
}
function insertCommentAttach(comment,id) {
activeCommentID = id;
activeCommentText = comment;
$('body').css('cursor', 'wait');
$('#invisible-comment-upload').trigger('click');
return false;
}
function insertCommentURL(comment, id) {
reply = prompt(aStr.linkurl);
if(reply && reply.length) {
reply = bin2hex(reply);
$('body').css('cursor', 'wait');
$.get('linkinfo?f=&binurl=' + reply, function(data) {
var tmpStr = $("#comment-edit-text-" + id).val();
if(tmpStr == comment) {
tmpStr = "";
$("#comment-edit-text-" + id).addClass("expanded");
openMenu("comment-tools-" + id);
$("#comment-edit-text-" + id).val(tmpStr);
}
textarea = document.getElementById("comment-edit-text-" +id);
textarea.value = textarea.value + data;
preview_comment(id);
$('body').css('cursor', 'auto');
});
}
return true;
}
function doFollowAuthor(url) {
$.get(url, function(data) { notificationsUpdate(); });
return true;
}
function viewsrc(id) {
$.colorbox({href: 'viewsrc/' + id, maxWidth: '80%', maxHeight: '80%' });
}
function showHideComments(id) {
if( $('#collapsed-comments-' + id).is(':visible')) {
$('#collapsed-comments-' + id + ' .autotime').timeago('dispose');
$('#collapsed-comments-' + id).hide();
$('#hide-comments-' + id).html(aStr.showmore);
$('#hide-comments-total-' + id).show();
} else {
$('#collapsed-comments-' + id + ' .autotime').timeago();
$('#collapsed-comments-' + id).show();
$('#hide-comments-' + id).html(aStr.showfewer);
$('#hide-comments-total-' + id).hide();
}
}
function openClose(theID) {
if(document.getElementById(theID).style.display == "block") {
document.getElementById(theID).style.display = "none";
} else {
document.getElementById(theID).style.display = "block";
}
}
function openCloseTR(theID) {
if(document.getElementById(theID).style.display == "table-row") {
document.getElementById(theID).style.display = "none";
} else {
document.getElementById(theID).style.display = "table-row";
}
}
function closeOpen(theID) {
if(document.getElementById(theID).style.display == "none") {
document.getElementById(theID).style.display = "block";
} else {
document.getElementById(theID).style.display = "none";
}
}
function openMenu(theID) {
document.getElementById(theID).style.display = "block";
}
function closeMenu(theID) {
document.getElementById(theID).style.display = "none";
}
function markRead(notifType) {
$.get('ping?f=&markRead='+notifType);
$('.' + notifType + '-button').fadeOut(function() {
$('#nav-' + notifType + '-sub').removeClass('show');
sessionStorage.removeItem('notification_open');
sse_setNotificationsStatus();
});
}
function markItemRead(itemId) {
$.get('ping?f=&markItemRead='+itemId);
$('.unseen-wall-indicator-'+itemId).hide();
}
function contextualHelp() {
var container = $("#contextual-help-content");
if(container.hasClass('contextual-help-content-open')) {
container.removeClass('contextual-help-content-open');
$('main').css('margin-top', '')
}
else {
container.addClass('contextual-help-content-open');
var mainTop = container.outerHeight(true);
$('main').css('margin-top', mainTop + 'px');
}
}
function contextualHelpFocus(target, openSidePanel) {
if($(target).length) {
if (openSidePanel) {
$("main").addClass('region_1-on'); // Open the side panel to highlight element
}
else {
$("main").removeClass('region_1-on');
}
var css_position = $(target).parent().css('position');
if (css_position === 'fixed') {
$(target).parent().css('position', 'static');
}
$('html,body').animate({ scrollTop: $(target).offset().top - $('nav').outerHeight(true) - $('#contextual-help-content').outerHeight(true)}, 'slow');
for (i = 0; i < 3; i++) {
$(target).fadeTo('slow', 0.1).fadeTo('slow', 1.0);
}
$(target).parent().css('position', css_position);
}
}
function updatePageItems(mode, data) {
$(document).trigger('hz:updatePageItems');
if(mode === 'append') {
newitemcount = 0;
$(data).each(function() {
$('#page-end').before($(this));
newitemcount++;
});
if(loadingPage) {
loadingPage = false;
}
}
var e = document.getElementById('content-complete');
if(e) {
pageHasMoreContent = false;
} else {
if (newitemcount < 1) {
pageUpdate();
}
}
collapseHeight();
}
function updateConvItems(mode,data) {
$(document).trigger('hz:updateConvItems');
if(mode === 'update' || mode === 'replace') {
prev = 'threads-begin';
}
if(mode === 'append') {
next = 'threads-end';
}
if(mode === 'replace') {
$('.thread-wrapper').remove(); // clear existing content
}
$('.thread-wrapper.toplevel_item',data).each(function() {
var ident = $(this).attr('id');
var convId = ident.replace('thread-wrapper-','');
var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
var itmId = 0;
var isVisible = false;
// figure out the comment state
if(typeof commentWrap !== 'undefined')
itmId = commentWrap.replace('collapsed-comments-','');
if($('#collapsed-comments-'+itmId).is(':visible'))
isVisible = true;
// insert the content according to the mode and first_page
// and whether or not the content exists already (overwrite it)
if($('#' + ident).length == 0) {
if((mode === 'update' || mode === 'replace') && profile_page == 1) {
$('#' + prev).after($(this));
prev = ident;
}
if(mode === 'append') {
$('#' + next).before($(this));
}
}
else {
$('#' + ident).replaceWith($(this));
}
// set the comment state to the state we discovered earlier
if(isVisible)
showHideComments(itmId);
var commentBody = localStorage.getItem("comment_body-" + convId);
if(commentBody) {
var commentElm = $('#comment-edit-text-' + convId);
if(auto_save_draft) {
if($(commentElm).val() === '') {
$('#comment-edit-form-' + convId).show();
$(commentElm).addClass("expanded");
openMenu("comment-tools-" + convId);
$(commentElm).val(commentBody);
}
} else {
localStorage.removeItem("comment_body-" + convId);
}
}
// trigger the autotime function on all newly created content
$("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
$("> .shared_header .autotime",this).timeago();
if((mode === 'append' || mode === 'replace') && (loadingPage)) {
loadingPage = false;
}
// if single thread view and the item has a title, display it in the title bar
if(mode === 'replace') {
if (window.location.search.indexOf("mid=") != -1 || window.location.pathname.indexOf("display") != -1) {
var title = $(".wall-item-title").text();
title.replace(/^\s+/, '');
title.replace(/\s+$/, '');
if (title) {
savedTitle = title + " " + savedTitle;
document.title = title;
}
}
}
});
// take care of the notifications count updates
$('.thread-wrapper', data).each(function() {
var nmids = $(this).data('b64mids');
nmids.forEach(function(nmid, index) {
if($('.notification[data-b64mid=\'' + nmid + '\']').length) {
$('.notification[data-b64mid=\'' + nmid + '\']').each(function() {
var n = this.parentElement.id.split('-');
return sse_updateNotifications(n[1], nmid);
});
}
// special handling for forum notifications
$('.notification-forum').filter(function() {
var fmids = decodeURIComponent($(this).data('b64mids'));
var n = this.parentElement.id.split('-');
if(fmids.indexOf(nmid) > -1) {
var fcount = Number($('.' + n[1] + '-update').html());
fcount--;
$('.' + n[1] + '-update').html(fcount);
if(fcount < 1)
$('.' + n[1] + '-button').fadeOut();
var count = Number($(this).find('.badge-secondary').html());
count--;
$(this).find('.badge-secondary').html(count);
if(count < 1)
$(this).remove();
}
});
});
sse_setNotificationsStatus();
});
// We are actually dealing with counts in sse_updateNotifications()
// for notifications which are already visible. For the case where
// unseen items were loaded but their notifications are not yet visible
// we need to bootstrap counts here to stay in sync with the DB after
// the first page load.
if(followUpPageLoad)
sse_bs_counts();
else
sse_bs_init();
if(commentBusy) {
commentBusy = false;
$('body').css('cursor', 'auto');
}
// Setup to determine if the media player is playing. This affects
// some content loading decisions.
$('video').off('playing');
$('video').off('pause');
$('audio').off('playing');
$('audio').off('pause');
$('video').on('playing', function() {
mediaPlaying = true;
});
$('video').on('pause', function() {
mediaPlaying = false;
});
$('audio').on('playing', function() {
mediaPlaying = true;
});
$('audio').on('pause', function() {
mediaPlaying = false;
});
if(! preloadImages) {
$('.wall-item-body, .wall-photo-item').imagesLoaded()
.always( function( instance ) {
//console.log('all images loaded');
collapseHeight();
if(bParam_mid && mode === 'replace')
scrollToItem();
})
.done( function( instance ) {
//console.log('all images successfully loaded');
})
.fail( function() {
//console.log('all images loaded, at least one is broken');
})
.progress( function( instance, image ) {
//var result = image.isLoaded ? 'loaded' : 'broken';
//console.log( 'image is ' + result + ' for ' + image.img.src );
});
}
else {
collapseHeight();
if(bParam_mid && mode === 'replace')
scrollToItem();
}
// reset rotators and cursors we may have set before reaching this place
$('.like-rotator').hide();
$("#page-spinner").hide();
$("#profile-jot-text-loading").hide();
followUpPageLoad = true;
}
function scrollToItem() {
// auto-scroll to a particular comment in a thread (designated by mid) when in single-thread mode
if(justifiedGalleryActive)
return;
var submid = ((bParam_mid.length) ? bParam_mid : 'abcdefg');
var encoded = ((submid.substr(0,4) == 'b64.') ? true : false);
var submid_encoded = ((encoded) ? submid : window.btoa(submid));
$('.thread-wrapper').filter(function() {
if($(this).data('b64mids').indexOf(submid_encoded) > -1 && !$(this).hasClass('toplevel_item')) {
if($('.collapsed-comments').length) {
var scrolltoid = $('.collapsed-comments').attr('id').substring(19);
$('#collapsed-comments-' + scrolltoid + ' .autotime').timeago();
$('#collapsed-comments-' + scrolltoid).show();
$('#hide-comments-' + scrolltoid).html(aStr.showfewer);
$('#hide-comments-total-' + scrolltoid).hide();
}
$('html, body').animate({ scrollTop: $(this).offset().top - $('nav').outerHeight(true) }, 'slow');
$(this).addClass('item-highlight');
}
});
}
function collapseHeight() {
var origContentHeight = Math.ceil($("#region_2").height());
var cDiff = 0;
var i = 0;
var position = $(window).scrollTop();
$(".wall-item-content, .directory-collapse").each(function() {
var orgHeight = $(this).outerHeight(true);
if(orgHeight > divmore_height) {
if(! $(this).hasClass('divmore') && $(this).has('div.no-collapse').length == 0) {
// check if we will collapse some content above the visible content and compensate the diff later
if($(this).offset().top + divmore_height - $(window).scrollTop() + cDiff - ($(".divgrow-showmore").outerHeight() * i) < 65) {
diff = orgHeight - divmore_height;
cDiff = cDiff + diff;
i++;
}
$(this).readmore({
speed: 0,
heightMargin: 50,
collapsedHeight: divmore_height,
moreLink: '' + aStr.divgrowmore + '',
lessLink: '' + aStr.divgrowless + '',
beforeToggle: function(trigger, element, expanded) {
if(expanded) {
if((($(element).offset().top + divmore_height) - $(window).scrollTop()) < 65 ) {
$(window).scrollTop($(window).scrollTop() - ($(element).outerHeight(true) - divmore_height));
}
}
}
});
$(this).addClass('divmore');
}
}
});
var collapsedContentHeight = Math.ceil($("#region_2").height());
contentHeightDiff = liking ? 0 : origContentHeight - collapsedContentHeight;
console.log('collapseHeight() - contentHeightDiff: ' + contentHeightDiff + 'px');
if(i && !liking){
var sval = position - cDiff + ($(".divgrow-showmore").outerHeight() * i);
console.log('collapsed above viewport count: ' + i);
$(window).scrollTop(sval);
}
}
function updateInit() {
if($('#live-network').length) { src = 'network'; }
if($('#live-channel').length) { src = 'channel'; }
if($('#live-pubstream').length) { src = 'pubstream'; }
if($('#live-display').length) { src = 'display'; }
if($('#live-hq').length) { src = 'hq'; }
if($('#live-search').length) { src = 'search'; }
// if($('#live-cards').length) { src = 'cards'; }
// if($('#live-articles').length) { src = 'articles'; }
if(src) {
liveUpdate();
}
else {
sse_bs_init();
}
if($('#live-photos').length || $('#live-cards').length || $('#live-articles').length ) {
if(liking) {
liking = 0;
window.location.href=window.location.href;
}
}
}
function liveUpdate(notify_id) {
if(typeof profile_uid === 'undefined') profile_uid = false; /* Should probably be unified with channelId defined in head.tpl */
if((src === null) || (stopped) || (! profile_uid)) { $('.like-rotator').hide(); return; }
// if auto updates are enabled and a comment box is open,
// prevent live updates until the comment is submitted
var lockUpdates = (($('.comment-edit-text.expanded').length && (! bParam_static)) ? true : false);
if(lockUpdates || in_progress || mediaPlaying) {
if(livetime) {
clearTimeout(livetime);
}
livetime = setTimeout(liveUpdate, 10000);
return;
}
if(timer)
clearTimeout(timer);
if(livetime !== null)
livetime = null;
prev = 'live-' + src;
in_progress = true;
var update_url;
var update_mode;
if(scroll_next) {
bParam_page = next_page;
page_load = true;
}
else {
bParam_page = 1;
}
update_url = buildCmd();
console.log('displaying: ' + update_url);
if(page_load) {
$("#page-spinner").show();
if(bParam_page == 1)
update_mode = 'replace';
else
update_mode = 'append';
}
else {
update_mode = 'update';
var orgHeight = $("#region_2").height();
}
if(page_cache.data && bParam_page == page_cache.page && page_cache.time > (Date.now() - 60000)) {
page_load = false;
scroll_next = false;
updateConvItems(update_mode,page_cache.data);
in_progress = false;
return;
}
var dstart = new Date();
console.log('LOADING data...');
$.get(update_url, function(data) {
// on shared hosts occasionally the live update process will be killed
// leaving an incomplete HTML structure, which leads to conversations getting
// truncated and the page messed up if all the divs aren't closed. We will try
// again and give up if we can't get a valid HTML response after 10 tries.
if((data.indexOf("") != (-1)) && (data.indexOf("") == (-1))) {
console.log('Incomplete data. Reloading');
in_progress = false;
liveRecurse ++;
if(liveRecurse < 10) {
liveUpdate();
}
else {
console.log('Incomplete data. Too many attempts. Giving up.');
}
}
// else data was valid - reset the recursion counter
liveRecurse = 0;
if(typeof notify_id !== 'undefined' && notify_id !== 'undefined') {
$.post(
"hq",
{
"notify_id" : notify_id
}
);
}
var dready = new Date();
console.log('DATA ready in: ' + (dready - dstart)/1000 + ' seconds.');
if(update_mode === 'update' || preloadImages) {
console.log('LOADING images...');
$('.wall-item-body, .wall-photo-item',data).imagesLoaded()
.always( function( instance ) {
//console.log('all images loaded');
var iready = new Date();
console.log('IMAGES ready in: ' + (iready - dready)/1000 + ' seconds.');
page_load = false;
scroll_next = false;
updateConvItems(update_mode,data);
// adjust scroll position if new content was added above viewport
if(update_mode === 'update' && !justifiedGalleryActive) {
$(window).scrollTop($(window).scrollTop() + $("#region_2").height() - orgHeight + contentHeightDiff);
}
in_progress = false;
$('#image_counter').html('');
})
.done( function( instance ) {
//console.log('all images successfully loaded');
})
.fail( function() {
//console.log('all images loaded, at least one is broken');
})
.progress( function( instance, image ) {
$('#image_counter').html(instance.progressedCount + '/' + instance.images.length);
//var result = image.isLoaded ? 'loaded' : 'broken';
//console.log( 'image is ' + result + ' for ' + image.img.src );
});
}
else {
page_load = false;
scroll_next = false;
updateConvItems(update_mode,data);
in_progress = false;
}
});
}
function cache_next_page() {
page_load = true;
bParam_page = bParam_page + 1;
update_url = buildCmd();
$.get(update_url, function(data) {
// on shared hosts occasionally the live update process will be killed
// leaving an incomplete HTML structure, which leads to conversations getting
// truncated and the page messed up if all the divs aren't closed. We will try
// again and give up if we can't get a valid HTML response after 10 tries.
if((data.indexOf("") != (-1)) && (data.indexOf("") == (-1))) {
console.log('Incomplete data. Reloading');
in_progress = false;
liveRecurse ++;
if(liveRecurse < 10) {
liveUpdate();
}
else {
console.log('Incomplete data. Too many attempts. Giving up.');
}
}
// else data was valid - reset the recursion counter
liveRecurse = 0;
console.log('cached: ' + update_url);
$('.wall-item-body, .wall-photo-item', data).imagesLoaded()
.always( function( instance ) {
console.log('page_cache images loaded:');
page_cache.data = data;
page_cache.page = bParam_page;
page_cache.time = Date.now();
bParam_page = bParam_page - 1;
page_load = false;
})
.done( function( instance ) {
console.log('success');
})
.fail( function() {
console.log('at least one is broken');
})
.progress( function( instance, image ) {
//console.log(instance.progressedCount + '/' + instance.images.length);
//var result = image.isLoaded ? 'loaded' : 'broken';
//console.log( 'image is ' + result + ' for ' + image.img.src );
});
});
}
function pageUpdate() {
in_progress = true;
var update_url;
var update_mode;
if(scroll_next) {
bParam_page = next_page;
page_load = true;
}
else {
bParam_page = 1;
}
update_url = baseurl + '/' + decodeURIComponent(page_query) + '/?f=&aj=1&page=' + bParam_page + extra_args ;
$("#page-spinner").show();
update_mode = 'append';
$.get(update_url,function(data) {
page_load = false;
scroll_next = false;
updatePageItems(update_mode,data);
$("#page-spinner").hide();
$(".autotime").timeago();
in_progress = false;
});
}
function justifyPhotos(id) {
justifiedGalleryActive = true;
$('#' + id).show();
$('#' + id).justifiedGallery({
rowHeight: 150,
selector: 'a',
margins: 3,
border: 0
}).on('jg.complete', function(e){ justifiedGalleryActive = false; });
}
function justifyPhotosAjax(id) {
justifiedGalleryActive = true;
$('#' + id).justifiedGallery('norewind').on('jg.complete', function(e){ justifiedGalleryActive = false; });
}
// 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 updateInit runs before it completes.
function dolike(ident, verb) {
unpause();
$('#like-rotator-' + ident.toString()).show();
$.get('like/' + ident.toString() + '?verb=' + verb, updateInit );
liking = 1;
}
function doprofilelike(ident, verb) {
$.get('like/' + ident + '?verb=' + verb, function() { window.location.href=window.location.href; });
}
function doreply(parent, ident, owner, hint) {
var form = $('#comment-edit-form-' + parent.toString());
form.find('input[name=parent]').val(ident);
var i = form.find('button[type=submit]');
var btn = i.html().replace(/<[^>]*>/g, '').trim();
i.html(' ' + btn);
var sel = 'wall-item-body-' + ident.toString();
var quote = window.getSelection().toString().trim();
form.find('textarea').val("@{" + owner + "}" + ((($(window.getSelection().anchorNode).closest("#" + sel).attr("id") != sel) || (quote.length === 0))? " " : "\n[quote]" + quote + "[/quote]\n"));
$('#comment-edit-text-' + parent.toString()).focus();
}
function doscroll(parent, hidden) {
var id;
var x = '#hide-comments-outer-' + hidden.toString();
var back = $('#back-to-reply');
if(back.length == 0)
var pos = $(window).scrollTop();
else
var pos = back.attr('href').replace(/[^\d|\.]/g,'');
if($(x).length !== 0) {
x = $(x).attr("onclick").replace(/\D/g,'');
var c = '#collapsed-comments-' + x;
if($(c).length !== 0 && (! $(c).is(':visible'))) {
showHideComments(x);
pos += $(c).height();
}
}
back.remove();
$('.thread-wrapper').filter(function() {
if($(this).data('b64mids').indexOf(parent) > -1) {
id = $(this);
}
});
$('html, body').animate({scrollTop:(id.offset().top) - 50}, 'slow');
$(' ').insertBefore('#wall-item-info-' + id.attr('id').replace(/\D/g,''));
}
function doscrollback(pos) {
$('#back-to-reply').remove();
$(window).scrollTop(pos);
}
function dopin(id) {
id = id.toString();
$('#like-rotator-' + id).show();
$.post('pin/pin', { 'id' : id })
.done(function() {
var i = $('#wall-item-pinned-' + id);
var me = $('#item-pinnable-' + id);
var pin = $('.pinned-item');
if(pin.length) {
$('html, body').animate({ scrollTop: $('#region_2').offset().top }, 'slow', function() {
pin.fadeTo('fast', 0.33, function() { this.remove(); });
});
};
pin.remove();
$('.dropdown-item-pinnable').html($('.dropdown-item-pinnable').html().replace(aStr['unpin_item'],aStr['pin_item']));
$('.wall-item-pinned').remove()
if(i.length == 0) {
$(' ').insertBefore('#wall-item-info-' + id);
me.html(me.html().replace(aStr['pin_item'],aStr['unpin_item']));
};
})
.fail(function() {
location.reload();
})
.always(function() {
$('#like-rotator-' + id).hide();
});
}
function dropItem(url, object) {
var confirm = confirmDelete();
if(confirm) {
var id = url.split('/')[2];
$('body').css('cursor', 'wait');
$(object + ', #pinned-wrapper-' + id).fadeTo('fast', 0.33, function () {
$.get(url).done(function() {
$(object + ', #pinned-wrapper-' + id).remove();
$('body').css('cursor', 'auto');
});
});
if($('#wall-item-pinned-' + id).length)
$.post('pin/pin', { 'id' : id });
return true;
}
else {
return false;
}
}
function dosubthread(ident) {
unpause();
$('#like-rotator-' + ident.toString()).show();
$.get('subthread/sub/' + ident.toString(), updateInit );
liking = 1;
}
function dounsubthread(ident) {
unpause();
$('#like-rotator-' + ident.toString()).show();
$.get('subthread/unsub/' + ident.toString(), updateInit );
liking = 1;
}
function dostar(ident) {
ident = ident.toString();
$('#like-rotator-' + ident).show();
$.get('starred/' + ident, function(data) {
if(data.result == 1) {
$('#starred-' + ident).addClass('starred');
$('#starred-' + ident).removeClass('unstarred');
$('#starred-' + ident).addClass('fa-star');
$('#starred-' + ident).removeClass('fa-star-o');
$('#star-' + ident).addClass('hidden');
$('#unstar-' + ident).removeClass('hidden');
var btn_tpl = '
(.*?)<\/code>/gi,"[code]$1[/code]");
rep(/<\/(strong|b)>/gi,"[/b]");
rep(/<(strong|b)>/gi,"[b]");
rep(/<\/(em|i)>/gi,"[/i]");
rep(/<(em|i)>/gi,"[i]");
rep(/<\/u>/gi,"[/u]");
rep(/(.*?)<\/span>/gi,"[u]$1[/u]");
rep(//gi,"[u]");
rep(/]*>/gi,"[quote]");
rep(/<\/blockquote>/gi,"[/quote]");
rep(/
/gi,"[hr]");
rep(/
/gi,"\n");
rep(/
/gi,"\n");
rep(/
/gi,"\n");
rep(//gi,"");
rep(/<\/p>/gi,"\n");
rep(/ /gi," ");
rep(/"/gi,"\"");
rep(/</gi,"<");
rep(/>/gi,">");
rep(/&/gi,"&");
return y;
}
function b2h(s) {
var y = s;
function rep(re, str) {
y = y.replace(re,str);
}
rep(/\&/gi,"&");
rep(/\/gi,">");
rep(/\"/gi,""");
rep(/\n/gi,"
");
rep(/\[b\]/gi,"");
rep(/\[\/b\]/gi,"");
rep(/\[i\]/gi,"");
rep(/\[\/i\]/gi,"");
rep(/\[u\]/gi,"");
rep(/\[\/u\]/gi,"");
rep(/\[hr\]/gi,"
");
rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"$2");
rep(/\[url\](.*?)\[\/url\]/gi,"$1");
rep(/\[img=(.*?)x(.*?)\](.*?)\[\/img\]/gi,"
");
rep(/\[img\](.*?)\[\/img\]/gi,"
");
rep(/\[zrl=([^\]]+)\](.*?)\[\/zrl\]/gi,"$2");
rep(/\[zrl\](.*?)\[\/zrl\]/gi,"$1");
rep(/\[zmg=(.*?)x(.*?)\](.*?)\[\/zmg\]/gi,"
");
rep(/\[zmg\](.*?)\[\/zmg\]/gi,"
");
rep(/\[list\](.*?)\[\/list\]/gi, '$1
');
rep(/\[list=\](.*?)\[\/list\]/gi, '$1
');
rep(/\[list=1\](.*?)\[\/list\]/gi, '$1
');
rep(/\[list=i\](.*?)\[\/list\]/gi,'$1
');
rep(/\[list=I\](.*?)\[\/list\]/gi, '$1
');
rep(/\[list=a\](.*?)\[\/list\]/gi, '$1
');
rep(/\[list=A\](.*?)\[\/list\]/gi, '$1
');
rep(/\[li\](.*?)\[\/li\]/gi, '- $1
');
rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"$2");
rep(/\[size=(.*?)\](.*?)\[\/size\]/gi,"$2");
rep(/\[code\](.*?)\[\/code\]/gi,"$1
");
rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"$1
");
rep(/\[video\](.*?)\[\/video\]/gi,"$1");
rep(/\[audio\](.*?)\[\/audio\]/gi,"$1");
rep(/\[\&\;([#a-z0-9]+)\;\]/gi,'&$1;');
rep(/\<(.*?)(src|href)=\"[^hfm](.*?)\>/gi,'<$1$2="">');
return y;
}
function zid(s) {
if((! s.length) || (s.indexOf('zid=') != (-1)))
return s;
if(! zid.length)
return s;
var has_params = ((s.indexOf('?') == (-1)) ? false : true);
var achar = ((has_params) ? '&' : '?');
s = s + achar + 'f=&zid=' + zid;
return s;
}
function sse_bs_init() {
if(sessionStorage.getItem('notification_open') !== null || typeof sse_type !== 'undefined' ) {
if(typeof sse_type === 'undefined')
sse_type = sessionStorage.getItem('notification_open');
$("#nav-" + sse_type + "-sub").addClass('show');
sse_bs_notifications(sse_type, true, false);
}
else {
sse_bs_counts();
}
}
function sse_bs_counts() {
$.get('/sse_bs',function(obj) {
console.log(obj);
sse_handleNotifications(obj, true, false);
});
}
function sse_bs_notifications(e, replace, followup) {
sse_bs_active = true;
var manual = false;
if(typeof replace === 'undefined')
replace = e.data.replace;
if(typeof followup === 'undefined')
followup = e.data.followup;
if(typeof e === 'string') {
sse_type = e;
}
else {
manual = true;
sse_offset = 0;
sse_type = e.target.dataset.sse_type;
}
if(typeof sse_type === 'undefined')
return;
if(followup || !manual || !($('#nav-' + sse_type + '-sub').hasClass('collapse') && $('#nav-' + sse_type + '-sub').hasClass('show'))) {
if(sse_offset >= 0) {
$("#nav-" + sse_type + "-loading").show();
}
sessionStorage.setItem('notification_open', sse_type);
if(sse_offset !== -1 || replace) {
var cn_val = (($('#cn-' + sse_type + '-input').length && sse_partial_result) ? $('#cn-' + sse_type + '-input').val().toString().toLowerCase() : '');
$.get('/sse_bs/' + sse_type + '/' + sse_offset + '?nquery=' + encodeURIComponent(cn_val), function(obj) {
console.log('sse: bootstraping ' + sse_type);
console.log(obj);
sse_bs_active = false;
sse_offset = obj[sse_type].offset;
if(sse_offset < 0)
$("#nav-" + sse_type + "-loading").hide();
sse_handleNotifications(obj, replace, followup);
});
}
else
$("#nav-" + sse_type + "-loading").hide();
}
else {
sessionStorage.removeItem('notification_open');
}
}
function sse_handleNotifications(obj, replace, followup) {
var primary_notifications = ['dm', 'home', 'intros', 'register', 'mail', 'notify', 'files'];
var secondary_notifications = ['network', 'forums', 'all_events', 'pubs'];
var all_notifications = primary_notifications.concat(secondary_notifications);
all_notifications.forEach(function(type, index) {
if(obj[type] && obj[type].count) {
$('.' + type + '-button').fadeIn();
if(replace || followup)
$('.' + type + '-update').html(Number(obj[type].count));
else
$('.' + type + '-update').html(Number(obj[type].count) + Number($('.' + type + '-update').html()));
}
if(obj[type] && obj[type].notifications.length)
sse_handleNotificationsItems(type, obj[type].notifications, replace, followup);
});
sse_setNotificationsStatus();
// notice and info
$.jGrowl.defaults.closerTemplate = '[ ' + aStr.closeAll + ']';
if(obj.notice) {
$(obj.notice.notifications).each(function() {
$.jGrowl(this, { sticky: true, theme: 'notice' });
});
}
if(obj.info) {
$(obj.info.notifications).each(function(){
$.jGrowl(this, { sticky: false, theme: 'info', life: 10000 });
});
}
}
function sse_handleNotificationsItems(notifyType, data, replace, followup) {
var notifications_tpl = ((notifyType == 'forums') ? decodeURIComponent($("#nav-notifications-forums-template[rel=template]").html()) : decodeURIComponent($("#nav-notifications-template[rel=template]").html()));
var notify_menu = $("#nav-" + notifyType + "-menu");
var notify_loading = $("#nav-" + notifyType + "-loading");
var notify_count = $("." + notifyType + "-update");
if(replace && !followup) {
notify_menu.html('');
notify_loading.hide();
}
$(data).each(function() {
html = notifications_tpl.format(this.notify_link,this.photo,this.name,this.addr,this.message,this.when,this.hclass,this.b64mid,this.notify_id,this.thread_top,this.unseen,this.private_forum, encodeURIComponent(this.mids));
notify_menu.append(html);
});
if(!replace && !followup) {
$("#nav-" + notifyType + "-menu .notification").sort(function(a,b) {
a = new Date(a.dataset.when);
b = new Date(b.dataset.when);
return a > b ? -1 : a < b ? 1 : 0;
}).appendTo('#nav-' + notifyType + '-menu');
}
$(document.body).trigger("sticky_kit:recalc");
$("#nav-" + notifyType + "-menu .notifications-autotime").timeago();
if($('#tt-' + notifyType + '-only').hasClass('active'))
$('#nav-' + notifyType + '-menu [data-thread_top=false]').addClass('tt-filter-active');
if($('#cn-' + notifyType + '-input').length) {
var filter = $('#cn-' + notifyType + '-input').val().toString().toLowerCase();
if(filter) {
filter = filter.indexOf('%') == 0 ? filter.substring(1) : filter;
$('#nav-' + notifyType + '-menu .notification').each(function(i, el) {
var cn = $(el).data('contact_name').toString().toLowerCase();
var ca = $(el).data('contact_addr').toString().toLowerCase();
if(cn.indexOf(filter) === -1 && ca.indexOf(filter) === -1)
$(el).addClass('cn-filter-active');
else
$(el).removeClass('cn-filter-active');
});
}
}
}
function sse_updateNotifications(type, mid) {
if(type === 'pubs')
return true;
if(type === 'notify' && (mid !== bParam_mid || sse_type !== 'notify'))
return true;
var count = Number($('.' + type + '-update').html());
count--;
if(count < 1) {
$('.' + type + '-update').html(count);
$('.' + type + '-button').fadeOut(function() {
sse_setNotificationsStatus();
});
}
else {
$('.' + type + '-update').html(count);
}
$('#nav-' + type + '-menu .notification[data-b64mid=\'' + mid + '\']').fadeOut(function() {
this.remove();
});
}
function sse_setNotificationsStatus() {
var primary_notifications = ['dm', 'home', 'intros', 'register', 'mail', 'notify', 'files'];
var secondary_notifications = ['network', 'forums', 'all_events', 'pubs'];
var all_notifications = primary_notifications.concat(secondary_notifications);
var primary_available = false;
var any_available = false;
all_notifications.forEach(function(type, index) {
if($('.' + type + '-button').css('display') == 'block') {
any_available = true;
if(primary_notifications.indexOf(type) > -1)
primary_available = true;
}
});
if(primary_available) {
$('.notifications-btn-icon').removeClass('fa-exclamation-circle');
$('.notifications-btn-icon').addClass('fa-exclamation-triangle');
}
else {
$('.notifications-btn-icon').removeClass('fa-exclamation-triangle');
$('.notifications-btn-icon').addClass('fa-exclamation-circle');
}
if(any_available) {
$('.notifications-btn').css('opacity', 1);
$('#no_notifications').hide();
$('#notifications').show();
}
else {
$('.notifications-btn').css('opacity', 0.5);
$('#navbar-collapse-1').removeClass('show');
$('#no_notifications').show();
$('#notifications').hide();
}
}