Mercurial > hg > digilib-old
annotate webapp/src/main/webapp/jquery/jquery.digilib.js @ 1118:f0474c1faaff
trying new annotator authentication.
author | robcast |
---|---|
date | Tue, 06 Nov 2012 18:24:39 +0100 |
parents | 0a01d5cc66fe |
children | 75e61bf276fe |
rev | line source |
---|---|
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1 /* Copyright (c) 2011 Martin Raspe, Robert Casties |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
2 |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
3 This program is free software: you can redistribute it and/or modify |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
4 it under the terms of the GNU Lesser General Public License as published by |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
5 the Free Software Foundation, either version 2 of the License, or |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
6 (at your option) any later version. |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
7 |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
8 This program is distributed in the hope that it will be useful, |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
9 but WITHOUT ANY WARRANTY; without even the implied warranty of |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
11 GNU Lesser General Public License for more details. |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
12 |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
13 You should have received a copy of the GNU Lesser General Public License |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
14 along with this program. If not, see <http://www.gnu.org/licenses/>. |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
15 |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
16 Authors: |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
17 Martin Raspe, Robert Casties, 11.1.2011 |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
18 */ |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
19 |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
20 /** |
604 | 21 * digilib jQuery plugin |
745
ad483c008159
move birdview zoom indicator along with zoom drag
hertzhaft
parents:
744
diff
changeset
|
22 **/ |
ad483c008159
move birdview zoom indicator along with zoom drag
hertzhaft
parents:
744
diff
changeset
|
23 |
767 | 24 /*jslint browser: true, debug: true, forin: true |
745
ad483c008159
move birdview zoom indicator along with zoom drag
hertzhaft
parents:
744
diff
changeset
|
25 */ |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
26 |
636 | 27 // fallback for console.log calls |
797 | 28 if (typeof console === 'undefined') { |
636 | 29 var console = { |
692 | 30 log : function(){}, |
31 debug : function(){}, | |
32 error : function(){} | |
33 }; | |
779 | 34 var customConsole = false; // set to true if debugging for MS IE |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
35 } |
604 | 36 |
37 (function($) { | |
617
cd846b5c8be8
toggle view event handlers for bird's eye and 'about windows
hertzhaft
parents:
616
diff
changeset
|
38 |
605 | 39 var defaults = { |
616 | 40 // version of this script |
1107 | 41 'version' : 'jquery.digilib.js 2.1.9', |
616 | 42 // logo url |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
43 'logoUrl' : 'img/digilib-logo-text1.png', |
635 | 44 // homepage url (behind logo) |
45 'homeUrl' : 'http://digilib.berlios.de', | |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
46 // base URL to digilib (e.g. 'http://digilib.mpiwg-berlin.mpg.de/digitallibrary') |
744 | 47 'digilibBaseUrl' : null, |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
48 // base URL to Scaler servlet (usually digilibBaseUrl+'/servlet/Scaler') |
652 | 49 'scalerBaseUrl' : null, |
995 | 50 // prefix of digilib classes in CSS styles |
51 'cssPrefix' : 'dl-', | |
610 | 52 // list of Scaler parameters |
627 | 53 'scalerParamNames' : ['fn','pn','dw','dh','ww','wh','wx','wy','ws','mo', |
1077 | 54 'rot','cont','brgt','rgbm','rgba','ddpi','ddpix','ddpiy','colop'], |
627 | 55 // Scaler parameter defaults |
643 | 56 'pn' : 1, |
627 | 57 'ww' : 1.0, |
58 'wh' : 1.0, | |
59 'wx' : 0.0, | |
60 'wy' : 0.0, | |
61 'ws' : 1.0, | |
643 | 62 'mo' : '', |
63 'rot' : 0, | |
64 'cont' : 0, | |
65 'brgt' : 0, | |
66 'rgbm' : '0/0/0', | |
67 'rgba' : '0/0/0', | |
68 'ddpi' : null, | |
69 'ddpix' : null, | |
70 'ddpiy' : null, | |
1077 | 71 'colop' : null, |
644
ee8ccd84c5f8
reload doesn't take list of changed parameters any more
robcast
parents:
643
diff
changeset
|
72 // list of digilib parameters |
1077 | 73 'digilibParamNames' : ['fn','pn','ww','wh','wx','wy','ws','mo','rot','cont','brgt','rgbm','rgba','ddpi','colop','mk','clop'], |
644
ee8ccd84c5f8
reload doesn't take list of changed parameters any more
robcast
parents:
643
diff
changeset
|
74 // digilib parameter defaults |
643 | 75 'mk' : '', |
650 | 76 'clop' : '', |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
77 // list of additional parameters (for page outside of digilib) |
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
78 'additionalParamNames' : [], |
914 | 79 // list of parameters to suppress when generating page URL |
80 'suppressParamNames' : null, | |
643 | 81 // mode of operation: |
82 // fullscreen = take parameters from page URL, keep state in page URL | |
83 // embedded = take parameters from Javascript options, keep state inside object | |
610 | 84 'interactionMode' : 'fullscreen', |
991
497ab03868ab
moved marks to separate plugin. (pack and unpack is still in digilib.js)
robcast
parents:
990
diff
changeset
|
85 // default size of preview image for drag-scroll (preferrably same as Bird's Eye View image) |
954 | 86 'previewImgWidth' : 200, |
87 'previewImgHeight' : 200, | |
88 // maximum width or height of preview background image for drag-scroll | |
778 | 89 'maxBgSize' : 10000, |
795 | 90 // parameters used by background image |
954 | 91 'previewImgParamNames' : ['fn','pn','dw','dh','mo','rot'], |
989
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
92 // reserved space in full page display (default value accounts for body margins) |
990 | 93 'scalerInsets' : { 'x' : 26, 'y': 20 } |
610 | 94 }; |
655 | 95 |
786 | 96 // list of plugins |
97 var plugins = {}; | |
787 | 98 // object to export functions to plugins |
948 | 99 var fn = null; |
786 | 100 // affine geometry plugin stub |
948 | 101 var geom = null; |
944 | 102 // rectangle with maximum zoom area |
948 | 103 var FULL_AREA = null; |
944 | 104 // limit for float comparison |
947 | 105 var EPSILON = 0.0001; |
106 // list of buttons | |
107 var buttons = {}; | |
655 | 108 |
651
694bdb86cbad
renamed 'actions' to 'buttons' and 'methods' to 'actions'
robcast
parents:
650
diff
changeset
|
109 var actions = { |
954 | 110 /** init: digilib initialization |
111 * | |
112 * @param options | |
113 * @returns | |
114 */ | |
668 | 115 init : function(options) { |
786 | 116 // import geometry classes |
117 if (plugins.geometry == null) { | |
118 $.error("jquery.digilib.geometry plugin not found!"); | |
790
baa98b639126
put plugins reference into plugin object. put geom into fn object for plugins.
robcast
parents:
788
diff
changeset
|
119 // last straw: old version |
785 | 120 geom = dlGeometry(); |
121 } else { | |
793
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
122 // geometry plugin puts classes in the shared fn |
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
123 geom = fn.geometry; |
785 | 124 } |
125 FULL_AREA = geom.rectangle(0, 0, 1, 1); | |
788 | 126 |
668 | 127 // settings for this digilib instance are merged from defaults and options |
128 var settings = $.extend({}, defaults, options); | |
129 var isFullscreen = settings.interactionMode === 'fullscreen'; | |
130 var queryParams = {}; | |
131 if (isFullscreen) { | |
1015 | 132 queryParams = parseQueryParams(); |
133 // filter additional parameters | |
134 for (var p in queryParams) { | |
135 if ($.inArray(p, settings.digilibParamNames) < 0) { | |
136 settings.additionalParamNames.push(p); | |
137 } | |
138 } | |
668 | 139 } |
140 return this.each(function() { | |
141 var $elem = $(this); | |
142 var data = $elem.data('digilib'); | |
688 | 143 var params, elemSettings; |
668 | 144 // if the plugin hasn't been initialized yet |
145 if (!data) { | |
146 // merge query parameters | |
147 if (isFullscreen) { | |
688 | 148 params = queryParams; |
668 | 149 } else { |
688 | 150 params = parseImgParams($elem); |
785 | 151 if ($.cookie) { |
727 | 152 // retrieve params from cookie |
153 var ck = "digilib-embed:fn:" + escape(params.fn) + ":pn:" + (params.pn || '1'); | |
785 | 154 var cs = $.cookie(ck); |
727 | 155 console.debug("get cookie=", ck, " value=", cs); |
156 if (cs) { | |
157 var cp = parseQueryString(cs); | |
728 | 158 // ignore fn and pn from cookie TODO: should we keep pn? |
159 delete cp.fn; | |
160 delete cp.pn; | |
785 | 161 $.extend(params, cp); |
727 | 162 } |
163 } | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
164 } |
856 | 165 // setup $elem.data, needs "deep copy" because of nesting |
849 | 166 elemSettings = $.extend(true, {}, settings, params); |
697 | 167 data = { |
856 | 168 // let $(this) know about $(this) :-) |
668 | 169 $elem : $elem, |
856 | 170 // let $elem have its own copy of settings |
668 | 171 settings : elemSettings, |
856 | 172 // and of the URL query parameters |
965 | 173 queryParams : params |
668 | 174 }; |
793
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
175 // store in jQuery data element |
668 | 176 $elem.data('digilib', data); |
949 | 177 } else { |
1015 | 178 // data exists |
179 elemSettings = data.settings; | |
668 | 180 } |
181 unpackParams(data); | |
989
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
182 // list of current insets (dynamic for buttons etc.) |
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
183 data.currentInsets = {'static' : elemSettings.scalerInsets}; |
744 | 184 // check if browser knows *background-size |
741 | 185 for (var bs in {'':1, '-moz-':1, '-webkit-':1, '-o-':1}) { |
186 if ($elem.css(bs+'background-size')) { | |
187 data.hasBgSize = true; | |
188 data.bgSizeName = bs+'background-size'; | |
189 break; | |
190 } | |
191 } | |
944 | 192 data.hasPreviewBg = false; |
942 | 193 // check if browser supports AJAX-like URL-replace without reload |
194 data.hasAsyncReload = (typeof history.replaceState === 'function'); | |
993 | 195 // check if browser sets complete on cached images |
196 data.hasCachedComplete = ! $.browser.mozilla; | |
744 | 197 // check digilib base URL |
198 if (elemSettings.digilibBaseUrl == null) { | |
199 if (isFullscreen) { | |
200 // take current host | |
201 var url = window.location.toString(); | |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
202 // assume the page lives in [webapp]/jquery/ |
915 | 203 var pos = url.indexOf('/jquery/'); |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
204 if (pos > 0) { |
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
205 elemSettings.digilibBaseUrl = url.substring(0, pos); |
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
206 } |
744 | 207 } else { |
1015 | 208 // may be we got the scaler URL from the img |
744 | 209 var url = elemSettings.scalerBaseUrl; |
210 if (url) { | |
211 // build it from scaler URL | |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
212 var pos = url.indexOf('/servlet/Scaler'); |
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
213 elemSettings.digilibBaseUrl = url.substring(0, pos); |
744 | 214 } |
215 } | |
216 } | |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
217 // check scaler base URL |
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
218 if (elemSettings.scalerBaseUrl == null) { |
1015 | 219 if (elemSettings.digilibBaseUrl) { |
220 elemSettings.scalerBaseUrl = elemSettings.digilibBaseUrl + '/servlet/Scaler'; | |
221 } | |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
222 } |
947 | 223 // set up event handlers |
224 $(data).on('update', handleUpdate); // handleUpdate needs to be the first handler for update | |
225 $(data).on('changeZoomArea', handleChangeZoomArea); | |
786 | 226 // initialise plugins |
787 | 227 for (n in plugins) { |
228 var p = plugins[n]; | |
793
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
229 if (typeof p.init === 'function') { |
1015 | 230 // call the plugins init() method |
793
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
231 p.init(data); |
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
232 } |
786 | 233 } |
992
4fcc85d4db8f
pack and unpack parameters now as events. used in marks plugin.
robcast
parents:
991
diff
changeset
|
234 // trigger unpack params handlers |
4fcc85d4db8f
pack and unpack parameters now as events. used in marks plugin.
robcast
parents:
991
diff
changeset
|
235 $(data).trigger('unpack'); |
763
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
236 // get image info from server if needed |
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
237 if (data.scaleMode === 'pixel' || data.scaleMode === 'size') { |
797 | 238 loadImageInfo(data); // triggers "imageInfo" on completion |
763
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
239 } |
947 | 240 // create HTML structure for scaler |
779 | 241 setupScalerDiv(data); |
795 | 242 // send setup event |
243 $(data).trigger('setup'); | |
668 | 244 }); |
245 }, | |
246 | |
954 | 247 /** destroy: clean up digilib |
248 * | |
249 * @param data | |
250 * @returns | |
251 */ | |
668 | 252 destroy : function(data) { |
253 return this.each(function(){ | |
254 var $elem = $(this); | |
917 | 255 $(window).off('.digilib'); // unbind all digilibs(?) |
668 | 256 data.digilib.remove(); |
257 $elem.removeData('digilib'); | |
258 }); | |
259 }, | |
260 | |
1052 | 261 /** show the 'about' window |
954 | 262 * |
263 * @param data | |
264 */ | |
1052 | 265 about : function(data) { |
266 //FIXME: highlightButtons(data, 'about', on); | |
267 var $elem = data.$elem; | |
268 var settings = data.settings; | |
269 var cssPrefix = settings.cssPrefix; | |
1058
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
270 var aboutSelector = '#'+cssPrefix+'about'; |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
271 if (isOnScreen(data, aboutSelector)) return; |
1052 | 272 // make relative logoUrl absolute |
273 var logoUrl = settings.logoUrl; | |
274 if (logoUrl.charAt(0) !== '/' && logoUrl.substring(0,3) !== 'http') { | |
275 logoUrl = settings.digilibBaseUrl + '/' + logoUrl; | |
276 } | |
277 var html = '\ | |
278 <div id="'+cssPrefix+'about" class="'+cssPrefix+'about" style="display:none">\ | |
279 <p>Digilib Image Viewer</p>\ | |
280 <a href="'+settings.homeUrl+'">\ | |
281 <img class="'+settings.cssPrefix+'logo" title="Digilib" src="'+logoUrl+'"/>\ | |
282 </a>\ | |
283 <p>Version: '+settings.version+'</p>\ | |
284 </div>'; | |
285 $about = $(html); | |
286 $about.appendTo($elem); | |
287 $about.on('click.digilib', function () { | |
288 withdraw($about); | |
289 }); | |
290 $about.fadeIn(); | |
291 centerOnScreen(data, $about); | |
668 | 292 }, |
655 | 293 |
954 | 294 /** goto given page nr (+/-: relative) |
295 * | |
296 * @param data | |
297 * @param pageNr | |
298 * @returns {Boolean} | |
299 */ | |
668 | 300 gotoPage : function (data, pageNr) { |
301 var settings = data.settings; | |
302 var oldpn = settings.pn; | |
716 | 303 if (pageNr == null) { |
304 pageNr = window.prompt("Goto page number", oldpn); | |
305 } | |
668 | 306 var pn = setNumValue(settings, "pn", pageNr); |
307 if (pn == null) return false; // nothing happened | |
308 if (pn < 1) { | |
309 alert("no such page (page number too low)"); | |
310 settings.pn = oldpn; | |
311 return false; | |
312 } | |
767 | 313 // TODO: how do we get pt? |
955
c8c441d1d7a0
fixed bug with prev/next page. (too quick in using jQuery functions)
robcast
parents:
954
diff
changeset
|
314 if (settings.pt != null) { |
668 | 315 if (pn > settings.pt) { |
316 alert("no such page (page number too high)"); | |
623 | 317 settings.pn = oldpn; |
318 return false; | |
634 | 319 } |
668 | 320 } |
321 // reset mk and others(?) | |
322 data.marks = []; | |
927 | 323 data.zoomArea = FULL_AREA.copy(); |
668 | 324 // then reload |
325 redisplay(data); | |
326 }, | |
654 | 327 |
954 | 328 /** zoom by a given factor |
329 * | |
330 * @param data | |
331 * @param factor | |
332 */ | |
668 | 333 zoomBy : function (data, factor) { |
334 zoomBy(data, factor); | |
335 }, | |
647 | 336 |
954 | 337 /** zoom to area (or interactive) |
338 * | |
339 * @param data | |
340 * @param area | |
341 */ | |
767 | 342 zoomArea : function (data, area) { |
343 if (area == null) { | |
344 // interactively | |
1107 | 345 var onComplete = function(data, rect) { |
346 if (rect == null) return; | |
347 setZoomArea(data, rect); | |
348 // reset modes | |
349 setFitMode(data, 'both'); | |
350 setScaleMode(data, 'screen'); | |
351 redisplay(data); | |
352 }; | |
353 defineArea(data, onComplete); | |
767 | 354 } else { |
355 data.zoomArea = geom.rectangle(area); | |
356 redisplay(data); | |
357 } | |
668 | 358 }, |
650 | 359 |
954 | 360 /** zoom out to full page |
361 * | |
362 * @param data | |
363 * @param mode | |
364 */ | |
668 | 365 zoomFull : function (data, mode) { |
1031 | 366 var settings = data.settings; |
917 | 367 data.zoomArea = FULL_AREA.copy(); |
972 | 368 setFitMode(data, mode); |
369 // zoom full only works in screen mode | |
370 setScaleMode(data, 'screen'); | |
668 | 371 redisplay(data); |
372 }, | |
373 | |
954 | 374 /** mirror the image |
375 * | |
376 * @param data | |
377 * @param mode | |
378 */ | |
668 | 379 mirror : function (data, mode) { |
380 var flags = data.scalerFlags; | |
381 if (mode === 'h') { | |
382 if (flags.hmir) { | |
383 delete flags.hmir; | |
384 } else { | |
385 flags.hmir = 1; | |
386 } | |
387 } else { | |
388 if (flags.vmir) { | |
389 delete flags.vmir; | |
390 } else { | |
391 flags.vmir = 1; | |
392 } | |
393 } | |
394 redisplay(data); | |
395 }, | |
650 | 396 |
954 | 397 /** rotate the image |
398 * | |
399 * @param data | |
400 * @param angle | |
401 */ | |
668 | 402 rotate : function (data, angle) { |
403 var rot = data.settings.rot; | |
404 if (angle == null) { | |
405 angle = window.prompt("Rotation angle:", rot); | |
406 } | |
407 data.settings.rot = angle; | |
408 redisplay(data); | |
409 }, | |
410 | |
954 | 411 /** change brightness |
412 * | |
413 * @param data | |
414 * @param factor | |
415 */ | |
668 | 416 brightness : function (data, factor) { |
417 var brgt = data.settings.brgt; | |
418 if (factor == null) { | |
419 factor = window.prompt("Brightness (-255..255)", brgt); | |
420 } | |
421 data.settings.brgt = factor; | |
422 redisplay(data); | |
423 }, | |
424 | |
954 | 425 /** change contrast |
426 * | |
427 * @param data | |
428 * @param factor | |
1020
0eedb4a5b674
sliders for rot/brgt/cont, needs some refactoring
hertzhaft
parents:
1019
diff
changeset
|
429 * @param brightness : if given, adjust brightness along with contrast |
954 | 430 */ |
1020
0eedb4a5b674
sliders for rot/brgt/cont, needs some refactoring
hertzhaft
parents:
1019
diff
changeset
|
431 contrast : function (data, factor, brightness) { |
668 | 432 var cont = data.settings.cont; |
433 if (factor == null) { | |
434 factor = window.prompt("Contrast (-8, 8)", cont); | |
435 } | |
436 data.settings.cont = factor; | |
1020
0eedb4a5b674
sliders for rot/brgt/cont, needs some refactoring
hertzhaft
parents:
1019
diff
changeset
|
437 if (brightness) { |
0eedb4a5b674
sliders for rot/brgt/cont, needs some refactoring
hertzhaft
parents:
1019
diff
changeset
|
438 var brgt = 127 - (127 * Math.pow(2, factor)); |
0eedb4a5b674
sliders for rot/brgt/cont, needs some refactoring
hertzhaft
parents:
1019
diff
changeset
|
439 data.settings.brgt = brgt; |
0eedb4a5b674
sliders for rot/brgt/cont, needs some refactoring
hertzhaft
parents:
1019
diff
changeset
|
440 } |
668 | 441 redisplay(data); |
688 | 442 }, |
710 | 443 |
1019
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
444 /** change rgb contrast and brightness |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
445 * |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
446 * @param data |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
447 * @param rgbm |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
448 * @param rgba |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
449 */ |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
450 setRGB : function (data, rgbm, rgba) { |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
451 var oldRgbm = data.settings.rgbm; |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
452 var oldRgba = data.settings.rgba; |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
453 if (rgbm == null && rgba == null) { |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
454 var rgb = window.prompt("RGBm, RGBa (m_r/m_g/m_b, a_r/a_g/a_b)", oldRgbm+', '+oldRgba); |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
455 if (rgb != null) { |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
456 rgbs = rgb.split(/,\s*/); |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
457 if (rgbs.length == 2) { |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
458 data.settings.rgbm = rgbs[0]; |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
459 data.settings.rgba = rgbs[1]; |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
460 redisplay(data); |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
461 } |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
462 } |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
463 } else { |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
464 if (rgbm != null) data.settings.rgbm = rgbm; |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
465 if (rgba != null) data.settings.rgba = rgba; |
1052 | 466 redisplay(data); |
1019
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
467 } |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
468 }, |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
469 |
954 | 470 /** reset image parameters to defaults |
471 * TODO: improve this! | |
472 * | |
473 * @param data | |
474 */ | |
688 | 475 reset : function (data) { |
476 var settings = data.settings; | |
477 var paramNames = settings.digilibParamNames; | |
478 var params = data.queryParams; | |
479 // delete all digilib parameters | |
480 for (var i = 0; i < paramNames.length; i++) { | |
481 var paramName = paramNames[i]; | |
482 delete settings[paramName]; | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
483 } |
735
790a7673bef0
improved some embedded buttons; fixed reset function
hertzhaft
parents:
733
diff
changeset
|
484 settings.fn = params.fn || ''; // no default defined |
790a7673bef0
improved some embedded buttons; fixed reset function
hertzhaft
parents:
733
diff
changeset
|
485 settings.pn = params.pn || defaults.pn; |
986 | 486 var size = getFullscreenImgSize(data); |
487 settings.dw = params.dw || size.width; | |
488 settings.dh = params.dh || size.height; | |
946 | 489 settings.visibleButtonSets = 1; // FIXME |
735
790a7673bef0
improved some embedded buttons; fixed reset function
hertzhaft
parents:
733
diff
changeset
|
490 // resets zoomArea, marks, scalerflags |
917 | 491 data.zoomArea = FULL_AREA.copy(); |
735
790a7673bef0
improved some embedded buttons; fixed reset function
hertzhaft
parents:
733
diff
changeset
|
492 data.marks = []; |
790a7673bef0
improved some embedded buttons; fixed reset function
hertzhaft
parents:
733
diff
changeset
|
493 data.scalerFlags = {}; |
712 | 494 delete data.dlOpts.fitwidth; |
495 delete data.dlOpts.fitheight; | |
986 | 496 data.scaleMode = 'screen'; |
688 | 497 redisplay(data); |
689 | 498 }, |
499 | |
954 | 500 /** presents a reference url (returns value if noprompt) |
501 * | |
502 * @param data | |
503 * @param noprompt | |
504 * @returns | |
505 */ | |
703 | 506 reference : function (data, noprompt) { |
744 | 507 var url = getDigilibUrl(data); |
703 | 508 if (noprompt == null) { |
509 window.prompt("URL reference to the current view", url); | |
1011 | 510 // return nothing so we can use is in javascript: url without reload |
511 return; | |
703 | 512 } |
513 return url; | |
514 }, | |
710 | 515 |
1011 | 516 /** |
517 * Returns URL to the full digilib.html with the current parameters. | |
518 * Redirects immediately with mode=open. | |
519 * | |
520 * @param data | |
521 * @param mode | |
522 */ | |
523 digilibUrl : function (data, mode) { | |
524 var url = getDigilibUrl(data, '/jquery/digilib.html'); | |
525 if (mode === 'open') { | |
526 // redirect | |
527 window.location = url; | |
528 } else if (mode === 'open_new') { | |
529 // open new window | |
530 window.open(url); | |
531 return; | |
532 } | |
533 return url; | |
534 }, | |
535 | |
536 | |
954 | 537 /** set image quality |
538 * | |
539 * @param data | |
540 * @param qual | |
541 */ | |
748 | 542 setQuality : function (data, qual) { |
703 | 543 var oldq = getQuality(data); |
544 if (qual == null) { | |
545 qual = window.prompt("Image quality (0..2)", oldq); | |
546 } | |
547 qual = parseInt(qual, 10); | |
548 if (qual >= 0 && qual <= 2) { | |
549 setQuality(data, qual); | |
550 redisplay(data); | |
551 } | |
754
ce5a0e6b5ee9
reading image info asynchronously works now. has just no use yet.
robcast
parents:
751
diff
changeset
|
552 }, |
760
f0be4432f515
primitive plugin extension mechanism - unsure how useful this is
hertzhaft
parents:
755
diff
changeset
|
553 |
1019
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
554 /** set image size |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
555 * |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
556 * @param data |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
557 * @param size |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
558 */ |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
559 setSize : function (data, size) { |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
560 var olds = data.settings.ws; |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
561 if (size == null) { |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
562 size = window.prompt("Image size (1=screen size)", olds); |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
563 } |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
564 size = parseFloat(size); |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
565 if (size > 0) { |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
566 data.settings.ws = size; |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
567 redisplay(data); |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
568 } |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
569 }, |
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
570 |
991
497ab03868ab
moved marks to separate plugin. (pack and unpack is still in digilib.js)
robcast
parents:
990
diff
changeset
|
571 /** calibrate (set client screen dpi) |
954 | 572 * |
573 * @param data | |
574 * @param res | |
575 */ | |
772
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
576 calibrate : function (data, res) { |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
577 var oldRes = data.settings.ddpi; |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
578 if (res == null) { |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
579 res = window.prompt("Display resolution (dpi)", oldRes); |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
580 } |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
581 if (res != null) { |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
582 data.settings.ddpi = res; |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
583 redisplay(data); |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
584 } |
760
f0be4432f515
primitive plugin extension mechanism - unsure how useful this is
hertzhaft
parents:
755
diff
changeset
|
585 }, |
775 | 586 |
954 | 587 /** set image scale mode |
588 * | |
589 * @param data | |
590 * @param mode | |
591 */ | |
761
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
592 setScaleMode : function (data, mode) { |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
593 var oldM = getScaleMode(data); |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
594 if (mode == null) { |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
595 mode = window.prompt("Image scale mode (screen, pixel, size)", oldM); |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
596 } |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
597 if (mode != null) { |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
598 setScaleMode(data, mode); |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
599 redisplay(data); |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
600 } |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
601 } |
763
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
602 // end of actions |
605 | 603 }; |
604 | 604 |
954 | 605 /** return parameters from page url |
606 * | |
607 */ | |
607 | 608 var parseQueryParams = function() { |
636 | 609 return parseQueryString(window.location.search.slice(1)); |
610 }; | |
655 | 611 |
984 | 612 /** |
613 * returns parameters from embedded img-element | |
954 | 614 * |
615 */ | |
607 | 616 var parseImgParams = function($elem) { |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
617 var src = $elem.find('img').first().attr('src'); |
710 | 618 if (!src) return null; |
607 | 619 var pos = src.indexOf('?'); |
620 var query = (pos < 0) ? '' : src.substring(pos + 1); | |
621 var scalerUrl = src.substring(0, pos); | |
627 | 622 var params = parseQueryString(query); |
623 params.scalerBaseUrl = scalerUrl; | |
624 return params; | |
636 | 625 }; |
607 | 626 |
984 | 627 /** |
628 * parses query parameter string into parameter object | |
954 | 629 * |
630 */ | |
607 | 631 var parseQueryString = function(query) { |
701 | 632 var params = {}; |
633 if (query == null) return params; | |
607 | 634 var pairs = query.split("&"); |
636 | 635 //var keys = []; |
607 | 636 for (var i = 0; i < pairs.length; i++) { |
637 var pair = pairs[i].split("="); | |
638 if (pair.length === 2) { | |
627 | 639 params[pair[0]] = pair[1]; |
636 | 640 //keys.push(pair[0]); |
634 | 641 } |
636 | 642 } |
627 | 643 return params; |
636 | 644 }; |
668 | 645 |
984 | 646 /** |
647 * return a query string from key names from a parameter hash | |
954 | 648 * (ignores keys if the same value is in defaults) |
649 * | |
650 */ | |
643 | 651 var getParamString = function (settings, keys, defaults) { |
615 | 652 var paramString = ''; |
650 | 653 var nx = false; |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
654 for (var i = 0; i < keys.length; ++i) { |
615 | 655 var key = keys[i]; |
663 | 656 if ((settings[key] != null) && ((defaults == null) || (settings[key] != defaults[key]))) { |
615 | 657 // first param gets no '&' |
650 | 658 if (nx) { |
659 paramString += '&'; | |
660 } else { | |
661 nx = true; | |
662 } | |
615 | 663 // add parm=val |
664 paramString += key + '=' + settings[key]; | |
643 | 665 } |
615 | 666 } |
667 return paramString; | |
631 | 668 }; |
669 | |
984 | 670 /** |
671 * returns URL and query string for Scaler | |
954 | 672 */ |
636 | 673 var getScalerUrl = function (data) { |
741 | 674 packParams(data); |
653 | 675 var settings = data.settings; |
652 | 676 if (settings.scalerBaseUrl == null) { |
677 alert("ERROR: URL of digilib Scaler servlet missing!"); | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
678 } |
636 | 679 var keys = settings.scalerParamNames; |
643 | 680 var queryString = getParamString(settings, keys, defaults); |
636 | 681 var url = settings.scalerBaseUrl + '?' + queryString; |
682 return url; | |
683 }; | |
684 | |
954 | 685 /** returns URL for preview background image |
686 * | |
687 */ | |
688 var getPreviewImgUrl = function (data, moreParams) { | |
741 | 689 var settings = data.settings; |
795 | 690 var bgOptions = { |
954 | 691 dw : settings.previewImgWidth, |
692 dh : settings.previewImgHeight | |
741 | 693 }; |
795 | 694 var bgSettings = $.extend({}, settings, bgOptions); |
931 | 695 // filter scaler flags (use only hmir and vmir) |
795 | 696 if (bgSettings.mo != null) { |
697 var mo = ''; | |
698 if (data.scalerFlags.hmir != null) { | |
699 mo += 'hmir,'; | |
767 | 700 } |
795 | 701 if (data.scalerFlags.vmir != null) { |
702 mo += 'vmir'; | |
703 } | |
704 bgSettings.mo = mo; | |
743 | 705 } |
954 | 706 var params = getParamString(bgSettings, settings.previewImgParamNames, defaults); |
743 | 707 var url = settings.scalerBaseUrl + '?' + params; |
741 | 708 return url; |
709 }; | |
745
ad483c008159
move birdview zoom indicator along with zoom drag
hertzhaft
parents:
744
diff
changeset
|
710 |
1011 | 711 /** |
712 * returns URL and query string for current digilib. | |
713 * if digilibPage != null returns URL to page in digilib installation with digilib parameters, | |
714 * otherwise using current URL and parameters. | |
954 | 715 * |
716 */ | |
1011 | 717 var getDigilibUrl = function (data, digilibPage) { |
643 | 718 packParams(data); |
636 | 719 var settings = data.settings; |
1011 | 720 var paramList = settings.digilibParamNames; |
721 if (digilibPage != null) { | |
722 var baseUrl = data.settings.digilibBaseUrl + digilibPage; | |
723 } else { | |
724 paramList = settings.additionalParamNames.concat(settings.digilibParamNames); | |
725 if (settings.suppressParamNames != null) { | |
726 // eliminate suppressed parameters from list | |
727 paramList = $.map(paramList, function(e, idx) { | |
728 if ($.inArray(e, settings.suppressParamNames) >= 0) { | |
729 return null; | |
730 } else { | |
731 return e; | |
732 } | |
733 }); | |
734 } | |
735 // take url from current location | |
736 var baseUrl = window.location.href; | |
737 var pos = baseUrl.indexOf('?'); | |
738 if (pos > -1) { | |
739 baseUrl = baseUrl.substring(0, pos); | |
740 } | |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
741 } |
1007 | 742 var queryString = getParamString(settings, paramList, defaults); |
1011 | 743 return baseUrl + '?' + queryString; |
636 | 744 }; |
745 | |
954 | 746 /** loads image information from digilib server via HTTP |
747 * | |
748 */ | |
797 | 749 var loadImageInfo = function (data) { |
754
ce5a0e6b5ee9
reading image info asynchronously works now. has just no use yet.
robcast
parents:
751
diff
changeset
|
750 var settings = data.settings; |
917 | 751 // bind default function (only once) |
752 $(data).off('imageInfo', handleImageInfo); | |
753 $(data).on('imageInfo', handleImageInfo); | |
754 var url = settings.digilibBaseUrl + '/ImgInfo-json.jsp'; | |
754
ce5a0e6b5ee9
reading image info asynchronously works now. has just no use yet.
robcast
parents:
751
diff
changeset
|
755 url += '?' + getParamString(settings, ['fn', 'pn'], defaults); |
767 | 756 // TODO: better error handling |
785 | 757 $.getJSON(url, function (json) { |
754
ce5a0e6b5ee9
reading image info asynchronously works now. has just no use yet.
robcast
parents:
751
diff
changeset
|
758 console.debug("got json data=", json); |
ce5a0e6b5ee9
reading image info asynchronously works now. has just no use yet.
robcast
parents:
751
diff
changeset
|
759 data.imgInfo = json; |
797 | 760 // send event |
761 $(data).trigger('imageInfo', [json]); | |
754
ce5a0e6b5ee9
reading image info asynchronously works now. has just no use yet.
robcast
parents:
751
diff
changeset
|
762 }); |
ce5a0e6b5ee9
reading image info asynchronously works now. has just no use yet.
robcast
parents:
751
diff
changeset
|
763 }; |
775 | 764 |
954 | 765 /** processes some parameters into objects and stuff |
766 * | |
767 */ | |
631 | 768 var unpackParams = function (data) { |
769 var settings = data.settings; | |
636 | 770 // zoom area |
631 | 771 var zoomArea = geom.rectangle(settings.wx, settings.wy, settings.ww, settings.wh); |
643 | 772 data.zoomArea = zoomArea; |
650 | 773 // mo (Scaler flags) |
774 var flags = {}; | |
775 if (settings.mo) { | |
776 var pa = settings.mo.split(","); | |
777 for (var i = 0; i < pa.length ; i++) { | |
778 flags[pa[i]] = pa[i]; | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
779 } |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
780 } |
650 | 781 data.scalerFlags = flags; |
763
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
782 data.scaleMode = getScaleMode(data); |
723 | 783 retrieveOptions(data); |
655 | 784 }; |
785 | |
954 | 786 /** put area into parameters |
787 * | |
788 */ | |
822 | 789 var packArea = function (settings, area) { |
790 if (!area) return; | |
791 // zoom area | |
792 settings.wx = cropFloat(area.x); | |
793 settings.wy = cropFloat(area.y); | |
794 settings.ww = cropFloat(area.width); | |
795 settings.wh = cropFloat(area.height); | |
796 }; | |
797 | |
954 | 798 /** pack scaler flags into parameters |
799 * | |
800 */ | |
822 | 801 var packScalerFlags = function (settings, flags) { |
802 if (!flags) return; | |
803 var mo = ''; | |
804 for (var f in flags) { | |
805 if (mo) { | |
806 mo += ','; | |
807 } | |
808 mo += f; | |
809 } | |
810 settings.mo = mo; | |
811 }; | |
812 | |
954 | 813 /** put objects back into parameters |
814 * | |
815 */ | |
631 | 816 var packParams = function (data) { |
817 var settings = data.settings; | |
822 | 818 packArea(settings, data.zoomArea); |
819 packScalerFlags(settings, data.scalerFlags); | |
820 // store user interface options in cookie | |
723 | 821 storeOptions(data); |
992
4fcc85d4db8f
pack and unpack parameters now as events. used in marks plugin.
robcast
parents:
991
diff
changeset
|
822 // trigger pack handlers |
4fcc85d4db8f
pack and unpack parameters now as events. used in marks plugin.
robcast
parents:
991
diff
changeset
|
823 $(data).trigger('pack'); |
709 | 824 }; |
688 | 825 |
954 | 826 /** store digilib options in a cookie |
827 * | |
828 */ | |
723 | 829 var storeOptions = function (data) { |
709 | 830 var settings = data.settings; |
831 if (data.dlOpts) { | |
832 // save digilib settings in options | |
833 data.dlOpts.birdview = settings.isBirdDivVisible ? 1 : 0; | |
834 data.dlOpts.buttons = settings.visibleButtonSets; | |
835 var clop = ''; | |
836 for (var o in data.dlOpts) { | |
837 if (clop) { | |
838 clop += '&'; | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
839 } |
709 | 840 clop += o + '=' + data.dlOpts[o]; |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
841 } |
785 | 842 if ($.cookie) { |
709 | 843 var ck = "digilib:fn:" + escape(settings.fn) + ":pn:" + settings.pn; |
844 console.debug("set cookie=", ck, " value=", clop); | |
785 | 845 $.cookie(ck, clop); |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
846 } |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
847 } |
785 | 848 if (settings.interactionMode !== 'fullscreen' && $.cookie) { |
727 | 849 // store normal parameters in cookie for embedded mode |
850 var qs = getParamString(settings, settings.digilibParamNames, defaults); | |
851 var ck = "digilib-embed:fn:" + escape(settings.fn) + ":pn:" + settings.pn; | |
852 console.debug("set cookie=", ck, " value=", qs); | |
785 | 853 $.cookie(ck, qs); |
727 | 854 } |
631 | 855 }; |
655 | 856 |
983 | 857 /** retrieve digilib options from a cookie |
954 | 858 * |
859 */ | |
723 | 860 var retrieveOptions = function (data) { |
709 | 861 // clop (digilib options) |
862 var opts = {}; | |
863 var settings = data.settings; | |
785 | 864 if ($.cookie) { |
709 | 865 // read from cookie |
866 var ck = "digilib:fn:" + escape(settings.fn) + ":pn:" + settings.pn; | |
785 | 867 var cp = $.cookie(ck); |
709 | 868 console.debug("get cookie=", ck, " value=", cp); |
869 // in query string format | |
870 opts = parseQueryString(cp); | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
871 } |
709 | 872 data.dlOpts = opts; |
873 // birdview option | |
874 if (opts.birdview != null) { | |
875 settings.isBirdDivVisible = opts.birdview === '1'; | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
876 } |
709 | 877 // visible button sets |
878 if (opts.buttons != null) { | |
879 settings.visibleButtonSets = opts.buttons; | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
880 } |
711 | 881 }; |
709 | 882 |
949 | 883 /** (re)load the image with the current settings. |
884 * | |
885 */ | |
644
ee8ccd84c5f8
reload doesn't take list of changed parameters any more
robcast
parents:
643
diff
changeset
|
886 var redisplay = function (data) { |
1031 | 887 var settings = data.settings; |
888 if (settings.autoBirdDiv) { | |
889 settings.isBirdDivVisible = !isFullArea(data.zoomArea); | |
890 } | |
636 | 891 if (settings.interactionMode === 'fullscreen') { |
892 // update location.href (browser URL) in fullscreen mode | |
644
ee8ccd84c5f8
reload doesn't take list of changed parameters any more
robcast
parents:
643
diff
changeset
|
893 var url = getDigilibUrl(data); |
636 | 894 var history = window.history; |
942 | 895 if (data.hasAsyncReload) { |
798
b07d1824ca2a
fullscreen mode works without reload on browsers supporting history.pushstate!
robcast
parents:
797
diff
changeset
|
896 console.debug("faking reload to "+url); |
b07d1824ca2a
fullscreen mode works without reload on browsers supporting history.pushstate!
robcast
parents:
797
diff
changeset
|
897 // change url without reloading (stateObj, title, url) |
890
613c2089bc7a
use setstate in redisplay instead of pushstate as long as we don't deal with popstate (i.e. history-back).
robcast
parents:
889
diff
changeset
|
898 // TODO: we really need to push the state in stateObj and listen to pop-events |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
899 try { |
1015 | 900 history.replaceState({}, '', url); |
901 // show busy cursor | |
902 $('body').css('cursor', 'progress'); | |
903 data.$scaler.css('cursor', 'progress'); | |
904 // change img src | |
905 var $img = data.$img; | |
906 var imgurl = getScalerUrl(data); | |
907 $img.attr('src', imgurl); | |
908 // trigger load event if image is cached. Doesn't work with Firefox!! | |
909 if (data.hasCachedComplete && $img.prop('complete')) { | |
910 console.debug("cached img.load"); | |
911 $img.trigger('load'); | |
912 } | |
913 if (data.scalerFlags.clip != null || data.scalerFlags.osize != null) { | |
914 // we need image info, do we have it? | |
915 if (data.imgInfo == null) { | |
916 loadImageInfo(data); | |
917 } | |
918 } | |
919 // update if we have a preview | |
920 if (data.hasPreviewBg) { | |
921 $(data).trigger('update'); | |
922 } | |
923 //FIXME: highlightButtons(data); | |
924 // send event | |
925 $(data).trigger('redisplay'); | |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
926 } catch (e) { |
1015 | 927 console.error("replaceState("+url+") didn't work: "+e); |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
928 // reload window |
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
929 window.location = url; |
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
930 } |
798
b07d1824ca2a
fullscreen mode works without reload on browsers supporting history.pushstate!
robcast
parents:
797
diff
changeset
|
931 } else { |
b07d1824ca2a
fullscreen mode works without reload on browsers supporting history.pushstate!
robcast
parents:
797
diff
changeset
|
932 // reload window |
b07d1824ca2a
fullscreen mode works without reload on browsers supporting history.pushstate!
robcast
parents:
797
diff
changeset
|
933 window.location = url; |
b07d1824ca2a
fullscreen mode works without reload on browsers supporting history.pushstate!
robcast
parents:
797
diff
changeset
|
934 } |
636 | 935 } else { |
936 // embedded mode -- just change img src | |
1015 | 937 // show busy cursor |
938 $('body').css('cursor', 'progress'); | |
939 data.$scaler.css('cursor', 'progress'); | |
940 var $img = data.$img; | |
636 | 941 var url = getScalerUrl(data); |
949 | 942 $img.attr('src', url); |
1015 | 943 // trigger load event if image is cached |
944 if ($img.prop('complete')) $img.trigger('load'); | |
945 if (data.scalerFlags.clip != null || data.scalerFlags.osize != null) { | |
946 // we need image info, do we have it? | |
947 if (data.imgInfo == null) { | |
948 loadImageInfo(data); | |
949 } | |
950 } | |
949 | 951 //FIXME: highlightButtons(data); |
795 | 952 // send event |
953 $(data).trigger('redisplay'); | |
913
ad071f122164
make dirInfo crash less. make digilib better for half-embedded use.
robcast
parents:
903
diff
changeset
|
954 } |
622 | 955 }; |
956 | |
949 | 957 /** update display (overlays etc.) |
958 * (just triggers "update" event) | |
959 */ | |
767 | 960 var updateDisplay = function (data) { |
947 | 961 // send event |
962 $(data).trigger('update'); | |
963 }; | |
964 | |
949 | 965 /** handle "update" display event. |
991
497ab03868ab
moved marks to separate plugin. (pack and unpack is still in digilib.js)
robcast
parents:
990
diff
changeset
|
966 * updates image transform, etc. |
949 | 967 */ |
947 | 968 var handleUpdate = function (evt) { |
1015 | 969 var data = this; |
767 | 970 updateImgTrafo(data); |
971 setupZoomDrag(data); | |
972 }; | |
974 | 973 |
984 | 974 /** |
975 * returns maximum size for scaler img in fullscreen mode. | |
949 | 976 */ |
778 | 977 var getFullscreenImgSize = function (data) { |
989
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
978 //var mode = data.settings.interactionMode; |
662 | 979 var $win = $(window); |
980 var winH = $win.height(); | |
779 | 981 var winW = $win.width(); |
989
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
982 // add all current insets |
991
497ab03868ab
moved marks to separate plugin. (pack and unpack is still in digilib.js)
robcast
parents:
990
diff
changeset
|
983 // accounting for left/right border, body margins and additional requirements |
989
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
984 var insets = { 'x' : 0, 'y' : 0}; |
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
985 for (var n in data.currentInsets) { |
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
986 insets.x += data.currentInsets[n].x; |
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
987 insets.y += data.currentInsets[n].y; |
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
988 }; |
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
989 var imgW = winW - insets.x; |
f4757bf6ab65
new arrows plugin for scroll arrows next to the image.
robcast
parents:
987
diff
changeset
|
990 var imgH = winH - insets.y; |
998 | 991 console.debug('getFullscreenImgSize - screen w/h:', winW, winH, 'window.width', $win.width(), 'img w/h:', imgW, imgH); |
886
cb23fe100d7e
make getFullscreenImgSize more robust. put button width in settings.
robcast
parents:
879
diff
changeset
|
992 return geom.size(imgW, imgH); |
662 | 993 }; |
994 | |
984 | 995 /** |
996 * returns a rectangle.with the fullscreen dimensions | |
974 | 997 */ |
998 var getFullscreenRect = function (data) { | |
999 return geom.rectangle(getFullscreenImgSize(data)); | |
1000 }; | |
1001 | |
984 | 1002 /** |
1003 * creates HTML structure for digilib in elem | |
949 | 1004 */ |
627 | 1005 var setupScalerDiv = function (data) { |
1006 var settings = data.settings; | |
647 | 1007 var $elem = data.$elem; |
996 | 1008 var cssPrefix = settings.cssPrefix; |
1009 $elem.addClass(cssPrefix+'digilib'); | |
728 | 1010 var $img; |
1011 var scalerUrl; | |
608 | 1012 if (settings.interactionMode === 'fullscreen') { |
728 | 1013 // fullscreen |
995 | 1014 $elem.addClass(cssPrefix+'fullscreen'); |
778 | 1015 var imgSize = getFullscreenImgSize(data); |
1012 | 1016 data.maxImgSize = imgSize; |
650 | 1017 // fitwidth/height omits destination height/width |
728 | 1018 if (data.dlOpts.fitheight == null) { |
650 | 1019 settings.dw = imgSize.width; |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1020 } |
728 | 1021 if (data.dlOpts.fitwidth == null) { |
650 | 1022 settings.dh = imgSize.height; |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1023 } |
686 | 1024 scalerUrl = getScalerUrl(data); |
728 | 1025 $img = $('<img/>'); |
609 | 1026 } else { |
728 | 1027 // embedded mode -- try to keep img tag |
1015 | 1028 data.maxImgSize = geom.rectangle($elem).getSize(); |
995 | 1029 $elem.addClass(cssPrefix+'embedded'); |
728 | 1030 scalerUrl = getScalerUrl(data); |
623 | 1031 $img = $elem.find('img'); |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
1032 if ($img.length > 0) { |
870
80cc227c1d50
keep title and alt attributes from HTML for scaler img
hertzhaft
parents:
869
diff
changeset
|
1033 var oldUrl = $img.attr('src'); |
80cc227c1d50
keep title and alt attributes from HTML for scaler img
hertzhaft
parents:
869
diff
changeset
|
1034 // keep img attributes from html |
80cc227c1d50
keep title and alt attributes from HTML for scaler img
hertzhaft
parents:
869
diff
changeset
|
1035 var title = $img.attr('title'); |
80cc227c1d50
keep title and alt attributes from HTML for scaler img
hertzhaft
parents:
869
diff
changeset
|
1036 var alt = $img.attr('alt'); |
80cc227c1d50
keep title and alt attributes from HTML for scaler img
hertzhaft
parents:
869
diff
changeset
|
1037 if (oldUrl === scalerUrl) { |
80cc227c1d50
keep title and alt attributes from HTML for scaler img
hertzhaft
parents:
869
diff
changeset
|
1038 console.debug("img detach:", $img); |
80cc227c1d50
keep title and alt attributes from HTML for scaler img
hertzhaft
parents:
869
diff
changeset
|
1039 $img.detach(); |
80cc227c1d50
keep title and alt attributes from HTML for scaler img
hertzhaft
parents:
869
diff
changeset
|
1040 } else { |
80cc227c1d50
keep title and alt attributes from HTML for scaler img
hertzhaft
parents:
869
diff
changeset
|
1041 $img = $('<img/>'); |
80cc227c1d50
keep title and alt attributes from HTML for scaler img
hertzhaft
parents:
869
diff
changeset
|
1042 $img.attr("title", title); |
80cc227c1d50
keep title and alt attributes from HTML for scaler img
hertzhaft
parents:
869
diff
changeset
|
1043 $img.attr("alt", alt); |
728 | 1044 } |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
1045 } else { |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
1046 $img = $('<img/>'); |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1047 } |
608 | 1048 } |
822 | 1049 // create new inner html, keeping buttons and content marked with "keep" class |
996 | 1050 $elem.contents(':not(.'+cssPrefix+'keep)').remove(); |
995 | 1051 var $scaler = $('<div class="'+cssPrefix+'scaler"/>'); |
779 | 1052 // scaler should be the first child element? |
1053 $elem.prepend($scaler); | |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
1054 $scaler.append($img); |
995 | 1055 $img.addClass(cssPrefix+'pic'); |
649 | 1056 data.$scaler = $scaler; |
636 | 1057 data.$img = $img; |
947 | 1058 // set busy cursor |
1059 $('body').css('cursor','progress'); | |
1015 | 1060 data.$scaler.css('cursor', 'progress'); |
942 | 1061 // set up image load handler before setting the src attribute (IE bug) |
687 | 1062 $img.load(scalerImgLoadedHandler(data)); |
767 | 1063 $img.error(function () {console.error("error loading scaler image");}); |
687 | 1064 $img.attr('src', scalerUrl); |
608 | 1065 }; |
615 | 1066 |
1052 | 1067 /** shows some div (toggle visibility if show is null) |
949 | 1068 * |
1069 */ | |
635 | 1070 var showDiv = function (isVisible, $div, show) { |
645 | 1071 if (show == null) { |
635 | 1072 // toggle visibility |
1073 isVisible = !isVisible; | |
1074 } else { | |
1075 // set visibility | |
1076 isVisible = show; | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1077 } |
635 | 1078 if (isVisible) { |
1079 $div.fadeIn(); | |
1080 } else { | |
1081 $div.fadeOut(); | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1082 } |
635 | 1083 return isVisible; |
634 | 1084 }; |
616 | 1085 |
949 | 1086 /** Create Transform from zoom area and image size and parameters. |
1087 * Returns Transform between normalized coordinates and image pixel coordinates. | |
1088 */ | |
772
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1089 var getImgTrafo = function ($img, area, rot, hmir, vmir, mode, data) { |
658
9ddcf0070122
split bird's view code in two more parts, analog to scaler-img code.
robcast
parents:
656
diff
changeset
|
1090 var picrect = geom.rectangle($img); |
949 | 1091 // handle pixel-by-pixel and original-size modes |
763
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
1092 if (mode != null) { |
772
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1093 var imgInfo = data.imgInfo; |
763
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
1094 if (mode === 'pixel') { |
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
1095 // scaler mo=clip - image area size does not come from ww, wh |
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
1096 if (imgInfo != null) { |
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
1097 area.width = picrect.width / imgInfo.width; |
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
1098 area.height = picrect.height / imgInfo.height; |
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
1099 } else { |
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
1100 console.error("No image info for pixel mode!"); |
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
1101 } |
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
1102 } |
772
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1103 if (mode === 'size') { |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1104 // scaler mo=osize - image area size does not come from ww, wh |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1105 if (imgInfo != null) { |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1106 var ddpi = parseFloat(data.settings.ddpi); |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1107 area.width = (picrect.width / ddpi) / (imgInfo.width / imgInfo.dpi_x); |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1108 area.height = (picrect.height / ddpi) / (imgInfo.height / imgInfo.dpi_y); |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1109 } else { |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1110 console.error("No image info for original size mode!"); |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1111 } |
33b5477f8d84
original size mode works with zoom area now. needs error handling.
robcast
parents:
769
diff
changeset
|
1112 } |
763
31664707999e
pixel-by-pixel scale mode works with zoom area. (not in all cases)
robcast
parents:
761
diff
changeset
|
1113 } |
658
9ddcf0070122
split bird's view code in two more parts, analog to scaler-img code.
robcast
parents:
656
diff
changeset
|
1114 var trafo = geom.transform(); |
675 | 1115 // move zoom area offset to center |
658
9ddcf0070122
split bird's view code in two more parts, analog to scaler-img code.
robcast
parents:
656
diff
changeset
|
1116 trafo.concat(trafo.getTranslation(geom.position(-area.x, -area.y))); |
675 | 1117 // scale zoom area size to [1,1] |
658
9ddcf0070122
split bird's view code in two more parts, analog to scaler-img code.
robcast
parents:
656
diff
changeset
|
1118 trafo.concat(trafo.getScale(geom.size(1/area.width, 1/area.height))); |
675 | 1119 // rotate and mirror (around transformed image center i.e. [0.5,0.5]) |
1120 if (rot || hmir || vmir) { | |
1121 // move [0.5,0.5] to center | |
1122 trafo.concat(trafo.getTranslation(geom.position(-0.5, -0.5))); | |
1123 if (hmir) { | |
1124 // mirror about center | |
1125 trafo.concat(trafo.getMirror('y')); | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1126 } |
675 | 1127 if (vmir) { |
1128 // mirror about center | |
1129 trafo.concat(trafo.getMirror('x')); | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1130 } |
675 | 1131 if (rot) { |
1132 // rotate around center | |
1133 trafo.concat(trafo.getRotation(parseFloat(rot))); | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1134 } |
675 | 1135 // move back |
1136 trafo.concat(trafo.getTranslation(geom.position(0.5, 0.5))); | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1137 } |
664
d5a5ee4cbf04
work on getting transformation to work with rotation (currently still doesn't)
robcast
parents:
663
diff
changeset
|
1138 // scale to screen position and size |
658
9ddcf0070122
split bird's view code in two more parts, analog to scaler-img code.
robcast
parents:
656
diff
changeset
|
1139 trafo.concat(trafo.getScale(picrect)); |
9ddcf0070122
split bird's view code in two more parts, analog to scaler-img code.
robcast
parents:
656
diff
changeset
|
1140 trafo.concat(trafo.getTranslation(picrect)); |
9ddcf0070122
split bird's view code in two more parts, analog to scaler-img code.
robcast
parents:
656
diff
changeset
|
1141 return trafo; |
655 | 1142 }; |
678
d50d24b7fd95
first step at dragging birdview zoom indicator around
hertzhaft
parents:
677
diff
changeset
|
1143 |
949 | 1144 /** update current scaler image transform |
1145 */ | |
767 | 1146 var updateImgTrafo = function (data) { |
1147 var $img = data.$img; | |
895 | 1148 if ($img == null) |
1149 return; | |
1150 var imgLoaded = $.browser.msie | |
949 | 1151 ? $img.prop('width') > 0 |
1152 : $img.prop('complete'); | |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1153 if (imgLoaded || data.hasPreviewBg) { |
1015 | 1154 // create Transform from current zoomArea and image size |
1155 data.imgTrafo = getImgTrafo($img, data.zoomArea, data.settings.rot, | |
1156 data.scalerFlags.hmir, data.scalerFlags.vmir, | |
1157 data.scaleMode, data); | |
1158 console.debug("updateImgTrafo: ", data.imgTrafo); | |
1159 } | |
767 | 1160 }; |
775 | 1161 |
949 | 1162 /** return handler for load event of scaler img |
1163 * (necessary for closure with data object) | |
1164 */ | |
767 | 1165 var scalerImgLoadedHandler = function (data) { |
1166 return function () { | |
1167 var $img = $(this); | |
1168 console.debug("scaler img loaded=",$img); | |
1169 var $scaler = data.$scaler; | |
760
f0be4432f515
primitive plugin extension mechanism - unsure how useful this is
hertzhaft
parents:
755
diff
changeset
|
1170 var imgRect = geom.rectangle($img); |
931 | 1171 data.imgRect = imgRect; |
1015 | 1172 // reset busy cursor |
1173 $('body').css('cursor', 'auto'); | |
1174 $scaler.css('cursor', 'auto'); | |
957 | 1175 // adjust scaler div size (beware: setting position makes the element relative) |
1176 imgRect.getSize().adjustDiv($scaler); | |
715 | 1177 // show image in case it was hidden (for example in zoomDrag) |
733 | 1178 $img.css('visibility', 'visible'); |
1019
287e2d2d2ae8
fix flicker in Firefox by leaving scaler background visible.
robcast
parents:
1018
diff
changeset
|
1179 $scaler.css({'opacity' : '1'}); |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1180 data.hasPreviewBg = false; |
767 | 1181 // update display (render marks, etc.) |
1182 updateDisplay(data); | |
658
9ddcf0070122
split bird's view code in two more parts, analog to scaler-img code.
robcast
parents:
656
diff
changeset
|
1183 }; |
9ddcf0070122
split bird's view code in two more parts, analog to scaler-img code.
robcast
parents:
656
diff
changeset
|
1184 }; |
9ddcf0070122
split bird's view code in two more parts, analog to scaler-img code.
robcast
parents:
656
diff
changeset
|
1185 |
949 | 1186 /** handle imageInfo loaded event |
1187 * | |
1188 */ | |
797 | 1189 var handleImageInfo = function (evt, json) { |
1015 | 1190 console.debug("handleImageInfo:", json); |
797 | 1191 var data = this; |
1192 updateDisplay(data); | |
1193 }; | |
813 | 1194 |
949 | 1195 /** handle changeZoomArea event |
1196 * | |
1197 */ | |
942 | 1198 var handleChangeZoomArea = function (evt, newZa) { |
1015 | 1199 console.debug("handleChangeZoomArea:", newZa); |
1200 var data = this; | |
1201 // hide all overlays (marks/regions) | |
996 | 1202 data.$elem.find('.'+data.settings.cssPrefix+'overlay').hide(); |
1015 | 1203 setPreviewBg(data, newZa); |
942 | 1204 }; |
1015 | 1205 |
949 | 1206 /** zoom by the given factor. |
1207 * | |
1208 */ | |
643 | 1209 var zoomBy = function(data, factor) { |
1210 var area = data.zoomArea; | |
1211 var newarea = area.copy(); | |
1212 // scale | |
1213 newarea.width /= factor; | |
1214 newarea.height /= factor; | |
1215 // and recenter | |
1216 newarea.x -= 0.5 * (newarea.width - area.width); | |
1217 newarea.y -= 0.5 * (newarea.height - area.height); | |
735
790a7673bef0
improved some embedded buttons; fixed reset function
hertzhaft
parents:
733
diff
changeset
|
1218 newarea = FULL_AREA.fit(newarea); |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1219 setZoomArea(data, newarea); |
972 | 1220 // reset modes |
1221 setScaleMode(data, 'screen'); | |
1222 setFitMode(data, 'both'); | |
644
ee8ccd84c5f8
reload doesn't take list of changed parameters any more
robcast
parents:
643
diff
changeset
|
1223 redisplay(data); |
643 | 1224 }; |
1225 | |
1107 | 1226 /** define an area by click and drag |
949 | 1227 * |
1228 */ | |
1107 | 1229 var defineArea = function(data, onComplete, cls) { |
1230 var CSS = data.settings.cssPrefix; | |
1231 var $elem = data.$elem; | |
1232 var $scaler = data.$scaler; | |
654 | 1233 var picRect = geom.rectangle($scaler); |
1107 | 1234 var $body = $('body'); |
1235 var bodyRect = geom.rectangle($body); | |
1236 var pt1, pt2; | |
1237 // overlay div prevents other elements from reacting to mouse events | |
1238 var $overlayDiv = $('<div class="'+CSS+'areaoverlay"/>'); | |
1239 $body.append($overlayDiv); | |
1240 bodyRect.adjustDiv($overlayDiv); | |
1241 // area div | |
1242 var $areaDiv = $('<div class="'+CSS+'area"/>'); | |
1243 if (cls) { | |
1244 $areaDiv.addClass(cls); // individual styling | |
1245 } | |
1246 $elem.append($areaDiv); | |
654 | 1247 |
1107 | 1248 var areaStart = function (evt) { |
654 | 1249 pt1 = geom.position(evt); |
1107 | 1250 // setup and show area div |
1251 pt1.adjustDiv($areaDiv); | |
1252 $areaDiv.width(0).height(0); | |
1253 $areaDiv.show(); | |
654 | 1254 // register events |
1107 | 1255 $overlayDiv.on("mousemove.dlArea", areaMove); |
1256 $overlayDiv.on("mouseup.dlArea", areaEnd); | |
654 | 1257 return false; |
1258 }; | |
668 | 1259 |
741 | 1260 // mouse move handler |
1107 | 1261 var areaMove = function (evt) { |
741 | 1262 pt2 = geom.position(evt); |
1263 var rect = geom.rectangle(pt1, pt2); | |
1264 rect.clipTo(picRect); | |
1107 | 1265 // update area div |
1266 rect.adjustDiv($areaDiv); | |
741 | 1267 return false; |
1268 }; | |
745
ad483c008159
move birdview zoom indicator along with zoom drag
hertzhaft
parents:
744
diff
changeset
|
1269 |
654 | 1270 // mouseup handler: end moving |
1107 | 1271 var areaEnd = function (evt) { |
654 | 1272 pt2 = geom.position(evt); |
1273 // assume a click and continue if the area is too small | |
1274 var clickRect = geom.rectangle(pt1, pt2); | |
1107 | 1275 if (clickRect.getArea() <= 5) { |
1276 onComplete(data, null); | |
1277 return false; | |
1278 }; | |
654 | 1279 // unregister events |
1107 | 1280 $overlayDiv.off("mousemove.dlArea", areaMove); |
1281 $overlayDiv.off("mouseup.dlArea", areaEnd); | |
654 | 1282 // clip and transform |
1283 clickRect.clipTo(picRect); | |
1107 | 1284 var rect = data.imgTrafo.invtransform(clickRect); |
1285 // execute callback | |
1286 onComplete(data, rect); | |
1287 // destroy area div | |
1288 withdraw($areaDiv); | |
1289 withdraw($overlayDiv); | |
654 | 1290 return false; |
1291 }; | |
668 | 1292 |
1107 | 1293 // start by clicking |
1294 $overlayDiv.one('mousedown.dlArea', areaStart); | |
654 | 1295 }; |
647 | 1296 |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1297 /** set preview background. |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1298 * optional newZoomArea scales and moves background to preview. |
949 | 1299 */ |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1300 var setPreviewBg = function(data, newZoomArea) { |
746
2e9a48dc7a0c
move zoom-drag background along with birdview indicator
hertzhaft
parents:
745
diff
changeset
|
1301 var $scaler = data.$scaler; |
2e9a48dc7a0c
move zoom-drag background along with birdview indicator
hertzhaft
parents:
745
diff
changeset
|
1302 var $img = data.$img; |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1303 var imgTrafo = data.imgTrafo; |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1304 var scalerPos = geom.position($scaler); |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1305 var bgRect = null; |
746
2e9a48dc7a0c
move zoom-drag background along with birdview indicator
hertzhaft
parents:
745
diff
changeset
|
1306 // hide the scaler img, show background of div instead |
2e9a48dc7a0c
move zoom-drag background along with birdview indicator
hertzhaft
parents:
745
diff
changeset
|
1307 $img.css('visibility', 'hidden'); |
918
f7869186ccb2
use current size background as well as scaled full-size background when dragging
robcast
parents:
917
diff
changeset
|
1308 // use current image as first background |
746
2e9a48dc7a0c
move zoom-drag background along with birdview indicator
hertzhaft
parents:
745
diff
changeset
|
1309 var scalerCss = { |
1015 | 1310 'background-image' : 'url(' + $img.attr('src') + ')', |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1311 'background-repeat' : 'no-repeat', |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1312 'background-position' : '0px 0px', |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1313 'opacity' : '0.7', |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1314 'cursor' : 'move' |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1315 }; |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1316 if (newZoomArea != null) { |
1015 | 1317 // check if aspect ratio has changed |
1318 if (Math.abs(newZoomArea.getAspect() - data.zoomArea.getAspect()) > 0.001 ) { | |
1319 var newRect = data.imgTrafo.transform(newZoomArea); | |
1320 var newAspect = newRect.getAspect(); | |
1321 var newSize = data.maxImgSize.fitAspect(newAspect); | |
1322 // set scaler to presumed new size | |
1323 newSize.adjustDiv($scaler); | |
1324 console.debug("adjusting aspect ratio for preview", data.maxImgSize, newSize); | |
1325 } | |
1326 // get transform for new zoomArea (use 'screen' instead of data.scaleMode) | |
1327 imgTrafo = getImgTrafo($scaler, newZoomArea, data.settings.rot, | |
1328 data.scalerFlags.hmir, data.scalerFlags.vmir, | |
1329 'screen', data); | |
1330 // for new background coordinates transform old zoomArea with new Transform | |
1331 bgRect = imgTrafo.transform(data.zoomArea); | |
1332 // correct offset because background is relative | |
1333 bgRect.addPosition(scalerPos.neg()); | |
1334 // position background | |
1335 scalerCss['background-position'] = Math.round(bgRect.x) + 'px '+ Math.round(bgRect.y) + 'px'; | |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1336 } |
746
2e9a48dc7a0c
move zoom-drag background along with birdview indicator
hertzhaft
parents:
745
diff
changeset
|
1337 if (data.hasBgSize) { |
1015 | 1338 // scale background using CSS3-background-size |
1339 if (bgRect != null && (bgRect.height < data.settings.maxBgSize && bgRect.width < data.settings.maxBgSize)) { | |
1340 scalerCss[data.bgSizeName] = Math.round(bgRect.width) + 'px ' + Math.round(bgRect.height) + 'px'; | |
1341 } else { | |
1342 scalerCss[data.bgSizeName] = 'auto'; | |
1343 } | |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1344 // additional full-size background using CSS3 |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1345 fullRect = imgTrafo.transform(FULL_AREA); |
746
2e9a48dc7a0c
move zoom-drag background along with birdview indicator
hertzhaft
parents:
745
diff
changeset
|
1346 if (fullRect.height < data.settings.maxBgSize && fullRect.width < data.settings.maxBgSize) { |
2e9a48dc7a0c
move zoom-drag background along with birdview indicator
hertzhaft
parents:
745
diff
changeset
|
1347 // correct offset because background is relative |
751
00b7857f07f5
zoom-drag background follows birdZoom also in embedded mode (still imprecise)
hertzhaft
parents:
748
diff
changeset
|
1348 fullRect.addPosition(scalerPos.neg()); |
954 | 1349 var url = getPreviewImgUrl(data); |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1350 // add second background url, size and position |
918
f7869186ccb2
use current size background as well as scaled full-size background when dragging
robcast
parents:
917
diff
changeset
|
1351 scalerCss['background-image'] += ', url(' + url + ')'; |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1352 scalerCss[data.bgSizeName] += ', ' + Math.round(fullRect.width) + 'px ' + Math.round(fullRect.height) + 'px'; |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1353 scalerCss['background-position'] += ', ' + Math.round(fullRect.x) + 'px '+ Math.round(fullRect.y) + 'px'; |
746
2e9a48dc7a0c
move zoom-drag background along with birdview indicator
hertzhaft
parents:
745
diff
changeset
|
1354 } |
918
f7869186ccb2
use current size background as well as scaled full-size background when dragging
robcast
parents:
917
diff
changeset
|
1355 } |
f7869186ccb2
use current size background as well as scaled full-size background when dragging
robcast
parents:
917
diff
changeset
|
1356 $scaler.css(scalerCss); |
942 | 1357 data.hasPreviewBg = true; |
929
e881ab1c2f47
first step to "preview" like zoom-drag for more operations
robcast
parents:
928
diff
changeset
|
1358 }; |
1015 | 1359 |
949 | 1360 /** setup handlers for dragging the zoomed image. |
1361 * | |
1362 */ | |
705 | 1363 var setupZoomDrag = function(data) { |
942 | 1364 var startPos, delta; |
733 | 1365 var $document = $(document); |
795 | 1366 var $data = $(data); |
705 | 1367 var $elem = data.$elem; |
1368 var $scaler = data.$scaler; | |
1369 var $img = data.$img; | |
710 | 1370 |
733 | 1371 // drag the image and load a new detail on mouse up |
705 | 1372 var dragStart = function (evt) { |
1015 | 1373 // cancel if not left-click |
1374 if (evt.which != 1) return; | |
813 | 1375 console.debug("dragstart at=", evt); |
737
7c93bdbb5153
setup zoomdrag even when image is not initially zoomed
hertzhaft
parents:
736
diff
changeset
|
1376 // don't start dragging if not zoomed |
7c93bdbb5153
setup zoomdrag even when image is not initially zoomed
hertzhaft
parents:
736
diff
changeset
|
1377 if (isFullArea(data.zoomArea)) return false; |
1107 | 1378 $elem.find('.'+data.settings.cssPrefix+'overlay').hide(); // hide all overlays (marks/regions) |
733 | 1379 startPos = geom.position(evt); |
741 | 1380 delta = null; |
746
2e9a48dc7a0c
move zoom-drag background along with birdview indicator
hertzhaft
parents:
745
diff
changeset
|
1381 // set low res background immediately on mousedown |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1382 setPreviewBg(data); |
917 | 1383 $document.on("mousemove.dlZoomDrag", dragMove); |
1384 $document.on("mouseup.dlZoomDrag", dragEnd); | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1385 return false; |
705 | 1386 }; |
745
ad483c008159
move birdview zoom indicator along with zoom drag
hertzhaft
parents:
744
diff
changeset
|
1387 |
733 | 1388 // mousemove handler: drag zoomed image |
705 | 1389 var dragMove = function (evt) { |
1390 var pos = geom.position(evt); | |
741 | 1391 delta = startPos.delta(pos); |
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
799
diff
changeset
|
1392 // send message event with current zoom position |
745
ad483c008159
move birdview zoom indicator along with zoom drag
hertzhaft
parents:
744
diff
changeset
|
1393 var za = geom.rectangle($img); |
ad483c008159
move birdview zoom indicator along with zoom drag
hertzhaft
parents:
744
diff
changeset
|
1394 za.addPosition(delta.neg()); |
947 | 1395 // transform back |
1396 var newArea = data.imgTrafo.invtransform(za); | |
1397 $data.trigger('changeZoomArea', newArea); | |
705 | 1398 return false; |
1399 }; | |
710 | 1400 |
733 | 1401 // mouseup handler: reload zoomed image in new position |
705 | 1402 var dragEnd = function (evt) { |
739 | 1403 $scaler.css('cursor', 'auto'); |
917 | 1404 $document.off("mousemove.dlZoomDrag", dragMove); |
1405 $document.off("mouseup.dlZoomDrag", dragEnd); | |
733 | 1406 if (delta == null || delta.distance() < 2) { |
1407 // no movement | |
1408 $img.css('visibility', 'visible'); | |
741 | 1409 $scaler.css({'opacity' : '1', 'background-image' : 'none'}); |
944 | 1410 data.hasPreviewBg = false; |
993 | 1411 // unhide marks etc. |
1412 updateDisplay(data); | |
733 | 1413 return false; |
1414 } | |
1415 // get old zoom area (screen coordinates) | |
741 | 1416 var za = geom.rectangle($img); |
733 | 1417 // move |
741 | 1418 za.addPosition(delta.neg()); |
733 | 1419 // transform back |
1420 var newArea = data.imgTrafo.invtransform(za); | |
735
790a7673bef0
improved some embedded buttons; fixed reset function
hertzhaft
parents:
733
diff
changeset
|
1421 data.zoomArea = FULL_AREA.fit(newArea); |
708
120ace160386
img reload works for fullscreen, but somehow not precise
hertzhaft
parents:
707
diff
changeset
|
1422 redisplay(data); |
705 | 1423 return false; |
1424 }; | |
735
790a7673bef0
improved some embedded buttons; fixed reset function
hertzhaft
parents:
733
diff
changeset
|
1425 |
733 | 1426 // clear old handler |
917 | 1427 $document.off(".dlZoomDrag"); |
1428 $scaler.off(".dlZoomDrag"); | |
742
2b6d3ef57d68
fixed problem with setmark, zoomarea and zoomDrag handlers.
robcast
parents:
741
diff
changeset
|
1429 if (! isFullArea(data.zoomArea)) { |
2b6d3ef57d68
fixed problem with setmark, zoomarea and zoomDrag handlers.
robcast
parents:
741
diff
changeset
|
1430 // set handler |
917 | 1431 $scaler.on("mousedown.dlZoomDrag", dragStart); |
742
2b6d3ef57d68
fixed problem with setmark, zoomarea and zoomDrag handlers.
robcast
parents:
741
diff
changeset
|
1432 } |
705 | 1433 }; |
1434 | |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1435 /** set the zoom area. |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1436 * also triggers "changeZoomArea" event. |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1437 */ |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1438 var setZoomArea = function(data, za) { |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1439 $(data).trigger('changeZoomArea', za); |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1440 data.oldZoomArea = data.zoomArea; |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1441 data.zoomArea = za; |
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1442 }; |
1012 | 1443 |
1111
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1444 /** move the zoom area and center it on rectangle "rect" |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1445 */ |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1446 var centerZoomArea = function(data, rect) { |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1447 var za = data.zoomArea; |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1448 if (isFullArea(za)) return; |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1449 za.setCenter(rect.getCenter()).stayInside(FULL_AREA); |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1450 if (!za.containsRect(rect)) { |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1451 za = FULL_AREA.copy(); |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1452 } |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1453 setZoomArea(data, za); |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1454 }; |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1455 |
949 | 1456 /** get image quality as a number (0..2). |
1457 * | |
1458 */ | |
703 | 1459 var getQuality = function (data) { |
1460 var flags = data.scalerFlags; | |
1461 var q = flags.q2 || flags.q1 || 'q0'; // assume q0 as default | |
1462 return parseInt(q[1], 10); | |
706 | 1463 }; |
703 | 1464 |
949 | 1465 /** set image quality as a number (0..2). |
1466 * | |
1467 */ | |
703 | 1468 var setQuality = function (data, qual) { |
1469 var flags = data.scalerFlags; | |
1470 // clear flags | |
1471 for (var i = 0; i < 3; ++i) { | |
1472 delete flags['q'+i]; | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1473 } |
703 | 1474 flags['q'+qual] = 'q'+qual; |
706 | 1475 }; |
710 | 1476 |
949 | 1477 /** get image scale mode (screen, pixel, size). |
1478 * | |
1479 */ | |
761
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1480 var getScaleMode = function (data) { |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1481 if (data.scalerFlags.clip != null) { |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1482 return 'pixel'; |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1483 } else if (data.scalerFlags.osize != null) { |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1484 return 'size'; |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1485 } |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1486 // mo=fit is default |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1487 return 'screen'; |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1488 }; |
775 | 1489 |
949 | 1490 /** set image scale mode (screen, pixel, size). |
1491 * | |
1492 */ | |
761
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1493 var setScaleMode = function (data, mode) { |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1494 delete data.scalerFlags.fit; |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1495 delete data.scalerFlags.clip; |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1496 delete data.scalerFlags.osize; |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1497 if (mode === 'pixel') { |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1498 data.scalerFlags.clip = 'clip'; |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1499 } else if (mode === 'size') { |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1500 data.scalerFlags.osize = 'osize'; |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1501 } |
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1502 // mo=fit is default |
972 | 1503 // save mode |
1504 data.scaleMode = mode; | |
761
16778bd2de7c
added setScaleMode. no compensation for change in scaling yet.
robcast
parents:
760
diff
changeset
|
1505 }; |
775 | 1506 |
972 | 1507 /** get screen fit mode (width, height, both). |
1508 * | |
1509 */ | |
1510 var getFitMode = function (data) { | |
1015 | 1511 if (data.dlOpts.fitwidth != null) { |
1512 return "width"; | |
1513 } else if (data.dlOpts.fitheight != null) { | |
1514 return "height"; | |
1515 } | |
1516 // "both" is default | |
1517 return "both"; | |
972 | 1518 }; |
1012 | 1519 |
972 | 1520 /** |
1521 * set screen fit mode (width, height, both). | |
1522 */ | |
1523 var setFitMode = function (data, mode) { | |
984 | 1524 var settings = data.settings; |
1012 | 1525 var imgSize = data.maxImgSize; |
1015 | 1526 if (mode === 'width') { |
1527 data.dlOpts.fitwidth = 1; | |
1528 delete data.dlOpts.fitheight; | |
1529 if (imgSize != null) { | |
1530 // fitwidth omits destination height | |
1531 settings.dw = imgSize.width; | |
1532 settings.dh = null; | |
1533 } | |
1534 } else if (mode === 'height') { | |
1535 data.dlOpts.fitheight = 1; | |
1536 delete data.dlOpts.fitwidth; | |
984 | 1537 if (imgSize != null) { |
1538 // fitheight omits destination width | |
1539 settings.dw = null; | |
1540 settings.dh = imgSize.height; | |
1541 } | |
1015 | 1542 } else { |
1543 delete data.dlOpts.fitwidth; | |
1544 delete data.dlOpts.fitheight; | |
984 | 1545 if (imgSize != null) { |
1546 settings.dw = imgSize.width; | |
1547 settings.dh = imgSize.height; | |
1548 } | |
1015 | 1549 } |
972 | 1550 }; |
1015 | 1551 |
949 | 1552 /** sets a key to a value (relative values with +/- if relative=true). |
1553 * | |
1554 */ | |
650 | 1555 var setNumValue = function(settings, key, value) { |
716 | 1556 if (value == null) return null; |
955
c8c441d1d7a0
fixed bug with prev/next page. (too quick in using jQuery functions)
robcast
parents:
954
diff
changeset
|
1557 if (isNumber(value)) { |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1558 settings[key] = value; |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1559 return value; |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1560 } |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1561 var sign = value[0]; |
650 | 1562 if (sign === '+' || sign === '-') { |
1563 if (settings[key] == null) { | |
651
694bdb86cbad
renamed 'actions' to 'buttons' and 'methods' to 'actions'
robcast
parents:
650
diff
changeset
|
1564 // this isn't perfect but still... |
650 | 1565 settings[key] = 0; |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1566 } |
650 | 1567 settings[key] = parseFloat(settings[key]) + parseFloat(value); |
1568 } else { | |
1569 settings[key] = value; | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1570 } |
650 | 1571 return settings[key]; |
1572 }; | |
655 | 1573 |
949 | 1574 /** return width of border on $elem. |
1575 * assumes equal border width on all sides. | |
1576 */ | |
775 | 1577 var getBorderWidth = function($elem) { |
1578 var border = $elem.outerWidth() - $elem.width(); | |
1579 return border/2; | |
1580 }; | |
1581 | |
949 | 1582 /** return if the current zoomarea can be moved further. |
1583 * | |
1584 */ | |
878 | 1585 var canMove = function(data, movx, movy) { |
1075
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1586 |
878 | 1587 var za = data.zoomArea; |
1588 if (isFullArea(za)) return false; | |
1075
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1589 var dx = movx; |
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1590 var dy = movy; |
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1591 // rotate and mirror change direction of cooordinate system |
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1592 var trafo = data.imgTrafo; |
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1593 if (trafo != null) { |
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1594 dx = (trafo.m00 > 0) ? movx : -movx; |
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1595 dy = (trafo.m11 > 0) ? movy : -movy; |
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1596 if (Math.abs(trafo.m00) < Math.abs(trafo.m01)) { |
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1597 dx = (trafo.m01 > 0) ? -movy : movy; |
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1598 dy = (trafo.m10 > 0) ? -movx : movx; |
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1599 } |
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1600 } |
878 | 1601 var x2 = za.x + za.width; |
1602 var y2 = za.y + za.height; | |
1075
1e4f4964e9c2
CLOSED - # 25: scroll arrows have wrong direction with mirror and rot
robcast
parents:
1060
diff
changeset
|
1603 return (((dx < 0) && (za.x > 0)) || ((dx > 0) && (x2 < 1.0)) || ((dy < 0) && (za.y > 0)) || ((dy > 0) && (y2 < 1.0))); |
878 | 1604 }; |
1605 | |
949 | 1606 /** return if area is maximal. |
1607 * | |
1608 */ | |
795 | 1609 var isFullArea = function (area) { |
659 | 1610 return (area.width === 1.0) && (area.height === 1.0); |
655 | 1611 }; |
1612 | |
955
c8c441d1d7a0
fixed bug with prev/next page. (too quick in using jQuery functions)
robcast
parents:
954
diff
changeset
|
1613 /** return if the argument is a number. |
c8c441d1d7a0
fixed bug with prev/next page. (too quick in using jQuery functions)
robcast
parents:
954
diff
changeset
|
1614 * from Douglas Crockford, A.10. |
c8c441d1d7a0
fixed bug with prev/next page. (too quick in using jQuery functions)
robcast
parents:
954
diff
changeset
|
1615 * this is different from $.isNumeric(). |
c8c441d1d7a0
fixed bug with prev/next page. (too quick in using jQuery functions)
robcast
parents:
954
diff
changeset
|
1616 */ |
c8c441d1d7a0
fixed bug with prev/next page. (too quick in using jQuery functions)
robcast
parents:
954
diff
changeset
|
1617 var isNumber = function (value) { |
c8c441d1d7a0
fixed bug with prev/next page. (too quick in using jQuery functions)
robcast
parents:
954
diff
changeset
|
1618 return typeof value === 'number' && isFinite(value); |
c8c441d1d7a0
fixed bug with prev/next page. (too quick in using jQuery functions)
robcast
parents:
954
diff
changeset
|
1619 }; |
949 | 1620 /** return number with reduced precision. |
1621 * ("crop senseless precision") | |
1622 */ | |
631 | 1623 var cropFloat = function (x) { |
637 | 1624 return parseInt(10000 * x, 10) / 10000; |
631 | 1625 }; |
655 | 1626 |
949 | 1627 /** return string from number with reduced precision. |
1628 */ | |
813 | 1629 var cropFloatStr = function (x) { |
1630 return cropFloat(x).toString(); | |
1631 }; | |
1632 | |
1100 | 1633 /** |
1634 * returns if str ends with suffix. | |
1635 */ | |
1636 var endsWith = function (str, suffix) { | |
1637 return str.indexOf(suffix, str.length - suffix.length) !== -1; | |
1638 }; | |
1107 | 1639 |
1047
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1640 /** center an item on the visible screen rect |
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1641 */ |
1021 | 1642 var centerOnScreen = function (data, $div) { |
1058
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1643 if ($div == null) return; |
1021 | 1644 var r = geom.rectangle($div); |
1645 var s = fn.getFullscreenRect(data); | |
1646 r.setCenter(s.getCenter()); | |
1060 | 1647 r.getPosition().adjustDiv($div); |
1021 | 1648 }; |
1649 | |
1058
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1650 /** find an element in digilib $elem |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1651 */ |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1652 var find = function (data, selector) { |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1653 var $obj = data.$elem.find(selector); |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1654 return ($obj.length > 0) ? $obj : null; |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1655 }; |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1656 |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1657 /** does element exist in digilib? |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1658 */ |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1659 var isOnScreen = function (data, selector) { |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1660 var $obj = find(data, selector); |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1661 return ($obj != null); |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1662 }; |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1663 |
1047
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1664 /** fade out and remove an item |
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1665 */ |
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1666 var withdraw = function ($item) { |
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1667 $item.fadeOut(function () { |
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1668 $item.remove(); |
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1669 }); |
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1670 }; |
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1671 |
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1672 |
692 | 1673 // fallback for console.log calls |
1674 if (customConsole) { | |
1675 var logFunction = function(type) { | |
1676 return function(){ | |
996 | 1677 var $debug = $('#'+defaults.cssPrefix+'debug'); // debug div |
692 | 1678 if (!$debug) return; |
1679 var args = Array.prototype.slice.call(arguments); | |
1680 var argtext = args.join(' '); | |
1681 var $logDiv = $('<div/>'); | |
1682 $logDiv.addClass(type); | |
1683 $logDiv.text(argtext); | |
1684 $debug.append($logDiv); | |
1685 }; | |
1686 }; | |
1687 console.log = logFunction('_log'); | |
1688 console.debug = logFunction('_debug'); | |
1689 console.error = logFunction('_error'); | |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1690 } |
692 | 1691 |
949 | 1692 /** functions to export to plugins. |
1693 */ | |
787 | 1694 fn = { |
791 | 1695 geometry : geom, |
787 | 1696 parseQueryString : parseQueryString, |
1697 getScalerUrl : getScalerUrl, | |
1698 getParamString : getParamString, | |
1699 getDigilibUrl : getDigilibUrl, | |
1700 unpackParams : unpackParams, | |
1701 packParams : packParams, | |
822 | 1702 packArea : packArea, |
1703 packScalerFlags : packScalerFlags, | |
795 | 1704 storeOptions : storeOptions, |
787 | 1705 redisplay : redisplay, |
1706 updateDisplay : updateDisplay, | |
791 | 1707 showDiv : showDiv, |
1107 | 1708 defineArea : defineArea, |
983 | 1709 setZoomArea : setZoomArea, |
1111
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1107
diff
changeset
|
1710 centerZoomArea : centerZoomArea, |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
949
diff
changeset
|
1711 setPreviewBg : setPreviewBg, |
787 | 1712 getImgTrafo : getImgTrafo, |
1713 getQuality : getQuality, | |
1714 setQuality : setQuality, | |
1715 getScaleMode : getScaleMode, | |
1716 setScaleMode : setScaleMode, | |
972 | 1717 getFitMode : getFitMode, |
1718 setFitMode : setFitMode, | |
878 | 1719 canMove : canMove, |
795 | 1720 isFullArea : isFullArea, |
978 | 1721 isNumber : isNumber, |
974 | 1722 getFullscreenRect : getFullscreenRect, |
813 | 1723 getBorderWidth : getBorderWidth, |
1724 cropFloat : cropFloat, | |
1021 | 1725 cropFloatStr : cropFloatStr, |
1100 | 1726 endsWith : endsWith, |
1047
4f17420392a9
factor out calibration/scalemode to new dialogs plugin
hertzhaft
parents:
1031
diff
changeset
|
1727 centerOnScreen : centerOnScreen, |
1058
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1728 withdraw : withdraw, |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1729 isOnScreen : isOnScreen, |
95d28c6ad018
rgb slider now gets/sets values, plus some refactoring
hertzhaft
parents:
1053
diff
changeset
|
1730 find : find |
787 | 1731 }; |
788 | 1732 |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
798
diff
changeset
|
1733 // hook digilib plugin into jquery |
785 | 1734 $.fn.digilib = function (action) { |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
798
diff
changeset
|
1735 // plugin extension mechanism, called when the plugins' code is read |
786 | 1736 if (action === 'plugin') { |
1737 var plugin = arguments[1]; | |
1738 // each plugin needs a name | |
1739 if (plugin.name != null) { | |
1740 plugins[plugin.name] = plugin; | |
793
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
1741 // share common objects |
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
1742 plugin.defaults = defaults; |
947 | 1743 plugin.buttons = buttons; |
793
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
1744 plugin.actions = actions; |
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
1745 plugin.fn = fn; |
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
1746 plugin.plugins = plugins; |
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
1747 // and install |
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
1748 if (typeof plugin.install === 'function') { |
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
1749 plugin.install(plugin); |
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
791
diff
changeset
|
1750 } |
786 | 1751 } |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
798
diff
changeset
|
1752 // plugins will be initialised when action.init is called |
760
f0be4432f515
primitive plugin extension mechanism - unsure how useful this is
hertzhaft
parents:
755
diff
changeset
|
1753 } else if (actions[action]) { |
651
694bdb86cbad
renamed 'actions' to 'buttons' and 'methods' to 'actions'
robcast
parents:
650
diff
changeset
|
1754 // call action on this with the remaining arguments (inserting data as first argument) |
694bdb86cbad
renamed 'actions' to 'buttons' and 'methods' to 'actions'
robcast
parents:
650
diff
changeset
|
1755 var $elem = $(this); |
694bdb86cbad
renamed 'actions' to 'buttons' and 'methods' to 'actions'
robcast
parents:
650
diff
changeset
|
1756 var data = $elem.data('digilib'); |
694bdb86cbad
renamed 'actions' to 'buttons' and 'methods' to 'actions'
robcast
parents:
650
diff
changeset
|
1757 var args = Array.prototype.slice.call(arguments, 1); |
694bdb86cbad
renamed 'actions' to 'buttons' and 'methods' to 'actions'
robcast
parents:
650
diff
changeset
|
1758 args.unshift(data); |
694bdb86cbad
renamed 'actions' to 'buttons' and 'methods' to 'actions'
robcast
parents:
650
diff
changeset
|
1759 return actions[action].apply(this, args); |
798
b07d1824ca2a
fullscreen mode works without reload on browsers supporting history.pushstate!
robcast
parents:
797
diff
changeset
|
1760 } else if (typeof action === 'object' || !action) { |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
798
diff
changeset
|
1761 // call init on the digilib jQuery object |
651
694bdb86cbad
renamed 'actions' to 'buttons' and 'methods' to 'actions'
robcast
parents:
650
diff
changeset
|
1762 return actions.init.apply(this, arguments); |
605 | 1763 } else { |
713
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1764 $.error('action ' + action + ' does not exist on jQuery.digilib'); |
c1fa722c570e
more cosmetics: added options to validate with http://www.jslint.com
robcast
parents:
711
diff
changeset
|
1765 } |
605 | 1766 }; |
692 | 1767 |
991
497ab03868ab
moved marks to separate plugin. (pack and unpack is still in digilib.js)
robcast
parents:
990
diff
changeset
|
1768 })(jQuery); |