Mercurial > hg > digilib
comparison client/digitallibrary/jquery/jquery.digilib.js @ 648:8f76bd79648e jquery
first try at birdview indicator
author | hertzhaft |
---|---|
date | Fri, 21 Jan 2011 00:33:33 +0100 |
parents | f18fac852d93 |
children | e328273b7ef4 |
comparison
equal
deleted
inserted
replaced
646:f18fac852d93 | 648:8f76bd79648e |
---|---|
1 /* | 1 /* |
2 * digilib jQuery plugin | 2 * digilib jQuery plugin |
3 * | 3 * |
4 */ | 4 */ |
5 | 5 |
6 // fallback for console.log calls | 6 // fallback for console.log calls |
7 if (typeof(console) === 'undefined') { | 7 if (typeof(console) === 'undefined') { |
8 var console = { | 8 var console = { |
9 log : function(){}, | 9 log : function(){}, |
10 debug : function(){}, | 10 debug : function(){}, |
196 'birdDivOptions' : {'dw' : 200, 'dh' : 200}, | 196 'birdDivOptions' : {'dw' : 200, 'dh' : 200}, |
197 // is the "about" window shown? | 197 // is the "about" window shown? |
198 'isAboutDivVisible' : false | 198 'isAboutDivVisible' : false |
199 | 199 |
200 }; | 200 }; |
201 | 201 |
202 // affine geometry classes | 202 // affine geometry classes |
203 var geom = dlGeometry(); | 203 var geom = dlGeometry(); |
204 | 204 |
205 var MAX_ZOOMAREA = geom.rectangle(0, 0, 1, 1); | 205 var MAX_ZOOMAREA = geom.rectangle(0, 0, 1, 1); |
206 | 206 |
207 var actions = { | 207 var actions = { |
208 // digilib initialization | 208 // digilib initialization |
209 init : function(options) { | 209 init : function(options) { |
210 // settings for this digilib instance are merged from defaults and options | 210 // settings for this digilib instance are merged from defaults and options |
211 var settings = $.extend({}, defaults, options); | 211 var settings = $.extend({}, defaults, options); |
281 showBirdDiv : function (data, show) { | 281 showBirdDiv : function (data, show) { |
282 if (data.$birdDiv == null) { | 282 if (data.$birdDiv == null) { |
283 // no bird div -> create | 283 // no bird div -> create |
284 setupBirdDiv(data); | 284 setupBirdDiv(data); |
285 } | 285 } |
286 // TODO: keep bird view visible after reload (parameter, cookie?) | |
286 data.settings.isBirdDivVisible = showDiv(data.settings.isBirdDivVisible, data.$birdDiv, show); | 287 data.settings.isBirdDivVisible = showDiv(data.settings.isBirdDivVisible, data.$birdDiv, show); |
287 }, | 288 showBirdIndicator(data); |
288 | 289 }, |
290 | |
289 // goto given page nr (+/-: relative) | 291 // goto given page nr (+/-: relative) |
290 gotoPage : function (data, pageNr) { | 292 gotoPage : function (data, pageNr) { |
291 var settings = data.settings; | 293 var settings = data.settings; |
292 var oldpn = settings.pn; | 294 var oldpn = settings.pn; |
293 var pn = setNumValue(settings, "pn", pageNr); | 295 var pn = setNumValue(settings, "pn", pageNr); |
308 data.marks = []; | 310 data.marks = []; |
309 data.zoomArea = MAX_ZOOMAREA; | 311 data.zoomArea = MAX_ZOOMAREA; |
310 // then reload | 312 // then reload |
311 redisplay(data); | 313 redisplay(data); |
312 }, | 314 }, |
313 | 315 |
314 // zoom by a given factor | 316 // zoom by a given factor |
315 zoomBy : function (data, factor) { | 317 zoomBy : function (data, factor) { |
316 zoomBy(data, factor); | 318 zoomBy(data, factor); |
317 }, | 319 }, |
318 | 320 |
354 | 356 |
355 // returns parameters from page url | 357 // returns parameters from page url |
356 var parseQueryParams = function() { | 358 var parseQueryParams = function() { |
357 return parseQueryString(window.location.search.slice(1)); | 359 return parseQueryString(window.location.search.slice(1)); |
358 }; | 360 }; |
359 | 361 |
360 // returns parameters from embedded img-element | 362 // returns parameters from embedded img-element |
361 var parseImgParams = function($elem) { | 363 var parseImgParams = function($elem) { |
362 var src = $elem.find('img').first().attr('src'); | 364 var src = $elem.find('img').first().attr('src'); |
363 if (!src) { | 365 if (!src) { |
364 return null; | 366 return null; |
428 var baseUrl = url.substring(0, pos); | 430 var baseUrl = url.substring(0, pos); |
429 var newurl = baseUrl + '?' + queryString; | 431 var newurl = baseUrl + '?' + queryString; |
430 return newurl; | 432 return newurl; |
431 }; | 433 }; |
432 | 434 |
433 // processes some parameters into objects and stuff | 435 // processes some parameters into objects and stuff |
434 var unpackParams = function (data) { | 436 var unpackParams = function (data) { |
435 var settings = data.settings; | 437 var settings = data.settings; |
436 // zoom area | 438 // zoom area |
437 var zoomArea = geom.rectangle(settings.wx, settings.wy, settings.ww, settings.wh); | 439 var zoomArea = geom.rectangle(settings.wx, settings.wy, settings.ww, settings.wh); |
438 data.zoomArea = zoomArea; | 440 data.zoomArea = zoomArea; |
469 for (var i = 0; i < pa.length ; i++) { | 471 for (var i = 0; i < pa.length ; i++) { |
470 opts[pa[i]] = pa[i]; | 472 opts[pa[i]] = pa[i]; |
471 } | 473 } |
472 } | 474 } |
473 data.dlOpts = opts; | 475 data.dlOpts = opts; |
474 }; | 476 }; |
475 | 477 |
476 // put objects back into parameters | 478 // put objects back into parameters |
477 var packParams = function (data) { | 479 var packParams = function (data) { |
478 var settings = data.settings; | 480 var settings = data.settings; |
479 // zoom area | 481 // zoom area |
480 if (data.zoomArea) { | 482 if (data.zoomArea) { |
514 clop += o; | 516 clop += o; |
515 } | 517 } |
516 settings.clop = clop; | 518 settings.clop = clop; |
517 } | 519 } |
518 }; | 520 }; |
519 | 521 |
520 // returns maximum size for scaler img in fullscreen mode | 522 // returns maximum size for scaler img in fullscreen mode |
521 var getFullscreenImgSize = function($elem) { | 523 var getFullscreenImgSize = function($elem) { |
522 var winH = $(window).height(); | 524 var winH = $(window).height(); |
523 var winW = $(window).width(); | 525 var winW = $(window).width(); |
524 // TODO: account for borders? | 526 // TODO: account for borders? |
525 return geom.size(winW, winH); | 527 return geom.size(winW, winH); |
526 }; | 528 }; |
527 | 529 |
528 // (re)load the img from a new scaler URL | 530 // (re)load the img from a new scaler URL |
529 var redisplay = function (data) { | 531 var redisplay = function (data) { |
530 var settings = data.settings; | 532 var settings = data.settings; |
531 if (settings.interactionMode === 'fullscreen') { | 533 if (settings.interactionMode === 'fullscreen') { |
532 // update location.href (browser URL) in fullscreen mode | 534 // update location.href (browser URL) in fullscreen mode |
641 var birdSettings = $.extend({}, settings, settings.birdDivOptions); | 643 var birdSettings = $.extend({}, settings, settings.birdDivOptions); |
642 var birdUrl = settings.scalerBaseUrl + '?' + getParamString(birdSettings, keys); | 644 var birdUrl = settings.scalerBaseUrl + '?' + getParamString(birdSettings, keys); |
643 // the bird's eye div | 645 // the bird's eye div |
644 var $birdviewDiv = $('<div class="birdview" style="display:none"/>'); | 646 var $birdviewDiv = $('<div class="birdview" style="display:none"/>'); |
645 // the detail indicator frame | 647 // the detail indicator frame |
646 var $birdzoomDiv = $('<div class="birdzoom"/>'); | 648 var $birdzoomDiv = $('<div class="birdzoom" style="position: absolute; background-color: transparent;"/>'); |
647 // the small image | 649 // the small image |
648 var $birdImg = $('<img class="birdimg"/>'); | 650 var $birdImg = $('<img class="birdimg"/>'); |
649 $elem.append($birdviewDiv); | 651 $elem.append($birdviewDiv); |
650 $birdviewDiv.append($birdzoomDiv); | 652 $birdviewDiv.append($birdzoomDiv); |
651 $birdviewDiv.append($birdImg); | 653 $birdviewDiv.append($birdImg); |
696 $div.fadeOut(); | 698 $div.fadeOut(); |
697 } | 699 } |
698 return isVisible; | 700 return isVisible; |
699 }; | 701 }; |
700 | 702 |
703 // shows bird view indicator | |
704 var showBirdIndicator = function (data) { | |
705 if (!data.settings.isBirdDivVisible || isFullArea(data)) return; | |
706 // TODO: more conditions: original size, pixel by pixel? | |
707 var $birdDiv = data.$birdDiv; | |
708 var $birdImg = $birdDiv.find('img.birdimg'); | |
709 var pos = $birdImg.offset(); | |
710 var birdRect = geom.rectangle(pos.left, pos.top, $birdImg.width(), $birdImg.height()); | |
711 var area = data.zoomArea; | |
712 // TODO: couldn't we do a trafo here? :-) | |
713 var indRect = geom.rectangle( | |
714 birdRect.x + birdRect.width * area.x, | |
715 birdRect.y + birdRect.height * area.y, | |
716 birdRect.width * area.width, | |
717 birdRect.height * area.height | |
718 ); | |
719 var $ind = $birdDiv.find('div.birdzoom'); | |
720 // TODO: set the coordinates all in one call? | |
721 $ind.width(indRect.width); | |
722 $ind.height(indRect.height); | |
723 $ind.offset({ left : indRect.x, top : indRect.y }); | |
724 // TODO: how to override this style with a CSS stylesheet? | |
725 if (!$ind.css('border')) $ind.css('border', '2px solid #ff0000'); | |
726 return; | |
727 }; | |
728 | |
701 // returns function for load event of scaler img | 729 // returns function for load event of scaler img |
702 var scalerImgLoadedHandler = function (data) { | 730 var scalerImgLoadedHandler = function (data) { |
703 var settings = data.settings; | 731 var settings = data.settings; |
704 var $elem = data.$elem; | 732 var $elem = data.$elem; |
705 var $img = data.$img; | 733 var $img = data.$img; |
706 | 734 |
707 return function () { | 735 return function () { |
708 console.debug("img loaded! this=", this, " data=", data); | 736 console.debug("img loaded! this=", this, " data=", data); |
709 var area = data.zoomArea; | 737 var area = data.zoomArea; |
710 // create Transform from current area and picsize | 738 // create Transform from current area and picsize |
711 var picpos = $img.offset(); | 739 var picpos = $img.offset(); |
722 renderMarks(data); | 750 renderMarks(data); |
723 //digilib.showArrows(); // show arrow overlays for zoom navigation | 751 //digilib.showArrows(); // show arrow overlays for zoom navigation |
724 // done -- hide about div --- | 752 // done -- hide about div --- |
725 // --- why? This only leads to suprise effects when displayed programmatically | 753 // --- why? This only leads to suprise effects when displayed programmatically |
726 // settings.isAboutDivVisible = showDiv(null, data.$aboutDiv, 0); | 754 // settings.isAboutDivVisible = showDiv(null, data.$aboutDiv, 0); |
755 showBirdIndicator(data); | |
727 }; | 756 }; |
728 }; | 757 }; |
729 | 758 |
730 // place marks on the image | 759 // place marks on the image |
731 var renderMarks = function (data) { | 760 var renderMarks = function (data) { |
742 $elem.append($mark); | 771 $elem.append($mark); |
743 $mark.offset({ left : mpos.x, top : mpos.y}); | 772 $mark.offset({ left : mpos.x, top : mpos.y}); |
744 } | 773 } |
745 } | 774 } |
746 }; | 775 }; |
747 | 776 |
748 // zooms by the given factor | 777 // zooms by the given factor |
749 var zoomBy = function(data, factor) { | 778 var zoomBy = function(data, factor) { |
750 var area = data.zoomArea; | 779 var area = data.zoomArea; |
751 var newarea = area.copy(); | 780 var newarea = area.copy(); |
752 // scale | 781 // scale |
789 } else { | 818 } else { |
790 settings[key] = value; | 819 settings[key] = value; |
791 } | 820 } |
792 return settings[key]; | 821 return settings[key]; |
793 }; | 822 }; |
794 | 823 |
824 // auxiliary function (from old dllib.js) | |
825 isFullArea = function(data) { | |
826 var area = data.zoomArea; | |
827 return (area.width == 1.0) && (area.height == 1.0); | |
828 }; | |
829 | |
795 // auxiliary function (from Douglas Crockford, A.10) | 830 // auxiliary function (from Douglas Crockford, A.10) |
796 var isNumber = function isNumber(value) { | 831 var isNumber = function isNumber(value) { |
797 return typeof value === 'number' && isFinite(value); | 832 return typeof value === 'number' && isFinite(value); |
798 }; | 833 }; |
799 | 834 |
800 // auxiliary function to crop senseless precision | 835 // auxiliary function to crop senseless precision |
801 var cropFloat = function (x) { | 836 var cropFloat = function (x) { |
802 return parseInt(10000 * x, 10) / 10000; | 837 return parseInt(10000 * x, 10) / 10000; |
803 }; | 838 }; |
804 | 839 |
805 // hook plugin into jquery | 840 // hook plugin into jquery |
806 $.fn.digilib = function(action) { | 841 $.fn.digilib = function(action) { |
807 if (actions[action]) { | 842 if (actions[action]) { |
808 // call action on this with the remaining arguments (inserting data as first argument) | 843 // call action on this with the remaining arguments (inserting data as first argument) |
809 var $elem = $(this); | 844 var $elem = $(this); |