##// END OF EJS Templates
Chrome image popups fix
neko259 -
r1485:87524e39 default
parent child Browse files
Show More
@@ -1,204 +1,205 b''
1 /*
1 /*
2 @licstart The following is the entire license notice for the
2 @licstart The following is the entire license notice for the
3 JavaScript code in this page.
3 JavaScript code in this page.
4
4
5
5
6 Copyright (C) 2013 neko259
6 Copyright (C) 2013 neko259
7
7
8 The JavaScript code in this page is free software: you can
8 The JavaScript code in this page is free software: you can
9 redistribute it and/or modify it under the terms of the GNU
9 redistribute it and/or modify it under the terms of the GNU
10 General Public License (GNU GPL) as published by the Free Software
10 General Public License (GNU GPL) as published by the Free Software
11 Foundation, either version 3 of the License, or (at your option)
11 Foundation, either version 3 of the License, or (at your option)
12 any later version. The code is distributed WITHOUT ANY WARRANTY;
12 any later version. The code is distributed WITHOUT ANY WARRANTY;
13 without even the implied warranty of MERCHANTABILITY or FITNESS
13 without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
14 FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
15
15
16 As additional permission under GNU GPL version 3 section 7, you
16 As additional permission under GNU GPL version 3 section 7, you
17 may distribute non-source (e.g., minimized or compacted) forms of
17 may distribute non-source (e.g., minimized or compacted) forms of
18 that code without the copy of the GNU GPL normally required by
18 that code without the copy of the GNU GPL normally required by
19 section 4, provided you include this license notice and a URL
19 section 4, provided you include this license notice and a URL
20 through which recipients can access the Corresponding Source.
20 through which recipients can access the Corresponding Source.
21
21
22 @licend The above is the entire license notice
22 @licend The above is the entire license notice
23 for the JavaScript code in this page.
23 for the JavaScript code in this page.
24 */
24 */
25
25
26 var IMAGE_POPUP_MARGIN = 10;
26 var IMAGE_POPUP_MARGIN = 10;
27
27
28
28
29 var IMAGE_VIEWERS = [
29 var IMAGE_VIEWERS = [
30 ['simple', new SimpleImageViewer()],
30 ['simple', new SimpleImageViewer()],
31 ['popup', new PopupImageViewer()]
31 ['popup', new PopupImageViewer()]
32 ];
32 ];
33
33
34 var FULL_IMG_CLASS = 'post-image-full';
34 var FULL_IMG_CLASS = 'post-image-full';
35
35
36 var ATTR_SCALE = 'scale';
36 var ATTR_SCALE = 'scale';
37
37
38
38
39 // Init image viewer
39 // Init image viewer
40 var viewerName = $('body').attr('data-image-viewer');
40 var viewerName = $('body').attr('data-image-viewer');
41 var viewer = ImageViewer();
41 var viewer = ImageViewer();
42 for (var i = 0; i < IMAGE_VIEWERS.length; i++) {
42 for (var i = 0; i < IMAGE_VIEWERS.length; i++) {
43 var item = IMAGE_VIEWERS[i];
43 var item = IMAGE_VIEWERS[i];
44 if (item[0] === viewerName) {
44 if (item[0] === viewerName) {
45 viewer = item[1];
45 viewer = item[1];
46 break;
46 break;
47 }
47 }
48 }
48 }
49
49
50
50
51 function getFullImageWidth(previewImage) {
51 function getFullImageWidth(previewImage) {
52 var full_img_w = previewImage.attr('data-width');
52 var full_img_w = previewImage.attr('data-width');
53 if (full_img_w == null) {
53 if (full_img_w == null) {
54 full_img_w = previewImage[0].naturalWidth;
54 full_img_w = previewImage[0].naturalWidth;
55 }
55 }
56
56
57 return full_img_w;
57 return full_img_w;
58 }
58 }
59
59
60 function getFullImageHeight(previewImage) {
60 function getFullImageHeight(previewImage) {
61 var full_img_h = previewImage.attr('data-height');
61 var full_img_h = previewImage.attr('data-height');
62 if (full_img_h == null) {
62 if (full_img_h == null) {
63 full_img_h = previewImage[0].naturalHeight;
63 full_img_h = previewImage[0].naturalHeight;
64 }
64 }
65
65
66 return full_img_h;
66 return full_img_h;
67 }
67 }
68
68
69
69
70 function ImageViewer() {}
70 function ImageViewer() {}
71 ImageViewer.prototype.view = function (post) {};
71 ImageViewer.prototype.view = function (post) {};
72
72
73 function SimpleImageViewer() {}
73 function SimpleImageViewer() {}
74 SimpleImageViewer.prototype.view = function (post) {
74 SimpleImageViewer.prototype.view = function (post) {
75 var images = post.find('img');
75 var images = post.find('img');
76 images.toggle();
76 images.toggle();
77
77
78 // When we first enlarge an image, a full image needs to be created
78 // When we first enlarge an image, a full image needs to be created
79 if (images.length == 1) {
79 if (images.length == 1) {
80 var thumb = images.first();
80 var thumb = images.first();
81
81
82 var width = getFullImageWidth(thumb);
82 var width = getFullImageWidth(thumb);
83 var height = getFullImageHeight(thumb);
83 var height = getFullImageHeight(thumb);
84
84
85 if (width == null || height == null) {
85 if (width == null || height == null) {
86 width = '100%';
86 width = '100%';
87 height = '100%';
87 height = '100%';
88 }
88 }
89
89
90 var parent = images.first().parent();
90 var parent = images.first().parent();
91 var link = parent.attr('href');
91 var link = parent.attr('href');
92
92
93 var fullImg = $('<img />')
93 var fullImg = $('<img />')
94 .addClass(FULL_IMG_CLASS)
94 .addClass(FULL_IMG_CLASS)
95 .attr('src', link)
95 .attr('src', link)
96 .attr('width', width)
96 .attr('width', width)
97 .attr('height', height);
97 .attr('height', height);
98
98
99 parent.append(fullImg);
99 parent.append(fullImg);
100 }
100 }
101 };
101 };
102
102
103 function PopupImageViewer() {}
103 function PopupImageViewer() {}
104 PopupImageViewer.prototype.view = function (post) {
104 PopupImageViewer.prototype.view = function (post) {
105 var el = post;
105 var el = post;
106 var thumb_id = 'full' + el.find('img').attr('alt');
106 var thumb_id = 'full' + el.find('img').attr('alt');
107
107
108 var existingPopups = $('#' + thumb_id);
108 var existingPopups = $('#' + thumb_id);
109 if (!existingPopups.length) {
109 if (!existingPopups.length) {
110 var imgElement = el.find('img');
110 var imgElement = el.find('img');
111
111
112 var full_img_w = getFullImageWidth(imgElement);
112 var full_img_w = getFullImageWidth(imgElement);
113 var full_img_h = getFullImageHeight(imgElement);
113 var full_img_h = getFullImageHeight(imgElement);
114
114
115 var win = $(window);
115 var win = $(window);
116
116
117 var win_w = win.width();
117 var win_w = win.width();
118 var win_h = win.height();
118 var win_h = win.height();
119
119
120 // New image size
120 // New image size
121 var w_scale = 1;
121 var w_scale = 1;
122 var h_scale = 1;
122 var h_scale = 1;
123
123
124 var freeWidth = win_w - 2 * IMAGE_POPUP_MARGIN;
124 var freeWidth = win_w - 2 * IMAGE_POPUP_MARGIN;
125 var freeHeight = win_h - 2 * IMAGE_POPUP_MARGIN;
125 var freeHeight = win_h - 2 * IMAGE_POPUP_MARGIN;
126
126
127 if (full_img_w > freeWidth) {
127 if (full_img_w > freeWidth) {
128 w_scale = full_img_w / freeWidth;
128 w_scale = full_img_w / freeWidth;
129 }
129 }
130 if (full_img_h > freeHeight) {
130 if (full_img_h > freeHeight) {
131 h_scale = full_img_h / freeHeight;
131 h_scale = full_img_h / freeHeight;
132 }
132 }
133
133
134 var scale = Math.max(w_scale, h_scale)
134 var scale = Math.max(w_scale, h_scale)
135 var img_w = full_img_w / scale;
135 var img_w = full_img_w / scale;
136 var img_h = full_img_h / scale;
136 var img_h = full_img_h / scale;
137
137
138 var postNode = $(el);
138 var postNode = $(el);
139
139
140 var img_pv = new Image();
140 var img_pv = new Image();
141 var newImage = $(img_pv);
141 var newImage = $(img_pv);
142 newImage.addClass('img-full')
142 newImage.addClass('img-full')
143 .attr('id', thumb_id)
143 .attr('id', thumb_id)
144 .attr('src', postNode.attr('href'))
144 .attr('src', postNode.attr('href'))
145 .attr(ATTR_SCALE, scale)
145 .attr(ATTR_SCALE, scale)
146 .css({
146 .css({
147 'width': img_w,
147 'width': img_w,
148 'height': img_h,
148 'height': img_h,
149 'left': (win_w - img_w) / 2,
149 'left': (win_w - img_w) / 2,
150 'top': ((win_h - img_h) / 2)
150 'top': ((win_h - img_h) / 2),
151 'position': 'fixed' // Chrome fix because it adds a 'relative' value to the image somehow
151 })
152 })
152 //scaling preview
153 //scaling preview
153 .mousewheel(function(event, delta) {
154 .mousewheel(function(event, delta) {
154 var cx = event.originalEvent.clientX;
155 var cx = event.originalEvent.clientX;
155 var cy = event.originalEvent.clientY;
156 var cy = event.originalEvent.clientY;
156
157
157 var scale = newImage.attr(ATTR_SCALE) / (delta > 0 ? 1.25 : 0.8);
158 var scale = newImage.attr(ATTR_SCALE) / (delta > 0 ? 1.25 : 0.8);
158
159
159 var oldWidth = newImage.width();
160 var oldWidth = newImage.width();
160 var oldHeight = newImage.height();
161 var oldHeight = newImage.height();
161
162
162 var newIW = full_img_w / scale;
163 var newIW = full_img_w / scale;
163 var newIH = full_img_h / scale;
164 var newIH = full_img_h / scale;
164
165
165 newImage.width(newIW);
166 newImage.width(newIW);
166 newImage.height(newIH);
167 newImage.height(newIH);
167 newImage.attr(ATTR_SCALE, scale);
168 newImage.attr(ATTR_SCALE, scale);
168
169
169 // Set position
170 // Set position
170 var oldPosition = newImage.position();
171 var oldPosition = newImage.position();
171 newImage.css({
172 newImage.css({
172 left: parseInt(cx - (newIW/oldWidth) * (cx - parseInt(oldPosition.left, 10)), 10),
173 left: parseInt(cx - (newIW/oldWidth) * (cx - parseInt(oldPosition.left, 10)), 10),
173 top: parseInt(cy - (newIH/oldHeight) * (cy - parseInt(oldPosition.top, 10)), 10)
174 top: parseInt(cy - (newIH/oldHeight) * (cy - parseInt(oldPosition.top, 10)), 10)
174 });
175 });
175
176
176 return false;
177 return false;
177 })
178 })
178 .draggable({
179 .draggable({
179 addClasses: false,
180 addClasses: false,
180 stack: '.img-full'
181 stack: '.img-full'
181 })
182 })
182 .appendTo($('body'));
183 .appendTo($('body'));
183 newImage.click(function() {
184 newImage.click(function() {
184 $(this).remove();
185 $(this).remove();
185 });
186 });
186 } else {
187 } else {
187 existingPopups.remove();
188 existingPopups.remove();
188 }
189 }
189 };
190 };
190
191
191 function addImgPreview() {
192 function addImgPreview() {
192 //keybind
193 //keybind
193 $(document).on('keyup.removepic', function(e) {
194 $(document).on('keyup.removepic', function(e) {
194 if(e.which === 27) {
195 if(e.which === 27) {
195 $('.img-full').remove();
196 $('.img-full').remove();
196 }
197 }
197 });
198 });
198
199
199 $('body').on('click', '.thumb', function() {
200 $('body').on('click', '.thumb', function() {
200 viewer.view($(this));
201 viewer.view($(this));
201
202
202 return false;
203 return false;
203 });
204 });
204 }
205 }
General Comments 0
You need to be logged in to leave comments. Login now