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);