##// END OF EJS Templates
Merged in bodqhrohro/neboard/mirrors_stamps (pull request #28)...
Merged in bodqhrohro/neboard/mirrors_stamps (pull request #28) Some more marochkas

File last commit:

r2082:47f758c2 default
r2107:d2d9582c merge default
Show More
main.js
362 lines | 11.7 KiB | application/javascript | JavascriptLexer
neko259
Added copyright to the JS code.
r332 /*
@licstart The following is the entire license notice for the
JavaScript code in this page.
Copyright (C) 2013 neko259
The JavaScript code in this page is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this page.
*/
neko259
Save video and audio volume level
r1432 var ITEM_VOLUME_LEVEL = 'volumeLevel';
neko259
Add an ability to hide posts locally
r2080 var ITEM_HIDDEN_POSTS = 'hiddenPosts';
neko259
Changed extensions to mimetypes for images in scripts
r1868 var IMAGE_TYPES = ['image/png', 'image/jpg', 'image/jpeg', 'image/bmp', 'image/gif'];
neko259
Added favorite thread popup
r1340
neko259
Hide email form row by the JS code.
r653 /**
* An email is a hidden file to prevent spam bots from posting. It has to be
* hidden.
*/
function hideEmailFromForm() {
$('.form-email').parent().parent().hide();
}
neko259
Added js code highlight
r703 /**
* Highlight code blocks with code highlighter
*/
neko259
Run js highlight on the new posts only, not on all page each time. Add...
r709 function highlightCode(node) {
node.find('pre code').each(function(i, e) {
neko259
Added js code highlight
r703 hljs.highlightBlock(e);
});
}
neko259
Use shared workers for favorites update script
r1463 function updateFavPosts(data) {
neko259
Added favorite thread popup
r1340 var includePostBody = $('#fav-panel').is(":visible");
neko259
Use shared workers for favorites update script
r1463
var allNewPostCount = 0;
neko259
Added favorite thread popup
r1340 if (includePostBody) {
neko259
Use shared workers for favorites update script
r1463 var favoriteThreadPanel = $('#fav-panel');
favoriteThreadPanel.empty();
neko259
Added favorite thread popup
r1340 }
neko259
Use shared workers for favorites update script
r1463
$.each($.parseJSON(data), function (_, dict) {
var newPostCount = dict.new_post_count;
allNewPostCount += newPostCount;
neko259
Added favorite thread popup
r1340
neko259
Use shared workers for favorites update script
r1463 if (includePostBody) {
var favThreadNode = $('<div class="post"></div>');
favThreadNode.append($(dict.post_url));
favThreadNode.append(' ');
favThreadNode.append($('<span class="title">' + dict.title + '</span>'));
if (newPostCount > 0) {
favThreadNode.append(' (<a href="' + dict.newest_post_link + '">+' + newPostCount + "</a>)");
neko259
Added favorite thread popup
r1340 }
neko259
Use shared workers for favorites update script
r1463 favoriteThreadPanel.append(favThreadNode);
neko259
Added favorite thread popup
r1340
neko259
Use shared workers for favorites update script
r1463 addRefLinkPreview(favThreadNode[0]);
}
});
neko259
Added favorite thread popup
r1340
neko259
Use shared workers for favorites update script
r1463 var newPostCountNode = $('#new-fav-post-count');
if (allNewPostCount > 0) {
newPostCountNode.text('(+' + allNewPostCount + ')');
newPostCountNode.show();
} else {
newPostCountNode.hide();
}
neko259
Added favorite thread popup
r1340 }
function initFavPanel() {
neko259
Use shared workers for favorites update script
r1463 var favPanelButton = $('#fav-panel-btn');
neko259
Check for shared worker support before enabling them
r1465 if (favPanelButton.length > 0 && typeof SharedWorker != 'undefined') {
neko259
Use shared workers for favorites update script
r1463 var worker = new SharedWorker($('body').attr('data-update-script'));
worker.port.onmessage = function(e) {
updateFavPosts(e.data);
};
neko259
Fixed capturing worker errors
r1466 worker.onerror = function(event){
throw new Error(event.message + " (" + event.filename + ":" + event.lineno + ")");
neko259
Add worker js errors to the console
r1464 };
neko259
Use shared workers for favorites update script
r1463 worker.port.start();
$(favPanelButton).click(function() {
var favPanel = $('#fav-panel');
favPanel.toggle();
worker.port.postMessage({ includePostBody: favPanel.is(':visible')});
neko259
Added favorite thread popup
r1340
neko259
Dont update favorites if there aren't any
r1341 return false;
});
neko259
Added favorite thread popup
r1340
neko259
Dont update favorites if there aren't any
r1341 $(document).on('keyup.removepic', function(e) {
if(e.which === 27) {
$('#fav-panel').hide();
}
});
}
neko259
Added favorite thread popup
r1340 }
neko259
Save video and audio volume level
r1432 function setVolumeLevel(level) {
localStorage.setItem(ITEM_VOLUME_LEVEL, level);
}
function getVolumeLevel() {
var level = localStorage.getItem(ITEM_VOLUME_LEVEL);
if (level == null) {
level = 1.0;
}
return level
}
function processVolumeUser(node) {
Opera Mini fixes
r1639 if (!window.localStorage) return;
neko259
Save video and audio volume level
r1432 node.prop("volume", getVolumeLevel());
node.on('volumechange', function(event) {
setVolumeLevel(event.target.volume);
$("video,audio").prop("volume", getVolumeLevel());
});
}
neko259
Add an ability to hide posts locally
r2080 function getHiddenPosts() {
var arr = Array();
var hiddenPosts = localStorage.getItem(ITEM_HIDDEN_POSTS);
if (hiddenPosts) {
arr = JSON.parse(hiddenPosts);
}
return arr;
}
neko259
Speed up post hiding, do not load the hidden posts list for each post being processed
r2082 function processPostHiding(posts) {
neko259
Add an ability to hide posts locally
r2080 var hiddenPosts = getHiddenPosts();
neko259
Speed up post hiding, do not load the hidden posts list for each post being processed
r2082
$.each(posts, function(index) {
var post = $(this);
if (hiddenPosts.indexOf(post.attr("id")) > -1) {
post.toggleClass("hidden_post");
}
});
neko259
Add an ability to hide posts locally
r2080 }
neko259
Save video and audio volume level
r1432 /**
* Add all scripts than need to work on post, when the post is added to the
* document.
*/
function addScriptsToPost(post) {
addRefLinkPreview(post[0]);
highlightCode(post);
processVolumeUser(post.find("video,audio"));
neko259
Speed up post hiding, do not load the hidden posts list for each post being processed
r2082 processPostHiding([post]);
neko259
Save video and audio volume level
r1432 }
Opera Mini fixes
r1639 /**
* Fix compatibility issues with some rare browsers
*/
function compatibilityCrutches() {
if (window.operamini) {
$('#form textarea').each(function() { this.placeholder = ''; });
}
}
neko259
Add an ability to hide posts locally
r2080 function togglePostHidden(postId) {
var hiddenPosts = getHiddenPosts();
var elIndex = hiddenPosts.indexOf(postId);
if (elIndex > -1) {
hiddenPosts.splice(elIndex, 1);
} else {
hiddenPosts.push(postId);
}
localStorage.setItem(ITEM_HIDDEN_POSTS, JSON.stringify(hiddenPosts));
$('#' + postId).toggleClass("hidden_post");
}
neko259
Build file search menu on the JS side
r1817 function addContextMenu() {
$.contextMenu({
selector: '.file-menu',
trigger: 'left',
build: function($trigger, e) {
var fileSearchUrl = $trigger.data('search-url');
var isImage = IMAGE_TYPES.indexOf($trigger.data('type')) > -1;
var hasUrl = fileSearchUrl.length > 0;
neko259
Added local stickers feature
r1940 var id = $trigger.data('id');
neko259
Build file search menu on the JS side
r1817 return {
items: {
duplicates: {
name: gettext('Duplicates search'),
callback: function(key, opts) {
neko259
Search duplicates for file, not hash
r1827 window.location = '/feed/?image=' + $trigger.data('filename');
neko259
Build file search menu on the JS side
r1817 }
},
google: {
name: 'Google',
visible: isImage && hasUrl,
callback: function(key, opts) {
window.location = 'https://www.google.com/searchbyimage?image_url=' + fileSearchUrl;
}
},
iqdb: {
name: 'IQDB',
visible: isImage && hasUrl,
callback: function(key, opts) {
window.location = 'http://iqdb.org/?url=' + fileSearchUrl;
}
},
tineye: {
name: 'TinEye',
visible: isImage && hasUrl,
callback: function(key, opts) {
window.location = 'http://tineye.com/search?url=' + fileSearchUrl;
}
neko259
Added local stickers feature
r1940 },
addAlias: {
name: gettext('Add local sticker'),
callback: function(key, opts) {
var alias = prompt(gettext('Input sticker name'));
if (alias) {
window.location = '/stickers/?action=add&name=' + alias + '&id=' + id;
}
}
neko259
Build file search menu on the JS side
r1817 }
neko259
Added local stickers feature
r1940 }
neko259
Build file search menu on the JS side
r1817 };
}
});
neko259
Moved moderation panel completely to javascript, which will use one menu for all posts instead of a new one for each loaded
r2039
$.contextMenu({
neko259
Add an ability to hide posts locally
r2080 selector: '.post .post-menu',
neko259
Moved moderation panel completely to javascript, which will use one menu for all posts instead of a new one for each loaded
r2039 trigger: 'left',
build: function($trigger, e) {
var canEditPost = PERMS['change_post'];
var canDeletePost = PERMS['delete_post'];
var canEditThread = PERMS['change_thread'];
var canDeleteThread = PERMS['delete_thread'];
var post = $trigger.parents('.post');
var isOpening = post.data('opening') === 'True';
var threadId = post.data('thread-id');
var hasGlobalId = post.data('has-global-id') === 'True';
var posterIp = $trigger.siblings('.pub_time').attr('title');
var hasIp = posterIp != null;
var postId = post.attr('id');
return {
items: {
neko259
Add an ability to hide posts locally
r2080 hide: {
name: gettext('Hide/show'),
callback: function(key, opt) {
togglePostHidden(postId);
}
},
neko259
Moved moderation panel completely to javascript, which will use one menu for all posts instead of a new one for each loaded
r2039 edit: {
name: gettext('Edit'),
callback: function(key, opt) {
window.location = '/admin/boards/post/' + postId + '/change/';
},
visible: canEditPost
},
deletePost: {
name: gettext('Delete post'),
callback: function(key, opt) {
window.location = '/admin/boards/post/' + postId + '/delete/';
},
visible: !isOpening && canDeletePost
},
editThread: {
name: gettext('Edit thread'),
callback: function(key, opt) {
window.location = '/admin/boards/thread/' + threadId + '/change/';
},
visible: isOpening && canEditThread
},
deleteThread: {
name: gettext('Delete thread'),
callback: function(key, opt) {
window.location = '/admin/boards/thread/' + threadId + '/delete/';
},
visible: isOpening && canDeleteThread
},
findByIp: {
name: 'IP = ' + posterIp,
callback: function(key, opt) {
window.location = '/feed/?ip=' + posterIp;
},
neko259
Add an ability to hide posts locally
r2080 visible: canEditPost && hasIp
neko259
Moved moderation panel completely to javascript, which will use one menu for all posts instead of a new one for each loaded
r2039 },
raw: {
name: 'RAW',
callback: function(key, opt) {
window.location = '/post_xml/' + postId;
},
neko259
Add an ability to hide posts locally
r2080 visible: canEditPost && hasGlobalId
neko259
Moved moderation panel completely to javascript, which will use one menu for all posts instead of a new one for each loaded
r2039 },
ban: {
name: gettext('Ban'),
callback: function(key, opt) {
if (confirm(gettext('Are you sure?'))) {
window.location = '/utils?method=ban&post_id=' + postId;
}
},
neko259
Add an ability to hide posts locally
r2080 visible: canEditPost && hasIp
neko259
Moved moderation panel completely to javascript, which will use one menu for all posts instead of a new one for each loaded
r2039 },
banAndDelete: {
name: gettext('Ban and delete'),
callback: function(key, opt) {
if (confirm(gettext('Are you sure?'))) {
window.location = '/utils?method=ban_and_delete&post_id=' + postId;
}
},
visible: hasIp && canDeletePost
}
}
};
}
});
neko259
Build file search menu on the JS side
r1817 }
neko259
xs
r54 $( document ).ready(function() {
neko259
Hide email form row by the JS code.
r653 hideEmailFromForm();
neko259
xs
r54 $("a[href='#top']").click(function() {
$("html, body").animate({ scrollTop: 0 }, "slow");
return false;
});
neko259
Added js popup for image viewing.
r63
neko259
Fixed image preview script which was accidentally disabled during testing.
r270 addImgPreview();
neko259
Removed reply popups as too buggy for using as they are now.
r272
neko259
Added post preview popups
r352 addRefLinkPreview();
neko259
Added js code highlight
r703
neko259
Run js highlight on the new posts only, not on all page each time. Add...
r709 highlightCode($(document));
neko259
Added favorite thread popup
r1340
initFavPanel();
neko259
Save video and audio volume level
r1432
var volumeUsers = $("video,audio");
processVolumeUser(volumeUsers);
Opera Mini fixes
r1639
neko259
Build file search menu on the JS side
r1817 addContextMenu();
Opera Mini fixes
r1639 compatibilityCrutches();
neko259
Add an ability to hide posts locally
r2080
neko259
Speed up post hiding, do not load the hidden posts list for each post being processed
r2082 processPostHiding($('.post'));
rt@lightning
add mark panel
r228 });