Mercurial > hg > digilib-old
changeset 237:786c27786281
new javascript code for digilib
author | robcast |
---|---|
date | Tue, 20 Jul 2004 09:57:24 +0200 |
parents | 35deb0f14913 |
children | 1ccda61967b2 |
files | client/digitallibrary/baselib.js client/digitallibrary/digimage.jsp client/digitallibrary/dllib.js |
diffstat | 3 files changed, 1075 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/digitallibrary/baselib.js Tue Jul 20 09:57:24 2004 +0200 @@ -0,0 +1,559 @@ +/* Copyright (C) 2003,2004 WTWG, Uni Bern and others + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Authors: ROC 03.06.2004 + first version by Christian Luginbuehl, 01.05.2003 + Changed for digiLib in Zope by DW 24.03.2004 +*/ + +function getInt (n) { + // returns always an integer + n = parseInt (n); + if (isNaN (n)) + return 0; + return n; +} + +function defined(x) { + // returns if x is defined + return (typeof arguments[0] != "undefined"); +} + +// auxiliary function to crop senseless precision +function cropFloat(x) { + return parseInt(10000*x)/10000; +} + +// browser sniffer +var browserType = Object(); +browserType.doDHTML = false; +browserType.versIE = 0; + +if ((! document.cssonly && document.layers) || document.all || document.getElementById) { + var vers = navigator.appVersion.split('MSIE '); + vers = vers[vers.length - 1]; + browserType.versIE = getInt(vers); + browserType.isIE = navigator.userAgent.indexOf('MSIE') >= 0; + browserType.isMac = navigator.platform.indexOf('Mac') >= 0; + browserType.isWin = navigator.platform.indexOf('Win') >= 0; + browserType.isN4 = (navigator.userAgent.indexOf('Mozilla/4.') >= 0) && ! browserType.isIE; + browserType.isIEWin = browserType.versIE > 0 && browserType.isWin; + if (navigator.appVersion.indexOf('MSIE') < 0 || ! browserType.isMac || browserType.versIE >= 5) { + browserType.doDHTML = true; + browserType.isOpera = navigator.userAgent.indexOf(' Opera ') >= 0; + browserType.isKonq = navigator.userAgent.indexOf(' Konqueror') >= 0; + } +} + +// fixes for javascript < 1.2 +if (! Array.prototype.push) { + Array.prototype.push = function(val) { + this[this.length] = val; + return this.length; + } + Array.prototype.pop = function() { + var val = this[this.length-1]; + this.length -= 1; + return val; + } +} + + +/* ********************************************** + * geometry classes + * ******************************************** */ + +/* + * Size class + */ +function Size(w, h) { + this.width = parseFloat(w); + this.height = parseFloat(h); + return this; +} + +/* + * Position class + */ +function Position(x, y) { + this.x = parseFloat(x); + this.y = parseFloat(y); + return this; +} + +/* + * Rectangle class + */ +function Rectangle(x, y, w, h) { + this.x = parseFloat(x); + this.y = parseFloat(y); + this.width = parseFloat(w); + this.height = parseFloat(h); + return this; +} +Rectangle.prototype.copy = function() { + // returns a copy of this Rectangle + return new Rectangle(this.x, this.y, this.width, this.height); +} +Rectangle.prototype.getPosition = function() { + // returns the position of this Rectangle + return new Position(this.x, this.y); +} +Rectangle.prototype.getSize = function() { + // returns the size of this Rectangle + return new Size(this.width, this.height); +} +Rectangle.prototype.getArea = function() { + // returns the area of this Rectangle + return (this.width * this.height); +} +Rectangle.prototype.containsPosition = function(pos) { + // returns if the given Position lies in this Rectangle + return ((pos.x >= this.x)&&(pos.y >= this.y)&&(pos.x <= this.x+this.width)&&(pos.y <= this.y+this.width)); +} +Rectangle.prototype.intersect = function(rect) { + // returns the intersection of the given Rectangle and this one + var sec = rect.copy(); + if (sec.x < this.x) { + sec.width = sec.width - (this.x - sec.x); + sec.x = this.x; + } + if (sec.y < this.y) { + sec.height = sec.height - (this.y - sec.y); + sec.y = this.y; + } + if (sec.x + sec.width > this.x + this.width) { + sec.width = (this.x + this.width) - sec.x; + } + if (sec.y + sec.height > this.y + this.height) { + sec.height = (this.y + this.height) - sec.y; + } + return sec; +} +Rectangle.prototype.fit = function(rect) { + // returns a Rectangle that fits into this one (by moving first) + var sec = rect.copy(); + sec.x = Math.max(sec.x, this.x); + sec.x = Math.max(sec.x, this.x); + if (sec.x + sec.width > this.x + this.width) { + sec.x = this.x + this.width - sec.width; + } + if (sec.y + sec.height > this.y + this.height) { + sec.y = this.y + this.height - sec.height; + } + return sec.intersect(this); +} + +/* + * Transform class + * + * defines a class of affine transformations + */ +function Transform() { + this.m00 = 1.0; + this.m01 = 0.0; + this.m02 = 0.0; + this.m10 = 0.0; + this.m11 = 1.0; + this.m12 = 0.0; + this.m20 = 0.0; + this.m21 = 0.0; + this.m22 = 1.0; + return this; +} +Transform.prototype.concat = function(traf) { + // add Transform traf to this Transform + for (var i = 0; i < 3; i++) { + for (var j = 0; j < 3; j++) { + var c = 0.0; + for (var k = 0; k < 3; k++) { + c += traf["m"+i+k] * this["m"+k+j]; + } + this["m"+i+j] = c; + } + } + return this; +} +Transform.prototype.transform = function(rect) { + // returns transformed Rectangle or Position with this Transform applied + var x = this.m00 * rect.x + this.m01 * rect.y + this.m02; + var y = this.m10 * rect.x + this.m11 * rect.y + this.m12; + if (rect.width) { + var width = this.m00 * rect.width + this.m01 * rect.height; + var height = this.m10 * rect.width + this.m11 * rect.height; + return new Rectangle(x, y, width, height); + } + return new Position(x, y); +} +Transform.prototype.invtransform = function(pos) { + // returns transformed Position pos with the inverse of this Transform applied + var det = this.m00 * this.m11 - this.m01 * this.m10; + var x = (this.m11 * pos.x - this.m01 * pos.y - this.m11 * this.m02 + this.m01 * this.m12) / det; + var y = (- this.m10 * pos.x + this.m00 * pos.y + this.m10 * this.m02 - this.m00 * this.m12) / det; + return new Position(x, y); +} +function getRotation(angle, pos) { + // returns a Transform that is a rotation by angle degrees around [pos.x, pos.y] + var traf = new Transform(); + if (angle != 0) { + var t = 2.0 * Math.PI * parseFloat(angle) / 360.0; + traf.m00 = Math.cos(t); + traf.m01 = - Math.sin(t); + traf.m10 = Math.sin(t); + traf.m11 = Math.cos(t); + traf.m02 = pos.x - pos.x * Math.cos(t) + pos.y * Math.sin(t); + traf.m12 = pos.y - pos.x * Math.sin(t) - pos.y * Math.cos(t); + } + return traf; +} +function getTranslation(pos) { + // returns a Transform that is a translation by [pos.x, pos,y] + var traf = new Transform(); + traf.m02 = pos.x; + traf.m12 = pos.y; + return traf; +} +function getScale(size) { + // returns a Transform that is a scale by [size.width, size.height] + var traf = new Transform(); + traf.m00 = size.width; + traf.m11 = size.height; + return traf; +} + + +/* ********************************************** + * parameter routines + * ******************************************** */ + +var dlParams = new Object(); + +function newParameter(name, defaultValue, detail) { + // create a new parameter with a name and a default value + if (defined(dlParams[name])) { + alert("Fatal: An object with name '" + name + "' already exists - cannot recreate!"); + return false; + } else { + dlParams[name] = new Object(); + dlParams[name].defaultValue = defaultValue; + dlParams[name].hasValue = false; + dlParams[name].value = defaultValue; + dlParams[name].detail = detail; + return dlParams[name]; + } +} + +function getParameter(name) { + // returns the named parameter value or its default value + if (defined(dlParams[name])) { + if (dlParams[name].hasValue) { + return dlParams[name].value; + } else { + return dlParams[name].defaultValue; + } + } else { + return null; + } +} + +function setParameter(name, value) { + // sets parameter value + if (defined(dlParams[name])) { + dlParams[name].value = value; + dlParams[name].hasValue = true; + return true; + } + return false; +} + +function getAllParameters(detail) { + // returns a string of all parameters in query format + if (! detail) { + detail = 10; + } + var params = new Array(); + for ( param in dlParams ) { + if ((dlParams[param].detail <= detail)&&(dlParams[param].hasValue)) { + var val = getParameter(param); + if (val != "") { + params.push(param + "=" + val); + } + } + } + return params.join("&"); +} + +function parseParameters(query) { + // gets parameter values from query format string + var params = query.split("&"); + for (var i = 0; i < params.length; i++) { + var keyval = params[i].split("="); + if (keyval.length == 2) { + setParameter(keyval[0], keyval[1]); + } + } +} + + +/* ********************************************** + * HTML/DOM routines + * ******************************************** */ + +function getElement(tagid, quiet) { + // returns the element object with the id tagid + var e; + if (document.getElementById) { + e = document.getElementById(tagid); + } else if (document.all) { + alert("document.all!"); + e = document.all[tagid]; + } else if (document.layers) { + e = document.layers[tagid]; + } + if (e) { + return e; + } else { + if (! quiet) { + alert("unable to find element: "+tagid); + } + return null; + } +} + +function getElementPosition(elem) { + // returns a Position with the position of the element + var x = 0; + var y = 0; + if (defined(elem.offsetLeft)) { + var e = elem; + while (e) { + if (defined(e.clientLeft)) { + // special for IE + if (browserType.isMac) { + if (e.offsetParent.tagName == "BODY") { + // IE for Mac extraspecial + x += e.clientLeft; + y += e.clientTop; + break; + } + } else { + if ((e.tagName != "TABLE") && (e.tagName != "BODY")) { + x += e.clientLeft; + y += e.clientTop; + } + } + } + x += e.offsetLeft; + y += e.offsetTop; + e = e.offsetParent; + } + } else if (defined(elem.x)) { + x = elem.x; + y = elem.y; + } else if (defined(elem.pageX)) { + x = elem.pageX; + y = elem.pageY; + } else { + alert("unable to get position of "+elem+" (id:"+elem.id+")"); + } + return new Position(getInt(x), getInt(y)); +} + +function getElementSize(elem) { + // returns a Rectangle with the size of the element + var width = 0; + var height = 0; + if (defined(elem.offsetWidth)) { + width = elem.offsetWidth; + height = elem.offsetHeight; + } else if (defined(elem.width)) { + width = elem.width; + height = elem.height; + } else if (defined(elem.clip.width)) { + width = elem.clip.width; + height = elem.clip.height; + } else { + alert("unable to get size of "+elem+" (id:"+elem.id+")"); + } + return new Size(getInt(width), getInt(height)); +} + +function getElementRect(elem) { + // returns a Rectangle with the size and position of the element + var pos = getElementPosition(elem); + var size = getElementSize(elem); + return new Rectangle(pos.x, pos.y, size.width, size.height); +} + + + +function moveElement(elem, rect) { + // moves and sizes the element + if (elem.style) { + if (defined(rect.x)) { + elem.style.left = Math.round(rect.x) + "px"; + elem.style.top = Math.round(rect.y) + "px"; + } + if (defined(rect.width)) { + elem.style.width = Math.round(rect.width) + "px"; + elem.style.height = Math.round(rect.height) + "px"; + } + } else if (document.layers) { + if (defined(rect.x)) { + elem.pageX = getInt(rect.x); + elem.pageY = getInt(rect.y); + } + if (defined(rect.width)) { + elem.clip.width = getInt(rect.width); + elem.clip.height = getInt(rect.height); + } + } else { + alert("moveelement: no style nor layer property!"); + return false; + } + return true; +} + +function showElement(elem, show) { + // shows or hides the element + if (elem.style) { + if (show) { + elem.style.visibility = "visible"; + } else { + elem.style.visibility = "hidden"; + } + } else if (defined(elem.visibility)) { + if (show) { + elem.visibility = "show"; + } else { + elem.visibility = "hide"; + } + } else { + alert("showelement: no style nor layer property!"); + } + return true; +} + +function evtPosition(evt) { + // returns the on-screen Position of the Event + var x; + var y; + evt = (evt) ? evt : window.event; + if (!evt) { + alert("no event found! "+evt); + return; + } + if (defined(evt.pageX)) { + x = parseInt(evt.pageX); + y = parseInt(evt.pageY); + } else if (defined(evt.clientX)) { + x = parseInt(document.body.scrollLeft+evt.clientX); + y = parseInt(document.body.scrollTop+evt.clientY); + } else { + alert("evtPosition: don't know how to deal with "+evt); + } + return new Position(x, y); +} + +function registerMouseDown(elem, handler) { + // register a mouse down event handler on the indicated element + if (elem.addEventListener) { + elem.addEventListener("mousedown", handler, false); + } else { + if (elem.captureEvents) { + elem.captureEvents(Event.MOUSEDOWN); + } + elem.onmousedown = handler; + } + return true; +} + +function unregisterMouseDown(elem, handler) { + // unregister the mouse down event handler + if (elem.removeEventListener) { + elem.removeEventListener("mousedown", handler, false); + } else { + if (elem.releaseEvents) { + elem.releaseEvents(Event.MOUSEDOWN); + } + elem.onmousedown = null; + } + return true; +} + +function registerMouseMove(elem, handler) { + // register a mouse move event handler on the indicated element + if (elem.addEventListener) { + elem.addEventListener("mousemove", handler, false); + } else { + if (elem.captureEvents) { + elem.captureEvents(Event.MOUSEMOVE); + } + elem.onmousemove = handler; + } + return true; +} + +function unregisterMouseMove(elem, handler) { + // unregister the mouse move event handler + if (elem.removeEventListener) { + elem.removeEventListener("mousemove", handler, false); + } else { + if (elem.releaseEvents) { + elem.releaseEvents(Event.MOUSEMOVE); + } + elem.onmousemove = null; + } + return true; +} + +function registerKeyDown(handler) { + // register a key down handler + if ( document.addEventListener ) { + this.document.addEventListener('keypress', handler, false); + } else { + if (elem.captureEvents) { + elem.captureEvents(Event.MOUSEDOWN); + } + this.document.onkeypress = handler + } + return true; +} + +function getWinSize() { + // returns a Size with the current window size (mostly from www.quirksmode.org) + var wsize = new Size(100, 100); + if (defined(self.innerHeight)) { + // all except Explorer + wsize.width = self.innerWidth; + wsize.height = self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { + // Explorer 6 Strict Mode + wsize.width = document.documentElement.clientWidth; + wsize.height = document.documentElement.clientHeight; + } else if (document.body) { + // other Explorers + wsize.width = document.body.clientWidth; + wsize.height = document.body.clientHeight; + } + return wsize; +} + +function openWin(url, title, params) { + // open browser window + var ow = window.open(url, title, params); + ow.focus(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/digitallibrary/digimage.jsp Tue Jul 20 09:57:24 2004 +0200 @@ -0,0 +1,80 @@ +<%@ page language="java" %> +<%! +// authentication stuff - robert +// ----------------------------- +// create DocumentBean instance for all JSP requests +digilib.servlet.DocumentBean docBean = new digilib.servlet.DocumentBean(); + +// initialize DocumentBean instance in JSP init +public void jspInit() { + try { + // set servlet init-parameter + docBean.setConfig(getServletConfig()); + } catch (javax.servlet.ServletException e) { + System.out.println(e); + } +} +%> +<% +// parsing the query +// ----------------- +digilib.servlet.DigilibRequest dlRequest = new digilib.servlet.DigilibRequest(request); +// check if authentication is needed and redirect if necessary +docBean.doAuthentication(dlRequest, response); +// add number of pages +dlRequest.setValue("pt", docBean.getNumPages(dlRequest)); +String imageLocation = dlRequest.getAsString("base.url") + "/servlet/Scaler?" + dlRequest.getAsString(); +%><html> +<head> + <title>Digital Document Library (L1)</title> + <script type="text/javascript" src="baselib.js"></script> + <script type="text/javascript" src="dllib.js"></script> +<script type="text/javascript"> + var dlTarget = window.name; + var baseUrl = '<%= dlRequest.getAsString("base.url") %>'; + var toolbarEnabledURL = window.location; + newParameter('fn', '', 1); + newParameter('pn', '1', 1); + newParameter('ws', '1.0', 1); + newParameter('mo', '', 1); + newParameter('mk', '', 3); + newParameter('wx', '0.0', 2); + newParameter('wy', '0.0', 2); + newParameter('ww', '1.0', 2); + newParameter('wh', '1.0', 2); + newParameter('pt', '<%= dlRequest.getAsString("pt") %>', 1); + newParameter('brgt', '0.0', 1); + newParameter('cont', '0.0', 1); + newParameter('rot', '0.0', 1); + newParameter('rgba', '', 1); + newParameter('rgbm', '', 1); + newParameter('ddpix', '', 9); + newParameter('ddpiy', '', 9); + document.id='digilib'; +</script> +</head> +<body bgcolor="#666666" onload="dl_init()"> + +<div id="scaler" style="position:absolute; left:10px; top:10px; visibility:visible"> +<script type="text/javascript"> +var ps = bestPicSize(getElement('scaler'), 10); +document.write('<img id="pic" src="<%= imageLocation %>&dw='+ps.width+'&dh='+ps.height+'" />'); +</script> +</div> + + <div id="dot0" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="mark1.gif" border="0"></div> + <div id="dot1" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="mark2.gif" border="0"></div> + <div id="dot2" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="mark3.gif" border="0"></div> + <div id="dot3" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="mark4.gif" border="0"></div> + <div id="dot4" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="mark5.gif" border="0"></div> + <div id="dot5" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="mark6.gif" border="0"></div> + <div id="dot6" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="mark7.gif" border="0"></div> + <div id="dot7" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="mark8.gif" border="0"></div> + <div id="eck1" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="olinks.gif" border="0"></div> + <div id="eck2" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="orechts.gif" border="0"></div> + <div id="eck3" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="ulinks.gif" border="0"></div> + <div id="eck4" style="position:absolute; left:-20; top:100; visibility:hidden"><img src="urechts.gif" border="0"></div> + +</body> + +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/digitallibrary/dllib.js Tue Jul 20 09:57:24 2004 +0200 @@ -0,0 +1,436 @@ +/* Copyright (C) 2003,2004 WTWG Uni Bern and others + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Authors: ROC 3.5.2004 + first version by Christian Luginbuehl, 01.05.2003 + Changed for digiLib in Zope by DW 24.03.2004 + +Requires baselib.js ! + +*/ + +var dlScriptVersion = "0.9a1"; + +/* + * more parameter handling + */ + +var dlArea = new Rectangle(0.0, 0.0, 1.0, 1.0); +var dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0); + +function parseArea() { + // returns area Rectangle from current parameters + return new Rectangle(getParameter("wx"), getParameter("wy"), getParameter("ww"), getParameter("wh")); +} + +function setParamFromArea(rect) { + // sets digilib wx etc. from rect + setParameter("wx", cropFloat(rect.x)); + setParameter("wy", cropFloat(rect.y)); + setParameter("ww", cropFloat(rect.width)); + setParameter("wh", cropFloat(rect.height)); + return true; +} + +var dlTrafo = new Transform(); + +function parseTrafo(elem) { + // returns Transform from current dlArea and picsize + var picsize = getElementRect(elem); + var trafo = new Transform(); + // subtract area offset and size + trafo.concat(getTranslation(new Position(-dlArea.x, -dlArea.y))); + trafo.concat(getScale(new Size(1/dlArea.width, 1/dlArea.height))); + // scale to screen size + trafo.concat(getScale(picsize)); + trafo.concat(getTranslation(picsize)); + // rotate + //trafo.concat(getRotation(- getParameter("rot"), new Position(0.5*picsize.width, 0.5*picsize.height))); + // mirror + //if (hasFlag("hmir")) { + //trafo.m00 = - trafo.m00; + //} + //if (hasFlag("vmir")) { + //trafo.m11 = - trafo.m11; + //} + return trafo; +} + + +var dlMarks = new Array(); + +function parseMarks() { + // returns marks array from current parameters + var marks = new Array(); + var ma; + var mk = getParameter("mk"); + if (mk.indexOf(";") >= 0) { + // old format with ";" + ma = mk.split(";"); + } else { + ma = mk.split(","); + } + for (var i = 0; i < ma.length ; i++) { + var pos = ma[i].split("/"); + if (pos.length > 1) { + marks.push(new Position(pos[0], pos[1])); + } + } + return marks; +} + +function getAllMarks() { + // returns a string with all marks in query format + var marks = new Array(); + for (var i = 0; i < dlMarks.length; i++) { + marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y)); + } + return marks.join(","); +} + +function addMark(pos) { + // add a mark + dlMarks.push(pos); + setParameter("mk", getAllMarks()); + return true; +} + +function deleteMark() { + // delete the last mark + dlMarks.pop(); + setParameter("mk", getAllMarks()); + return true; +} + +var dlFlags = new Object(); + +function hasFlag(mode) { + // returns if mode flag is set + return (dlFlags[mode]); +} + +function addFlag(mode) { + // add a mode flag + dlFlags[mode] = mode; + return true; +} + +function removeFlag(mode) { + // remove a mode flag + if (dlFlags[mode]) { + delete dlFlags[mode]; + } + return true; +} + +function toggleFlag(mode) { + // change a mode flag + if (dlFlags[mode]) { + delete dlFlags[mode]; + } else { + dlFlags[mode] = mode; + } + return true; +} + +function getAllFlags() { + // returns a string with all flags in query format + var fa = new Array(); + for (var f in dlFlags) { + if ((f != "")&&(dlFlags[f] != null)) { + fa.push(f); + } + } + return fa.join(","); +} + +function parseFlags() { + // sets dlFlags from the current parameters + var flags = new Object(); + var fa = getParameter("mo").split(","); + for (var i = 0; i < fa.length ; i++) { + var f = fa[i]; + if (f != "") { + flags[f] = f; + } + } + return flags; +} + + +function bestPicSize(elem, inset) { + // returns a Size with the best image size for the given element + if (! defined(inset)) { + inset = 25; + } + var ws = getWinSize(); + var es = getElementPosition(elem); + if (es) { + ws.width = ws.width - es.x - inset; + ws.height = ws.height - es.y - inset; + } + return ws; +} + + +/* ********************************************** + * digilib specific routines + * ******************************************** */ + +var elemScaler = null; +var picElem = null; + +function dl_init() { + elemScaler = getElement("scaler", true); + picElem = getElement("pic", true); + if (picElem == null && elemScaler) { + // in N4 pic is in the scaler layer + picElem = elemScaler.document.images[0]; + } + if ((!elemScaler)||(!picElem)) { + alert("Sorry, zogilib doesn't work here!"); + return false; + } + // give a name to the window containing digilib + if (defined(dlTarget)&&(dlTarget)) { + window.name = dlTarget; + } else { + window.name = "digilib"; + } + // put the query parameters (sans "?") in the parameters array + parseParameters(location.search.slice(1)); + // treat special parameters + dlMarks = parseMarks(); + dlArea = parseArea(); + dlFlags = parseFlags(); + // wait for image to load and display marks + renderMarks(); + // done + focus(); + return; +} + + +function display(detail) { + // redisplay the page + if (! detail) { + detail = 9; + } + var queryString = getAllParameters(detail); + location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString; +} + + +/* ********************************************** + * interactive digilib functions + * ******************************************** */ + + +function renderMarks() { + // put the visible marks on the image + var mark_count = dlMarks.length; + // make shure the image is loaded so we know its size + if (defined(picElem.complete) && picElem.complete == false && ! browserType.isN4 ) { + setTimeout("renderMarks()", 100); + } else { + dlTrafo = parseTrafo(picElem); + for (var i = 0; i < 8; i++) { + var me = getElement("dot"+i); + if (i < mark_count) { + if (dlArea.containsPosition(dlMarks[i])) { + var mpos = dlTrafo.transform(dlMarks[i]); + // suboptimal to place -5 pixels and not half size of mark-image + mpos.x = mpos.x -5; + mpos.y = mpos.y -5; + moveElement(me, mpos); + showElement(me, true); + } + } else { + // hide the other marks + showElement(me, false); + } + } + } +} + + +function setMark() { + // add a mark where clicked + if ( dlMarks.length > 7 ) { + alert("Only 8 marks are possible at the moment!"); + return; + } + + function markEvent(evt) { + // event handler adding a new mark + unregisterMouseDown(elemScaler, markEvent); + var p = dlTrafo.invtransform(evtPosition(evt)); + addMark(p); + display(); + } + + // starting event capture + registerMouseDown(elemScaler, markEvent); +} + + +function zoomArea() { + var click = 1; + var pt1, pt2; + var eck1pos, eck2pos, eck3pos, eck4pos; + window.focus(); + var eck1 = getElement("eck1"); + var eck2 = getElement("eck2"); + var eck3 = getElement("eck3"); + var eck4 = getElement("eck4"); + + function zoomClick(evt) { + // mouse click handler + if (click == 1) { + // first click -- start moving + click = 2; + pt1 = evtPosition(evt); + pt2 = pt1; + eck1pos = pt1; + eck2pos = new Position(pt1.x - 12, pt1.y); + eck3pos = new Position(pt1.x, pt1.y - 12); + eck4pos = new Position(pt1.y - 12, pt1.y - 12); + moveElement(eck1, eck1pos); + moveElement(eck2, eck2pos); + moveElement(eck3, eck3pos); + moveElement(eck4, eck4pos); + showElement(eck1, true); + showElement(eck2, true); + showElement(eck3, true); + showElement(eck4, true); + registerMouseMove(elemScaler, zoomMove); + registerMouseMove(eck4, zoomMove); + } else { + // second click -- end moving + pt2 = evtPosition(evt); + showElement(eck1, false); + showElement(eck2, false); + showElement(eck3, false); + showElement(eck4, false); + unregisterMouseMove(elemScaler, zoomMove); + unregisterMouseMove(eck4, zoomMove); + unregisterMouseDown(elemScaler, zoomClick); + unregisterMouseDown(eck4, zoomClick); + var p1 = dlTrafo.invtransform(pt1); + var p2 = dlTrafo.invtransform(pt2); + var ww = p2.x-p1.x; + var wh = p2.y-p1.y; + if ((ww > 0)&&(wh > 0)) { + setParameter("wx", cropFloat(p1.x)); + setParameter("wy", cropFloat(p1.y)); + setParameter("ww", cropFloat(ww)); + setParameter("wh", cropFloat(wh)); + parseArea(); + // zoomed is always fit + setParameter("ws", 1); + display(); + } + } + } + + function zoomMove(evt) { + // mouse move handler + pt2 = evtPosition(evt); + // restrict marks to move right and down + eck1pos = pt1; + eck2pos = new Position(Math.max(pt1.x, pt2.x)-12, pt1.y); + eck3pos = new Position(pt1.x, Math.max(pt1.y, pt2.y)-12); + eck4pos = new Position(Math.max(pt1.x, pt2.x)-12, Math.max(pt1.y, pt2.y)-12); + moveElement(eck1, eck1pos); + moveElement(eck2, eck2pos); + moveElement(eck3, eck3pos); + moveElement(eck4, eck4pos); + } + + // starting event capture + registerMouseDown(elemScaler, zoomClick); + registerMouseDown(eck4, zoomClick); +} + +var ZOOMFACTOR = Math.sqrt(2); + +function zoomBy(factor) { + // zooms by the given factor + var newarea = dlArea; + 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(); +} + + +function zoomFullpage() { + // zooms out to show the whole image + setParameter("wx", 0.0); + setParameter("wy", 0.0); + setParameter("ww", 1.0); + setParameter("wh", 1.0); + display(); +} + + +function moveCenter() { + // move visible area so that it's centered around the clicked point + if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) { + // noting to do + return; + } + window.focus(); + + function moveCenterEvent(evt) { + // move to handler + unregisterMouseDown(elemScaler, moveCenterEvent); + 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 = dlMaxArea.fit(newarea); + // set parameters + setParamFromArea(newarea); + parseArea(); + display(); + } + + // starting event capture + registerMouseDown(elemScaler, moveCenterEvent); +} + + +function removeMark() { + // remove the last mark + deleteMark(); + renderMarks(); +} + + +function getRef(select) { + // returns a reference to the current digilib set + if (! baseUrl) { + var baseUrl = location.protocol + "//" + location.host + location.pathname; + } + var hyperlinkRef = baseUrl; + var par = getAllParameters(9); + if (par.length > 0) { + hyperlinkRef += "?" + par; + } + return hyperlinkRef; +}