comparison client/digitallibrary/jquery/jquery.digilib.js @ 713:c1fa722c570e jquery

more cosmetics: added options to validate with http://www.jslint.com still doesn't fully validate because of "== null" and if without block. removed unnecessary semicolons after if and for.
author robcast
date Sun, 30 Jan 2011 17:58:56 +0100
parents eab17859be79
children 667a316edb89
comparison
equal deleted inserted replaced
711:eab17859be79 713:c1fa722c570e
1 /* 1 /* Copyright (c) 2011 Martin Raspe, Robert Casties
2
3 This program is free software: you can redistribute it and/or modify
4 it under the terms of the GNU Lesser General Public License as published by
5 the Free Software Foundation, either version 2 of the License, or
6 (at your option) any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU Lesser General Public License for more details.
12
13 You should have received a copy of the GNU Lesser General Public License
14 along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16 Authors:
17 Martin Raspe, Robert Casties, 11.1.2011
18 */
19
20 /**
2 * digilib jQuery plugin 21 * digilib jQuery plugin
3 * 22 *
4 */ 23 */
24
25 /*jslint browser: true, debug: true, forin: true */
5 26
6 // fallback for console.log calls 27 // fallback for console.log calls
7 if (typeof(console) === 'undefined') { 28 if (typeof(console) === 'undefined') {
8 var console = { 29 var console = {
9 log : function(){}, 30 log : function(){},
10 debug : function(){}, 31 debug : function(){},
11 error : function(){} 32 error : function(){}
12 }; 33 };
13 var customConsole = true; 34 var customConsole = true;
14 }; 35 }
15 36
16 (function($) { 37 (function($) {
17 var buttons = { 38 var buttons = {
18 reference : { 39 reference : {
19 onclick : "reference", 40 onclick : "reference",
263 // merge query parameters 284 // merge query parameters
264 if (isFullscreen) { 285 if (isFullscreen) {
265 params = queryParams; 286 params = queryParams;
266 } else { 287 } else {
267 params = parseImgParams($elem); 288 params = parseImgParams($elem);
268 }; 289 }
269 // store $(this) element in the settings 290 // store $(this) element in the settings
270 elemSettings = $.extend({}, settings, params); 291 elemSettings = $.extend({}, settings, params);
271 data = { 292 data = {
272 $elem : $elem, 293 $elem : $elem,
273 settings : elemSettings, 294 settings : elemSettings,
280 // create HTML structure for scaler 301 // create HTML structure for scaler
281 setupScalerDiv(data); 302 setupScalerDiv(data);
282 // add buttons 303 // add buttons
283 for (var i = 0; i < elemSettings.visibleButtonSets; ++i) { 304 for (var i = 0; i < elemSettings.visibleButtonSets; ++i) {
284 showButtons(data, true, i); 305 showButtons(data, true, i);
285 }; 306 }
286 // bird's eye view creation 307 // bird's eye view creation
287 if (elemSettings.isBirdDivVisible) { 308 if (elemSettings.isBirdDivVisible) {
288 setupBirdDiv(data); 309 setupBirdDiv(data);
289 }; 310 }
290 // about window creation - TODO: could be deferred? restrict to only one item? 311 // about window creation - TODO: could be deferred? restrict to only one item?
291 setupAboutDiv(data); 312 setupAboutDiv(data);
292 // TODO: the actual moving code 313 // TODO: the actual moving code
293 setupZoomDrag(data); 314 setupZoomDrag(data);
294 }); 315 });
473 resetData(data); 494 resetData(data);
474 // delete all digilib parameters 495 // delete all digilib parameters
475 for (var i = 0; i < paramNames.length; i++) { 496 for (var i = 0; i < paramNames.length; i++) {
476 var paramName = paramNames[i]; 497 var paramName = paramNames[i];
477 delete settings[paramName]; 498 delete settings[paramName];
478 }; 499 }
479 // fullscreen: restore only fn/pn parameters 500 // fullscreen: restore only fn/pn parameters
480 if (settings.interactionMode === 'fullscreen') { 501 if (settings.interactionMode === 'fullscreen') {
481 settings['fn'] = params.fn || ''; // no default defined 502 settings.fn = params.fn || ''; // no default defined
482 settings['pn'] = params.pn || defaults.pn; 503 settings.pn = params.pn || defaults.pn;
483 // embedded: restore original parameters 504 // embedded: restore original parameters
484 } else { 505 } else {
485 $.extend(settings, params); 506 $.extend(settings, params);
486 }; 507 }
487 // TODO: should we really reset all user preferences here? 508 // TODO: should we really reset all user preferences here?
488 settings.isBirdDivVisible = false; 509 settings.isBirdDivVisible = false;
489 settings.visibleButtonSets = 1; 510 settings.visibleButtonSets = 1;
490 redisplay(data); 511 redisplay(data);
491 }, 512 },
496 var url; 517 var url;
497 if (settings.interactionMode === 'fullscreen') { 518 if (settings.interactionMode === 'fullscreen') {
498 url = getDigilibUrl(data); 519 url = getDigilibUrl(data);
499 } else { 520 } else {
500 url = getScalerUrl(data); 521 url = getScalerUrl(data);
501 }; 522 }
502 if (noprompt == null) { 523 if (noprompt == null) {
503 window.prompt("URL reference to the current view", url); 524 window.prompt("URL reference to the current view", url);
504 } 525 }
505 return url; 526 return url;
506 }, 527 },
575 // returns URL and query string for Scaler 596 // returns URL and query string for Scaler
576 var getScalerUrl = function (data) { 597 var getScalerUrl = function (data) {
577 var settings = data.settings; 598 var settings = data.settings;
578 if (settings.scalerBaseUrl == null) { 599 if (settings.scalerBaseUrl == null) {
579 alert("ERROR: URL of digilib Scaler servlet missing!"); 600 alert("ERROR: URL of digilib Scaler servlet missing!");
580 }; 601 }
581 packParams(data); 602 packParams(data);
582 var keys = settings.scalerParamNames; 603 var keys = settings.scalerParamNames;
583 var queryString = getParamString(settings, keys, defaults); 604 var queryString = getParamString(settings, keys, defaults);
584 var url = settings.scalerBaseUrl + '?' + queryString; 605 var url = settings.scalerBaseUrl + '?' + queryString;
585 return url; 606 return url;
609 var mk = settings.mk; 630 var mk = settings.mk;
610 if (mk.indexOf(";") >= 0) { 631 if (mk.indexOf(";") >= 0) {
611 var pa = mk.split(";"); // old format with ";" 632 var pa = mk.split(";"); // old format with ";"
612 } else { 633 } else {
613 var pa = mk.split(","); // new format 634 var pa = mk.split(","); // new format
614 }; 635 }
615 for (var i = 0; i < pa.length ; i++) { 636 for (var i = 0; i < pa.length ; i++) {
616 var pos = pa[i].split("/"); 637 var pos = pa[i].split("/");
617 if (pos.length > 1) { 638 if (pos.length > 1) {
618 marks.push(geom.position(pos[0], pos[1])); 639 marks.push(geom.position(pos[0], pos[1]));
619 }; 640 }
620 }; 641 }
621 }; 642 }
622 data.marks = marks; 643 data.marks = marks;
623 // mo (Scaler flags) 644 // mo (Scaler flags)
624 var flags = {}; 645 var flags = {};
625 if (settings.mo) { 646 if (settings.mo) {
626 var pa = settings.mo.split(","); 647 var pa = settings.mo.split(",");
627 for (var i = 0; i < pa.length ; i++) { 648 for (var i = 0; i < pa.length ; i++) {
628 flags[pa[i]] = pa[i]; 649 flags[pa[i]] = pa[i];
629 }; 650 }
630 }; 651 }
631 data.scalerFlags = flags; 652 data.scalerFlags = flags;
632 retrieveOptionsCookie(data); 653 retrieveOptionsCookie(data);
633 }; 654 };
634 655
635 // put objects back into parameters 656 // put objects back into parameters
639 if (data.zoomArea) { 660 if (data.zoomArea) {
640 settings.wx = cropFloat(data.zoomArea.x); 661 settings.wx = cropFloat(data.zoomArea.x);
641 settings.wy = cropFloat(data.zoomArea.y); 662 settings.wy = cropFloat(data.zoomArea.y);
642 settings.ww = cropFloat(data.zoomArea.width); 663 settings.ww = cropFloat(data.zoomArea.width);
643 settings.wh = cropFloat(data.zoomArea.height); 664 settings.wh = cropFloat(data.zoomArea.height);
644 }; 665 }
645 // marks 666 // marks
646 if (data.marks) { 667 if (data.marks) {
647 settings.mk = ''; 668 settings.mk = '';
648 for (var i = 0; i < data.marks.length; i++) { 669 for (var i = 0; i < data.marks.length; i++) {
649 if (i) { 670 if (i) {
650 settings.mk += ','; 671 settings.mk += ',';
651 }; 672 }
652 settings.mk 673 settings.mk += cropFloat(data.marks[i].x).toString() +
653 += cropFloat(data.marks[i].x).toString() + '/' 674 '/' + cropFloat(data.marks[i].y).toString();
654 + cropFloat(data.marks[i].y).toString(); 675 }
655 }; 676 }
656 };
657 // Scaler flags 677 // Scaler flags
658 if (data.scalerFlags) { 678 if (data.scalerFlags) {
659 var mo = ''; 679 var mo = '';
660 for (var f in data.scalerFlags) { 680 for (var f in data.scalerFlags) {
661 if (mo) { 681 if (mo) {
690 data.dlOpts.buttons = settings.visibleButtonSets; 710 data.dlOpts.buttons = settings.visibleButtonSets;
691 var clop = ''; 711 var clop = '';
692 for (var o in data.dlOpts) { 712 for (var o in data.dlOpts) {
693 if (clop) { 713 if (clop) {
694 clop += '&'; 714 clop += '&';
695 }; 715 }
696 clop += o + '=' + data.dlOpts[o]; 716 clop += o + '=' + data.dlOpts[o];
697 }; 717 }
698 if (jQuery.cookie) { 718 if (jQuery.cookie) {
699 var ck = "digilib:fn:" + escape(settings.fn) + ":pn:" + settings.pn; 719 var ck = "digilib:fn:" + escape(settings.fn) + ":pn:" + settings.pn;
700 console.debug("set cookie=", ck, " value=", clop); 720 console.debug("set cookie=", ck, " value=", clop);
701 jQuery.cookie(ck, clop); 721 jQuery.cookie(ck, clop);
702 }; 722 }
703 }; 723 }
704 }; 724 };
705 725
706 var retrieveOptionsCookie = function (data) { 726 var retrieveOptionsCookie = function (data) {
707 // clop (digilib options) 727 // clop (digilib options)
708 var opts = {}; 728 var opts = {};
719 var ck = "digilib:fn:" + escape(settings.fn) + ":pn:" + settings.pn; 739 var ck = "digilib:fn:" + escape(settings.fn) + ":pn:" + settings.pn;
720 var cp = jQuery.cookie(ck); 740 var cp = jQuery.cookie(ck);
721 console.debug("get cookie=", ck, " value=", cp); 741 console.debug("get cookie=", ck, " value=", cp);
722 // in query string format 742 // in query string format
723 opts = parseQueryString(cp); 743 opts = parseQueryString(cp);
724 }; 744 }
725 data.dlOpts = opts; 745 data.dlOpts = opts;
726 // birdview option 746 // birdview option
727 if (opts.birdview != null) { 747 if (opts.birdview != null) {
728 settings.isBirdDivVisible = opts.birdview === '1'; 748 settings.isBirdDivVisible = opts.birdview === '1';
729 }; 749 }
730 // visible button sets 750 // visible button sets
731 if (opts.buttons != null) { 751 if (opts.buttons != null) {
732 settings.visibleButtonSets = opts.buttons; 752 settings.visibleButtonSets = opts.buttons;
733 }; 753 }
734 }; 754 };
735 755
736 // clear digilib data for reset 756 // clear digilib data for reset
737 var resetData = function (data) { 757 var resetData = function (data) {
758 // TODO: we should reset instead of delete
738 if (data.zoomArea) delete data.zoomArea; 759 if (data.zoomArea) delete data.zoomArea;
739 if (data.marks) delete data.marks; 760 if (data.marks) delete data.marks;
740 if (data.scalerFlags) delete data.scalerFlags; 761 if (data.scalerFlags) delete data.scalerFlags;
741 }; 762 };
742 763
747 // update location.href (browser URL) in fullscreen mode 768 // update location.href (browser URL) in fullscreen mode
748 var url = getDigilibUrl(data); 769 var url = getDigilibUrl(data);
749 var history = window.history; 770 var history = window.history;
750 if (typeof(history.pushState) === 'function') { 771 if (typeof(history.pushState) === 'function') {
751 console.debug("we could modify history, but we don't..."); 772 console.debug("we could modify history, but we don't...");
752 }; 773 }
753 window.location = url; 774 window.location = url;
754 } else { 775 } else {
755 // embedded mode -- just change img src 776 // embedded mode -- just change img src
756 var url = getScalerUrl(data); 777 var url = getScalerUrl(data);
757 data.$img.attr('src', url); 778 data.$img.attr('src', url);
758 }; 779 }
759 }; 780 };
760 781
761 // returns maximum size for scaler img in fullscreen mode 782 // returns maximum size for scaler img in fullscreen mode
762 var getFullscreenImgSize = function($elem) { 783 var getFullscreenImgSize = function($elem) {
763 var $win = $(window); 784 var $win = $(window);
774 var $img, scalerUrl; 795 var $img, scalerUrl;
775 // fullscreen 796 // fullscreen
776 if (settings.interactionMode === 'fullscreen') { 797 if (settings.interactionMode === 'fullscreen') {
777 var imgSize = getFullscreenImgSize($elem); 798 var imgSize = getFullscreenImgSize($elem);
778 // fitwidth/height omits destination height/width 799 // fitwidth/height omits destination height/width
779 if (data.dlOpts['fitheight'] == null) { 800 if (data.dlOpts.fitheight == null) {
780 settings.dw = imgSize.width; 801 settings.dw = imgSize.width;
781 }; 802 }
782 if (data.dlOpts['fitwidth'] == null) { 803 if (data.dlOpts.fitwidth == null) {
783 settings.dh = imgSize.height; 804 settings.dh = imgSize.height;
784 }; 805 }
785 $img = $('<img/>'); 806 $img = $('<img/>');
786 scalerUrl = getScalerUrl(data); 807 scalerUrl = getScalerUrl(data);
787 // embedded mode -- try to keep img tag 808 // embedded mode -- try to keep img tag
788 } else { 809 } else {
789 $img = $elem.find('img'); 810 $img = $elem.find('img');
792 scalerUrl = $img.attr('src'); 813 scalerUrl = $img.attr('src');
793 $img.detach(); 814 $img.detach();
794 } else { 815 } else {
795 $img = $('<img/>'); 816 $img = $('<img/>');
796 scalerUrl = getScalerUrl(data); 817 scalerUrl = getScalerUrl(data);
797 }; 818 }
798 } 819 }
799 // create new html 820 // create new html
800 $elem.empty(); // TODO: should we keep stuff for customization? 821 $elem.empty(); // TODO: should we keep stuff for customization?
801 var $scaler = $('<div class="scaler"/>'); 822 var $scaler = $('<div class="scaler"/>');
802 $elem.append($scaler); 823 $elem.append($scaler);
901 data.$birdImg = $birdImg; 922 data.$birdImg = $birdImg;
902 $birdImg.load(birdImgLoadedHandler(data)); 923 $birdImg.load(birdImgLoadedHandler(data));
903 $birdImg.attr('src', birdUrl); 924 $birdImg.attr('src', birdUrl);
904 if (data.settings.isBirdDivVisible) { 925 if (data.settings.isBirdDivVisible) {
905 $birdDiv.show(); 926 $birdDiv.show();
906 }; 927 }
907 birdZoom(data); 928 birdZoom(data);
908 }; 929 };
909 930
910 // creates HTML structure for the about view in elem 931 // creates HTML structure for the about view in elem
911 var setupAboutDiv = function (data) { 932 var setupAboutDiv = function (data) {
938 // toggle visibility 959 // toggle visibility
939 isVisible = !isVisible; 960 isVisible = !isVisible;
940 } else { 961 } else {
941 // set visibility 962 // set visibility
942 isVisible = show; 963 isVisible = show;
943 }; 964 }
944 if (isVisible) { 965 if (isVisible) {
945 $div.fadeIn(); 966 $div.fadeIn();
946 } else { 967 } else {
947 $div.fadeOut(); 968 $div.fadeOut();
948 }; 969 }
949 return isVisible; 970 return isVisible;
950 }; 971 };
951 972
952 // display more (or less) button sets 973 // display more (or less) button sets
953 var showButtons = function (data, more, setIdx, animated) { 974 var showButtons = function (data, more, setIdx, animated) {
959 if (data.$buttonSets && data.$buttonSets[setIdx]) { 980 if (data.$buttonSets && data.$buttonSets[setIdx]) {
960 // set exists 981 // set exists
961 $set = data.$buttonSets[setIdx]; 982 $set = data.$buttonSets[setIdx];
962 } else { 983 } else {
963 $set = createButtons(data, setIdx); 984 $set = createButtons(data, setIdx);
964 }; 985 }
965 if ($set == null) return false; 986 if ($set == null) return false;
966 var btnWidth = $set.width(); 987 var btnWidth = $set.width();
967 // move remaining sets left and show new set 988 // move remaining sets left and show new set
968 if ($otherSets.length > 0) { 989 if ($otherSets.length > 0) {
969 $otherSets.animate({right : '+='+btnWidth+'px'}, atime, 990 $otherSets.animate({right : '+='+btnWidth+'px'}, atime,
998 // move [0.5,0.5] to center 1019 // move [0.5,0.5] to center
999 trafo.concat(trafo.getTranslation(geom.position(-0.5, -0.5))); 1020 trafo.concat(trafo.getTranslation(geom.position(-0.5, -0.5)));
1000 if (hmir) { 1021 if (hmir) {
1001 // mirror about center 1022 // mirror about center
1002 trafo.concat(trafo.getMirror('y')); 1023 trafo.concat(trafo.getMirror('y'));
1003 }; 1024 }
1004 if (vmir) { 1025 if (vmir) {
1005 // mirror about center 1026 // mirror about center
1006 trafo.concat(trafo.getMirror('x')); 1027 trafo.concat(trafo.getMirror('x'));
1007 }; 1028 }
1008 if (rot) { 1029 if (rot) {
1009 // rotate around center 1030 // rotate around center
1010 trafo.concat(trafo.getRotation(parseFloat(rot))); 1031 trafo.concat(trafo.getRotation(parseFloat(rot)));
1011 }; 1032 }
1012 // move back 1033 // move back
1013 trafo.concat(trafo.getTranslation(geom.position(0.5, 0.5))); 1034 trafo.concat(trafo.getTranslation(geom.position(0.5, 0.5)));
1014 }; 1035 }
1015 // scale to screen position and size 1036 // scale to screen position and size
1016 trafo.concat(trafo.getScale(picrect)); 1037 trafo.concat(trafo.getScale(picrect));
1017 trafo.concat(trafo.getTranslation(picrect)); 1038 trafo.concat(trafo.getTranslation(picrect));
1018 return trafo; 1039 return trafo;
1019 }; 1040 };
1032 // TODO: digilib.showArrows(); // show arrow overlays for zoom navigation 1053 // TODO: digilib.showArrows(); // show arrow overlays for zoom navigation
1033 var $birdImg = data.$birdImg; 1054 var $birdImg = data.$birdImg;
1034 // should the birdview adapt to mirror or rotation? decision: No. :-) 1055 // should the birdview adapt to mirror or rotation? decision: No. :-)
1035 if ($birdImg) { 1056 if ($birdImg) {
1036 $birdImg.triggerHandler('load'); 1057 $birdImg.triggerHandler('load');
1037 }; 1058 }
1038 }; 1059 };
1039 }; 1060 };
1040 1061
1041 // returns function for load event of bird's eye view img 1062 // returns function for load event of bird's eye view img
1042 var birdImgLoadedHandler = function (data) { 1063 var birdImgLoadedHandler = function (data) {
1063 // create mark 1084 // create mark
1064 var html = '<div class="mark">'+(i+1)+'</div>'; 1085 var html = '<div class="mark">'+(i+1)+'</div>';
1065 var $mark = $(html); 1086 var $mark = $(html);
1066 $elem.append($mark); 1087 $elem.append($mark);
1067 $mark.offset({left : mpos.x, top : mpos.y}); 1088 $mark.offset({left : mpos.x, top : mpos.y});
1068 }; 1089 }
1069 }; 1090 }
1070 }; 1091 };
1071 1092
1072 // show zoom area indicator on bird's eye view 1093 // show zoom area indicator on bird's eye view
1073 var renderbirdZoom = function (data) { 1094 var renderbirdZoom = function (data) {
1074 var $birdZoom = data.$birdZoom; 1095 var $birdZoom = data.$birdZoom;
1087 $birdZoom.width(coords.width); 1108 $birdZoom.width(coords.width);
1088 $birdZoom.height(coords.height); 1109 $birdZoom.height(coords.height);
1089 $birdZoom.offset(coords); 1110 $birdZoom.offset(coords);
1090 $birdZoom.show(); 1111 $birdZoom.show();
1091 return; 1112 return;
1092 }; 1113 }
1093 // nice animation for embedded mode :-) 1114 // nice animation for embedded mode :-)
1094 var makeCompleteFunction = function($birdZoom, normalSize) { 1115 var makeCompleteFunction = function($birdZoom, normalSize) {
1095 return function() { 1116 return function() {
1096 if (normalSize) $birdZoom.hide(); 1117 if (normalSize) $birdZoom.hide();
1097 }; 1118 };
1205 // move birdZoom div, keeping size 1226 // move birdZoom div, keeping size
1206 newRect = geom.rectangle( 1227 newRect = geom.rectangle(
1207 birdZoomRect.x + dx, 1228 birdZoomRect.x + dx,
1208 birdZoomRect.y + dy, 1229 birdZoomRect.y + dy,
1209 birdZoomRect.width, 1230 birdZoomRect.width,
1210 birdZoomRect.height 1231 birdZoomRect.height);
1211 );
1212 // stay within birdimage 1232 // stay within birdimage
1213 newRect.stayInside(birdImgRect); 1233 newRect.stayInside(birdImgRect);
1214 $birdZoom.offset({left : newRect.x, top : newRect.y}); 1234 $birdZoom.offset({left : newRect.x, top : newRect.y});
1215 // $birdZoom.show(); 1235 // $birdZoom.show();
1216 return false; 1236 return false;
1224 $birdZoom.unbind("mousemove.digilib", birdZoomMove); 1244 $birdZoom.unbind("mousemove.digilib", birdZoomMove);
1225 $birdZoom.unbind("mouseup.digilib", birdZoomEndDrag); 1245 $birdZoom.unbind("mouseup.digilib", birdZoomEndDrag);
1226 if (newRect == null) { // no movement happened 1246 if (newRect == null) { // no movement happened
1227 startPos = birdZoomRect.getCenter(); 1247 startPos = birdZoomRect.getCenter();
1228 birdZoomMove(evt); // set center to click position 1248 birdZoomMove(evt); // set center to click position
1229 }; 1249 }
1230 if (data.zoomArea) { 1250 if (data.zoomArea) {
1231 // should always be true 1251 // should always be true
1232 var x = cropFloat((newRect.x - birdImgRect.x + 2) / birdImgRect.width); 1252 var x = cropFloat((newRect.x - birdImgRect.x + 2) / birdImgRect.width);
1233 var y = cropFloat((newRect.y - birdImgRect.y + 2) / birdImgRect.height); 1253 var y = cropFloat((newRect.y - birdImgRect.y + 2) / birdImgRect.height);
1234 data.zoomArea.x = x; 1254 data.zoomArea.x = x;
1235 data.zoomArea.y = y; 1255 data.zoomArea.y = y;
1236 }; 1256 }
1237 settings.ws = 1; // zoomed is always fit 1257 settings.ws = 1; // zoomed is always fit
1238 redisplay(data); 1258 redisplay(data);
1239 return false; 1259 return false;
1240 }; 1260 };
1241 1261
1265 var $img = data.$img; 1285 var $img = data.$img;
1266 var $bg = $elem.has('div.bgDrag'); 1286 var $bg = $elem.has('div.bgDrag');
1267 if ($bg.length === 0) { 1287 if ($bg.length === 0) {
1268 $bg = $('<div class="bgDrag" style="display:none; position:absolute"/>'); 1288 $bg = $('<div class="bgDrag" style="display:none; position:absolute"/>');
1269 $scaler.before($bg); // set as background 1289 $scaler.before($bg); // set as background
1270 }; 1290 }
1271 1291
1272 var dragStart = function (evt) { 1292 var dragStart = function (evt) {
1273 // drag the image and load a new detail on mouse up 1293 // drag the image and load a new detail on mouse up
1274 // useless if not zoomed 1294 // useless if not zoomed
1275 if (isFullArea(data.zoomArea)) return false; 1295 if (isFullArea(data.zoomArea)) return false;
1276 if(evt.preventDefault) evt.preventDefault(); // no Firefox drag and drop (NEEDED?)
1277 pt1 = geom.position(evt); 1296 pt1 = geom.position(evt);
1278 $imgRect = geom.rectangle($img); 1297 $imgRect = geom.rectangle($img);
1279 $imgRect.adjustDiv($bg); // set background size 1298 $imgRect.adjustDiv($bg); // set background size
1280 // hide the scaler image, show it as background of div instead 1299 // hide the scaler image, show it as background of div instead
1281 $bg.css({ 1300 $bg.css({
1286 }); 1305 });
1287 $img.hide(); 1306 $img.hide();
1288 $bg.show(); 1307 $bg.show();
1289 $(document).bind("mousemove.digilib", dragMove); 1308 $(document).bind("mousemove.digilib", dragMove);
1290 $(document).bind("mouseup.digilib", dragEnd); 1309 $(document).bind("mouseup.digilib", dragEnd);
1291 window.focus(); 1310 return false;
1292 }; 1311 };
1293 1312
1294 var dragMove = function (evt) { 1313 var dragMove = function (evt) {
1295 // mousemove handler: drag 1314 // mousemove handler: drag
1296 var pos = geom.position(evt); 1315 var pos = geom.position(evt);
1297 if(evt.preventDefault) evt.preventDefault(); // no Firefox drag and drop (NEEDED?)
1298 dx = pos.x - pt1.x; 1316 dx = pos.x - pt1.x;
1299 dy = pos.y - pt1.y; 1317 dy = pos.y - pt1.y;
1300 // move the background image to the new position 1318 // move the background image to the new position
1301 $bg.css({ 1319 $bg.css({
1302 'background-position' : dx + "px " + dy + "px" 1320 'background-position' : dx + "px " + dy + "px"
1310 'cursor' : 'default' 1328 'cursor' : 'default'
1311 }); 1329 });
1312 $(document).unbind("mousemove.digilib", dragMove); 1330 $(document).unbind("mousemove.digilib", dragMove);
1313 $(document).unbind("mouseup.digilib", dragEnd); 1331 $(document).unbind("mouseup.digilib", dragEnd);
1314 // calculate relative offset 1332 // calculate relative offset
1315 if (dx == 0 && dy == 0) return false; // no movement 1333 if (dx === 0 && dy === 0) return false; // no movement
1316 // reload with scaler image showing the new ausschnitt 1334 // reload with scaler image showing the new ausschnitt
1317 // digilib.moveBy(x, y); 1335 // digilib.moveBy(x, y);
1318 var pos = geom.position(-dx, -dy); 1336 var pos = geom.position(-dx, -dy);
1319 var newPos = data.imgTrafo.invtransform(pos); 1337 var newPos = data.imgTrafo.invtransform(pos);
1320 var newArea = data.zoomArea.setPt1(newPos); 1338 var newArea = data.zoomArea.setPt1(newPos);
1338 var setQuality = function (data, qual) { 1356 var setQuality = function (data, qual) {
1339 var flags = data.scalerFlags; 1357 var flags = data.scalerFlags;
1340 // clear flags 1358 // clear flags
1341 for (var i = 0; i < 3; ++i) { 1359 for (var i = 0; i < 3; ++i) {
1342 delete flags['q'+i]; 1360 delete flags['q'+i];
1343 }; 1361 }
1344 flags['q'+qual] = 'q'+qual; 1362 flags['q'+qual] = 'q'+qual;
1345 }; 1363 };
1346 1364
1347 // sets a key to a value (relative values with +/- if relative=true) 1365 // sets a key to a value (relative values with +/- if relative=true)
1348 var setNumValue = function(settings, key, value) { 1366 var setNumValue = function(settings, key, value) {
1349 if (isNumber(value)) return settings[key] = value; 1367 if (isNumber(value)) {
1350 var sign = value.substring(0,1); 1368 settings[key] = value;
1369 return value;
1370 }
1371 var sign = value[0];
1351 if (sign === '+' || sign === '-') { 1372 if (sign === '+' || sign === '-') {
1352 if (settings[key] == null) { 1373 if (settings[key] == null) {
1353 // this isn't perfect but still... 1374 // this isn't perfect but still...
1354 settings[key] = 0; 1375 settings[key] = 0;
1355 }; 1376 }
1356 settings[key] = parseFloat(settings[key]) + parseFloat(value); 1377 settings[key] = parseFloat(settings[key]) + parseFloat(value);
1357 } else { 1378 } else {
1358 settings[key] = value; 1379 settings[key] = value;
1359 }; 1380 }
1360 return settings[key]; 1381 return settings[key];
1361 }; 1382 };
1362 1383
1363 // auxiliary function (from old dllib.js) 1384 // auxiliary function (from old dllib.js)
1364 isFullArea = function(area) { 1385 isFullArea = function(area) {
1390 }; 1411 };
1391 }; 1412 };
1392 console.log = logFunction('_log'); 1413 console.log = logFunction('_log');
1393 console.debug = logFunction('_debug'); 1414 console.debug = logFunction('_debug');
1394 console.error = logFunction('_error'); 1415 console.error = logFunction('_error');
1395 }; 1416 }
1396 1417
1397 // hook plugin into jquery 1418 // hook plugin into jquery
1398 $.fn.digilib = function(action) { 1419 $.fn.digilib = function(action) {
1399 if (actions[action]) { 1420 if (actions[action]) {
1400 // call action on this with the remaining arguments (inserting data as first argument) 1421 // call action on this with the remaining arguments (inserting data as first argument)
1405 return actions[action].apply(this, args); 1426 return actions[action].apply(this, args);
1406 } else if (typeof(action) === 'object' || !action) { 1427 } else if (typeof(action) === 'object' || !action) {
1407 // call init on this 1428 // call init on this
1408 return actions.init.apply(this, arguments); 1429 return actions.init.apply(this, arguments);
1409 } else { 1430 } else {
1410 $.error( 'action ' + action + ' does not exist on jQuery.digilib' ); 1431 $.error('action ' + action + ' does not exist on jQuery.digilib');
1411 }; 1432 }
1412 }; 1433 };
1413 1434
1414 })(jQuery); 1435 })(jQuery);