Mercurial > hg > digilib-old
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); |
