Annotation of zogiLib/js/dllib.js, revision 1.3
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.3 ! casties 20: Robert Casties, 04.10.2004
1.1 casties 21:
1.2 casties 22: ! Requires baselib.js !
1.1 casties 23:
24: */
25:
1.3 ! casties 26: var dlScriptVersion = "1.0b3";
1.1 casties 27:
28: /*
29: * more parameter handling
30: */
31:
32: var dlArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
33: var dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
34:
35: function parseArea() {
36: // returns area Rectangle from current parameters
37: return new Rectangle(getParameter("wx"), getParameter("wy"), getParameter("ww"), getParameter("wh"));
38: }
39:
40: function setParamFromArea(rect) {
41: // sets digilib wx etc. from rect
42: setParameter("wx", cropFloat(rect.x));
43: setParameter("wy", cropFloat(rect.y));
44: setParameter("ww", cropFloat(rect.width));
45: setParameter("wh", cropFloat(rect.height));
46: return true;
47: }
48:
49: var dlTrafo = new Transform();
50:
51: function parseTrafo(elem) {
52: // returns Transform from current dlArea and picsize
53: var picsize = getElementRect(elem);
54: var trafo = new Transform();
55: // subtract area offset and size
56: trafo.concat(getTranslation(new Position(-dlArea.x, -dlArea.y)));
57: trafo.concat(getScale(new Size(1/dlArea.width, 1/dlArea.height)));
58: // scale to screen size
59: trafo.concat(getScale(picsize));
60: trafo.concat(getTranslation(picsize));
61: // rotate
62: //trafo.concat(getRotation(- getParameter("rot"), new Position(0.5*picsize.width, 0.5*picsize.height)));
63: // mirror
64: //if (hasFlag("hmir")) {
65: //trafo.m00 = - trafo.m00;
66: //}
67: //if (hasFlag("vmir")) {
68: //trafo.m11 = - trafo.m11;
69: //}
70: return trafo;
71: }
72:
73:
74: var dlMarks = new Array();
75:
76: function parseMarks() {
77: // returns marks array from current parameters
78: var marks = new Array();
79: var ma;
80: var mk = getParameter("mk");
81: if (mk.indexOf(";") >= 0) {
82: // old format with ";"
83: ma = mk.split(";");
84: } else {
85: ma = mk.split(",");
86: }
87: for (var i = 0; i < ma.length ; i++) {
88: var pos = ma[i].split("/");
89: if (pos.length > 1) {
90: marks.push(new Position(pos[0], pos[1]));
91: }
92: }
93: return marks;
94: }
95:
96: function getAllMarks() {
97: // returns a string with all marks in query format
98: var marks = new Array();
99: for (var i = 0; i < dlMarks.length; i++) {
100: marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y));
101: }
102: return marks.join(",");
103: }
104:
105: function addMark(pos) {
106: // add a mark
107: dlMarks.push(pos);
108: setParameter("mk", getAllMarks());
109: return true;
110: }
111:
112: function deleteMark() {
113: // delete the last mark
114: dlMarks.pop();
115: setParameter("mk", getAllMarks());
116: return true;
117: }
118:
119: var dlFlags = new Object();
120:
121: function hasFlag(mode) {
122: // returns if mode flag is set
123: return (dlFlags[mode]);
124: }
125:
126: function addFlag(mode) {
127: // add a mode flag
128: dlFlags[mode] = mode;
129: setParameter("mo", getAllFlags());
130: return true;
131: }
132:
133: function removeFlag(mode) {
134: // remove a mode flag
135: if (dlFlags[mode]) {
136: delete dlFlags[mode];
137: }
138: setParameter("mo", getAllFlags());
139: return true;
140: }
141:
142: function toggleFlag(mode) {
143: // change a mode flag
144: if (dlFlags[mode]) {
145: delete dlFlags[mode];
146: } else {
147: dlFlags[mode] = mode;
148: }
149: setParameter("mo", getAllFlags());
150: return true;
151: }
152:
153: function getAllFlags() {
154: // returns a string with all flags in query format
155: var fa = new Array();
156: for (var f in dlFlags) {
157: if ((f != "")&&(dlFlags[f] != null)) {
158: fa.push(f);
159: }
160: }
161: return fa.join(",");
162: }
163:
164: function parseFlags() {
165: // sets dlFlags from the current parameters
166: var flags = new Object();
167: var fa = getParameter("mo").split(",");
168: for (var i = 0; i < fa.length ; i++) {
169: var f = fa[i];
170: if (f != "") {
171: flags[f] = f;
172: }
173: }
174: return flags;
175: }
176:
177:
178: function bestPicSize(elem, inset) {
179: // returns a Size with the best image size for the given element
180: if (! defined(inset)) {
181: inset = 25;
182: }
183: var ws = getWinSize();
184: var es = getElementPosition(elem);
185: if (es) {
186: ws.width = ws.width - es.x - inset;
187: ws.height = ws.height - es.y - inset;
188: }
189: return ws;
190: }
191:
192:
193: /* **********************************************
194: * digilib specific routines
195: * ******************************************** */
196:
197: var elemScaler = null;
198: var picElem = null;
199:
200:
201: function dl_param_init() {
202: // parameter initialisation before onload
203:
204: // put the query parameters (sans "?") in the parameters array
205: parseParameters(location.search.slice(1));
206: // treat special parameters
207: dlMarks = parseMarks();
208: dlArea = parseArea();
209: dlFlags = parseFlags();
210: }
211:
212:
213: function dl_init() {
214: // initalisation on load
215: elemScaler = getElement("scaler", true);
216: picElem = getElement("pic", true);
217: if (picElem == null && elemScaler) {
218: // in N4 pic is in the scaler layer
219: picElem = elemScaler.document.images[0];
220: }
221: if ((!elemScaler)||(!picElem)) {
222: alert("Sorry, zogilib doesn't work here!");
223: return false;
224: }
225: // give a name to the window containing digilib
226: if (defined(dlTarget)&&(dlTarget)) {
227: window.name = dlTarget;
228: } else {
229: window.name = "digilib";
230: }
231: // put the query parameters (sans "?") in the parameters array
232: parseParameters(location.search.slice(1));
233: // treat special parameters
234: dlMarks = parseMarks();
235: dlArea = parseArea();
236: dlFlags = parseFlags();
237: // wait for image to load and display marks
238: renderMarks();
239: // done
240: focus();
241: return;
242: }
243:
244:
245: function display(detail) {
246: // redisplay the page
247: if (! detail) {
248: detail = 9;
249: }
250: var queryString = getAllParameters(detail);
251: location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString;
252: }
253:
254:
255: /* **********************************************
256: * interactive digilib functions
257: * ******************************************** */
258:
259:
260: function renderMarks() {
261: // put the visible marks on the image
262: var mark_count = dlMarks.length;
263: // make shure the image is loaded so we know its size
264: if (defined(picElem.complete) && picElem.complete == false && ! browserType.isN4 ) {
265: setTimeout("renderMarks()", 100);
266: } else {
267: dlTrafo = parseTrafo(picElem);
268: for (var i = 0; i < 8; i++) {
269: var me = getElement("dot"+i);
270: if (i < mark_count) {
271: if (dlArea.containsPosition(dlMarks[i])) {
272: var mpos = dlTrafo.transform(dlMarks[i]);
273: // suboptimal to place -5 pixels and not half size of mark-image
274: mpos.x = mpos.x -5;
275: mpos.y = mpos.y -5;
276: moveElement(me, mpos);
277: showElement(me, true);
278: }
279: } else {
280: // hide the other marks
281: showElement(me, false);
282: }
283: }
284: }
285: }
286:
287:
288: function setMark(reload) {
289: // add a mark where clicked
290: if ( dlMarks.length > 7 ) {
291: alert("Only 8 marks are possible at the moment!");
292: return;
293: }
1.2 casties 294: window.focus();
1.1 casties 295:
296: function markEvent(evt) {
297: // event handler adding a new mark
1.2 casties 298: unregisterEvent("mousedown", elemScaler, markEvent);
1.1 casties 299: var p = dlTrafo.invtransform(evtPosition(evt));
300: addMark(p);
301: if (defined(reload)&&(!reload)) {
302: // don't redisplay
303: renderMarks();
304: return;
305: }
306: display();
307: }
308:
309: // starting event capture
1.2 casties 310: registerEvent("mousedown", elemScaler, markEvent);
1.1 casties 311: }
312:
313:
314: function removeMark(reload) {
315: // remove the last mark
316: deleteMark();
317: if (defined(reload)&&(!reload)) {
318: // don't redisplay
319: renderMarks();
320: return;
321: }
322: display();
323: }
324:
325:
326: function zoomArea() {
327: var click = 1;
328: var pt1, pt2;
329: var eck1pos, eck2pos, eck3pos, eck4pos;
330: window.focus();
331: var eck1 = getElement("eck1");
332: var eck2 = getElement("eck2");
333: var eck3 = getElement("eck3");
334: var eck4 = getElement("eck4");
335:
336: function zoomClick(evt) {
337: // mouse click handler
338: if (click == 1) {
339: // first click -- start moving
340: click = 2;
341: pt1 = evtPosition(evt);
342: pt2 = pt1;
343: eck1pos = pt1;
344: eck2pos = new Position(pt1.x - 12, pt1.y);
345: eck3pos = new Position(pt1.x, pt1.y - 12);
346: eck4pos = new Position(pt1.y - 12, pt1.y - 12);
347: moveElement(eck1, eck1pos);
348: moveElement(eck2, eck2pos);
349: moveElement(eck3, eck3pos);
350: moveElement(eck4, eck4pos);
351: showElement(eck1, true);
352: showElement(eck2, true);
353: showElement(eck3, true);
354: showElement(eck4, true);
1.2 casties 355: // show moving
356: registerEvent("mousemove", elemScaler, zoomMove);
357: registerEvent("mousemove", eck4, zoomMove);
358: // enable drag-to-zoom
359: registerEvent("mouseup", elemScaler, zoomClick);
360: registerEvent("mouseup", eck4, zoomClick);
1.1 casties 361: } else {
362: // second click -- end moving
363: pt2 = evtPosition(evt);
364: showElement(eck1, false);
365: showElement(eck2, false);
366: showElement(eck3, false);
367: showElement(eck4, false);
1.2 casties 368: unregisterEvent("mousemove", elemScaler, zoomMove);
369: unregisterEvent("mousemove", eck4, zoomMove);
370: unregisterEvent("mousedown", elemScaler, zoomClick);
371: unregisterEvent("mousedown", eck4, zoomClick);
1.1 casties 372: var p1 = dlTrafo.invtransform(pt1);
373: var p2 = dlTrafo.invtransform(pt2);
374: var ww = p2.x-p1.x;
375: var wh = p2.y-p1.y;
376: if ((ww > 0)&&(wh > 0)) {
377: setParameter("wx", cropFloat(p1.x));
378: setParameter("wy", cropFloat(p1.y));
379: setParameter("ww", cropFloat(ww));
380: setParameter("wh", cropFloat(wh));
381: parseArea();
382: // zoomed is always fit
383: setParameter("ws", 1);
384: display();
385: }
386: }
387: }
388:
389: function zoomMove(evt) {
390: // mouse move handler
391: pt2 = evtPosition(evt);
392: // restrict marks to move right and down
393: eck1pos = pt1;
394: eck2pos = new Position(Math.max(pt1.x, pt2.x)-12, pt1.y);
395: eck3pos = new Position(pt1.x, Math.max(pt1.y, pt2.y)-12);
396: eck4pos = new Position(Math.max(pt1.x, pt2.x)-12, Math.max(pt1.y, pt2.y)-12);
397: moveElement(eck1, eck1pos);
398: moveElement(eck2, eck2pos);
399: moveElement(eck3, eck3pos);
400: moveElement(eck4, eck4pos);
401: }
402:
403: // starting event capture
1.2 casties 404: registerEvent("mousedown", elemScaler, zoomClick);
405: registerEvent("mousedown", eck4, zoomClick);
1.1 casties 406: }
407:
408: var ZOOMFACTOR = Math.sqrt(2);
409:
410: function zoomBy(factor) {
411: // zooms by the given factor
412: var newarea = dlArea.copy();
413: newarea.width /= factor;
414: newarea.height /= factor;
415: newarea.x -= 0.5 * (newarea.width - dlArea.width);
416: newarea.y -= 0.5 * (newarea.height - dlArea.height);
417: newarea = dlMaxArea.fit(newarea);
418: setParamFromArea(newarea);
419: display();
420: }
421:
422:
423: function zoomFullpage() {
424: // zooms out to show the whole image
425: setParameter("wx", 0.0);
426: setParameter("wy", 0.0);
427: setParameter("ww", 1.0);
428: setParameter("wh", 1.0);
429: display();
430: }
431:
432:
433: function moveCenter() {
434: // move visible area so that it's centered around the clicked point
435: if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) {
436: // noting to do
437: return;
438: }
439: window.focus();
440:
441: function moveCenterEvent(evt) {
442: // move to handler
1.2 casties 443: unregisterEvent("mousedown", elemScaler, moveCenterEvent);
1.1 casties 444: var pt = dlTrafo.invtransform(evtPosition(evt));
445: var newarea = new Rectangle(pt.x-0.5*dlArea.width, pt.y-0.5*dlArea.height, dlArea.width, dlArea.height);
446: newarea = dlMaxArea.fit(newarea);
447: // set parameters
448: setParamFromArea(newarea);
449: parseArea();
450: display();
451: }
452:
453: // starting event capture
1.2 casties 454: registerEvent("mousedown", elemScaler, moveCenterEvent);
1.1 casties 455: }
456:
457:
458:
459: function getRef() {
460: // returns a reference to the current digilib set
461: if (! baseUrl) {
462: var baseUrl = location.protocol + "//" + location.host + location.pathname;
463: }
464: var hyperlinkRef = baseUrl;
465: var par = getAllParameters(9);
466: if (par.length > 0) {
467: hyperlinkRef += "?" + par;
468: }
469: return hyperlinkRef;
470: }
1.3 ! casties 471:
! 472: function getRefWin(type, msg) {
! 473: // shows an alert with a reference to the current digilib set
! 474: if (! msg) {
! 475: msg = "Link for HTML documents";
! 476: prompt(msg, getRef());
! 477: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>