--- zogiLib/js/dllib.js 2004/10/04 20:58:01 1.3 +++ zogiLib/js/dllib.js 2006/07/14 12:42:05 1.8 @@ -17,21 +17,24 @@ Foundation, Inc., 59 Temple Place - Suit Authors: Christian Luginbuehl, 01.05.2003 (first version) DW 24.03.2004 (Changed for digiLib in Zope) - Robert Casties, 04.10.2004 + Robert Casties, 14.7.2006 ! Requires baselib.js ! */ -var dlScriptVersion = "1.0b3"; + +function identify() { + // used for identifying a digilib instance + // Relato uses that function - lugi + return "Digilib 0.6"; +} + /* * 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")); @@ -46,8 +49,6 @@ function setParamFromArea(rect) { return true; } -var dlTrafo = new Transform(); - function parseTrafo(elem) { // returns Transform from current dlArea and picsize var picsize = getElementRect(elem); @@ -71,24 +72,22 @@ function parseTrafo(elem) { } -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(";"); + // old format with ";" + ma = mk.split(";"); } else { - ma = mk.split(","); + 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])); - } + var pos = ma[i].split("/"); + if (pos.length > 1) { + marks.push(new Position(pos[0], pos[1])); + } } return marks; } @@ -97,7 +96,7 @@ 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)); + marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y)); } return marks.join(","); } @@ -116,8 +115,6 @@ function deleteMark() { return true; } -var dlFlags = new Object(); - function hasFlag(mode) { // returns if mode flag is set return (dlFlags[mode]); @@ -133,7 +130,7 @@ function addFlag(mode) { function removeFlag(mode) { // remove a mode flag if (dlFlags[mode]) { - delete dlFlags[mode]; + delete dlFlags[mode]; } setParameter("mo", getAllFlags()); return true; @@ -142,9 +139,9 @@ function removeFlag(mode) { function toggleFlag(mode) { // change a mode flag if (dlFlags[mode]) { - delete dlFlags[mode]; + delete dlFlags[mode]; } else { - dlFlags[mode] = mode; + dlFlags[mode] = mode; } setParameter("mo", getAllFlags()); return true; @@ -154,9 +151,9 @@ 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); - } + if ((f != "")&&(dlFlags[f] != null)) { + fa.push(f); + } } return fa.join(","); } @@ -166,10 +163,10 @@ function parseFlags() { 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; - } + var f = fa[i]; + if (f != "") { + flags[f] = f; + } } return flags; } @@ -178,28 +175,57 @@ function parseFlags() { function bestPicSize(elem, inset) { // returns a Size with the best image size for the given element if (! defined(inset)) { - inset = 25; + 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; + ws.width = ws.width - es.x - inset; + ws.height = ws.height - es.y - inset; } return ws; } +function setDLParam(e, s, relative) { + // sets parameter based on HTML event + var nam; + var val; + if (s.type && (s.type == "select-one")) { + nam = s.name; + val = s.options[s.selectedIndex].value; + } else if (s.name && s.value) { + nam = s.name; + val = s.value; + } + if (nam && val) { + setParameter(nam, val, relative); + display(); + } else { + alert("ERROR: unable to process event!"); + } + return true; +} + /* ********************************************** * digilib specific routines * ******************************************** */ -var elemScaler = null; -var picElem = null; - function dl_param_init() { // parameter initialisation before onload + if (!baseScriptVersion) { + base_init(); + } + dlScriptVersion = "1.2b"; + dlArea = new Rectangle(0.0, 0.0, 1.0, 1.0); + dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0); + dlTrafo = new Transform(); + dlMarks = new Array(); + dlFlags = new Object(); + elemScaler = null; + picElem = null; + ZOOMFACTOR = Math.sqrt(2); // put the query parameters (sans "?") in the parameters array parseParameters(location.search.slice(1)); @@ -212,21 +238,24 @@ function dl_param_init() { function dl_init() { // initalisation on load + if (!dlScriptVersion) { + dl_param_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]; + // 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; + alert("Sorry, digilib doesn't work here!"); + return false; } // give a name to the window containing digilib if (defined(dlTarget)&&(dlTarget)) { - window.name = dlTarget; + window.name = dlTarget; } else { - window.name = "digilib"; + window.name = "digilib"; } // put the query parameters (sans "?") in the parameters array parseParameters(location.search.slice(1)); @@ -245,7 +274,7 @@ function dl_init() { function display(detail) { // redisplay the page if (! detail) { - detail = 9; + detail = 255; } var queryString = getAllParameters(detail); location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString; @@ -262,25 +291,25 @@ function renderMarks() { 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); + 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); - } - } + 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); + } + } } } @@ -288,22 +317,22 @@ function renderMarks() { function setMark(reload) { // add a mark where clicked if ( dlMarks.length > 7 ) { - alert("Only 8 marks are possible at the moment!"); - return; + alert("Only 8 marks are possible at the moment!"); + return; } window.focus(); function markEvent(evt) { - // event handler adding a new mark - unregisterEvent("mousedown", elemScaler, markEvent); - var p = dlTrafo.invtransform(evtPosition(evt)); - addMark(p); - if (defined(reload)&&(!reload)) { - // don't redisplay - renderMarks(); - return; - } - display(); + // event handler adding a new mark + unregisterEvent("mousedown", elemScaler, markEvent); + var p = dlTrafo.invtransform(evtPosition(evt)); + addMark(p); + if (defined(reload)&&(!reload)) { + // don't redisplay + renderMarks(); + return; + } + display(); } // starting event capture @@ -315,9 +344,9 @@ function removeMark(reload) { // remove the last mark deleteMark(); if (defined(reload)&&(!reload)) { - // don't redisplay - renderMarks(); - return; + // don't redisplay + renderMarks(); + return; } display(); } @@ -334,70 +363,70 @@ function zoomArea() { 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); - // show moving - registerEvent("mousemove", elemScaler, zoomMove); - registerEvent("mousemove", eck4, zoomMove); - // enable drag-to-zoom - registerEvent("mouseup", elemScaler, zoomClick); - registerEvent("mouseup", eck4, zoomClick); - } else { - // second click -- end moving - pt2 = evtPosition(evt); - showElement(eck1, false); - showElement(eck2, false); - showElement(eck3, false); - showElement(eck4, false); - unregisterEvent("mousemove", elemScaler, zoomMove); - unregisterEvent("mousemove", eck4, zoomMove); - unregisterEvent("mousedown", elemScaler, zoomClick); - unregisterEvent("mousedown", 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(); - } - } + // 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); + // show moving + registerEvent("mousemove", elemScaler, zoomMove); + registerEvent("mousemove", eck4, zoomMove); + // enable drag-to-zoom + registerEvent("mouseup", elemScaler, zoomClick); + registerEvent("mouseup", eck4, zoomClick); + } else { + // second click -- end moving + pt2 = evtPosition(evt); + showElement(eck1, false); + showElement(eck2, false); + showElement(eck3, false); + showElement(eck4, false); + unregisterEvent("mousemove", elemScaler, zoomMove); + unregisterEvent("mousemove", eck4, zoomMove); + unregisterEvent("mousedown", elemScaler, zoomClick); + unregisterEvent("mousedown", 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); + // 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 @@ -405,8 +434,6 @@ function zoomArea() { registerEvent("mousedown", eck4, zoomClick); } -var ZOOMFACTOR = Math.sqrt(2); - function zoomBy(factor) { // zooms by the given factor var newarea = dlArea.copy(); @@ -433,38 +460,52 @@ function zoomFullpage() { 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; + // nothing to do + return; } window.focus(); function moveCenterEvent(evt) { - // move to handler - unregisterEvent("mousedown", 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(); + // move to handler + unregisterEvent("mousedown", 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 registerEvent("mousedown", elemScaler, moveCenterEvent); } - +function moveBy(movx, movy) { + // move visible area by movx and movy (in units of ww, wh) + if ((dlArea.width == 1.0)&&(dlArea.height == 1.0)) { + // nothing to do + return; + } + var newarea = dlArea.copy(); + newarea.x += parseFloat(movx)*dlArea.width; + newarea.y += parseFloat(movy)*dlArea.height; + newarea = dlMaxArea.fit(newarea); + // set parameters + setParamFromArea(newarea); + parseArea(); + display(); +} function getRef() { // returns a reference to the current digilib set if (! baseUrl) { - var baseUrl = location.protocol + "//" + location.host + location.pathname; + var baseUrl = location.protocol + "//" + location.host + location.pathname; } var hyperlinkRef = baseUrl; - var par = getAllParameters(9); + var par = getAllParameters(7+16); // all without ddpi, pt if (par.length > 0) { - hyperlinkRef += "?" + par; + hyperlinkRef += "?" + par; } return hyperlinkRef; } @@ -472,6 +513,108 @@ function getRef() { function getRefWin(type, msg) { // shows an alert with a reference to the current digilib set if (! msg) { - msg = "Link for HTML documents"; + msg = "Link for HTML documents"; + } prompt(msg, getRef()); -} \ No newline at end of file +} + +function getQuality() { + // returns the current q setting + for (var i = 0; i < 3; i++) { + if (hasFlag("q"+i)) { + return i; + } + } + return 1 +} + +function setQuality(qual) { + // set the image quality + for (var i = 0; i < 3; i++) { + removeFlag("q"+i); + if (i == qual) { + addFlag("q"+i); + } + } + setParameter("mo", getAllFlags()); + display(); +} + +function setQualityWin(msg) { + // dialog for setting quality + if (! msg) { + msg = "Quality (0..2)"; + } + var q = getQuality(); + var newq = window.prompt(msg, q); + if (newq) { + setQuality(newq); + } +} + +function mirror(dir) { + // mirror the image horizontally or vertically + if (dir == "h") { + toggleFlag("hmir"); + } else { + toggleFlag("vmir"); + } + setParameter("mo", getAllFlags()); + display(); +} + +function gotoPage(gopage, keep) { + // goto given page nr (+/-: relative) + var oldpn = parseInt(getParameter("pn")); + setParameter("pn", gopage, true); + var pn = parseInt(getParameter("pn")); + if (pn < 1) { + alert("No such page! (Page number too low)"); + setParameter("pn", oldpn); + return; + } + if (hasParameter("pt")) { + pt = parseInt(getParameter("pt")) + if (pn > pt) { + alert("No such page! (Page number too high)"); + setParameter("pn", oldpn); + return; + } + } + if (keep) { + display(15+32); // all, no mark + } else { + display(3+32); // fn, pn, ws, mo + pt + } +} + +function gotoPageWin() { + // dialog to ask for new page nr + var pn = getParameter("pn"); + var gopage = window.prompt("Go to page", pn); + if (gopage) { + gotoPage(gopage); + } +} + +function setParamWin(param, text, relative) { + // dialog to ask for new parameter value + var val = getParameter(param); + var newval = window.prompt(text, val); + if (newval) { + setParameter(param, newval, relative); + display(); + } +} + +function showOptions(show) { + // show or hide option div + var elem = getElement("dloptions"); + showElement(elem, show); +} + +function toggleOptions() { + // toggle option div + var elem = getElement("dloptions"); + showOptions(! isElementVisible(elem)); +}