Mercurial > hg > digilib-old
annotate client/digitallibrary/jquery/jquery.digilib.js @ 636:7049579a0097 jquery
last and next page works now
implemented redisplay function (only tested with fullscreen)
parameters that are changed need to be in data.queryParams to get in the url on redisplay
author | robcast |
---|---|
date | Tue, 18 Jan 2011 21:30:03 +0100 |
parents | 7293a42f44f5 |
children | d904c0c74c15 |
rev | line source |
---|---|
604 | 1 /* |
2 * digilib jQuery plugin | |
3 * | |
4 */ | |
636 | 5 |
6 // fallback for console.log calls | |
7 if (typeof(console) === 'undefined') { | |
8 var console = { | |
9 log : function(){}, | |
10 debug : function(){}, | |
11 error : function(){} | |
12 }; | |
13 } | |
604 | 14 |
15 (function($) { | |
618
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
16 var actions = { |
610 | 17 reference : { |
18 onclick : "javascript:getRefWin()", | |
19 tooltip : "get a reference URL", | |
20 img : "reference.png" | |
21 }, | |
22 zoomin : { | |
23 onclick : "javascript:dl.zoomBy(1.4)", | |
24 tooltip : "zoom in", | |
25 img : "zoom-in.png" | |
26 }, | |
27 zoomout : { | |
28 onclick : "javascript:zoomBy(0.7)", | |
29 tooltip : "zoom out", | |
30 img : "zoom-out.png" | |
31 }, | |
32 zoomarea : { | |
33 onclick : "javascript:zoomArea()", | |
34 tooltip : "zoom area", | |
35 img : "zoom-area.png" | |
36 }, | |
37 zoomfull : { | |
38 onclick : "javascript:zoomFullpage()", | |
39 tooltip : "view the whole image", | |
40 img : "zoom-full.png" | |
41 }, | |
42 pagewidth : { | |
43 onclick : "javascript:zoomFullpage('width')", | |
44 tooltip : "page width", | |
45 img : "pagewidth.png" | |
46 }, | |
47 back : { | |
623 | 48 onclick : ["gotoPage", "-1"], |
610 | 49 tooltip : "goto previous image", |
50 img : "back.png" | |
51 }, | |
52 fwd : { | |
623 | 53 onclick : ["gotoPage", "+1"], |
610 | 54 tooltip : "goto next image", |
55 img : "fwd.png" | |
56 }, | |
57 page : { | |
58 onclick : "javascript:gotoPageWin()", | |
59 tooltip : "specify image", | |
60 img : "page.png" | |
61 }, | |
62 bird : { | |
635 | 63 onclick : "showBirdDiv", |
610 | 64 tooltip : "show bird's eye view", |
65 img : "birds-eye.png" | |
66 }, | |
67 help : { | |
635 | 68 onclick : "showAboutDiv", |
610 | 69 tooltip : "about Digilib", |
70 img : "help.png" | |
71 }, | |
72 reset : { | |
73 onclick : "javascript:resetImage()", | |
74 tooltip : "reset image", | |
75 img : "reset.png" | |
76 }, | |
77 mark : { | |
78 onclick : "javascript:setMark()", | |
79 tooltip : "set a mark", | |
80 img : "mark.png" | |
81 }, | |
82 delmark : { | |
83 onclick : "javascript:removeMark()", | |
84 tooltip : "delete the last mark", | |
85 img : "delmark.png" | |
86 }, | |
87 hmir : { | |
88 onclick : "javascript:mirror('h')", | |
89 tooltip : "mirror horizontally", | |
90 img : "mirror-horizontal.png" | |
91 }, | |
92 vmir : { | |
93 onclick : "javascript:mirror('v')", | |
94 tooltip : "mirror vertically", | |
95 img : "mirror-vertical.png" | |
96 }, | |
97 rot : { | |
98 onclick : "javascript:setParamWin('rot', 'Rotate (0..360) clockwise')", | |
99 tooltip : "rotate image", | |
100 img : "rotate.png" | |
101 }, | |
102 brgt : { | |
103 onclick : "javascript:setParamWin('brgt', 'Brightness (-255..255)')", | |
104 tooltip : "set brightness", | |
105 img : "brightness.png" | |
106 }, | |
107 cont : { | |
108 onclick : "javascript:setParamWin('cont', 'Contrast (0..8)')", | |
109 tooltip : "set contrast", | |
110 img : "contrast.png" | |
111 }, | |
112 rgb : { | |
113 onclick : "javascript:setParamWin('rgb', '...')", | |
114 tooltip : "set rgb values", | |
115 img : "rgb.png" | |
116 }, | |
117 quality : { | |
118 onclick : "javascript:setQualityWin('Quality (0..2)')", | |
119 tooltip : "set image quality", | |
120 img : "quality.png" | |
121 }, | |
122 size : { | |
123 onclick : "javascript:toggleSizeMenu()", | |
124 tooltip : "set page size", | |
125 img : "size.png" | |
126 }, | |
127 calibrationx : { | |
128 onclick : "javascript:calibrate('x')", | |
129 tooltip : "calibrate screen x-ratio", | |
130 img : "calibration-x.png" | |
131 }, | |
132 scale : { | |
133 onclick : "javascript:toggleScaleMenu()", | |
134 tooltip : "change image scale", | |
135 img : "original-size.png" | |
136 }, | |
137 options : { | |
138 onclick : "javascript:toggleOptionDiv()", | |
139 tooltip : "hide options", | |
140 img : "options.png" | |
141 }, | |
142 SEP : { | |
143 img : "sep.png" | |
144 } | |
145 }; | |
617
cd846b5c8be8
toggle view event handlers for bird's eye and 'about windows
hertzhaft
parents:
616
diff
changeset
|
146 |
605 | 147 var defaults = { |
617
cd846b5c8be8
toggle view event handlers for bird's eye and 'about windows
hertzhaft
parents:
616
diff
changeset
|
148 // the root digilib element, for easy retrieval |
cd846b5c8be8
toggle view event handlers for bird's eye and 'about windows
hertzhaft
parents:
616
diff
changeset
|
149 'digilibRoot' : null, |
616 | 150 // version of this script |
635 | 151 'version' : 'jquery.digilib.js 0.9', |
616 | 152 // logo url |
153 'logoUrl' : '../img/digilib-logo-text1.png', | |
635 | 154 // homepage url (behind logo) |
155 'homeUrl' : 'http://digilib.berlios.de', | |
610 | 156 // base URL to Scaler servlet |
157 'scalerBaseUrl' : 'http://digilib.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler', | |
158 // list of Scaler parameters | |
627 | 159 'scalerParamNames' : ['fn','pn','dw','dh','ww','wh','wx','wy','ws','mo', |
160 'rot','cont','brgt','rgbm','rgba','ddpi','ddpix','ddpiy'], | |
161 // Scaler parameter defaults | |
162 'ww' : 1.0, | |
163 'wh' : 1.0, | |
164 'wx' : 0.0, | |
165 'wy' : 0.0, | |
166 'ws' : 1.0, | |
610 | 167 // mode of operation. |
168 // fullscreen: takes parameters from page URL, keeps state in page URL | |
169 // embedded: takes parameters from Javascript options, keeps state inside object | |
170 'interactionMode' : 'fullscreen', | |
618
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
171 // actions |
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
172 'actions' : actions, |
612 | 173 // path to button images (must end with a slash) |
174 'buttonsImagePath' : '../greyskin/', | |
618
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
175 // actions groups |
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
176 'actionsStandard' : ["reference","zoomin","zoomout","zoomarea","zoomfull","pagewidth","back","fwd","page","bird","SEP","help","reset","options"], |
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
177 'actionsSpecial' : ["mark","delmark","hmir","vmir","rot","brgt","cont","rgb","quality","size","calibrationx","scale","SEP","options"], |
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
178 'actionsCustom' : [], |
616 | 179 // is birdView shown? |
180 'isBirdDivVisible' : false, | |
615 | 181 // dimensions of bird's eye window |
182 'birdMaxX' : 200, | |
616 | 183 'birdMaxY' : 200, |
184 // is the "about" window shown? | |
185 'isAboutDivVisible' : false | |
186 | |
610 | 187 }; |
605 | 188 |
608 | 189 // affine geometry classes |
190 var geom = dlGeometry(); | |
604 | 191 |
192 var methods = { | |
608 | 193 // digilib initialization |
604 | 194 init : function(options) { |
608 | 195 // settings for this digilib instance are merged from defaults and options |
607 | 196 var settings = $.extend({}, defaults, options); |
636 | 197 var isFullscreen = settings.interactionMode === 'fullscreen'; |
198 var queryParams = {}; | |
607 | 199 if (isFullscreen) { |
200 queryParams = parseQueryParams(); | |
636 | 201 } |
604 | 202 return this.each(function() { |
605 | 203 var $elem = $(this); |
204 var data = $elem.data('digilib'); | |
607 | 205 var elemSettings; |
608 | 206 // if the plugin hasn't been initialized yet |
604 | 207 if (!data) { |
605 | 208 // merge query parameters |
607 | 209 if (isFullscreen) { |
210 elemSettings = $.extend({}, settings, queryParams); | |
211 } else { | |
212 elemSettings = $.extend({}, settings, parseImgParams($elem)); | |
634 | 213 } |
617
cd846b5c8be8
toggle view event handlers for bird's eye and 'about windows
hertzhaft
parents:
616
diff
changeset
|
214 // store $(this) element in the settings |
cd846b5c8be8
toggle view event handlers for bird's eye and 'about windows
hertzhaft
parents:
616
diff
changeset
|
215 elemSettings.digilibRoot = $elem; |
627 | 216 data = { |
217 target : $elem, | |
636 | 218 settings : elemSettings, |
219 queryParams : queryParams | |
627 | 220 }; |
605 | 221 // store in data element |
627 | 222 $elem.data('digilib', data); |
604 | 223 } |
633 | 224 unpackParams(data); |
608 | 225 // create HTML structure |
627 | 226 setupScalerDiv(data); |
628
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
227 setupButtons(data, 'actionsStandard'); |
627 | 228 // bird's eye view creation - TODO: could be deferred? |
628
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
229 setupBirdviewDiv(data); |
627 | 230 // about window creation - TODO: could be deferred? restrict to only one item? |
628
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
231 setupAboutDiv(data); |
604 | 232 }); |
233 }, | |
608 | 234 |
235 // clean up digilib | |
604 | 236 destroy : function() { |
237 return this.each(function(){ | |
636 | 238 var $elem = $(this); |
239 var data = $elem.data('digilib'); | |
604 | 240 // Namespacing FTW |
605 | 241 $(window).unbind('.digilib'); // unbinds all digilibs(?) |
604 | 242 data.digilib.remove(); |
636 | 243 $elem.removeData('digilib'); |
604 | 244 }); |
617
cd846b5c8be8
toggle view event handlers for bird's eye and 'about windows
hertzhaft
parents:
616
diff
changeset
|
245 }, |
cd846b5c8be8
toggle view event handlers for bird's eye and 'about windows
hertzhaft
parents:
616
diff
changeset
|
246 |
635 | 247 // show or hide the 'about' window |
248 showAboutDiv : function(show) { | |
636 | 249 var $elem = $(this); |
250 var data = $elem.data('digilib'); | |
635 | 251 data.settings.isAboutDivVisible = showDiv(data.settings.isAboutDivVisible, data.$aboutDiv, show); |
617
cd846b5c8be8
toggle view event handlers for bird's eye and 'about windows
hertzhaft
parents:
616
diff
changeset
|
252 }, |
cd846b5c8be8
toggle view event handlers for bird's eye and 'about windows
hertzhaft
parents:
616
diff
changeset
|
253 |
cd846b5c8be8
toggle view event handlers for bird's eye and 'about windows
hertzhaft
parents:
616
diff
changeset
|
254 // event handler: toggles the visibility of the bird's eye window |
635 | 255 showBirdDiv : function (show) { |
636 | 256 var $elem = $(this); |
257 var data = $elem.data('digilib'); | |
635 | 258 data.settings.isBirdDivVisible = showDiv(data.settings.isBirdDivVisible, data.$birdDiv, show); |
623 | 259 }, |
260 | |
261 // goto given page nr (+/-: relative) | |
636 | 262 gotoPage : function (pageNr) { |
623 | 263 var $elem = $(this); // the clicked button |
636 | 264 var data = $elem.data('digilib'); |
265 var settings = data.settings; | |
623 | 266 var oldpn = settings.pn; |
624 | 267 var pn = setNumValue(settings, "pn", pageNr); |
268 if (pn == null) return false; // nothing happened | |
623 | 269 if (pn < 1) { |
270 alert("no such page (page number too low)"); | |
271 settings.pn = oldpn; | |
272 return false; | |
634 | 273 } |
623 | 274 if (settings.pt) { |
275 if (pn > settings.pt) { | |
276 alert("no such page (page number too high)"); | |
277 settings.pn = oldpn; | |
278 return false; | |
279 } | |
634 | 280 } |
636 | 281 // add pn to param list and remove mk and others(?) |
282 data.queryParams.pn = pn; | |
283 delete data.queryParams.mk; | |
284 // then reload | |
285 redisplay(data); | |
604 | 286 } |
605 | 287 }; |
604 | 288 |
623 | 289 // sets a key to a value (relative values with +/- if relative=true) |
290 var setNumValue = function(settings, key, value) { | |
291 // TODO: type and error checking | |
292 if (settings[key] == null) return null; | |
293 var sign = value.substring(0,1); | |
294 if (sign === '+' || sign === '-') { | |
295 settings[key] = parseFloat(settings[key]) + parseFloat(value); | |
296 } else { | |
297 settings[key] = value; | |
298 } | |
299 return settings[key]; | |
300 }; | |
301 | |
608 | 302 // returns parameters from page url |
607 | 303 var parseQueryParams = function() { |
636 | 304 return parseQueryString(window.location.search.slice(1)); |
305 }; | |
607 | 306 |
636 | 307 // returns parameters from embedded img-element |
607 | 308 var parseImgParams = function($elem) { |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
309 var src = $elem.find('img').first().attr('src'); |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
310 if (!src) { |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
311 return null; |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
312 } |
607 | 313 var pos = src.indexOf('?'); |
314 var query = (pos < 0) ? '' : src.substring(pos + 1); | |
315 var scalerUrl = src.substring(0, pos); | |
627 | 316 var params = parseQueryString(query); |
317 params.scalerBaseUrl = scalerUrl; | |
318 return params; | |
636 | 319 }; |
607 | 320 |
608 | 321 // parses query parameter string into parameter object |
607 | 322 var parseQueryString = function(query) { |
323 var pairs = query.split("&"); | |
627 | 324 var params = {}; |
636 | 325 //var keys = []; |
607 | 326 for (var i = 0; i < pairs.length; i++) { |
327 var pair = pairs[i].split("="); | |
328 if (pair.length === 2) { | |
627 | 329 params[pair[0]] = pair[1]; |
636 | 330 //keys.push(pair[0]); |
634 | 331 } |
636 | 332 } |
627 | 333 return params; |
636 | 334 }; |
604 | 335 |
615 | 336 // returns a query string from key names from a parameter hash |
628
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
337 var getParamString = function (settings, keys) { |
615 | 338 var paramString = ''; |
339 var latter = false; | |
340 for (i = 0; i < keys.length; ++i) { | |
341 var key = keys[i]; | |
342 if (settings[key]) { | |
343 // first param gets no '&' | |
344 paramString += latter ? '&' : ''; | |
345 latter = true; | |
346 // add parm=val | |
347 paramString += key + '=' + settings[key]; | |
634 | 348 } |
615 | 349 } |
350 return paramString; | |
631 | 351 }; |
352 | |
636 | 353 // returns URL and query string for Scaler |
354 var getScalerUrl = function (data) { | |
355 var settings = data.settings; | |
356 var keys = settings.scalerParamNames; | |
357 var queryString = getParamString(settings, keys); | |
358 var url = settings.scalerBaseUrl + '?' + queryString; | |
359 return url; | |
360 }; | |
361 | |
362 // returns URL and query string for current digilib | |
363 var getDigilibUrl = function (data) { | |
364 var settings = data.settings; | |
365 // make list from queryParams keys | |
366 var keys = []; | |
367 for (var k in data.queryParams) { | |
368 keys.push(k); | |
369 } | |
370 var queryString = getParamString(settings, keys); | |
371 var url = window.location.toString(); | |
372 var pos = url.indexOf('?'); | |
373 var baseUrl = url.substring(0, pos); | |
374 var newurl = baseUrl + '?' + queryString; | |
375 return newurl; | |
376 }; | |
377 | |
631 | 378 // processes some parameters into objects and stuff |
379 var unpackParams = function (data) { | |
380 var settings = data.settings; | |
636 | 381 // zoom area |
631 | 382 var zoomArea = geom.rectangle(settings.wx, settings.wy, settings.ww, settings.wh); |
383 settings.zoomArea = zoomArea; | |
636 | 384 // marks |
631 | 385 var marks = []; |
633 | 386 var mk = settings.mk || ''; |
387 if (mk.indexOf(";") >= 0) { | |
388 var pa = mk.split(";"); // old format with ";" | |
631 | 389 } else { |
633 | 390 var pa = mk.split(","); // new format |
631 | 391 } |
392 for (var i = 0; i < pa.length ; i++) { | |
393 var pos = pa[i].split("/"); | |
633 | 394 if (pos.length > 1) { |
395 marks.push(geom.position(pos[0], pos[1])); | |
396 } | |
631 | 397 } |
398 settings.marks = marks; | |
399 }; | |
400 | |
401 // put objects back into parameters | |
402 var packParams = function (data) { | |
403 var settings = data.settings; | |
636 | 404 // zoom area |
631 | 405 if (settings.zoomArea) { |
406 settings.wx = settings.zoomArea.x; | |
407 settings.wy = settings.zoomArea.y; | |
408 settings.ww = settings.zoomArea.width; | |
409 settings.wh = settings.zoomArea.height; | |
410 } | |
636 | 411 // marks |
631 | 412 if (settings.marks) { |
413 var ma = []; | |
414 for (var i = 0; i < settings.marks.length; i++) { | |
415 ma.push(cropFloat(settings.marks[i].x) + "/" + cropFloat(settings.marks[i].y)); | |
416 } | |
417 settings.mk = ma.join(","); | |
418 } | |
419 }; | |
420 | |
609 | 421 // returns maximum size for scaler img in fullscreen mode |
422 var getFullscreenImgSize = function($elem) { | |
423 var winH = $(window).height(); | |
424 var winW = $(window).width(); | |
425 // TODO: account for borders? | |
426 return geom.size(winW, winH); | |
608 | 427 }; |
428 | |
622 | 429 // (re)load the img from a new scaler URL |
636 | 430 var redisplay = function (data) { |
431 var settings = data.settings; | |
432 if (settings.interactionMode === 'fullscreen') { | |
433 // update location.href (browser URL) in fullscreen mode | |
434 var url = getDigilibUrl(data); | |
435 var history = window.history; | |
436 if (typeof(history.pushState) === 'function') { | |
437 console.debug("we could modify history, but we don't..."); | |
438 } | |
439 window.location = url; | |
440 } else { | |
441 // embedded mode -- just change img src | |
442 var url = getScalerUrl(data); | |
443 data.$img.attr('src', url); | |
444 } | |
622 | 445 }; |
446 | |
608 | 447 // creates HTML structure for digilib in elem |
627 | 448 var setupScalerDiv = function (data) { |
449 var settings = data.settings; | |
450 var $elem = data.target; | |
623 | 451 var $img; |
608 | 452 if (settings.interactionMode === 'fullscreen') { |
609 | 453 // fullscreen |
454 var imgSize = getFullscreenImgSize($elem); | |
455 settings.dw = imgSize.width; | |
456 settings.dh = imgSize.height; | |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
457 $img = $('<img/>'); |
636 | 458 var scalerUrl = getScalerUrl(data); |
459 $img.attr('src', scalerUrl); | |
609 | 460 } else { |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
461 // embedded mode -- try to keep img tag |
623 | 462 $img = $elem.find('img'); |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
463 if ($img.length > 0) { |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
464 console.debug("img detach:",$img); |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
465 $img.detach(); |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
466 } else { |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
467 $img = $('<img/>'); |
636 | 468 var scalerUrl = getScalerUrl(data); |
469 $img.attr('src', scalerUrl); | |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
470 } |
608 | 471 } |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
472 // create new html |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
473 $elem.empty(); // TODO: should we keep stuff for customization? |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
474 var $scaler = $('<div class="scaler"/>'); |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
475 $elem.append($scaler); |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
476 $scaler.append($img); |
622 | 477 $img.addClass('pic'); |
636 | 478 data.$img = $img; |
479 $img.load(scalerImgLoadedHandler(data)); | |
608 | 480 }; |
615 | 481 |
610 | 482 // creates HTML structure for buttons in elem |
628
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
483 var setupButtons = function (data, actionGroup) { |
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
484 var $elem = data.target; |
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
485 var settings = data.settings; |
610 | 486 if (settings.interactionMode === 'fullscreen') { |
487 // fullscreen -- create new | |
612 | 488 var $buttonsDiv = $('<div class="buttons"></div>'); |
489 $elem.append($buttonsDiv); | |
618
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
490 var actionNames = settings[actionGroup]; |
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
491 for (var i = 0; i < actionNames.length; i++) { |
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
492 var actionName = actionNames[i]; |
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
493 var actionSettings = settings.actions[actionName]; |
612 | 494 // construct the button html |
495 var $button = $('<div class="button"></div>'); | |
496 var $a = $('<a/>'); | |
614 | 497 var $img = $('<img class="button"/>'); |
612 | 498 $buttonsDiv.append($button); |
499 $button.append($a); | |
500 $a.append($img); | |
501 // add attributes and bindings | |
618
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
502 $button.attr('title', actionSettings.tooltip); |
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
503 $button.addClass('button-' + actionName); |
635 | 504 // create handler for the buttons |
505 $a.bind('click', (function () { | |
506 // we create a new closure to capture the value of method | |
507 var method = actionSettings.onclick; | |
619 | 508 if ($.isArray(method)) { |
635 | 509 // the handler function calls digilib with method and parameters |
510 return function () { | |
511 console.debug('click method=', method); | |
512 $elem.digilib.apply($elem, method); | |
619 | 513 }; |
635 | 514 } else { |
515 // the handler function calls digilib with method | |
516 return function () { | |
517 console.debug('click method=', method); | |
518 $elem.digilib(method); | |
519 }; | |
520 } | |
521 })()); | |
618
09167ef1512e
some refactoring, onclick handlers now work with arguments
hertzhaft
parents:
617
diff
changeset
|
522 $img.attr('src', settings.buttonsImagePath + actionSettings.img); |
611 | 523 }; |
524 } | |
612 | 525 return $buttonsDiv; |
610 | 526 }; |
615 | 527 |
528 // creates HTML structure for the bird's eye view in elem | |
628
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
529 var setupBirdviewDiv = function (data) { |
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
530 var $elem = data.target; |
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
531 var settings = data.settings; |
615 | 532 // use only the relevant parameters |
533 var keys = ['fn','pn','dw','dh']; | |
534 var birdDimensions = { | |
535 'dw' : settings.birdMaxX, | |
536 'dh' : settings.birdMaxY | |
537 }; | |
538 var birdSettings = $.extend({}, settings, birdDimensions); | |
628
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
539 var birdUrl = settings.scalerBaseUrl + '?' + getParamString(birdSettings, keys); |
615 | 540 // the bird's eye div |
625 | 541 var $birdviewDiv = $('<div class="birdview" style="display:none"/>'); |
615 | 542 // the detail indicator frame |
543 var $birdzoomDiv = $('<div class="birdzoom"/>'); | |
544 // the small image | |
545 var $birdImg = $('<img class="birdimg"/>'); | |
546 $elem.append($birdviewDiv); | |
547 $birdviewDiv.append($birdzoomDiv); | |
548 $birdviewDiv.append($birdImg); | |
549 $birdImg.attr('src', birdUrl); | |
635 | 550 data.$birdDiv = $birdviewDiv; |
615 | 551 }; |
552 | |
625 | 553 // creates HTML structure for the about view in elem |
628
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
554 var setupAboutDiv = function (data) { |
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
555 var $elem = data.target; |
1f077f8afc5e
changed methods to pass "data" around instead of "settings"
robcast
parents:
627
diff
changeset
|
556 var settings = data.settings; |
625 | 557 var $aboutDiv = $('<div class="about" style="display:none"/>'); |
616 | 558 var $header = $('<p>Digilib Graphic Viewer</p>'); |
559 var $link = $('<a/>'); | |
560 var $logo = $('<img class="logo" title="digilib"/>'); | |
561 var $content = $('<p/>'); | |
562 $elem.append($aboutDiv); | |
563 $aboutDiv.append($header); | |
564 $aboutDiv.append($link); | |
565 $aboutDiv.append($content); | |
566 $link.append($logo); | |
567 $logo.attr('src', settings.logoUrl); | |
635 | 568 $link.attr('href', settings.homeUrl); |
616 | 569 $content.text('Version: ' + settings.version); |
635 | 570 // click hides |
571 $aboutDiv.bind('click', function () { showDiv(settings.isAboutDivVisible, $aboutDiv, 0); }); | |
572 data.$aboutDiv = $aboutDiv; | |
634 | 573 }; |
574 | |
635 | 575 // shows some window e.g. 'about' (toggle visibility if show is null) |
576 var showDiv = function (isVisible, $div, show) { | |
577 if (typeof(show) !== 'number') { | |
578 // toggle visibility | |
579 isVisible = !isVisible; | |
580 } else { | |
581 // set visibility | |
582 isVisible = show; | |
583 } | |
584 if (isVisible) { | |
585 $div.fadeIn(); | |
586 } else { | |
587 $div.fadeOut(); | |
588 } | |
589 return isVisible; | |
634 | 590 }; |
616 | 591 |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
592 // returns function for load event of scaler img |
636 | 593 var scalerImgLoadedHandler = function (data) { |
627 | 594 var settings = data.settings; |
595 var $elem = data.target; | |
636 | 596 var $img = data.$img; |
627 | 597 |
633 | 598 return function () { |
627 | 599 console.debug("img loaded! this=", this, " data=", data); |
631 | 600 var area = settings.zoomArea; |
627 | 601 // create Transform from current area and picsize |
602 var picpos = $img.offset(); | |
603 var picrect = geom.rectangle(picpos.left, picpos.top, $img.width(), $img.height()); | |
604 var trafo = geom.transform(); | |
605 // subtract area offset and size | |
606 trafo.concat(trafo.getTranslation(geom.position(area.x, area.y))); | |
607 trafo.concat(trafo.getScale(geom.size(1/area.width, 1/area.height))); | |
608 // scale to screen size | |
609 trafo.concat(trafo.getScale(picrect)); | |
610 trafo.concat(trafo.getTranslation(picrect)); | |
611 data.imgTrafo = trafo; | |
612 // display marks | |
633 | 613 renderMarks(data); |
635 | 614 // show birds eye view |
615 //showDiv(settings.isBirdDivVisible); | |
627 | 616 //digilib.showArrows(); // show arrow overlays for zoom navigation |
634 | 617 // done -- hide about div |
635 | 618 settings.isAboutDivVisible = showDiv(null, data.$aboutDiv, 0); |
613
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
619 }; |
53ee659e2d00
keeping img tag for embedded mode seems to work now
robcast
parents:
612
diff
changeset
|
620 }; |
633 | 621 |
622 // place marks on the image | |
623 var renderMarks = function (data) { | |
624 var $elem = data.target; | |
625 var marks = data.settings.marks; | |
626 for (var i = 0; i < marks.length; i++) { | |
627 var mark = marks[i]; | |
628 if (data.settings.zoomArea.containsPosition(mark)) { | |
629 var mpos = data.imgTrafo.transform(mark); | |
630 // create mark | |
631 var html = '<div class="mark">'+(i+1)+'</div>'; | |
632 var $mark = $(html); | |
633 $elem.append($mark); | |
634 $mark.offset({ left : mpos.x, top : mpos.y}); | |
635 } | |
636 } | |
637 }; | |
631 | 638 |
639 // auxiliary function to crop senseless precision | |
640 var cropFloat = function (x) { | |
641 return parseInt(10000 * x) / 10000; | |
642 }; | |
636 | 643 |
605 | 644 // hook plugin into jquery |
645 $.fn.digilib = function(method) { | |
646 if (methods[method]) { | |
634 | 647 // call method on this with the remaining arguments |
605 | 648 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); |
649 } else if (typeof(method) === 'object' || !method) { | |
634 | 650 // call init on this |
605 | 651 return methods.init.apply(this, arguments); |
652 } else { | |
634 | 653 $.error( 'Method ' + method + ' does not exist on jQuery.digilib' ); |
605 | 654 } |
655 }; | |
604 | 656 |
657 })(jQuery); |