summaryrefslogtreecommitdiff
path: root/js/inline-expanding.js
blob: cf8cab8195ac3f85d9ccb83b2365028b325ee652 (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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
 * inline-expanding.js
 * https://github.com/savetheinternet/Tinyboard/blob/master/js/inline-expanding.js
 *
 * Released under the MIT license
 * Copyright (c) 2012-2013 Michael Save <savetheinternet@tinyboard.org>
 * Copyright (c) 2013-2014 Marcin Łabanowski <marcin@6irc.net>
 *
 * Usage:
 *   $config['additional_javascript'][] = 'js/jquery.min.js';
 *   $config['additional_javascript'][] = 'js/inline-expanding.js';
 *
 */

onready(function(){
	var inline_expand_post = function() {
		var link = this.getElementsByTagName('a');

		for (var i = 0; i < link.length; i++) {
			if (typeof link[i] == "object" && link[i].childNodes && typeof link[i].childNodes[0] !== 'undefined' && link[i].childNodes[0].src && link[i].childNodes[0].className.match(/post-image/) && !link[i].className.match(/file/)) {
				link[i].onclick = function(e) {
					var img, post_body, still_open;
					var thumb = this.childNodes[0];
					var padding = 5;
					var boardlist = $('.boardlist')[0];
					
					var loadImage = function(img, thumb) {
						if (img.naturalWidth) {
							thumb.style.display = 'none';
							img.style.display = '';
						}
						else {
							return thumb.parentNode.timeout = setTimeout(loadImage, 30, img, thumb);
						}
					};

					if (thumb.className == 'hidden')
						return false;
					if (e.which == 2 || e.ctrlKey) //open in new tab
						return true;
					if (!this.dataset.expanded) {
						this.parentNode.removeAttribute('style');
						this.dataset.expanded = 'true';

						if (thumb.tagName === 'CANVAS') {
							this.removeChild(thumb);
							thumb.style.display = 'block';
						}

						thumb.style.opacity = '0.4';
						thumb.style.filter = 'alpha(opacity=40)';

						img = document.createElement('img');
						img.className = 'full-image';
						img.setAttribute('src', this.href);
						img.setAttribute('alt', 'Fullsized image');
						img.style.display = 'none';
						this.appendChild(img);

						this.timeout = loadImage(img, thumb);
					} else {
						clearTimeout(this.timeout);

						//scroll to thumb if not triggered by 'shrink all image'
						if (e.target.className == 'full-image') {
							post_body = $(e.target).parentsUntil('form > div').last();
							still_open = post_body.find('.post-image').filter(function(){return $(this).parent().attr('data-expanded') == 'true'}).length;

							//deal with differnt boards' menu styles
							if ($(boardlist).css('position') == 'fixed')
								padding += boardlist.getBoundingClientRect().height;

							if (still_open > 1) {
								if (e.target.getBoundingClientRect().top - padding < 0)
									$('body').scrollTop($(e.target).parent().parent().offset().top - padding);
							} else {
								if (post_body[0].getBoundingClientRect().top - padding < 0)
									$('body').scrollTop(post_body.offset().top - padding);
							}
						}

						if (~this.parentNode.className.indexOf('multifile'))
							this.parentNode.style.width = (parseInt(this.dataset.width)+40)+'px';

						thumb.style.opacity = '';
						thumb.style.display = '';
						this.removeChild(thumb.nextSibling);
						delete this.dataset.expanded;
						delete thumb.style.filter;

						if (localStorage.no_animated_gif === 'true' && typeof unanimate_gif === 'function') {
							unanimate_gif(thumb);
						}
					}
					return false;
				};
			}
		}
	};

	if (window.jQuery) {
		$('div[id^="thread_"]').each(inline_expand_post);

		// allow to work with auto-reload.js, etc.
		$(document).on('new_post', function(e, post) {
			inline_expand_post.call(post);
		});
	} else {
		inline_expand_post.call(document);
	}
});