![]() ![]() | ![]() |
newer better zogilib for mozillas and IEs
/* 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 */ /* * 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"); if (! elemScaler) { return false; } picElem = getElement("pic", true); if (picElem == null) { // in N4 pic is in the layer scaler picElem = elemScaler.document.images[0]; } // give a name to the window containing digilib top.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 null; } function display(detail) { // redisplay the page if (! detail) { detail = 9; } var queryString = getAllParameters(detail); location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString; } function openWin(url, title, params) { // open browser window var ow = window.open(url, title, params); ow.focus(); } /* ********************************************** * interactive digilib functions * ******************************************** */ function getRef(select) { // open a dialog with a reference to the current digilib set var hyperlinkRef = baseUrl + "?" + getAllParameters(9); if ( select == 0 ) { prompt("Link for LaTeX-documents", "\\href{" + hyperlinkRef + "}{TEXT}"); } else if ( select == 1 ) { prompt("Link for HTML-documents", hyperlinkRef); } } 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 { //alert("rendermarks!"); 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 var p = dlTrafo.invtransform(evtPosition(evt)); unregisterMouseDown(elemScaler, markEvent); addMark(p); display(); } // starting event capture registerMouseDown(elemScaler, markEvent); } var ZOOMFACTOR = Math.sqrt(2); function zoomPoint(inout) { // zoom image in or out around the clicked point var zoom = ZOOMFACTOR; if (inout < 0) { zoom = 1/ZOOMFACTOR; } window.focus(); function zoomPointEvent(evt) { // take new center and set zoom parameters var p = dlTrafo.invtransform(evtPosition(evt)); var neww = Math.min(dlArea.width * (1/zoom), 1.0); var newh = Math.min(dlArea.height * (1/zoom), 1.0); var newx = p.x - 0.5 * neww; var newy = p.y - 0.5 * newh; var zoomarea = new Rectangle(newx, newy, neww, newh); // check bounds zoomarea = dlMaxArea.fit(zoomarea); // set parameters setParamFromArea(zoomarea); parseArea(); // zoomed is always fit setParameter("ws", 1); display(); } // starting event capture registerMouseDown(elemScaler, zoomPointEvent); } 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); } function moveTo() { if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) { alert("This function is only available when zoomed in!"); return; } function moveToEvent(event) { // move to handler var pt = 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); // stopping event capture unregisterMouseDown(elemScaler, moveToEvent); // set parameters setParameter("wx", cropFloat(newarea.x)); setParameter("wy", cropFloat(newarea.y)); setParameter("ww", cropFloat(newarea.width)); setParameter("wh", cropFloat(newarea.height)); display(); } // starting event capture registerMouseDown(elemScaler, moveToEvent); } // debuggin' function showcoordsN4() { var s = ""; for (var l in document.layers) { if (l == "length") continue; e = document.layers[l]; if (e) { s += " [" + e.name + "]: pageX:" + e.pageX + " pageY:" + e.pageY + " width:" + e.clip.width + " height:" + e.clip.height + " visibility:" + e.visibility + " zindex:" + e.zIndex + "
\n"; } else { s += " {" + l + "}
\n"; } } return s; }