Annotation of zogiLib/js/dllib.js, revision 1.6
1.2 casties 1: /* Copyright (C) 2003,2004 IT-Group MPIWG, WTWG Uni Bern and others
1.1 casties 2:
3: This program is free software; you can redistribute it and/or
4: modify it under the terms of the GNU General Public License
5: as published by the Free Software Foundation; either version 2
6: of the License, or (at your option) any later version.
7:
8: This program is distributed in the hope that it will be useful,
9: but WITHOUT ANY WARRANTY; without even the implied warranty of
10: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11: GNU General Public License for more details.
12:
13: You should have received a copy of the GNU General Public License
14: along with this program; if not, write to the Free Software
15: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
16:
1.2 casties 17: Authors:
18: Christian Luginbuehl, 01.05.2003 (first version)
19: DW 24.03.2004 (Changed for digiLib in Zope)
1.5 casties 20: Robert Casties, 2.11.2004
1.1 casties 21:
1.2 casties 22: ! Requires baselib.js !
1.1 casties 23:
24: */
25:
1.5 casties 26:
27: function identify() {
1.6 ! casties 28: // used for identifying a digilib instance
! 29: // Relato uses that function - lugi
! 30: return "Digilib 0.6";
1.5 casties 31: }
32:
1.1 casties 33:
34: /*
35: * more parameter handling
36: */
37:
38: function parseArea() {
39: // returns area Rectangle from current parameters
40: return new Rectangle(getParameter("wx"), getParameter("wy"), getParameter("ww"), getParameter("wh"));
41: }
42:
43: function setParamFromArea(rect) {
44: // sets digilib wx etc. from rect
45: setParameter("wx", cropFloat(rect.x));
46: setParameter("wy", cropFloat(rect.y));
47: setParameter("ww", cropFloat(rect.width));
48: setParameter("wh", cropFloat(rect.height));
49: return true;
50: }
51:
52: function parseTrafo(elem) {
53: // returns Transform from current dlArea and picsize
54: var picsize = getElementRect(elem);
55: var trafo = new Transform();
56: // subtract area offset and size
57: trafo.concat(getTranslation(new Position(-dlArea.x, -dlArea.y)));
58: trafo.concat(getScale(new Size(1/dlArea.width, 1/dlArea.height)));
59: // scale to screen size
60: trafo.concat(getScale(picsize));
61: trafo.concat(getTranslation(picsize));
62: // rotate
63: //trafo.concat(getRotation(- getParameter("rot"), new Position(0.5*picsize.width, 0.5*picsize.height)));
64: // mirror
65: //if (hasFlag("hmir")) {
66: //trafo.m00 = - trafo.m00;
67: //}
68: //if (hasFlag("vmir")) {
69: //trafo.m11 = - trafo.m11;
70: //}
71: return trafo;
72: }
73:
74:
75: function parseMarks() {
76: // returns marks array from current parameters
77: var marks = new Array();
78: var ma;
79: var mk = getParameter("mk");
80: if (mk.indexOf(";") >= 0) {
1.6 ! casties 81: // old format with ";"
! 82: ma = mk.split(";");
1.1 casties 83: } else {
1.6 ! casties 84: ma = mk.split(",");
1.1 casties 85: }
86: for (var i = 0; i < ma.length ; i++) {
1.6 ! casties 87: var pos = ma[i].split("/");
! 88: if (pos.length > 1) {
! 89: marks.push(new Position(pos[0], pos[1]));
! 90: }
1.1 casties 91: }
92: return marks;
93: }
94:
95: function getAllMarks() {
96: // returns a string with all marks in query format
97: var marks = new Array();
98: for (var i = 0; i < dlMarks.length; i++) {
1.6 ! casties 99: marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y));
1.1 casties 100: }
101: return marks.join(",");
102: }
103:
104: function addMark(pos) {
105: // add a mark
106: dlMarks.push(pos);
107: setParameter("mk", getAllMarks());
108: return true;
109: }
110:
111: function deleteMark() {
112: // delete the last mark
113: dlMarks.pop();
114: setParameter("mk", getAllMarks());
115: return true;
116: }
117:
118: function hasFlag(mode) {
119: // returns if mode flag is set
120: return (dlFlags[mode]);
121: }
122:
123: function addFlag(mode) {
124: // add a mode flag
125: dlFlags[mode] = mode;
126: setParameter("mo", getAllFlags());
127: return true;
128: }
129:
130: function removeFlag(mode) {
131: // remove a mode flag
132: if (dlFlags[mode]) {
1.6 ! casties 133: delete dlFlags[mode];
1.1 casties 134: }
135: setParameter("mo", getAllFlags());
136: return true;
137: }
138:
139: function toggleFlag(mode) {
140: // change a mode flag
141: if (dlFlags[mode]) {
1.6 ! casties 142: delete dlFlags[mode];
1.1 casties 143: } else {
1.6 ! casties 144: dlFlags[mode] = mode;
1.1 casties 145: }
146: setParameter("mo", getAllFlags());
147: return true;
148: }
149:
150: function getAllFlags() {
151: // returns a string with all flags in query format
152: var fa = new Array();
153: for (var f in dlFlags) {
1.6 ! casties 154: if ((f != "")&&(dlFlags[f] != null)) {
! 155: fa.push(f);
! 156: }
1.1 casties 157: }
158: return fa.join(",");
159: }
160:
161: function parseFlags() {
162: // sets dlFlags from the current parameters
163: var flags = new Object();
164: var fa = getParameter("mo").split(",");
165: for (var i = 0; i < fa.length ; i++) {
1.6 ! casties 166: var f = fa[i];
! 167: if (f != "") {
! 168: flags[f] = f;
! 169: }
1.1 casties 170: }
171: return flags;
172: }
173:
174:
175: function bestPicSize(elem, inset) {
176: // returns a Size with the best image size for the given element
177: if (! defined(inset)) {
1.6 ! casties 178: inset = 25;
1.1 casties 179: }
180: var ws = getWinSize();
181: var es = getElementPosition(elem);
182: if (es) {
1.6 ! casties 183: ws.width = ws.width - es.x - inset;
! 184: ws.height = ws.height - es.y - inset;
1.1 casties 185: }
186: return ws;
187: }
188:
1.6 ! casties 189: function setDLParam(e, s) {
! 190: // sets parameter based on HTML event
! 191: var nam;
! 192: var val;
! 193: if (s.type && (s.type == "select-one")) {
! 194: nam = s.name;
! 195: val = s.options[s.selectedIndex].value;
! 196: } else if (s.name && s.value) {
! 197: nam = s.name;
! 198: val = s.value;
! 199: }
! 200: if (nam && val) {
! 201: setParameter(nam, val);
! 202: display();
! 203: } else {
! 204: alert("unable to process event!");
! 205: }
! 206: return true;
! 207: }
! 208:
1.1 casties 209:
210: /* **********************************************
211: * digilib specific routines
212: * ******************************************** */
213:
214:
215: function dl_param_init() {
216: // parameter initialisation before onload
1.5 casties 217: if (!baseScriptVersion) {
1.6 ! casties 218: base_init();
1.5 casties 219: }
220: dlScriptVersion = "1.1b";
221: dlArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
222: dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
223: dlTrafo = new Transform();
224: dlMarks = new Array();
225: dlFlags = new Object();
226: elemScaler = null;
227: picElem = null;
228: ZOOMFACTOR = Math.sqrt(2);
1.1 casties 229:
230: // put the query parameters (sans "?") in the parameters array
231: parseParameters(location.search.slice(1));
232: // treat special parameters
233: dlMarks = parseMarks();
234: dlArea = parseArea();
235: dlFlags = parseFlags();
236: }
237:
238:
239: function dl_init() {
240: // initalisation on load
1.5 casties 241: if (!dlScriptVersion) {
1.6 ! casties 242: dl_param_init();
1.5 casties 243: }
1.1 casties 244: elemScaler = getElement("scaler", true);
245: picElem = getElement("pic", true);
246: if (picElem == null && elemScaler) {
1.6 ! casties 247: // in N4 pic is in the scaler layer
! 248: picElem = elemScaler.document.images[0];
1.1 casties 249: }
250: if ((!elemScaler)||(!picElem)) {
1.6 ! casties 251: alert("Sorry, digilib doesn't work here!");
! 252: return false;
1.1 casties 253: }
254: // give a name to the window containing digilib
255: if (defined(dlTarget)&&(dlTarget)) {
1.6 ! casties 256: window.name = dlTarget;
1.1 casties 257: } else {
1.6 ! casties 258: window.name = "digilib";
1.1 casties 259: }
260: // put the query parameters (sans "?") in the parameters array
261: parseParameters(location.search.slice(1));
262: // treat special parameters
263: dlMarks = parseMarks();
264: dlArea = parseArea();
265: dlFlags = parseFlags();
266: // wait for image to load and display marks
267: renderMarks();
268: // done
269: focus();
270: return;
271: }
272:
273:
274: function display(detail) {
275: // redisplay the page
276: if (! detail) {
1.6 ! casties 277: detail = 9;
1.1 casties 278: }
279: var queryString = getAllParameters(detail);
280: location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString;
281: }
282:
283:
284: /* **********************************************
285: * interactive digilib functions
286: * ******************************************** */
287:
288:
289: function renderMarks() {
290: // put the visible marks on the image
291: var mark_count = dlMarks.length;
292: // make shure the image is loaded so we know its size
293: if (defined(picElem.complete) && picElem.complete == false && ! browserType.isN4 ) {
1.6 ! casties 294: setTimeout("renderMarks()", 100);
1.1 casties 295: } else {
1.6 ! casties 296: dlTrafo = parseTrafo(picElem);
! 297: for (var i = 0; i < 8; i++) {
! 298: var me = getElement("dot"+i);
! 299: if (i < mark_count) {
! 300: if (dlArea.containsPosition(dlMarks[i])) {
! 301: var mpos = dlTrafo.transform(dlMarks[i]);
! 302: // suboptimal to place -5 pixels and not half size of mark-image
! 303: mpos.x = mpos.x -5;
! 304: mpos.y = mpos.y -5;
! 305: moveElement(me, mpos);
! 306: showElement(me, true);
! 307: }
! 308: } else {
! 309: // hide the other marks
! 310: showElement(me, false);
! 311: }
! 312: }
1.1 casties 313: }
314: }
315:
316:
317: function setMark(reload) {
318: // add a mark where clicked
319: if ( dlMarks.length > 7 ) {
1.6 ! casties 320: alert("Only 8 marks are possible at the moment!");
! 321: return;
1.1 casties 322: }
1.2 casties 323: window.focus();
1.1 casties 324:
325: function markEvent(evt) {
1.6 ! casties 326: // event handler adding a new mark
! 327: unregisterEvent("mousedown", elemScaler, markEvent);
! 328: var p = dlTrafo.invtransform(evtPosition(evt));
! 329: addMark(p);
! 330: if (defined(reload)&&(!reload)) {
! 331: // don't redisplay
! 332: renderMarks();
! 333: return;
! 334: }
! 335: display();
1.1 casties 336: }
337:
338: // starting event capture
1.2 casties 339: registerEvent("mousedown", elemScaler, markEvent);
1.1 casties 340: }
341:
342:
343: function removeMark(reload) {
344: // remove the last mark
345: deleteMark();
346: if (defined(reload)&&(!reload)) {
1.6 ! casties 347: // don't redisplay
! 348: renderMarks();
! 349: return;
1.1 casties 350: }
351: display();
352: }
353:
354:
355: function zoomArea() {
356: var click = 1;
357: var pt1, pt2;
358: var eck1pos, eck2pos, eck3pos, eck4pos;
359: window.focus();
360: var eck1 = getElement("eck1");
361: var eck2 = getElement("eck2");
362: var eck3 = getElement("eck3");
363: var eck4 = getElement("eck4");
364:
365: function zoomClick(evt) {
1.6 ! casties 366: // mouse click handler
! 367: if (click == 1) {
! 368: // first click -- start moving
! 369: click = 2;
! 370: pt1 = evtPosition(evt);
! 371: pt2 = pt1;
! 372: eck1pos = pt1;
! 373: eck2pos = new Position(pt1.x - 12, pt1.y);
! 374: eck3pos = new Position(pt1.x, pt1.y - 12);
! 375: eck4pos = new Position(pt1.y - 12, pt1.y - 12);
! 376: moveElement(eck1, eck1pos);
! 377: moveElement(eck2, eck2pos);
! 378: moveElement(eck3, eck3pos);
! 379: moveElement(eck4, eck4pos);
! 380: showElement(eck1, true);
! 381: showElement(eck2, true);
! 382: showElement(eck3, true);
! 383: showElement(eck4, true);
! 384: // show moving
! 385: registerEvent("mousemove", elemScaler, zoomMove);
! 386: registerEvent("mousemove", eck4, zoomMove);
! 387: // enable drag-to-zoom
! 388: registerEvent("mouseup", elemScaler, zoomClick);
! 389: registerEvent("mouseup", eck4, zoomClick);
! 390: } else {
! 391: // second click -- end moving
! 392: pt2 = evtPosition(evt);
! 393: showElement(eck1, false);
! 394: showElement(eck2, false);
! 395: showElement(eck3, false);
! 396: showElement(eck4, false);
! 397: unregisterEvent("mousemove", elemScaler, zoomMove);
! 398: unregisterEvent("mousemove", eck4, zoomMove);
! 399: unregisterEvent("mousedown", elemScaler, zoomClick);
! 400: unregisterEvent("mousedown", eck4, zoomClick);
! 401: var p1 = dlTrafo.invtransform(pt1);
! 402: var p2 = dlTrafo.invtransform(pt2);
! 403: var ww = p2.x-p1.x;
! 404: var wh = p2.y-p1.y;
! 405: if ((ww > 0)&&(wh > 0)) {
! 406: setParameter("wx", cropFloat(p1.x));
! 407: setParameter("wy", cropFloat(p1.y));
! 408: setParameter("ww", cropFloat(ww));
! 409: setParameter("wh", cropFloat(wh));
! 410: parseArea();
! 411: // zoomed is always fit
! 412: setParameter("ws", 1);
! 413: display();
! 414: }
! 415: }
1.1 casties 416: }
417:
418: function zoomMove(evt) {
1.6 ! casties 419: // mouse move handler
! 420: pt2 = evtPosition(evt);
! 421: // restrict marks to move right and down
! 422: eck1pos = pt1;
! 423: eck2pos = new Position(Math.max(pt1.x, pt2.x)-12, pt1.y);
! 424: eck3pos = new Position(pt1.x, Math.max(pt1.y, pt2.y)-12);
! 425: eck4pos = new Position(Math.max(pt1.x, pt2.x)-12, Math.max(pt1.y, pt2.y)-12);
! 426: moveElement(eck1, eck1pos);
! 427: moveElement(eck2, eck2pos);
! 428: moveElement(eck3, eck3pos);
! 429: moveElement(eck4, eck4pos);
1.1 casties 430: }
431:
432: // starting event capture
1.2 casties 433: registerEvent("mousedown", elemScaler, zoomClick);
434: registerEvent("mousedown", eck4, zoomClick);
1.1 casties 435: }
436:
437: function zoomBy(factor) {
438: // zooms by the given factor
439: var newarea = dlArea.copy();
440: newarea.width /= factor;
441: newarea.height /= factor;
442: newarea.x -= 0.5 * (newarea.width - dlArea.width);
443: newarea.y -= 0.5 * (newarea.height - dlArea.height);
444: newarea = dlMaxArea.fit(newarea);
445: setParamFromArea(newarea);
446: display();
447: }
448:
449:
450: function zoomFullpage() {
451: // zooms out to show the whole image
452: setParameter("wx", 0.0);
453: setParameter("wy", 0.0);
454: setParameter("ww", 1.0);
455: setParameter("wh", 1.0);
456: display();
457: }
458:
459:
460: function moveCenter() {
461: // move visible area so that it's centered around the clicked point
462: if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) {
1.6 ! casties 463: // noting to do
! 464: return;
1.1 casties 465: }
466: window.focus();
467:
468: function moveCenterEvent(evt) {
1.6 ! casties 469: // move to handler
! 470: unregisterEvent("mousedown", elemScaler, moveCenterEvent);
! 471: var pt = dlTrafo.invtransform(evtPosition(evt));
! 472: var newarea = new Rectangle(pt.x-0.5*dlArea.width, pt.y-0.5*dlArea.height, dlArea.width, dlArea.height);
! 473: newarea = dlMaxArea.fit(newarea);
! 474: // set parameters
! 475: setParamFromArea(newarea);
! 476: parseArea();
! 477: display();
1.1 casties 478: }
479:
480: // starting event capture
1.2 casties 481: registerEvent("mousedown", elemScaler, moveCenterEvent);
1.1 casties 482: }
483:
1.5 casties 484: function moveBy(movx, movy) {
1.6 ! casties 485: // move visible area by movx and movy (in units of ww, wh)
1.5 casties 486: if ((dlArea.width == 1.0)&&(dlArea.height == 1.0)) {
1.6 ! casties 487: // nothing to do
! 488: return;
1.5 casties 489: }
490: var newarea = dlArea.copy();
491: newarea.x += parseFloat(movx)*dlArea.width;
492: newarea.y += parseFloat(movy)*dlArea.height;
493: newarea = dlMaxArea.fit(newarea);
494: // set parameters
495: setParamFromArea(newarea);
496: parseArea();
497: display();
498: }
499:
1.1 casties 500: function getRef() {
501: // returns a reference to the current digilib set
502: if (! baseUrl) {
1.6 ! casties 503: var baseUrl = location.protocol + "//" + location.host + location.pathname;
1.1 casties 504: }
505: var hyperlinkRef = baseUrl;
506: var par = getAllParameters(9);
507: if (par.length > 0) {
1.6 ! casties 508: hyperlinkRef += "?" + par;
1.1 casties 509: }
510: return hyperlinkRef;
511: }
1.3 casties 512:
513: function getRefWin(type, msg) {
514: // shows an alert with a reference to the current digilib set
515: if (! msg) {
1.6 ! casties 516: msg = "Link for HTML documents";
1.4 casties 517: }
1.3 casties 518: prompt(msg, getRef());
1.5 casties 519: }
1.6 ! casties 520:
! 521: function getQuality() {
! 522: // returns the current q setting
! 523: for (var i = 0; i < 3; i++) {
! 524: if (hasFlag("q"+i)) {
! 525: return i;
! 526: }
! 527: }
! 528: return 1
! 529: }
! 530:
! 531: function setQuality(qual) {
! 532: // set the image quality
! 533: for (var i = 0; i < 3; i++) {
! 534: removeFlag("q"+i);
! 535: if (i == qual) {
! 536: addFlag("q"+i);
! 537: }
! 538: }
! 539: setParameter("mo", getAllFlags());
! 540: display();
! 541: }
! 542:
! 543: function setQualityWin(msg) {
! 544: // dialog for setting quality
! 545: if (! msg) {
! 546: msg = "Quality (0..2)";
! 547: }
! 548: var q = getQuality();
! 549: var newq = window.prompt(msg, q);
! 550: if (newq) {
! 551: setQuality(newq);
! 552: }
! 553: }
! 554:
! 555: function mirror(dir) {
! 556: // mirror the image horizontally or vertically
! 557: if (dir == "h") {
! 558: toggleFlag("hmir");
! 559: } else {
! 560: toggleFlag("vmir");
! 561: }
! 562: setParameter("mo", getAllFlags());
! 563: display();
! 564: }
! 565:
! 566: function gotoPage(gopage) {
! 567: // goto given page nr (+/- relative)
! 568: setParameter("pn", gopage);
! 569: var pn = parseInt(getParameter("pn"));
! 570: if (pn < 1) {
! 571: pn = 1;
! 572: setParameter("pn", pn);
! 573: }
! 574: // TODO: check for last page
! 575: display(1);
! 576: }
! 577:
! 578: function gotoPageWin() {
! 579: // dialog to ask for new page nr
! 580: var pn = getParameter('pn');
! 581: var gopage = window.prompt("Go to page", pn);
! 582: if (gopage) {
! 583: gotoPage(gopage);
! 584: }
! 585: }
! 586:
! 587: function setParamWin(param, text) {
! 588: // dialog to ask for new parameter value
! 589: var val = getParameter(param);
! 590: var newval = window.prompt(text, val);
! 591: if (newval) {
! 592: setParameter(param, newval);
! 593: display();
! 594: }
! 595: }
! 596:
! 597: function showOptions(show) {
! 598: // show or hide option div
! 599: var elem = getElement("dloptions");
! 600: showElement(elem, show);
! 601: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>