Mercurial > hg > digilib
comparison client/digitallibrary/jquery/jquery.digilib.js @ 636:687447a0e799 jquery
zoomin and -out works now
gotopage resets (some) parameters
reload takes changed parameters (to put in url)
getParamString omits parameters with default values (for shorter urls)
author | robcast |
---|---|
date | Wed, 19 Jan 2011 20:03:44 +0100 |
parents | 3223fabd53bc |
children | 71cc855e2e4b |
comparison
equal
deleted
inserted
replaced
635:0547e61e4e3d | 636:687447a0e799 |
---|---|
18 onclick : "javascript:getRefWin()", | 18 onclick : "javascript:getRefWin()", |
19 tooltip : "get a reference URL", | 19 tooltip : "get a reference URL", |
20 img : "reference.png" | 20 img : "reference.png" |
21 }, | 21 }, |
22 zoomin : { | 22 zoomin : { |
23 onclick : "javascript:dl.zoomBy(1.4)", | 23 onclick : ["zoomBy", 1.4], |
24 tooltip : "zoom in", | 24 tooltip : "zoom in", |
25 img : "zoom-in.png" | 25 img : "zoom-in.png" |
26 }, | 26 }, |
27 zoomout : { | 27 zoomout : { |
28 onclick : "javascript:zoomBy(0.7)", | 28 onclick : ["zoomBy", 0.7], |
29 tooltip : "zoom out", | 29 tooltip : "zoom out", |
30 img : "zoom-out.png" | 30 img : "zoom-out.png" |
31 }, | 31 }, |
32 zoomarea : { | 32 zoomarea : { |
33 onclick : "javascript:zoomArea()", | 33 onclick : "javascript:zoomArea()", |
157 'scalerBaseUrl' : 'http://digilib.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler', | 157 'scalerBaseUrl' : 'http://digilib.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler', |
158 // list of Scaler parameters | 158 // list of Scaler parameters |
159 'scalerParamNames' : ['fn','pn','dw','dh','ww','wh','wx','wy','ws','mo', | 159 'scalerParamNames' : ['fn','pn','dw','dh','ww','wh','wx','wy','ws','mo', |
160 'rot','cont','brgt','rgbm','rgba','ddpi','ddpix','ddpiy'], | 160 'rot','cont','brgt','rgbm','rgba','ddpi','ddpix','ddpiy'], |
161 // Scaler parameter defaults | 161 // Scaler parameter defaults |
162 'pn' : 1, | |
162 'ww' : 1.0, | 163 'ww' : 1.0, |
163 'wh' : 1.0, | 164 'wh' : 1.0, |
164 'wx' : 0.0, | 165 'wx' : 0.0, |
165 'wy' : 0.0, | 166 'wy' : 0.0, |
166 'ws' : 1.0, | 167 'ws' : 1.0, |
167 'pn' : 1, | 168 'mo' : '', |
168 // mode of operation. | 169 'rot' : 0, |
169 // fullscreen: takes parameters from page URL, keeps state in page URL | 170 'cont' : 0, |
170 // embedded: takes parameters from Javascript options, keeps state inside object | 171 'brgt' : 0, |
172 'rgbm' : '0/0/0', | |
173 'rgba' : '0/0/0', | |
174 'ddpi' : null, | |
175 'ddpix' : null, | |
176 'ddpiy' : null, | |
177 // digilib defaults | |
178 'mk' : '', | |
179 // mode of operation: | |
180 // fullscreen = take parameters from page URL, keep state in page URL | |
181 // embedded = take parameters from Javascript options, keep state inside object | |
171 'interactionMode' : 'fullscreen', | 182 'interactionMode' : 'fullscreen', |
172 // actions | 183 // actions |
173 'actions' : actions, | 184 'actions' : actions, |
174 // path to button images (must end with a slash) | 185 // path to button images (must end with a slash) |
175 'buttonsImagePath' : '../greyskin/', | 186 'buttonsImagePath' : '../greyskin/', |
186 | 197 |
187 }; | 198 }; |
188 | 199 |
189 // affine geometry classes | 200 // affine geometry classes |
190 var geom = dlGeometry(); | 201 var geom = dlGeometry(); |
202 | |
203 var MAX_ZOOMAREA = geom.rectangle(0, 0, 1, 1); | |
191 | 204 |
192 var methods = { | 205 var methods = { |
193 // digilib initialization | 206 // digilib initialization |
194 init : function(options) { | 207 init : function(options) { |
195 // settings for this digilib instance are merged from defaults and options | 208 // settings for this digilib instance are merged from defaults and options |
264 data.settings.isBirdDivVisible = showDiv(data.settings.isBirdDivVisible, data.$birdDiv, show); | 277 data.settings.isBirdDivVisible = showDiv(data.settings.isBirdDivVisible, data.$birdDiv, show); |
265 }, | 278 }, |
266 | 279 |
267 // goto given page nr (+/-: relative) | 280 // goto given page nr (+/-: relative) |
268 gotoPage : function (pageNr) { | 281 gotoPage : function (pageNr) { |
269 var $elem = $(this); // the clicked button | 282 var $elem = $(this); |
270 var data = $elem.data('digilib'); | 283 var data = $elem.data('digilib'); |
271 var settings = data.settings; | 284 var settings = data.settings; |
272 var oldpn = settings.pn; | 285 var oldpn = settings.pn; |
273 var pn = setNumValue(settings, "pn", pageNr); | 286 var pn = setNumValue(settings, "pn", pageNr); |
274 if (pn == null) return false; // nothing happened | 287 if (pn == null) return false; // nothing happened |
282 alert("no such page (page number too high)"); | 295 alert("no such page (page number too high)"); |
283 settings.pn = oldpn; | 296 settings.pn = oldpn; |
284 return false; | 297 return false; |
285 } | 298 } |
286 } | 299 } |
287 // add pn to param list and remove mk and others(?) | 300 // add pn to param list and reset mk and others(?) |
288 data.queryParams.pn = pn; | 301 data.marks = []; |
289 delete data.queryParams.mk; | 302 data.zoomArea = MAX_ZOOMAREA; |
290 // then reload | 303 // then reload |
291 redisplay(data); | 304 redisplay(data, ['pn']); |
305 }, | |
306 | |
307 // zoom by a given factor | |
308 zoomBy : function (factor) { | |
309 var $elem = $(this); | |
310 var data = $elem.data('digilib'); | |
311 zoomBy(data, factor); | |
292 } | 312 } |
293 }; | 313 }; |
294 | 314 |
295 // sets a key to a value (relative values with +/- if relative=true) | 315 // sets a key to a value (relative values with +/- if relative=true) |
296 var setNumValue = function(settings, key, value) { | 316 var setNumValue = function(settings, key, value) { |
340 } | 360 } |
341 } | 361 } |
342 return params; | 362 return params; |
343 }; | 363 }; |
344 | 364 |
345 // returns a query string from key names from a parameter hash | 365 // returns a query string from key names from a parameter hash (ignoring if the same value is in defaults) |
346 var getParamString = function (settings, keys) { | 366 var getParamString = function (settings, keys, defaults) { |
347 var paramString = ''; | 367 var paramString = ''; |
348 var latter = false; | 368 var latter = false; |
349 for (i = 0; i < keys.length; ++i) { | 369 for (i = 0; i < keys.length; ++i) { |
350 var key = keys[i]; | 370 var key = keys[i]; |
351 if (settings[key]) { | 371 if ((settings[key] != null) && ((defaults == null) || (settings[key] !== defaults[key]))) { |
352 // first param gets no '&' | 372 // first param gets no '&' |
353 paramString += latter ? '&' : ''; | 373 paramString += latter ? '&' : ''; |
354 latter = true; | 374 latter = true; |
355 // add parm=val | 375 // add parm=val |
356 paramString += key + '=' + settings[key]; | 376 paramString += key + '=' + settings[key]; |
357 } | 377 } |
358 } | 378 } |
359 return paramString; | 379 return paramString; |
360 }; | 380 }; |
361 | 381 |
362 // returns URL and query string for Scaler | 382 // returns URL and query string for Scaler |
363 var getScalerUrl = function (data) { | 383 var getScalerUrl = function (data) { |
364 var settings = data.settings; | 384 var settings = data.settings; |
365 var keys = settings.scalerParamNames; | 385 var keys = settings.scalerParamNames; |
366 var queryString = getParamString(settings, keys); | 386 var queryString = getParamString(settings, keys, defaults); |
367 var url = settings.scalerBaseUrl + '?' + queryString; | 387 var url = settings.scalerBaseUrl + '?' + queryString; |
368 return url; | 388 return url; |
369 }; | 389 }; |
370 | 390 |
371 // returns URL and query string for current digilib | 391 // returns URL and query string for current digilib |
372 var getDigilibUrl = function (data) { | 392 var getDigilibUrl = function (data, changedParams) { |
373 var settings = data.settings; | 393 packParams(data); |
394 var settings = data.settings; | |
395 var queryParams = data.queryParams; | |
396 // add changedParams | |
397 if (changedParams != null) { | |
398 for (var i=0; i < changedParams.length; ++i) { | |
399 var k = changedParams[i]; | |
400 if (queryParams[k] == null) { | |
401 // add param (value doesn't matter) | |
402 queryParams[k] = k; | |
403 } | |
404 } | |
405 } | |
374 // make list from queryParams keys | 406 // make list from queryParams keys |
375 var keys = []; | 407 var keys = []; |
376 for (var k in data.queryParams) { | 408 for (var k in data.queryParams) { |
377 keys.push(k); | 409 keys.push(k); |
378 } | 410 } |
379 var queryString = getParamString(settings, keys); | 411 var queryString = getParamString(settings, keys, defaults); |
380 var url = window.location.toString(); | 412 var url = window.location.toString(); |
381 var pos = url.indexOf('?'); | 413 var pos = url.indexOf('?'); |
382 var baseUrl = url.substring(0, pos); | 414 var baseUrl = url.substring(0, pos); |
383 var newurl = baseUrl + '?' + queryString; | 415 var newurl = baseUrl + '?' + queryString; |
384 return newurl; | 416 return newurl; |
387 // processes some parameters into objects and stuff | 419 // processes some parameters into objects and stuff |
388 var unpackParams = function (data) { | 420 var unpackParams = function (data) { |
389 var settings = data.settings; | 421 var settings = data.settings; |
390 // zoom area | 422 // zoom area |
391 var zoomArea = geom.rectangle(settings.wx, settings.wy, settings.ww, settings.wh); | 423 var zoomArea = geom.rectangle(settings.wx, settings.wy, settings.ww, settings.wh); |
392 settings.zoomArea = zoomArea; | 424 data.zoomArea = zoomArea; |
393 // marks | 425 // marks |
394 var marks = []; | 426 var marks = []; |
395 var mk = settings.mk || ''; | 427 var mk = settings.mk || ''; |
396 if (mk.indexOf(";") >= 0) { | 428 if (mk.indexOf(";") >= 0) { |
397 var pa = mk.split(";"); // old format with ";" | 429 var pa = mk.split(";"); // old format with ";" |
402 var pos = pa[i].split("/"); | 434 var pos = pa[i].split("/"); |
403 if (pos.length > 1) { | 435 if (pos.length > 1) { |
404 marks.push(geom.position(pos[0], pos[1])); | 436 marks.push(geom.position(pos[0], pos[1])); |
405 } | 437 } |
406 } | 438 } |
407 settings.marks = marks; | 439 data.marks = marks; |
408 }; | 440 }; |
409 | 441 |
410 // put objects back into parameters | 442 // put objects back into parameters |
411 var packParams = function (data) { | 443 var packParams = function (data) { |
412 var settings = data.settings; | 444 var settings = data.settings; |
413 // zoom area | 445 // zoom area |
414 if (settings.zoomArea) { | 446 if (data.zoomArea) { |
415 settings.wx = settings.zoomArea.x; | 447 settings.wx = data.zoomArea.x; |
416 settings.wy = settings.zoomArea.y; | 448 settings.wy = data.zoomArea.y; |
417 settings.ww = settings.zoomArea.width; | 449 settings.ww = data.zoomArea.width; |
418 settings.wh = settings.zoomArea.height; | 450 settings.wh = data.zoomArea.height; |
419 } | 451 } |
420 // marks | 452 // marks |
421 if (settings.marks) { | 453 if (data.marks) { |
422 var ma = []; | 454 var ma = []; |
423 for (var i = 0; i < settings.marks.length; i++) { | 455 for (var i = 0; i < data.marks.length; i++) { |
424 ma.push(cropFloat(settings.marks[i].x) + "/" + cropFloat(settings.marks[i].y)); | 456 ma.push(cropFloat(data.marks[i].x) + "/" + cropFloat(data.marks[i].y)); |
425 } | 457 } |
426 settings.mk = ma.join(","); | 458 settings.mk = ma.join(","); |
427 } | 459 } |
428 }; | 460 }; |
429 | 461 |
434 // TODO: account for borders? | 466 // TODO: account for borders? |
435 return geom.size(winW, winH); | 467 return geom.size(winW, winH); |
436 }; | 468 }; |
437 | 469 |
438 // (re)load the img from a new scaler URL | 470 // (re)load the img from a new scaler URL |
439 var redisplay = function (data) { | 471 var redisplay = function (data, changedParams) { |
440 var settings = data.settings; | 472 var settings = data.settings; |
441 if (settings.interactionMode === 'fullscreen') { | 473 if (settings.interactionMode === 'fullscreen') { |
442 // update location.href (browser URL) in fullscreen mode | 474 // update location.href (browser URL) in fullscreen mode |
443 var url = getDigilibUrl(data); | 475 var url = getDigilibUrl(data, changedParams); |
444 var history = window.history; | 476 var history = window.history; |
445 if (typeof(history.pushState) === 'function') { | 477 if (typeof(history.pushState) === 'function') { |
446 console.debug("we could modify history, but we don't..."); | 478 console.debug("we could modify history, but we don't..."); |
447 } | 479 } |
448 window.location = url; | 480 window.location = url; |
603 var $elem = data.target; | 635 var $elem = data.target; |
604 var $img = data.$img; | 636 var $img = data.$img; |
605 | 637 |
606 return function () { | 638 return function () { |
607 console.debug("img loaded! this=", this, " data=", data); | 639 console.debug("img loaded! this=", this, " data=", data); |
608 var area = settings.zoomArea; | 640 var area = data.zoomArea; |
609 // create Transform from current area and picsize | 641 // create Transform from current area and picsize |
610 var picpos = $img.offset(); | 642 var picpos = $img.offset(); |
611 var picrect = geom.rectangle(picpos.left, picpos.top, $img.width(), $img.height()); | 643 var picrect = geom.rectangle(picpos.left, picpos.top, $img.width(), $img.height()); |
612 var trafo = geom.transform(); | 644 var trafo = geom.transform(); |
613 // subtract area offset and size | 645 // subtract area offset and size |
617 trafo.concat(trafo.getScale(picrect)); | 649 trafo.concat(trafo.getScale(picrect)); |
618 trafo.concat(trafo.getTranslation(picrect)); | 650 trafo.concat(trafo.getTranslation(picrect)); |
619 data.imgTrafo = trafo; | 651 data.imgTrafo = trafo; |
620 // display marks | 652 // display marks |
621 renderMarks(data); | 653 renderMarks(data); |
622 // show birds eye view | |
623 //showDiv(settings.isBirdDivVisible); | |
624 //digilib.showArrows(); // show arrow overlays for zoom navigation | 654 //digilib.showArrows(); // show arrow overlays for zoom navigation |
625 // done -- hide about div --- | 655 // done -- hide about div --- |
626 // --- why? This only leads to suprise effects when displayed programmatically | 656 // --- why? This only leads to suprise effects when displayed programmatically |
627 // settings.isAboutDivVisible = showDiv(null, data.$aboutDiv, 0); | 657 // settings.isAboutDivVisible = showDiv(null, data.$aboutDiv, 0); |
628 }; | 658 }; |
629 }; | 659 }; |
630 | 660 |
631 // place marks on the image | 661 // place marks on the image |
632 var renderMarks = function (data) { | 662 var renderMarks = function (data) { |
633 var $elem = data.target; | 663 var $elem = data.target; |
634 var marks = data.settings.marks; | 664 var marks = data.marks; |
635 for (var i = 0; i < marks.length; i++) { | 665 for (var i = 0; i < marks.length; i++) { |
636 var mark = marks[i]; | 666 var mark = marks[i]; |
637 if (data.settings.zoomArea.containsPosition(mark)) { | 667 if (data.zoomArea.containsPosition(mark)) { |
638 var mpos = data.imgTrafo.transform(mark); | 668 var mpos = data.imgTrafo.transform(mark); |
639 // create mark | 669 // create mark |
640 var html = '<div class="mark">'+(i+1)+'</div>'; | 670 var html = '<div class="mark">'+(i+1)+'</div>'; |
641 var $mark = $(html); | 671 var $mark = $(html); |
642 $elem.append($mark); | 672 $elem.append($mark); |
643 $mark.offset({ left : mpos.x, top : mpos.y}); | 673 $mark.offset({ left : mpos.x, top : mpos.y}); |
644 } | 674 } |
645 } | 675 } |
646 }; | 676 }; |
647 | 677 |
678 var zoomBy = function(data, factor) { | |
679 // zooms by the given factor | |
680 var area = data.zoomArea; | |
681 var newarea = area.copy(); | |
682 // scale | |
683 newarea.width /= factor; | |
684 newarea.height /= factor; | |
685 // and recenter | |
686 newarea.x -= 0.5 * (newarea.width - area.width); | |
687 newarea.y -= 0.5 * (newarea.height - area.height); | |
688 newarea = MAX_ZOOMAREA.fit(newarea); | |
689 data.zoomArea = newarea; | |
690 redisplay(data, ['wx', 'wy', 'ww', 'wh']); | |
691 }; | |
692 | |
648 // auxiliary function (from Douglas Crockford, A.10) | 693 // auxiliary function (from Douglas Crockford, A.10) |
649 var isNumber = function isNumber(value) { | 694 var isNumber = function isNumber(value) { |
650 return typeof value === 'number' && isFinite(value); | 695 return typeof value === 'number' && isFinite(value); |
651 }; | 696 }; |
652 | 697 |