changeset 668:ad4a2edcbdbc jquery

make zoomarea and birdview work in embedded mode
author hertzhaft
date Mon, 24 Jan 2011 09:48:27 +0100
parents 48e5b9608091
children b93241aa017c
files client/digitallibrary/jquery/jquery-test-full.html client/digitallibrary/jquery/jquery.digilib.js
diffstat 2 files changed, 203 insertions(+), 194 deletions(-) [+]
line wrap: on
line diff
--- a/client/digitallibrary/jquery/jquery-test-full.html	Mon Jan 24 00:52:47 2011 +0100
+++ b/client/digitallibrary/jquery/jquery-test-full.html	Mon Jan 24 09:48:27 2011 +0100
@@ -46,7 +46,7 @@
               border: 2px solid #ff0000;
               z-index: 200;
               }
-              
+
             div.birdview {
                 border: 1px solid white;
                 position: fixed;
--- a/client/digitallibrary/jquery/jquery.digilib.js	Mon Jan 24 00:52:47 2011 +0100
+++ b/client/digitallibrary/jquery/jquery.digilib.js	Mon Jan 24 09:48:27 2011 +0100
@@ -183,9 +183,10 @@
         'interactionMode' : 'fullscreen',
         // buttons
         'buttons' : buttons,
+        // defaults for digilib buttons
         'buttonSettings' : {
-        // path to button images (must end with a slash)
             'fullscreen' : {
+                // path to button images (must end with a slash)
                 'imagePath' : 'img/fullscreen/',
                 //'standardSet' : ["reference","zoomin","zoomout","zoomarea","zoomfull","pagewidth","back","fwd","page","bird","SEP","help","reset","options"],
                 'standardSet' : ["reference","zoomin","zoomout","zoomarea","zoomfull","pagewidth","mark","delmark","hmir","vmir","back","fwd","page","rot","brgt","cont","rgb","quality","size","calibrationx","scale","bird","help","options"],
@@ -202,10 +203,12 @@
         // button groups
         // is birdView shown?
         'isBirdDivVisible' : false,
-        // dimensions of bird's eye window
+        // dimensions of bird's eye div
         'birdDivOptions' : {'dw' : 200, 'dh' : 200},
-        // style of bird's eye window
+        // style of the zoom area indicator in the bird's eye div 
         'birdIndicatorStyle' : {'border' : '2px solid #ff0000' },
+        // style of zoom area "rubber band"
+        'zoomrectStyle' : {'border' : '2px solid #ff0000' },
         // is the "about" window shown?
         'isAboutDivVisible' : false
 
@@ -217,206 +220,204 @@
     var MAX_ZOOMAREA = geom.rectangle(0, 0, 1, 1);
 
     var actions = {
-            // init: digilib initialization
-            init : function(options) {
-                // settings for this digilib instance are merged from defaults and options
-                var settings = $.extend({}, defaults, options);
-                var isFullscreen = settings.interactionMode === 'fullscreen';
-                var queryParams = {};
-                if (isFullscreen) {
-                    queryParams = parseQueryParams();
-                    // check scalerBaseUrl
-                    if (settings.scalerBaseUrl == null) {
-                        // try the host this came from
-                        var h = window.location.host;
-                        if (window.location.host) {
-                            var url = window.location.href;
-                            // assume the page lives in [webapp]/jquery/
-                            var pos = url.indexOf('jquery/');
-                            if (pos > 0) {
-                                settings.scalerBaseUrl = url.substring(0, pos) + 'servlet/Scaler';
-                            }
+        // init: digilib initialization
+        init : function(options) {
+            // settings for this digilib instance are merged from defaults and options
+            var settings = $.extend({}, defaults, options);
+            var isFullscreen = settings.interactionMode === 'fullscreen';
+            var queryParams = {};
+            if (isFullscreen) {
+                queryParams = parseQueryParams();
+                // check scalerBaseUrl
+                if (settings.scalerBaseUrl == null) {
+                    // try the host this came from
+                    var h = window.location.host;
+                    if (window.location.host) {
+                        var url = window.location.href;
+                        // assume the page lives in [webapp]/jquery/
+                        var pos = url.indexOf('jquery/');
+                        if (pos > 0) {
+                            settings.scalerBaseUrl = url.substring(0, pos) + 'servlet/Scaler';
                         }
                     }
                 }
-                return this.each(function() {
-                    var $elem = $(this);
-                    var data = $elem.data('digilib');
-                    var elemSettings;
-                    // if the plugin hasn't been initialized yet
-                    if (!data) {
-                        // merge query parameters
-                        if (isFullscreen) {
-                            elemSettings = $.extend({}, settings, queryParams);
-                        } else {
-                            elemSettings = $.extend({}, settings, parseImgParams($elem));
-                        }
-                        // store $(this) element in the settings
-                        data =  {
-                                $elem : $elem,
-                                settings : elemSettings,
-                                queryParams : queryParams
-                        };
-                        // store in data element
-                        $elem.data('digilib', data);
+            }
+            return this.each(function() {
+                var $elem = $(this);
+                var data = $elem.data('digilib');
+                var elemSettings;
+                // if the plugin hasn't been initialized yet
+                if (!data) {
+                    // merge query parameters
+                    if (isFullscreen) {
+                        elemSettings = $.extend({}, settings, queryParams);
+                    } else {
+                        elemSettings = $.extend({}, settings, parseImgParams($elem));
                     }
-                    unpackParams(data);
-                    // create HTML structure
-                    setupScalerDiv(data);
-                    setupButtons(data, 'standardSet');
-                    // bird's eye view creation
-                    if (elemSettings.isBirdDivVisible) {
-                        setupBirdDiv(data);
-                    }
-                    // about window creation - TODO: could be deferred? restrict to only one item?
-                    setupAboutDiv(data);
-                });
-            },
-
-            // destroy: clean up digilib
-            destroy : function(data) {
-                return this.each(function(){
-                    var $elem = $(this);
-                    $(window).unbind('.digilib'); // unbind all digilibs(?)
-                    data.digilib.remove();
-                    $elem.removeData('digilib');
-                });
-            },
-
-            // show or hide the 'about' window
-            showAboutDiv : function(data, show) {
-                data.settings.isAboutDivVisible = showDiv(data.settings.isAboutDivVisible, data.$aboutDiv, show);
-            },
-
-            // event handler: toggles the visibility of the bird's eye window 
-            showBirdDiv : function (data, show) {
-                if (data.$birdDiv == null) {
-                    // no bird div -> create
+                    // store $(this) element in the settings
+                    data =  {
+                            $elem : $elem,
+                            settings : elemSettings,
+                            queryParams : queryParams
+                    };
+                    // store in data element
+                    $elem.data('digilib', data);
+                }
+                unpackParams(data);
+                // create HTML structure
+                setupScalerDiv(data);
+                setupButtons(data, 'standardSet');
+                // bird's eye view creation
+                if (elemSettings.isBirdDivVisible) {
                     setupBirdDiv(data);
                 }
-                // TODO: keep bird view visible after reload (parameter, cookie?)
-                data.settings.isBirdDivVisible = showDiv(data.settings.isBirdDivVisible, data.$birdDiv, show);
-            },
+                // about window creation - TODO: could be deferred? restrict to only one item?
+                setupAboutDiv(data);
+            });
+        },
+
+        // destroy: clean up digilib
+        destroy : function(data) {
+            return this.each(function(){
+                var $elem = $(this);
+                $(window).unbind('.digilib'); // unbind all digilibs(?)
+                data.digilib.remove();
+                $elem.removeData('digilib');
+            });
+        },
+
+        // show or hide the 'about' window
+        showAboutDiv : function(data, show) {
+            data.settings.isAboutDivVisible = showDiv(data.settings.isAboutDivVisible, data.$aboutDiv, show);
+        },
 
-            // goto given page nr (+/-: relative)
-            gotoPage : function (data, pageNr) {
-                var settings = data.settings;
-                var oldpn = settings.pn;
-                var pn = setNumValue(settings, "pn", pageNr);
-                if (pn == null) return false; // nothing happened
-                if (pn < 1) {
-                    alert("no such page (page number too low)");
+        // event handler: toggles the visibility of the bird's eye window 
+        showBirdDiv : function (data, show) {
+            if (data.$birdDiv == null) {
+                // no bird div -> create
+                setupBirdDiv(data);
+            }
+            // TODO: keep bird view visible after reload (parameter, cookie?)
+            data.settings.isBirdDivVisible = showDiv(data.settings.isBirdDivVisible, data.$birdDiv, show);
+        },
+
+        // goto given page nr (+/-: relative)
+        gotoPage : function (data, pageNr) {
+            var settings = data.settings;
+            var oldpn = settings.pn;
+            var pn = setNumValue(settings, "pn", pageNr);
+            if (pn == null) return false; // nothing happened
+            if (pn < 1) {
+                alert("no such page (page number too low)");
+                settings.pn = oldpn;
+                return false;
+                }
+            if (settings.pt) {
+                if (pn > settings.pt) {
+                    alert("no such page (page number too high)");
                     settings.pn = oldpn;
                     return false;
                     }
-                if (settings.pt) {
-                    if (pn > settings.pt) {
-                        alert("no such page (page number too high)");
-                        settings.pn = oldpn;
-                        return false;
-                        }
-                    }
-                // reset mk and others(?)
-                data.marks = [];
-                data.zoomArea = MAX_ZOOMAREA;
-                // then reload
-                redisplay(data);
-            },
-
-            // zoom by a given factor
-            zoomBy : function (data, factor) {
-                zoomBy(data, factor);
-            },
-
-            // zoom interactively
-            zoomArea : function (data) {
-                zoomArea(data);
-            },
+                }
+            // reset mk and others(?)
+            data.marks = [];
+            data.zoomArea = MAX_ZOOMAREA;
+            // then reload
+            redisplay(data);
+        },
 
-            // zoom out to full page
-            zoomFull : function (data, mode) {
-                data.zoomArea = MAX_ZOOMAREA;
-                if (mode === 'width') {
-                    data.dlOpts.fitwidth = 1;
-                    delete data.dlOpts.fitheight;
-                } else if (mode === 'height') {
-                    data.dlOpts.fitheight = 1;
-                    delete data.dlOpts.fitwidth;
-                } else {
-                    delete data.dlOpts.fitwidth;
-                    delete data.dlOpts.fitheight;
-                }
-                redisplay(data);
-            },
+        // zoom by a given factor
+        zoomBy : function (data, factor) {
+            zoomBy(data, factor);
+        },
 
-            // set a mark by clicking (or giving a position)
-            setMark : function (data, mpos) {
-                if (mpos == null) {
-                    // interactive
-                    setMark(data);
-                } else {
-                    // use position
-                    data.marks.push(pos);
-                    redisplay(data);
-                }
-            },
+        // zoom interactively
+        zoomArea : function (data) {
+            zoomArea(data);
+        },
 
-            // remove the last mark
-            removeMark : function (data) {
-                data.marks.pop();
-                redisplay(data);
-            },
-            
-            // mirror the image
-            mirror : function (data, mode) {
-                var flags = data.scalerFlags;
-            	if (mode === 'h') {
-            	    if (flags.hmir) {
-                        delete flags.hmir;
-            	    } else {
-                        flags.hmir = 1;
-            	    }
-            	} else {
-                    if (flags.vmir) {
-                        delete flags.vmir;
-                    } else {
-                        flags.vmir = 1;
-                    }
-                }
-            	redisplay(data);
-            },
-            
-            // rotate the image
-            rotate : function (data, angle) {
-                var rot = data.settings.rot;
-                if (angle == null) {
-                    angle = window.prompt("Rotation angle:", rot);
-                }
-                data.settings.rot = angle;
-                redisplay(data);
-            },
-            
-            // change brightness
-            brightness : function (data, factor) {
-                var brgt = data.settings.brgt;
-                if (factor == null) {
-                    factor = window.prompt("Brightness (-255..255)", brgt);
-                }
-                data.settings.brgt = factor;
-                redisplay(data);
-            },
-            
-            // change contrast
-            contrast : function (data, factor) {
-                var cont = data.settings.cont;
-                if (factor == null) {
-                    factor = window.prompt("Contrast (-8, 8)", cont);
-                }
-                data.settings.cont = factor;
+        // zoom out to full page
+        zoomFull : function (data, mode) {
+            data.zoomArea = MAX_ZOOMAREA;
+            if (mode === 'width') {
+                data.dlOpts.fitwidth = 1;
+                delete data.dlOpts.fitheight;
+            } else if (mode === 'height') {
+                data.dlOpts.fitheight = 1;
+                delete data.dlOpts.fitwidth;
+            } else {
+                delete data.dlOpts.fitwidth;
+                delete data.dlOpts.fitheight;
+            }
+            redisplay(data);
+        },
+
+        // set a mark by clicking (or giving a position)
+        setMark : function (data, mpos) {
+            if (mpos == null) {
+                // interactive
+                setMark(data);
+            } else {
+                // use position
+                data.marks.push(pos);
                 redisplay(data);
             }
-            
+        },
+
+        // remove the last mark
+        removeMark : function (data) {
+            data.marks.pop();
+            redisplay(data);
+        },
+
+        // mirror the image
+        mirror : function (data, mode) {
+            var flags = data.scalerFlags;
+            if (mode === 'h') {
+                if (flags.hmir) {
+                    delete flags.hmir;
+                } else {
+                    flags.hmir = 1;
+                }
+            } else {
+                if (flags.vmir) {
+                    delete flags.vmir;
+                } else {
+                    flags.vmir = 1;
+                }
+            }
+            redisplay(data);
+        },
 
+        // rotate the image
+        rotate : function (data, angle) {
+            var rot = data.settings.rot;
+            if (angle == null) {
+                angle = window.prompt("Rotation angle:", rot);
+            }
+            data.settings.rot = angle;
+            redisplay(data);
+        },
+
+        // change brightness
+        brightness : function (data, factor) {
+            var brgt = data.settings.brgt;
+            if (factor == null) {
+                factor = window.prompt("Brightness (-255..255)", brgt);
+            }
+            data.settings.brgt = factor;
+            redisplay(data);
+        },
+
+        // change contrast
+        contrast : function (data, factor) {
+            var cont = data.settings.cont;
+            if (factor == null) {
+                factor = window.prompt("Contrast (-8, 8)", cont);
+            }
+            data.settings.cont = factor;
+            redisplay(data);
+        }
     };
 
     // returns parameters from page url
@@ -452,7 +453,7 @@
         }
         return params;
     };
-    
+
     // returns a query string from key names from a parameter hash (ignoring if the same value is in defaults)
     var getParamString = function (settings, keys, defaults) {
         var paramString = '';
@@ -610,6 +611,11 @@
             // embedded mode -- just change img src
             var url = getScalerUrl(data);
             data.$img.attr('src', url);
+            // TODO: doesn't work yet
+            var $birdImg = data.$birdImg;
+            if ($birdImg) {
+                $birdImg.triggerHandler('load');
+                };
         }
     };
 
@@ -830,10 +836,11 @@
     var birdImgLoadedHandler = function (data) {
         var $img = data.$birdImg;
         return function () {
+            if (!$img) return;
             console.debug("birdimg loaded! this=", this, " data=", data);
             // create Transform from current area and picsize
             data.birdTrafo = getImgTrafo($img, MAX_ZOOMAREA);
-            // display marks
+            // display red indicator around zoomarea
             renderBirdArea(data);
         };
     };
@@ -900,13 +907,14 @@
             return false; // do we even get here?
         });
     };
-    
+
     var zoomArea = function(data) {
         $elem = data.$elem;
         $scaler = data.$scaler;
         var pt1, pt2;
         var $zoomDiv = $('<div class="zoomrect" style="display:none"/>');
         $elem.append($zoomDiv);
+        $zoomDiv.css(data.settings.zoomrectStyle);
         //var overlay = getElement("overlay");
         // use overlay div to avoid <img> mousemove problems
         var picRect = geom.rectangle($scaler);
@@ -924,13 +932,14 @@
             // setup and show zoom div
             //moveElement(zoomdiv, Rectangle(pt1.x, pt1.y, 0, 0));
             $zoomDiv.offset({left : pt1.x, top : pt1.y});
+            $zoomDiv.width(0).height(0);
             $zoomDiv.show();
             // register events
             $elem.bind("mousemove.digilib", zoomMove);
             $elem.bind("mouseup.digilib", zoomEnd);
             return false;
         };
-        
+
         // mouseup handler: end moving
         var zoomEnd = function (evt) {
             pt2 = geom.position(evt);
@@ -955,7 +964,7 @@
             redisplay(data);
             return false;
         };
-        
+
         // mouse move handler
         var zoomMove = function (evt) {
             pt2 = geom.position(evt);
@@ -967,7 +976,7 @@
             $zoomDiv.width(rect.width).height(rect.height);
             return false;
         };
-        
+
         // bind start zoom handler
         $scaler.one('mousedown.digilib', zoomStart);
     };