# HG changeset patch # User robcast # Date 1138052189 -3600 # Node ID a6c83fa262b2b7b968c6ef3470f6df161f010587 # Parent 4255c09a8147337d535c42093640efda6383880b still somewhat experimental intermediary release - Digilib is now an object with methods - in theory we could now have more than one digilib instance on a page - for compatibility one instance is created and wrapper methods exist - setting a mark recenters the view for some (unrelated) reason diff -r 4255c09a8147 -r a6c83fa262b2 client/digitallibrary/greyskin/diginew.jsp --- a/client/digitallibrary/greyskin/diginew.jsp Mon Jan 23 18:29:52 2006 +0100 +++ b/client/digitallibrary/greyskin/diginew.jsp Mon Jan 23 22:36:29 2006 +0100 @@ -109,60 +109,30 @@ function reflectImageStatus() { if (hasFlag("hmir")) setOnImage("hmir", "mirror-horizontal-on.png"); if (hasFlag("vmir")) setOnImage("vmir", "mirror-vertical-on.png"); - if (dlParams.isSet("brgt")) - setOnImage("brgt", "brightness-on.png", dlParams.get("brgt")); - if (dlParams.isSet("cont")) - setOnImage("cont", "contrast-on.png", dlParams.get("cont")); - if (dlParams.isSet("rot")) - setOnImage("rot", "rotate-on.png", dlParams.get("rot")); - if (dlParams.isSet("rgb")) - setOnImage("rgb", "rgb-on.png", dlParams.get("rgb")); + if (hasParameter("brgt")) + setOnImage("brgt", "brightness-on.png", getParameter("brgt")); + if (hasParameter("cont")) + setOnImage("cont", "contrast-on.png", getParameter("cont")); + if (hasParameter("rot")) + setOnImage("rot", "rotate-on.png", getParameter("rot")); + if (hasParameter("rgb")) + setOnImage("rgb", "rgb-on.png", getParameter("rgb")); } - function onImgLoad() { - // make sure the image is loaded so we know its size - if (defined(scalerImg.complete) && !scalerImg.complete && !browserType.isN4 ) { - setTimeout("onImgLoad()", 100); - waited += 100; - return; - } - dlTrafo = parseTrafo(scalerImg); - // display marks - renderMarks(); - reflectImageStatus(); // adjust icons - showOptions(isOptionDivVisible); - showBirdDiv(isBirdDivVisible); - showArrows(); // show arrow overlays for zoom navigation - moveCenter(true); // click to move point to center - // new Slider("sizes", 1, 5, 2); - focus(); - } // initialize digilib; called by body.onload function onBodyLoad() { document.id = 'digilib'; - scalerDiv = getElement("scaler", true); - scalerImg = getElement("pic", true); - if (scalerImg == null && scalerDiv) { - // in N4 pic is in the scaler layer - scalerImg = scalerDiv.document.images[0]; - } - if ((!scalerImg)||(!scalerDiv)) { - alert("Sorry, digilib doesn't work here!"); - return false; - } - setScalerImage(); // ruft auch dl_init() / initScaler auf - loadBirdImage(); // lädt das Bird's Eye Bild - //onImgLoad(); - } + dl.onLoad(); + dl.showOptions(isOptionDivVisible); + reflectImageStatus(); // adjust icons + } function onBodyUnload() { // alert(strObject(cookie)); cookie.store(); } - // base_init(); // now done on loading baselib.js - initParameters(); // load default values and detail @@ -249,7 +219,7 @@
mousemove problems - var picRect = getElementRect(scalerImg); + var picRect = getElementRect(this.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; @@ -450,14 +410,17 @@ showElement(overlay, true); // start event capturing registerEvent("mousedown", overlay, zoomStart); - registerEvent("mousedown", scalerImg, zoomStart); + registerEvent("mousedown", this.scalerImg, zoomStart); window.focus(); + // our own reference to this for the local function + var digilib = this; + // mousedown handler: start moving function zoomStart(evt) { pt1 = evtPosition(evt); unregisterEvent("mousedown", overlay, zoomStart); - unregisterEvent("mousedown", scalerImg, zoomStart); + unregisterEvent("mousedown", digilib.scalerImg, zoomStart); // setup and show zoom div moveElement(zoomdiv, Rectangle(pt1.x, pt1.y, 0, 0)); showElement(zoomdiv, true); @@ -482,11 +445,11 @@ unregisterEvent("mouseup", document, zoomMove); // clip and transform clickRect.clipTo(picRect); - var area = dlTrafo.invtransform(clickRect); - setParamFromArea(area); + var area = digilib.trafo.invtransform(clickRect); + digilib.setParamFromArea(area); // zoomed is always fit - dlParams.set("ws", 1); - display(); + digilib.params.set("ws", 1); + digilib.display(); return stopEvent(evt); } @@ -502,90 +465,87 @@ } } -function zoomBy(factor) { +Digilib.prototype.zoomBy = function(factor) { // zooms by the given factor - var newarea = dlArea.copy(); + var newarea = this.area.copy(); newarea.width /= factor; newarea.height /= factor; - newarea.x -= 0.5 * (newarea.width - dlArea.width); - newarea.y -= 0.5 * (newarea.height - dlArea.height); - newarea = dlMaxArea.fit(newarea); - setParamFromArea(newarea); - display(); + newarea.x -= 0.5 * (newarea.width - this.area.width); + newarea.y -= 0.5 * (newarea.height - this.area.height); + newarea = MAX_AREA.fit(newarea); + this.setParamFromArea(newarea); + this.display(); } -function zoomFullpage() { +Digilib.prototype.zoomFullpage = function() { // zooms out to show the whole image - dlParams.set("wx", 0.0); - dlParams.set("wy", 0.0); - dlParams.set("ww", 1.0); - dlParams.set("wh", 1.0); - display(); + this.params.set("wx", 0.0); + this.params.set("wy", 0.0); + this.params.set("ww", 1.0); + this.params.set("wh", 1.0); + this.display(); } -function moveCenter(on) { +Digilib.prototype.moveCenter = function(on) { // move visible area so that it's centered around the clicked point - if (isFullArea()) return; // nothing to do + if (this.isFullArea()) return; // nothing to do // starting event capture - if (on) registerEvent("mousedown", scalerImg, moveCenterEvent); - else unregisterEvent("mousedown", scalerImg, moveCenterEvent); + if (on) registerEvent("mousedown", this.scalerImg, moveCenterEvent); + else unregisterEvent("mousedown", this.scalerImg, moveCenterEvent); window.focus(); + + // our own reference to this for the local function + var digilib = this; + + function moveCenterEvent(evt) { + // move to handler + var pt = digilib.trafo.invtransform(evtPosition(evt)); + var newarea = digilib.area.copy(); + newarea.setCenter(pt); + newarea.stayInside(MAX_AREA); + // newarea = dlMaxArea.fit(newarea); + // debugProps(newarea, "newarea"); + // debugProps(dlArea, "dlArea"); + if (newarea.equals(digilib.area)) return; // keep event handler + unregisterEvent("mousedown", digilib.scalerImg, moveCenterEvent); + // set parameters + digilib.setParamFromArea(newarea); + digilib.display(); + } } -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; +Digilib.prototype.isFullArea = function(area) { + if (!area) area = this.area; // pixel by pixel is not always full area return (area.width == 1.0) && (area.height == 1.0) && ! hasFlag("clip"); } -function canMove(movx, movy) { - if (isFullArea()) return false; - var x2 = dlArea.x + dlArea.width; - var y2 = dlArea.y + dlArea.height; +Digilib.prototype.canMove = function(movx, movy) { + if (this.isFullArea()) return false; + var x2 = this.area.x + this.area.width; + var y2 = this.area.y + this.area.height; // debugProps(dlArea); - return ((movx < 0) && (dlArea.x > 0)) + return ((movx < 0) && (this.area.x > 0)) || ((movx > 0) && (x2 < 1.0)) - || ((movy < 0) && (dlArea.y > 0)) + || ((movy < 0) && (this.area.y > 0)) || ((movy > 0) && (y2 < 1.0)) } -function moveBy(movx, movy) { +Digilib.prototype.moveBy = function(movx, movy) { // move visible area by movx and movy (in units of ww, wh) - if (!canMove(movx, movy)) return; // nothing to do - var newarea = dlArea.copy(); - newarea.x += parseFloat(movx)*dlArea.width; - newarea.y += parseFloat(movy)*dlArea.height; - newarea = dlMaxArea.fit(newarea); + if (!this.canMove(movx, movy)) return; // nothing to do + var newarea = this.area.copy(); + newarea.x += parseFloat(movx)*this.area.width; + newarea.y += parseFloat(movy)*this.area.height; + newarea = MAX_AREA.fit(newarea); // set parameters - setParamFromArea(newarea); - parseArea(); - display(); + this.setParamFromArea(newarea); + this.display(); } -function getRef(baseURL) { +Digilib.prototype.getRef = function(baseUrl) { // returns a reference to the current digilib set if (!baseUrl) baseUrl = location.protocol @@ -593,101 +553,105 @@ + location.host + location.pathname; var hyperlinkRef = baseUrl; - var params = dlParams.getAll(dlParams.PARAM_ALL & ~(dlParams.PARAM_DPI | dlParams.PARAM_PAGES)); // all without ddpi, pt - if (params.length > 0) hyperlinkRef += "?" + params; + with (this.params) { + var ps = getAll(PARAM_ALL & ~(PARAM_DPI | PARAM_PAGES)); // all without ddpi, pt + } + if (ps.length > 0) hyperlinkRef += "?" + ps; return hyperlinkRef; } -function getRefWin(type, msg) { +Digilib.prototype.getRefWin = function(type, msg) { // shows an alert with a reference to the current digilib set if (! msg) msg = "URL reference to the current view"; - prompt(msg, getRef()); + prompt(msg, this.getRef()); } -function getQuality() { +Digilib.prototype.getQuality = function() { // returns the current q setting for (var i = 0; i < 3; i++) { - if (dlFlags.get("q"+i)) return i; + if (this.flags.get("q"+i)) return i; } return 1 } -function setQuality(qual) { +Digilib.prototype.setQuality = function(qual) { // set the image quality - for (var i = 0; i < 3; i++) dlFlags.reset("q" + i); if ((qual < 0)||(qual > 2)) return alert("Quality setting not supported"); - dlFlags.set("q" + qual); - display(); + for (var i = 0; i < 3; i++) this.flags.reset("q" + i); + this.flags.set("q" + qual); + this.display(); } -function setQualityWin(msg) { +Digilib.prototype.setQualityWin = function(msg) { // dialog for setting quality if (! msg) msg = "Quality (0..2)"; - var q = getQuality(); + var q = this.getQuality(); var newq = window.prompt(msg, q); - if (newq) setQuality(newq); + if (newq) this.setQuality(newq); } -function mirror(dir) { +Digilib.prototype.mirror = function(dir) { // mirror the image horizontally or vertically if (dir == "h") { - dlFlags.toggle("hmir"); + this.flags.toggle("hmir"); } else { - dlFlags.toggle("vmir"); + this.flags.toggle("vmir"); } - display(); + this.display(); } -function gotoPage(gopage, keep) { +Digilib.prototype.gotoPage = function(gopage, keep) { // goto given page nr (+/-: relative) - var oldpn = parseInt(dlParams.get("pn")); - dlParams.set("pn", gopage, true); - var pn = parseInt(dlParams.get("pn")); + var oldpn = parseInt(this.params.get("pn")); + // set with relative=true uses the sign + this.params.set("pn", gopage, true); + // now check the outcome + var pn = parseInt(this.params.get("pn")); if (pn < 1) { alert("No such page! (Page number too low)"); - dlParams.set("pn", oldpn); + this.params.set("pn", oldpn); return; } - if (dlParams.isSet("pt")) { - pt = parseInt(dlParams.get("pt")) + if (this.params.isSet("pt")) { + pt = parseInt(this.params.get("pt")) if (pn > pt) { alert("No such page! (Page number too high)"); - dlParams.set("pn", oldpn); + this.params.set("pn", oldpn); return; } } if (keep) { - display(dlParams.PARAM_ALL & ~dlParams.PARAM_MARK); // all, no mark + this.display(this.params.PARAM_ALL & ~this.params.PARAM_MARK); // all, no mark } else { - display(dlParams.PARAM_FILE | dlParams.PARAM_MODE | dlParams.PARAM_PAGES, dlParams.MODE_QUAL | dlParams.MODE_OTHER); // fn, pn, ws, mo + pt + this.display(this.params.PARAM_FILE | this.params.PARAM_MODE | this.params.PARAM_PAGES, this.params.MODE_QUAL | this.params.MODE_OTHER); // fn, pn, ws, mo + pt } } -function gotoPageWin() { +Digilib.prototype.gotoPageWin = function() { // dialog to ask for new page nr - var pn = dlParams.get("pn"); + var pn = this.params.get("pn"); var gopage = window.prompt("Go to page", pn); - if (gopage) gotoPage(gopage); - } + if (gopage) this.gotoPage(gopage); +} -function setParamWin(param, text, relative) { +Digilib.prototype.setParamWin = function(param, text, relative) { // dialog to ask for new parameter value - var val = dlParams.get(param); + var val = this.params.get(param); var newval = window.prompt(text, val); if (newval) { - dlParams.set(param, newval, relative); - display(); + this.params.set(param, newval, relative); + this.display(); } } -function showOptions(show) { +Digilib.prototype.showOptions = function(show) { // show or hide option div var elem = getElement("dloptions"); showElement(elem, show); // FIX ME: get rid of the dotted line around the buttons when focused } -function showAboutDiv(show) { +Digilib.prototype.showAboutDiv = function(show) { // show or hide "about" div var elem = getElement("about"); if (elem == null) { @@ -710,16 +674,16 @@ showElement(elem, show); } -function loadBirdImage() { +Digilib.prototype.loadBirdImage = function() { var img = getElement("bird-image"); var src = "../servlet/Scaler?" - + dlParams.getAll(dlParams.PARAM_FILE) + + this.params.getAll(this.params.PARAM_FILE) + "&dw=" + BIRD_MAXX + "&dh=" + BIRD_MAXY; img.src = src; - } +} -function showBirdDiv(show) { +Digilib.prototype.showBirdDiv = function(show) { // show or hide "bird's eye" div var startPos; // anchor for dragging var newRect; // position after drag @@ -728,14 +692,14 @@ var overlay = getElement("overlay"); showElement(birdImg, show); // dont show selector if area has full size - if (!show || isFullArea()) { + if (!show || this.isFullArea()) { // hide area showElement(birdArea, false); showElement(overlay, false); return; - }; + }; var birdImgRect = getElementRect(birdImg); - var area = parseArea(); + var area = this.area; // scale area down to img size var birdAreaRect = new Rectangle( // what about borders ?? @@ -751,6 +715,9 @@ registerEvent("mousedown", overlay, birdAreaStartDrag); registerEvent("mousedown", birdImg, birdAreaStartDrag); + // our own reference to this for local functions + var digilib = this; + function birdAreaStartDrag(evt) { // mousedown handler: start drag startPos = evtPosition(evt); @@ -760,7 +727,7 @@ registerEvent("mouseup", document, birdAreaEndDrag); // debugProps(getElementRect(bird)) return stopEvent(evt); - } + } function birdAreaMove(evt) { // mousemove handler: drag @@ -778,7 +745,7 @@ moveElement(birdArea, newRect); showElement(birdArea, true); return stopEvent(evt); - } + } function birdAreaEndDrag(evt) { // mouseup handler: reload page @@ -789,47 +756,46 @@ startPos = birdAreaRect.getCenter(); birdAreaMove(evt); // set center to click position } - dlParams.set("wx", cropFloat((newRect.x - birdImgRect.x) / birdImgRect.width)); - dlParams.set("wy", cropFloat((newRect.y - birdImgRect.y) / birdImgRect.height)); + digilib.params.set("wx", cropFloat((newRect.x - birdImgRect.x) / birdImgRect.width)); + digilib.params.set("wy", cropFloat((newRect.y - birdImgRect.y) / birdImgRect.height)); // zoomed is always fit - dlParams.set("ws", 1); - display(); + digilib.params.set("ws", 1); + digilib.display(); return stopEvent(evt); - } } +} -function showArrow(name, rect, show) { +Digilib.prototype.showArrow = function(name, rect, show) { var arrow = getElement(name); moveElement(arrow, rect); showElement(arrow, show); } -function showArrows() { +Digilib.prototype.showArrows = function() { // show the 4 arrow bars on top of scaler img according to current dlArea - if (defined(scalerImg.complete) && !scalerImg.complete && !browserType.isN4 ) { - setTimeout("showArrows()", 100); - return; + if (defined(this.scalerImg.complete) && !this.scalerImg.complete && !browserType.isN4 ) { + alert("ERROR: scaler img not complete in showArrows!"); } - var r = getElementRect(scalerImg); - showArrow('up', + var r = getElementRect(this.scalerImg); + this.showArrow('up', new Rectangle(r.x, r.y, r.width, ARROW_WIDTH), - canMove(0, -1) + this.canMove(0, -1) ); - showArrow('down', + this.showArrow('down', new Rectangle(r.x, r.y + r.height - ARROW_WIDTH, r.width, ARROW_WIDTH), - canMove(0, 1) + this.canMove(0, 1) ); - showArrow('left', + this.showArrow('left', new Rectangle(r.x, r.y, ARROW_WIDTH, r.height), - canMove(-1, 0) + this.canMove(-1, 0) ); - showArrow('right', + this.showArrow('right', new Rectangle(r.x + r.width - ARROW_WIDTH, r.y, ARROW_WIDTH, r.height), - canMove(1, 0) + this.canMove(1, 0) ); } -function calibrate(direction) { +Digilib.prototype.calibrate = function(direction) { // calibrate screen var startPos; // anchor for dragging var newRect; // position after drag @@ -892,7 +858,7 @@ } } -function originalSize(on) { +Digilib.prototype.originalSize = function(on) { // set osize flag, needs calibrated screen if (on) { var dpi = cookie.get("ddpi"); @@ -900,41 +866,41 @@ alert("Screen has not yet been calibrated - using default value of 72 dpi"); dpi = 72; } - dlParams.set("ddpi", dpi); - addFlag("osize"); - display(); - } - else removeFlag("osize"); + this.params.set("ddpi", dpi); + this.flags.set("osize"); + this.display(); + } else { + this.flags.reset("osize"); + } } - -function pixelByPixel(on) { + +Digilib.prototype.pixelByPixel = function(on) { // sets clip flag if (on) { - addFlag("clip"); - display(); + this.flags.set("clip"); + this.display(); } - else removeFlag("clip"); + else this.flags.reset("clip"); } -function pageWidth() { - var divSize = getElementSize(scalerDiv); +Digilib.prototype.pageWidth = function() { + var divSize = getElementSize(this.scalerDiv); divSize.width -= INSET; // allow for scrollbars [Firefox bug?] - var imgSize = getElementSize(scalerImg); + var imgSize = getElementSize(this.scalerImg); if (imgSize.width < divSize.width) { - dlParams.set("ws", cropFloat(divSize.width / imgSize.width)); - display(dlParams.PARAM_ALL & ~dlParams.PARAM_DIM); // no zoom + this.params.set("ws", cropFloat(divSize.width / imgSize.width)); + this.display(this.params.PARAM_ALL & ~this.params.PARAM_DIM); // no zoom }; // TODO: how to calculate correct width if zoom is on? (plus size?) - } -function resize(factor) { - dlParams.set("ws", factor); - showSizeMenu(false); - display(); +Digilib.prototype.resize = function(factor) { + this.params.set("ws", factor); + this.showSizeMenu(false); + this.display(); } -function showSizeMenu(show) { +Digilib.prototype.showSizeMenu = function(show) { var menu = getElement("sizes"); if (show) { // align menu with button @@ -943,5 +909,65 @@ } showElement(menu, show); } + + +/******************************** + * global variables + ********************************/ + +var dl = new Digilib(); + +/* old parameter function compatibility stuff */ +function newParameter(a,b,c) {return dl.params.define(a,b,c)}; +function resetParameter(a) {return dl.params.reset(a)}; +function deleteParameter(a) {return dl.params.remove(a)}; +function getParameter(a) {return dl.params.get(a)}; +function setParameter(a,b,c) {return dl.params.set(a,b,c)}; +function hasParameter(a) {return dl.params.isSet(a)}; +function getAllParameters(a) {return dl.params.getAll(a)}; +getQueryString = getAllParameters; +function parseParameters(a) {return dl.params.parse(a)}; +function getAllMarks() {return dl.marks.getAll()}; +getMarksQueryString = getAllMarks; +function addMark(evt) {return dl.marks.addEvent(evt)}; +function deleteMark() {return dl.marks.pop()}; +function deleteAllMarks() {return dl.marks = new Marks()}; +function hasFlag(mode) {return dl.flags.get(mode)}; +function addFlag(mode) {return dl.flags.set(mode)}; +function removeFlag(mode) {return dl.flags.reset(mode)}; +function toggleFlag(mode) {return dl.flags.toggle(mode)}; +function getAllFlags() {return dl.flags.getAll()}; +/* old digilib function compatibility */ +function setDLParam(e, s, relative) {dl.setDLParam(e, s, relative)}; +function display(detail, moDetail) {dl.display(detail, moDetail)}; +function setMark(reload) {dl.setMark(reload)}; +function removeMark(reload) {dl.removeMark(reload)}; +function zoomArea() {dl.zoomArea()}; +function zoomBy(factor) {dl.zoomBy(factor)}; +function zoomFullpage() {dl.zoomFullpage()}; +function moveCenter(on) {dl.moveCenter(on)}; +function isFullArea(area) {dl.isFullArea(area)}; +function canMove(movx, movy) {dl.canMove(movx, movy)}; +function moveBy(movx, movy) {dl.moveBy(movx, movy)}; +function getRef(baseURL) {dl.getRef(baseURL)}; +function getRefWin(type, msg) {dl.getRefWin(type, msg)}; +function getQuality() {dl.getQuality()}; +function setQuality(qual) {dl.setQuality(qual)}; +function setQualityWin(msg) {dl.setQualityWin(msg)}; +function mirror(dir) {dl.mirror(dir)}; +function gotoPage(gopage, keep) {dl.gotoPage(gopage, keep)}; +function gotoPageWin() {dl.gotoPageWin()}; +function setParamWin(param, text, relative) {dl.setParamWin(param, text, relative)}; +function showOptions(show) {dl.showOptions(show)}; +function showBirdDiv(show) {dl.showBirdDiv(show)}; +function showAboutDiv(show) {dl.showAboutDiv(show)}; +function calibrate(direction) {dl.calibrate(direction)}; +function originalSize(on) {dl.originalSize(on)}; +function pixelByPixel(on) {dl.pixelByPixel(on)}; +function pageWidth() {dl.pageWidth()}; +function resize(factor) {dl.resize(factor)}; +function showSizeMenu(show) {dl.showSizeMenu(show)}; + + // :tabSize=4:indentSize=4:noTabs=true: