changeset 434:4eeabb5ed193

bug fixes; added saving status in cookie; added basic screen calibration functionality;
author hertzhaft
date Mon, 09 Jan 2006 17:53:03 +0100
parents 35044254c5af
children 14557d3879d2
files client/digitallibrary/greyskin/diginew.jsp client/digitallibrary/greyskin/dllib.js
diffstat 2 files changed, 228 insertions(+), 120 deletions(-) [+]
line wrap: on
line diff
--- a/client/digitallibrary/greyskin/diginew.jsp	Mon Jan 09 17:41:34 2006 +0100
+++ b/client/digitallibrary/greyskin/diginew.jsp	Mon Jan 09 17:53:03 2006 +0100
@@ -46,9 +46,13 @@
 
 	<script language="JavaScript">
 
-	var isOptionDivVisible = false;
+	var jspVersion = "diginew.jsp 1.009";
+	var cookie = new Cookie();
+	// alert(strObject(cookie));
+
+	var isOptionDivVisible = cookie.getbool("isOptionDivVisible");
+	var isBirdDivVisible = cookie.getbool("isBirdDivVisible");
 	var isAboutDivVisible = false;
-	var isBirdDivVisible = false;
 	var dlTarget = window.name;
 	var baseUrl = '<%= dlRequest.getAsString("base.url") %>';
 	var toolbarEnabledURL = window.location.href;
@@ -56,19 +60,21 @@
 
 	function toggleOptionDiv() {
 		isOptionDivVisible = !isOptionDivVisible;
+		cookie.addbool("isOptionDivVisible", isOptionDivVisible);
 		showOptions(isOptionDivVisible);
 		}
 
+	function toggleBirdDiv() {
+		isBirdDivVisible = !isBirdDivVisible;
+		cookie.addbool("isBirdDivVisible", isBirdDivVisible);
+		showBirdDiv(isBirdDivVisible);
+		}
+
 	function toggleAboutDiv() {
 		isAboutDivVisible = !isAboutDivVisible;
 		showAboutDiv(isAboutDivVisible);
 		}
 
-	function toggleBirdDiv() {
-		isBirdDivVisible = !isBirdDivVisible;
-		showBirdDiv(isBirdDivVisible);
-		}
-
 	// replace img src and display "on" status
 	function setOnImage(id, src) {
 		var elem = getElement(id);
@@ -87,29 +93,33 @@
 		}
 		
 	// initialize image; called by body.onload
-	function onBodyLoaded() {
+	function onBodyLoad() {
 		document.id = 'digilib';
 		initParameters();	// load default values and detail
 		dl_param_init();	// parse parameter values
 		loadScalerImage();	// ruft auch dl_init() / initScaler auf
 		loadBirdImage();	// lädt das Bird's Eye Bild
 		reflectImageStatus();	// adjust icons
+		showOptions(isOptionDivVisible);
+		showBirdDiv(isBirdDivVisible);
 		showArrows();		// show arrow overlays for zoom navigation
-		moveCenter();		// click to move point to center
+		moveCenter(true);	// click to move point to center
 		}
 
+	function onBodyUnload() {
+		// alert(strObject(cookie));
+		cookie.store();
+		}
 	// base_init();		// now done on loading baselib.js
 
 	</script>
 </head>
 
-<body onload="onBodyLoaded();">
+<body onload="onBodyLoad();" onunload="onBodyUnload();">
 
  <!-- slot for the scaled image -->
- <div id="scaler-table">
- 	<div id="scaler">
-		<img id="pic"></img>
-	</div>
+ <div id="scaler">
+	<img id="pic"></img>
  </div>
 
  <!-- sensitive overlay for zoom area etc -->
@@ -126,7 +136,7 @@
  <!-- the bird's eye select area -->
  <div id="bird-area">
  </div>
- 
+
  <!-- the arrows -->
  <a class="arrow" id="up"    href="javascript:moveBy(0, -0.5)"></a>
  <a class="arrow" id="down"  href="javascript:moveBy(0, 0.5)"></a>
@@ -140,10 +150,13 @@
  		<img class="logo" src="../img/digilib-logo-text1.png" title="digilib"></img>
 	</a>
 	<p id="digilib-version"></p>
+	<p id="jsp-version"></p>
 	<p id="baselib-version"></p>
 	<p id="dllib-version"></p>
  </div>
 
+ <!-- the calibration div -->
+ <div id="calibration"><p>10 cm</p></div>
 
  <div id="buttons">
 	<div class="button">
@@ -254,6 +267,21 @@
 	<div class="button">
 		<a
 			class="icon"
+			href="javascript:gotoPageWin()"
+			>
+
+			<img
+				class="png"
+				id="page"
+				title="specify image"
+				src="page.png"
+			>
+	</a>
+	</div>
+	
+	<div class="button">
+		<a
+			class="icon"
 			href="javascript:toggleBirdDiv()"
 			>
 
@@ -454,18 +482,33 @@
 	<div class="button">
 		<a
 			class="icon"
-			href="javascript:gotoPageWin()"
+			href="javascript:calibrate('x')"
 			>
 
 			<img
 				class="png"
-				id="page"
-				title="specify image"
-				src="page.png"
+				id="calibration-x"
+				title="calibrate screen x-ratio"
+				src="calibration-x.png"
 			>
-	</a>
+		</a>
 	</div>
-	
+
+	<div class="button">
+		<a
+			class="icon"
+			href="javascript:calibrate('y')"
+			>
+
+			<img
+				class="png"
+				id="calibration-y"
+				title="calibrate screen y-ratio"
+				src="calibration-y.png"
+			>
+		</a>
+	</div>
+
 	<div class="button">
 		<a
 			class="icon"
--- a/client/digitallibrary/greyskin/dllib.js	Mon Jan 09 17:41:34 2006 +0100
+++ b/client/digitallibrary/greyskin/dllib.js	Mon Jan 09 17:53:03 2006 +0100
@@ -24,7 +24,7 @@
 
 */
 digilibVersion = "Digilib NG";
-dllibVersion = "2.0";
+dllibVersion = "2.027";
 isDigilibInitialized = false;    // gets set to true in dl_param_init
 reloadPage = true; // reload the page when parameters are changed, otherwise update only "src" attribute of scaler img 
 
@@ -36,19 +36,19 @@
 dlFlags = null;
 
 // global elements
-elemScaler = null;
-picElem = null;
-
+scalerDiv = null;
+scalerImg = null;
 
 // flags for parameter sets
 PARAM_FILE = 1;
 PARAM_MODE = 2;
-PARAM_SIZE = 4;
+PARAM_DIM = 4;
 PARAM_IMAGE = 8;
 PARAM_DPI = 16;
 PARAM_MARK = 32;
 PARAM_PAGES = 64;
-PARAM_ALL = PARAM_FILE | PARAM_MODE | PARAM_SIZE | PARAM_IMAGE | PARAM_DPI | PARAM_MARK | PARAM_PAGES;
+PARAM_SIZE = 128;
+PARAM_ALL = PARAM_FILE | PARAM_MODE | PARAM_DIM | PARAM_IMAGE | PARAM_DPI | PARAM_MARK | PARAM_PAGES | PARAM_SIZE;
 
 // mouse drag area that counts as one click 
 MIN_AREA_SIZE = 3 * 3 + 1;
@@ -63,6 +63,9 @@
 // with of arrow bars
 ARROW_WIDTH = 32;
 
+// with of calibration bar
+CALIBRATION_WIDTH = 64;
+
 function identify() {
         // used for identifying a digilib instance
         // Relato uses that function - lugi
@@ -77,13 +80,12 @@
     newParameter('fn', '',    PARAM_FILE);
     newParameter('pn', '1',   PARAM_FILE);
 // mode
-    newParameter('ws', '1.0', PARAM_MODE);
     newParameter('mo', '',    PARAM_MODE);
 // relative dimensions of zoomed image
-    newParameter('wx', '0.0', PARAM_SIZE);
-    newParameter('wy', '0.0', PARAM_SIZE);
-    newParameter('ww', '1.0', PARAM_SIZE);
-    newParameter('wh', '1.0', PARAM_SIZE);
+    newParameter('wx', '0.0', PARAM_DIM);
+    newParameter('wy', '0.0', PARAM_DIM);
+    newParameter('ww', '1.0', PARAM_DIM);
+    newParameter('wh', '1.0', PARAM_DIM);
 // image manipulation
     newParameter('brgt', '0.0', PARAM_IMAGE);
     newParameter('cont', '0.0', PARAM_IMAGE);
@@ -98,7 +100,9 @@
     newParameter('mk', '', PARAM_MARK);
 // pages total
     newParameter('pt', '0', PARAM_PAGES);
-    }
+// size
+    newParameter('ws', '1.0', PARAM_SIZE);
+}
 
 function parseArea() {
     // returns area Rectangle from current parameters
@@ -326,11 +330,11 @@
 function dl_init() {
     // initalisation on load
     if (!isDigilibInitialized) dl_param_init();
-    elemScaler = getElement("scaler");
-    picElem = getElement("pic", true);
+    scalerDiv = getElement("scaler");
+    scalerImg = getElement("pic", true);
     // in N4 pic is in the scaler layer
-    if (picElem == null && elemScaler) {
-        picElem = elemScaler.document.images[0];
+    if (scalerImg == null && scalerDiv) {
+        scalerImg = scalerDiv.document.images[0];
         }
     // give a name to the window containing digilib
     window.name = defined(dlTarget) && dlTarget
@@ -383,12 +387,12 @@
  * ******************************************** */
 function renderMarks() {
     // make sure the image is loaded so we know its size
-    if (defined(picElem.complete) && !picElem.complete && !browserType.isN4 ) {
+    if (defined(scalerImg.complete) && !scalerImg.complete && !browserType.isN4 ) {
         setTimeout("renderMarks()", 100);
         return;
             }
     // put the visible marks on the image
-    dlTrafo = parseTrafo(picElem);
+    dlTrafo = parseTrafo(scalerImg);
     // debugProps(dlArea, "dlArea");
     for (var i = 0; i < dlMarks.length; i++) {
     var div = document.getElementById("mark" + i) || createMarkDiv(i);
@@ -414,7 +418,7 @@
 
     function markEvent(evt) {
     // event handler adding a new mark
-        unregisterEvent("mousedown", elemScaler, markEvent);
+        unregisterEvent("mousedown", scalerDiv, markEvent);
         addMark(evt);
         if ( defined(reload) && !reload ) {
             // don't redisplay
@@ -422,12 +426,14 @@
             return;
             }
         display();
+        return stopEvent(evt);
         }
     
     // add a mark where clicked
     window.focus();
+    moveCenter(false);
     // start event capturing
-    registerEvent("mousedown", elemScaler, markEvent);
+    registerEvent("mousedown", scalerDiv, markEvent);
     }
 
 function removeMark(reload) {
@@ -446,34 +452,28 @@
     var zoomdiv = getElement("zoom");
     var overlay = getElement("overlay");
     // use overlay div to avoid <img> mousemove problems
-    var rect = getElementRect(picElem);
+    var picRect = getElementRect(scalerImg);
     // FIX ME: is there a way to query the border width from CSS info?
     // rect.x -= 2; // account for overlay borders
     // rect.y -= 2;
-    moveElement(overlay, rect);
+    moveElement(overlay, picRect);
     showElement(overlay, true);
     // start event capturing
     registerEvent("mousedown", overlay, zoomStart);
-    registerEvent("mousedown", elemScaler, zoomStart);
+    registerEvent("mousedown", scalerImg, zoomStart);
     window.focus();
 
 // mousedown handler: start moving
     function zoomStart(evt) {
         pt1 = evtPosition(evt);
         unregisterEvent("mousedown", overlay, zoomStart);
-        unregisterEvent("mousedown", elemScaler, zoomStart);
-        // unregisterEvent("mousedown", zoomdiv, zoomStart);
+        unregisterEvent("mousedown", scalerImg, zoomStart);
         // setup and show zoom div
         moveElement(zoomdiv, Rectangle(pt1.x, pt1.y, 0, 0));
         showElement(zoomdiv, true);
-        // register move events
-        registerEvent("mousemove", overlay, zoomMove);
-        registerEvent("mousemove", zoomdiv, zoomMove);
-        registerEvent("mousemove", elemScaler, zoomMove);
-        // register up events for drag end
-        registerEvent("mouseup", overlay, zoomEnd);
-        registerEvent("mouseup", zoomdiv, zoomEnd);
-        registerEvent("mouseup", elemScaler, zoomEnd);
+        // register events
+        registerEvent("mousemove", document, zoomMove);
+        registerEvent("mouseup", document, zoomEnd);
         return stopEvent(evt);
         }
     
@@ -481,24 +481,20 @@
     function zoomEnd(evt) {
         pt2 = evtPosition(evt);
         // assume a click if the area is too small (up to 3 x 3 pixel)
-        var clickArea = getRect(pt1, pt2).getArea();
-        if (clickArea <= MIN_AREA_SIZE) return stopEvent(evt); 
+        var clickRect = getRect(pt1, pt2);
+        if (clickRect.getArea() <= MIN_AREA_SIZE) return stopEvent(evt); 
         // hide zoom div
         showElement(zoomdiv, false);
         showElement(overlay, false);
-        // unregister move events
-        unregisterEvent("mousemove", overlay, zoomMove);
-        unregisterEvent("mousemove", zoomdiv, zoomMove);
-        unregisterEvent("mousemove", elemScaler, zoomMove);
-        // unregister drag events
-        unregisterEvent("mouseup", overlay, zoomEnd);
-        unregisterEvent("mouseup", zoomdiv, zoomEnd);
-        unregisterEvent("mouseup", elemScaler, zoomMove);
+        // unregister events
+        unregisterEvent("mousemove", document, zoomMove);
+        unregisterEvent("mouseup", document, zoomMove);
         // calc offsets
+        clickRect.clipTo(picRect);
         var area = getRect(
             // FIX ME: liefert negative x/y Werte, wenn hmir/vmir=1
-            dlTrafo.invtransform(pt1),
-            dlTrafo.invtransform(pt2)
+            dlTrafo.invtransform(clickRect.getPt1()),
+            dlTrafo.invtransform(clickRect.getPt2())
             );
         setParameter("wx", cropFloat(area.x));
         setParameter("wy", cropFloat(area.y));
@@ -514,8 +510,10 @@
 // mouse move handler
     function zoomMove(evt) {
         pt2 = evtPosition(evt);
+        var rect = getRect(pt1, pt2);
+        rect.clipTo(picRect);
         // update zoom div
-        moveElement(zoomdiv, getRect(pt1, pt2));
+        moveElement(zoomdiv, rect);
         return stopEvent(evt);
         }
     
@@ -553,52 +551,51 @@
 }
 
 
-function moveCenter() {
+function moveCenter(on) {
     // move visible area so that it's centered around the clicked point
-    if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) {
-        // nothing to do
-        return;
-    }
+    if (isFullArea()) return; // nothing to do
+    // starting event capture
+    if (on) registerEvent("mousedown", scalerImg, moveCenterEvent);
+    else  unregisterEvent("mousedown", scalerImg, moveCenterEvent);
     window.focus();
+}
 
-    function moveCenterEvent(evt) {
-        // move to handler
-        var pt = dlTrafo.invtransform(evtPosition(evt));
-        var newarea = new Rectangle(
-            pt.x - 0.5 * dlArea.width,
-            pt.y - 0.5 * dlArea.height,
-            dlArea.width,
-            dlArea.height
-            );
-        newarea.stayInside(dlMaxArea);
-        // newarea = dlMaxArea.fit(newarea);
-        // debugProps(newarea, "newarea");
-        // debugProps(dlArea, "dlArea");
-        if (newarea.equals(dlArea)) return; // keep event handler
-        unregisterEvent("mousedown", elemScaler, moveCenterEvent);
-        // set parameters
-        setParamFromArea(newarea);
-        parseArea();
-        display();
-    }
-
-    // starting event capture
-    registerEvent("mousedown", elemScaler, moveCenterEvent);
+function moveCenterEvent(evt) {
+    // move to handler
+    var pt = dlTrafo.invtransform(evtPosition(evt));
+    var newarea = new Rectangle(
+        pt.x - 0.5 * dlArea.width,
+        pt.y - 0.5 * dlArea.height,
+        dlArea.width,
+        dlArea.height
+        );
+    newarea.stayInside(dlMaxArea);
+    // newarea = dlMaxArea.fit(newarea);
+    // debugProps(newarea, "newarea");
+    // debugProps(dlArea, "dlArea");
+    if (newarea.equals(dlArea)) return; // keep event handler
+    unregisterEvent("mousedown", scalerImg, moveCenterEvent);
+    // set parameters
+    setParamFromArea(newarea);
+    parseArea();
+    display();
 }
 
 function isFullArea(area) {
     if (!area) area = dlArea;
     return ((area.width == 1.0) && (area.height == 1.0));
-    }
+}
 
 function canMove(movx, movy) {
     if (isFullArea()) return false;
+    var x2 = dlArea.x + dlArea.width;
+    var y2 = dlArea.y + dlArea.height;
     // debugProps(dlArea);
     return ((movx < 0) && (dlArea.x > 0))
-        || ((movy < 0) && (dlArea.y > 0))
-        || ((movx > 0) && (dlArea.x + dlArea.width < 1.0))
-        || ((movy > 0) && (dlArea.y + dlArea.height < 1.0))
-    }
+    	|| ((movx > 0) && (x2 < 1.0))
+	|| ((movy < 0) && (dlArea.y > 0))
+    	|| ((movy > 0) && (y2 < 1.0))
+}
 
 function moveBy(movx, movy) {
     // move visible area by movx and movy (in units of ww, wh)
@@ -725,11 +722,13 @@
         if (!show) return;
         alert("About Digilib - dialog missing in HTML code!"
             + "\nDigilib Version: " + digilibVersion
+            + "\JSP Version: " + jspVersion
             + "\ndlLib Version: " + dllibVersion
             + "\nbaseLib Version: " + baseLibVersion);
         return;
         }
     document.getElementById("digilib-version").innerHTML = "Digilib Version: " + digilibVersion;
+    document.getElementById("jsp-version").innerHTML = "JSP Version: " + jspVersion;
     document.getElementById("baselib-version").innerHTML = "baseLib Version: " + baseLibVersion;
     document.getElementById("dllib-version").innerHTML = "dlLib Version: " + dllibVersion;
     showElement(elem, show);
@@ -738,7 +737,7 @@
 function loadBirdImage() {
     var img = getElement("bird-image");
     var src = "../servlet/Scaler?" 
-        + getQueryString(PARAM_FILE | PARAM_MODE)
+        + getQueryString(PARAM_FILE)
         + "&dw=" + BIRD_MAXX 
         + "&dh=" + BIRD_MAXY;
     img.src = src;
@@ -749,12 +748,14 @@
     var startPos; // anchor for dragging
     var newRect;  // position after drag
     var birdImg = getElement("bird-image");
+    var birdArea = getElement("bird-area");
+    var overlay = getElement("overlay");
     showElement(birdImg, show);
-    var birdArea = getElement("bird-area");
-    // dont show selector if area is full size
+    // dont show selector if area has full size
     if (!show || isFullArea()) {
         // hide area
         showElement(birdArea, false);
+        showElement(overlay, false);
         return;
         };
     var birdImgRect = getElementRect(birdImg);
@@ -768,17 +769,19 @@
         birdImgRect.height * area.height
         );
     moveElement(birdArea, birdAreaRect);
-    showElement(birdArea, show);
-    registerEvent("mousedown", birdArea, birdAreaStartDrag);
+    showElement(birdArea, true);
+    moveElement(overlay, birdImgRect);
+    showElement(overlay, true);
+    registerEvent("mousedown", overlay, birdAreaStartDrag);
+    registerEvent("mousedown", birdImg, birdAreaStartDrag);
 
     function birdAreaStartDrag(evt) {
     // mousedown handler: start drag
         startPos = evtPosition(evt);
-        registerEvent("mousemove", birdArea, birdAreaMove);
-        registerEvent("mousemove", birdImg, birdAreaMove);
-        registerEvent("mouseup",   birdArea, birdAreaEndDrag);
-        registerEvent("mouseup",   birdImg, birdAreaEndDrag);
-        
+        unregisterEvent("mousedown", overlay, birdAreaStartDrag);
+        unregisterEvent("mousedown", birdImg, birdAreaStartDrag);
+        registerEvent("mousemove", document, birdAreaMove);
+        registerEvent("mouseup",   document, birdAreaEndDrag);
         // debugProps(getElementRect(bird))
         return stopEvent(evt);
         }
@@ -803,16 +806,15 @@
 
     function birdAreaEndDrag(evt) {
     // mouseup handler: reload page
-        unregisterEvent("mousemove", birdArea, birdAreaMove);
-        unregisterEvent("mouseup",   birdArea, birdAreaEndDrag);
-        unregisterEvent("mousemove", birdImg, birdAreaMove);
-        unregisterEvent("mouseup",   birdImg, birdAreaEndDrag);
+        unregisterEvent("mousemove", document, birdAreaMove);
+        unregisterEvent("mouseup",   document, birdAreaEndDrag);
+        showElement(overlay, false);
+        if (newRect == null) { // no movement happened
+            startPos = birdAreaRect.getCenter();
+            birdAreaMove(evt); // set center to click position
+            }
         setParameter("wx", cropFloat((newRect.x - birdImgRect.x) / birdImgRect.width));
         setParameter("wy", cropFloat((newRect.y - birdImgRect.y) / birdImgRect.height));
-        // width and height parameters remain the same
-        // setParameter("ww", cropFloat(newRect.width / birdImgRect.width));
-        // setParameter("ww", cropFloat(newRect.height / birdImgRect.height));
-        // parseArea(); // why?
         // zoomed is always fit
         setParameter("ws", 1);
         display();
@@ -827,11 +829,11 @@
 	}
 	
 function showArrows() {
-    if (defined(picElem.complete) && !picElem.complete && !browserType.isN4 ) {
+    if (defined(scalerImg.complete) && !scalerImg.complete && !browserType.isN4 ) {
         setTimeout("showArrows()", 100);
         return;
         }
-	var r = getElementRect(picElem);
+	var r = getElementRect(scalerImg);
     showArrow('up',
         new Rectangle(r.x, r.y, r.width, ARROW_WIDTH), 
         canMove(0, -1)
@@ -850,3 +852,66 @@
         );
 	}
 
+function calibrate(direction) {
+    // calibrate screen
+    var startPos; // anchor for dragging
+    var newRect;  // position after drag
+    var calDiv = getElement("calibration");
+    var overlay = getElement("overlay");
+    moveElement(overlay, getWinRect());
+    showElement(overlay, true);
+    var xDir = direction == "x";
+    moveCenter(false);
+    registerEvent("mousedown", document, calibrationStartDrag);
+
+    function calibrationStartDrag(evt) {
+    // mousedown handler: start drag
+        startPos = evtPosition(evt);
+        unregisterEvent("mousedown", document, calibrationStartDrag);
+        registerEvent("mousemove", document, calibrationMove);
+        registerEvent("mouseup",   document, calibrationEndDrag);
+        registerEvent("mousemove", calDiv, calibrationMove);
+        registerEvent("mouseup",   calDiv, calibrationEndDrag);
+        newRect = new Rectangle(
+            startPos.x,
+            startPos.y,
+            xDir ? 1 : CALIBRATION_WIDTH,
+            xDir ? CALIBRATION_WIDTH : 1
+            );
+        // stay within image
+        moveElement(calDiv, newRect);
+        showElement(calDiv, true);
+        // debugProps(getElementRect(bird))
+        return stopEvent(evt);
+        }
+
+    function calibrationMove(evt) {
+    // mousemove handler: drag
+        var pos = evtPosition(evt);
+        var dx = (xDir) ? pos.x - startPos.x : CALIBRATION_WIDTH;
+        var dy = (xDir) ? CALIBRATION_WIDTH : pos.y - startPos.y;
+        // move birdArea div, keeping size
+        newRect = new Rectangle(startPos.x, startPos.y, dx, dy);
+        // stay within image
+        moveElement(calDiv, newRect);
+        showElement(calDiv, true);
+        return stopEvent(evt);
+        }
+
+    function calibrationEndDrag(evt) {
+    // mouseup handler: calibrate
+        unregisterEvent("mousemove", document, calibrationMove);
+        unregisterEvent("mouseup",   document, calibrationEndDrag);
+        unregisterEvent("mousemove", calDiv, calibrationMove);
+        unregisterEvent("mouseup",   calDiv, calibrationEndDrag);
+        showElement(calDiv, false);
+        showElement(overlay, false);
+        moveCenter(true);
+
+        // TODO: calculate ...
+        return stopEvent(evt);
+        }
+    }
+
+// :tabSize=4:indentSize=4:noTabs=true:
+