summaryrefslogtreecommitdiff
path: root/js/no-animated-gif.js
blob: 42c841ab77bd1dbbd83ee61d21f73bd9f0224c8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
 * no-animated-gif.js - Toggle GIF animated thumbnails when gifsicle is enabled
 *
 * Copyright (c) 2014 Fredrick Brennan <admin@8chan.co>
 * Copyright (c) 2014 Marcin Łabanowski <marcin@6irc.net>
 *
 * Usage:
 *   $config['additional_javascript'][] = 'js/jquery.min.js';
 *   //$config['additional_javascript'][] = 'js/options.js';
 *   //$config['additional_javascript'][] = 'js/style-select.js';
 *   //$config['additional_javascript'][] = 'js/options/general.js';
 *   $config['additional_javascript'][] = 'js/no-animated-gif.js';
 */
function unanimate_gif(e) {
	if ($(e).closest('.thread').children('.thread-hidden').length > 0) return;

	if (active_page === "catalog")
		var c = $('<canvas class="thread-image"></canvas>');
	else
		var c = $('<canvas class="post-image"></canvas>');
	$(e).parent().prepend(c);
	c.attr('width', $(e).width());
	c.attr('height',$(e).height());
	function draw_image() {
		c[0].getContext('2d').drawImage(e, 0, 0, $(e).width(), $(e).height())
	};
	
	// Fix drawing image before loaded. Note that Chrome needs to check .complete because load() is NOT called if loaded from cache.
	if (!e.complete) {
		e.onload = draw_image;
	} else {
		draw_image();
	}

	$(e).addClass("unanimated").hide();
}

$(function(){

var gif_finder = 'img.post-image[src$=".gif"], img.thread-image[src$=".gif"]';

function no_animated_gif() {
	var anim_gifs = $(gif_finder);
	localStorage.no_animated_gif = true;
	$('#no-animated-gif>a').text(_('Animate GIFs'));
	$('#no-animated-gif>input').prop('checked', true);

	$.each(anim_gifs, function(i, e) {unanimate_gif(e)} );

	$(document).on('new_post', new_post_handler);
}

function animated_gif() {
	$('canvas.post-image').remove();
	$('img.post-image').removeClass("unanimated").show();
	localStorage.no_animated_gif = false;
	$('#no-animated-gif>a').text(_('Unanimate GIFs'));
	$('#no-animated-gif>input').prop('checked', false);	

	$(document).off('new_post', new_post_handler);
}

function new_post_handler(e, post) {
	$(post).find(gif_finder).each(function(k, v) {
		unanimate_gif(v);
	});
}

if (active_page == 'thread' || active_page == 'index' || active_page == 'ukko' || active_page == 'catalog') {
		var selector, event;
		if (window.Options && Options.get_tab('general')) {
			selector = '#no-animated-gif>input';
			event = 'change';
			Options.extend_tab("general", "<label id='no-animated-gif'><input type='checkbox' />"+_('Unanimate GIFs')+"</label>");
		}
		else {
			selector = '#no-animated-gif';
			event = 'click';
			$('hr:first').before('<div id="no-animated-gif" style="text-align:right"><a class="unimportant" href="javascript:void(0)">'+_('Unanimate GIFs')+'</a></div>')
		}

		$(selector).on(event, function() {
			if (localStorage.no_animated_gif === 'true') {
				animated_gif();
			} else {
				no_animated_gif();
			}
		});

		if (localStorage.no_animated_gif === 'true')
			no_animated_gif();
}

});