##// END OF EJS Templates
Close image popup when clicked on it
neko259 -
r1475:daf7f277 default
parent child Browse files
Show More
@@ -1,201 +1,204 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 })
151 })
152 //scaling preview
152 //scaling preview
153 .mousewheel(function(event, delta) {
153 .mousewheel(function(event, delta) {
154 var cx = event.originalEvent.clientX;
154 var cx = event.originalEvent.clientX;
155 var cy = event.originalEvent.clientY;
155 var cy = event.originalEvent.clientY;
156
156
157 var scale = newImage.attr(ATTR_SCALE) / (delta > 0 ? 1.25 : 0.8);
157 var scale = newImage.attr(ATTR_SCALE) / (delta > 0 ? 1.25 : 0.8);
158
158
159 var oldWidth = newImage.width();
159 var oldWidth = newImage.width();
160 var oldHeight = newImage.height();
160 var oldHeight = newImage.height();
161
161
162 var newIW = full_img_w / scale;
162 var newIW = full_img_w / scale;
163 var newIH = full_img_h / scale;
163 var newIH = full_img_h / scale;
164
164
165 newImage.width(newIW);
165 newImage.width(newIW);
166 newImage.height(newIH);
166 newImage.height(newIH);
167 newImage.attr(ATTR_SCALE, scale);
167 newImage.attr(ATTR_SCALE, scale);
168
168
169 // Set position
169 // Set position
170 var oldPosition = newImage.position();
170 var oldPosition = newImage.position();
171 newImage.css({
171 newImage.css({
172 left: parseInt(cx - (newIW/oldWidth) * (cx - parseInt(oldPosition.left, 10)), 10),
172 left: parseInt(cx - (newIW/oldWidth) * (cx - parseInt(oldPosition.left, 10)), 10),
173 top: parseInt(cy - (newIH/oldHeight) * (cy - parseInt(oldPosition.top, 10)), 10)
173 top: parseInt(cy - (newIH/oldHeight) * (cy - parseInt(oldPosition.top, 10)), 10)
174 });
174 });
175
175
176 return false;
176 return false;
177 })
177 })
178 .draggable({
178 .draggable({
179 addClasses: false,
179 addClasses: false,
180 stack: '.img-full'
180 stack: '.img-full'
181 })
181 })
182 .appendTo($('body'));
182 .appendTo($('body'));
183 newImage.click(function() {
184 $(this).remove();
185 });
183 } else {
186 } else {
184 existingPopups.remove();
187 existingPopups.remove();
185 }
188 }
186 };
189 };
187
190
188 function addImgPreview() {
191 function addImgPreview() {
189 //keybind
192 //keybind
190 $(document).on('keyup.removepic', function(e) {
193 $(document).on('keyup.removepic', function(e) {
191 if(e.which === 27) {
194 if(e.which === 27) {
192 $('.img-full').remove();
195 $('.img-full').remove();
193 }
196 }
194 });
197 });
195
198
196 $('body').on('click', '.thumb', function() {
199 $('body').on('click', '.thumb', function() {
197 viewer.view($(this));
200 viewer.view($(this));
198
201
199 return false;
202 return false;
200 });
203 });
201 }
204 }
General Comments 0
You need to be logged in to leave comments. Login now