Mercurial > hg > digilib
annotate client/digitallibrary/greyskin/dllib.js @ 425:ab2557f079fc
added showArrows() function (navigation arrows overlay)
added canMove() function ()
pulled global vars out of init functions
author | hertzhaft |
---|---|
date | Thu, 22 Dec 2005 11:46:22 +0100 |
parents | e2bc7587aee1 |
children | fc5b8cade32f |
rev | line source |
---|---|
396 | 1 /* Copyright (C) 2003,2004 IT-Group MPIWG, WTWG Uni Bern and others |
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 | |
17 Authors: | |
18 Christian Luginbuehl, 01.05.2003 (first version) | |
19 DW 24.03.2004 (Changed for digiLib in Zope) | |
20 Robert Casties, 8.11.2005 | |
407 | 21 Martin Raspe <hertzhaft@biblhertz.it>, 12.12.2005 |
396 | 22 |
23 ! Requires baselib.js ! | |
24 | |
25 */ | |
407 | 26 digilibVersion = "Digilib NG"; |
27 dllibVersion = "2.0"; | |
412 | 28 isDigilibInitialized = false; // gets set to true in dl_param_init |
425
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
29 reloadPage = true; // reload the page when parameters are changed, otherwise update only "src" attribute of scaler img |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
30 |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
31 // global variables |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
32 dlTrafo = new Transform(); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
33 dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
34 dlArea = null; |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
35 dlMarks = null; |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
36 dlFlags = null; |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
37 |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
38 // global elements |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
39 elemScaler = null; |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
40 picElem = null; |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
41 |
412 | 42 |
43 // flags for parameter sets | |
44 PARAM_FILE = 1; | |
45 PARAM_MODE = 2; | |
46 PARAM_SIZE = 4; | |
47 PARAM_IMAGE = 8; | |
48 PARAM_DPI = 16; | |
49 PARAM_MARK = 32; | |
50 PARAM_PAGES = 64; | |
51 PARAM_ALL = PARAM_FILE | PARAM_MODE | PARAM_SIZE | PARAM_IMAGE | PARAM_DPI | PARAM_MARK | PARAM_PAGES; | |
52 | |
53 // mouse drag area that counts as one click | |
54 MIN_AREA_SIZE = 3 * 3 + 1; | |
55 | |
56 // standard zoom factor | |
57 ZOOMFACTOR = Math.sqrt(2); | |
58 | |
59 // bird's eye view dimensions | |
60 BIRD_MAXX = 100; | |
61 BIRD_MAXY = 100; | |
62 | |
63 // with of arrow bars | |
64 ARROW_WIDTH = 32; | |
396 | 65 |
66 function identify() { | |
67 // used for identifying a digilib instance | |
68 // Relato uses that function - lugi | |
407 | 69 return digilibVersion; |
396 | 70 } |
71 /* | |
72 * more parameter handling | |
73 */ | |
74 | |
412 | 75 function initParameters() { |
76 // file | |
77 newParameter('fn', '', PARAM_FILE); | |
78 newParameter('pn', '1', PARAM_FILE); | |
79 // mode | |
80 newParameter('ws', '1.0', PARAM_MODE); | |
81 newParameter('mo', '', PARAM_MODE); | |
82 // relative dimensions of zoomed image | |
83 newParameter('wx', '0.0', PARAM_SIZE); | |
84 newParameter('wy', '0.0', PARAM_SIZE); | |
85 newParameter('ww', '1.0', PARAM_SIZE); | |
86 newParameter('wh', '1.0', PARAM_SIZE); | |
87 // image manipulation | |
88 newParameter('brgt', '0.0', PARAM_IMAGE); | |
89 newParameter('cont', '0.0', PARAM_IMAGE); | |
90 newParameter('rot', '0.0', PARAM_IMAGE); | |
91 newParameter('rgba', '', PARAM_IMAGE); | |
92 newParameter('rgbm', '', PARAM_IMAGE); | |
93 // resolution | |
94 newParameter('ddpi', '', PARAM_DPI); | |
95 newParameter('ddpix', '', PARAM_DPI); | |
96 newParameter('ddpiy', '', PARAM_DPI); | |
97 // marks | |
98 newParameter('mk', '', PARAM_MARK); | |
99 // pages total | |
100 newParameter('pt', '0', PARAM_PAGES); | |
101 } | |
102 | |
396 | 103 function parseArea() { |
104 // returns area Rectangle from current parameters | |
407 | 105 return new Rectangle( |
412 | 106 getParameter("wx"), |
107 getParameter("wy"), | |
108 getParameter("ww"), | |
109 getParameter("wh")); | |
110 } | |
396 | 111 |
112 function setParamFromArea(rect) { | |
412 | 113 // sets digilib wx etc. from rect |
114 setParameter("wx", cropFloat(rect.x)); | |
115 setParameter("wy", cropFloat(rect.y)); | |
116 setParameter("ww", cropFloat(rect.width)); | |
117 setParameter("wh", cropFloat(rect.height)); | |
118 return true; | |
119 } | |
120 | |
121 /* ********************************************** | |
122 * parse parameters routines | |
123 * ******************************************** */ | |
396 | 124 |
125 function parseTrafo(elem) { | |
126 // returns Transform from current dlArea and picsize | |
127 var picsize = getElementRect(elem); | |
128 var trafo = new Transform(); | |
129 // subtract area offset and size | |
130 trafo.concat(getTranslation(new Position(-dlArea.x, -dlArea.y))); | |
131 trafo.concat(getScale(new Size(1/dlArea.width, 1/dlArea.height))); | |
132 // scale to screen size | |
133 trafo.concat(getScale(picsize)); | |
134 trafo.concat(getTranslation(picsize)); | |
412 | 135 // FIX ME: Robert, kannst Du mal nachsehen, ob das folgende tut, was es soll? |
136 // oder gibt es dafür neuen Code? | |
396 | 137 // rotate |
412 | 138 var rot = getRotation(- getParameter("rot"), new Position(0.5*picsize.width, 0.5*picsize.height)); |
139 trafo.concat(rot); | |
396 | 140 // mirror |
412 | 141 if (hasFlag("hmir")) trafo.m00 = - trafo.m00; // ?? |
142 if (hasFlag("vmir")) trafo.m11 = - trafo.m11; // ?? | |
396 | 143 return trafo; |
144 } | |
145 | |
146 function parseMarks() { | |
147 // returns marks array from current parameters | |
148 var marks = new Array(); | |
407 | 149 var param = getParameter("mk"); |
150 var pairs = (param.indexOf(";") >= 0) | |
412 | 151 ? param.split(";") // old format with ";" |
152 : param.split(","); // new format | |
407 | 153 for (var i = 0; i < pairs.length ; i++) { |
154 var pos = pairs[i].split("/"); | |
155 if (pos.length > 1) marks.push(new Position(pos[0], pos[1])); | |
156 } | |
157 return marks; | |
396 | 158 } |
159 | |
412 | 160 /* ********************************************** |
161 * marks routines | |
162 * ******************************************** */ | |
163 | |
164 function getAllMarks() { | |
396 | 165 // returns a string with all marks in query format |
166 var marks = new Array(); | |
407 | 167 for (var i = 0; i < dlMarks.length; i++) |
396 | 168 marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y)); |
407 | 169 return marks.join(","); |
396 | 170 } |
407 | 171 |
172 getMarksQueryString = getAllMarks; | |
396 | 173 |
407 | 174 function addMark(evt) { |
412 | 175 // add a mark |
176 var pos = dlTrafo.invtransform(evtPosition(evt)); | |
177 dlMarks.push(pos) | |
178 setParameter("mk", getAllMarks()); | |
179 return true; | |
180 } | |
181 | |
182 function deleteMark() { | |
183 // delete the last mark | |
184 var mark = dlMarks.pop(); | |
185 setParameter("mk", getAllMarks()); | |
186 return true; | |
187 } | |
188 | |
189 function deleteAllMarks() { | |
190 // delete all marks and mk parameters | |
191 dlMarks.length = 0; | |
192 resetParameter("mk"); | |
193 return true; | |
194 } | |
407 | 195 |
196 function createMarkDiv(index) { | |
412 | 197 var div = document.createElement("div"); |
198 div.className = "mark"; | |
199 div.id = "mark" + index; | |
200 div.innerHTML = index + 1; | |
201 document.body.appendChild(div); | |
202 return div; | |
203 } | |
396 | 204 |
412 | 205 /* ********************************************** |
206 * flag routines | |
207 * ******************************************** */ | |
396 | 208 |
209 function hasFlag(mode) { | |
412 | 210 // returns if mode flag is set |
211 return (dlFlags[mode]); | |
212 } | |
396 | 213 |
214 function addFlag(mode) { | |
412 | 215 // add a mode flag |
216 dlFlags[mode] = mode; | |
217 setParameter("mo", getAllFlags()); | |
218 return true; | |
219 } | |
396 | 220 |
221 function removeFlag(mode) { | |
412 | 222 // remove a mode flag |
223 if (dlFlags[mode]) delete dlFlags[mode]; | |
224 setParameter("mo", getAllFlags()); | |
225 return true; | |
226 } | |
396 | 227 |
228 function toggleFlag(mode) { | |
412 | 229 // change a mode flag |
230 if (dlFlags[mode]) { | |
231 delete dlFlags[mode]; | |
232 } else { | |
233 dlFlags[mode] = mode; | |
234 } | |
235 setParameter("mo", getAllFlags()); | |
236 return true; | |
237 } | |
396 | 238 |
239 function getAllFlags() { | |
240 // returns a string with all flags in query format | |
241 var fa = new Array(); | |
242 for (var f in dlFlags) { | |
243 if ((f != "")&&(dlFlags[f] != null)) { | |
244 fa.push(f); | |
245 } | |
246 } | |
247 return fa.join(","); | |
248 } | |
249 | |
250 function parseFlags() { | |
251 // sets dlFlags from the current parameters | |
252 var flags = new Object(); | |
253 var fa = getParameter("mo").split(","); | |
254 for (var i = 0; i < fa.length ; i++) { | |
255 var f = fa[i]; | |
256 if (f != "") { | |
257 flags[f] = f; | |
258 } | |
259 } | |
260 return flags; | |
407 | 261 } |
396 | 262 |
263 | |
264 function bestPicSize(elem, inset) { | |
265 // returns a Size with the best image size for the given element | |
266 if (! defined(inset)) { | |
267 inset = 25; | |
268 } | |
269 var ws = getWinSize(); | |
270 var es = getElementPosition(elem); | |
271 if (es) { | |
272 ws.width = ws.width - es.x - inset; | |
273 ws.height = ws.height - es.y - inset; | |
274 } | |
275 return ws; | |
276 } | |
277 | |
278 function setDLParam(e, s, relative) { | |
412 | 279 // sets parameter based on HTML event |
280 var nam; | |
396 | 281 var val; |
282 if (s.type && (s.type == "select-one")) { | |
283 nam = s.name; | |
284 val = s.options[s.selectedIndex].value; | |
285 } else if (s.name && s.value) { | |
286 nam = s.name; | |
287 val = s.value; | |
288 } | |
289 if (nam && val) { | |
290 setParameter(nam, val, relative); | |
291 display(); | |
292 } else { | |
293 alert("ERROR: unable to process event!"); | |
294 } | |
295 return true; | |
296 } | |
297 | |
298 | |
299 /* ********************************************** | |
300 * digilib specific routines | |
301 * ******************************************** */ | |
302 | |
303 | |
407 | 304 function parseAllParameters() { |
412 | 305 // put the query parameters (sans "?") in the parameters array |
306 parseParameters(location.search.slice(1)); | |
307 // treat special parameters | |
308 dlMarks = parseMarks(); | |
309 dlArea = parseArea(); | |
310 dlFlags = parseFlags(); | |
311 } | |
407 | 312 |
396 | 313 function dl_param_init() { |
412 | 314 // initialisation before onload |
315 if (!baseLibVersion) alert("ERROR: baselib.js not loaded!"); | |
316 if (isDigilibInitialized) return false; // dl_param_init was already run | |
317 // dlArea = new Rectangle(0.0, 0.0, 1.0, 1.0); // overwritten by parseAllParameters() below | |
318 // dlMarks = new Array(); // dito | |
319 // dlFlags = new Object(); // dito | |
320 // parse parameters | |
321 parseAllParameters(); | |
322 isDigilibInitialized = true; | |
323 return true; | |
324 } | |
396 | 325 |
326 function dl_init() { | |
412 | 327 // initalisation on load |
328 if (!isDigilibInitialized) dl_param_init(); | |
329 elemScaler = getElement("scaler"); | |
330 picElem = getElement("pic", true); | |
331 // in N4 pic is in the scaler layer | |
332 if (picElem == null && elemScaler) { | |
333 picElem = elemScaler.document.images[0]; | |
334 } | |
335 // give a name to the window containing digilib | |
336 window.name = defined(dlTarget) && dlTarget | |
337 ? dlTarget | |
338 : "digilib"; | |
339 // put the query parameters (sans "?") in the parameters array | |
340 // parseAllParameters(); // has already been called in dl_param_init() | |
341 // wait for image to load and display marks | |
342 renderMarks(); | |
343 // done | |
344 focus(); | |
345 } | |
346 | |
347 initScaler = dl_init; | |
396 | 348 |
407 | 349 function loadScalerImage(detail) { |
412 | 350 var pic = getElement('pic'); |
351 var scaler = getElement('scaler'); | |
352 var zoomdiv = getElement("zoom"); // test for presence only | |
353 var overlay = getElement("overlay"); // test for presence only | |
354 var about = getElement("bird"); // test for presence only | |
355 var bird = getElement("bird"); // test for presence only | |
356 var picsize = bestPicSize(scaler, 50); | |
357 var src = "../servlet/Scaler?" | |
358 + getQueryString() | |
359 + "&dw=" + picsize.width | |
360 + "&dh=" + picsize.height; | |
361 // debug(src); | |
362 pic.src = src; | |
363 initScaler(); // dl_init braucht die endgültigen Maße des pic Elements | |
364 } | |
396 | 365 |
366 function display(detail) { | |
412 | 367 // redisplay the page |
368 if (! detail) detail = PARAM_ALL; | |
369 var queryString = getAllParameters(detail); | |
370 if (reloadPage) { | |
371 location.href | |
372 = location.protocol + "//" | |
373 + location.host | |
374 + location.pathname | |
375 + "?" + queryString; | |
376 } else { | |
377 loadScalerImage(); | |
378 } | |
379 } | |
396 | 380 |
381 /* ********************************************** | |
382 * interactive digilib functions | |
383 * ******************************************** */ | |
384 function renderMarks() { | |
412 | 385 // make sure the image is loaded so we know its size |
407 | 386 if (defined(picElem.complete) && !picElem.complete && !browserType.isN4 ) { |
412 | 387 setTimeout("renderMarks()", 100); |
388 return; | |
396 | 389 } |
407 | 390 // put the visible marks on the image |
391 dlTrafo = parseTrafo(picElem); | |
412 | 392 // debugProps(dlArea, "dlArea"); |
407 | 393 for (var i = 0; i < dlMarks.length; i++) { |
412 | 394 var div = document.getElementById("mark" + i) || createMarkDiv(i); |
407 | 395 var mark = dlMarks[i]; |
425
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
396 // debugProps(mark, "mark"); |
412 | 397 if (dlArea.containsPosition(mark)) { |
398 var mpos = dlTrafo.transform(mark); // FIX ME: transform does not change anything | |
425
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
399 // debugProps(mark, "mpos"); |
412 | 400 // suboptimal to place -5 pixels and not half size of mark-image |
401 // better not hide the marked spot (MR) | |
402 // mpos.x = mpos.x -5; | |
403 // mpos.y = mpos.y -5; | |
404 moveElement(div, mpos); | |
405 showElement(div, true); | |
406 } else { | |
407 // hide the other marks | |
408 showElement(div, false); | |
409 } | |
396 | 410 } |
411 } | |
412 | |
413 function setMark(reload) { | |
414 | |
412 | 415 function markEvent(evt) { |
416 // event handler adding a new mark | |
417 unregisterEvent("mousedown", elemScaler, markEvent); | |
418 addMark(evt); | |
419 if ( defined(reload) && !reload ) { | |
420 // don't redisplay | |
421 renderMarks(); | |
422 return; | |
423 } | |
424 display(); | |
425 } | |
426 | |
427 // add a mark where clicked | |
428 window.focus(); | |
429 // start event capturing | |
430 registerEvent("mousedown", elemScaler, markEvent); | |
431 } | |
396 | 432 |
433 function removeMark(reload) { | |
434 // remove the last mark | |
435 deleteMark(); | |
436 if (defined(reload)&&(!reload)) { | |
437 // don't redisplay | |
438 renderMarks(); | |
439 return; | |
440 } | |
441 display(); | |
442 } | |
443 | |
444 function zoomArea() { | |
412 | 445 var pt1, pt2; |
446 var zoomdiv = getElement("zoom"); | |
447 var overlay = getElement("overlay"); | |
448 // use overlay div to avoid <img> mousemove problems | |
449 var rect = getElementRect(picElem); | |
450 // FIX ME: is there a way to query the border width from CSS info? | |
451 // rect.x -= 2; // account for overlay borders | |
452 // rect.y -= 2; | |
453 moveElement(overlay, rect); | |
454 showElement(overlay, true); | |
455 // start event capturing | |
456 registerEvent("mousedown", overlay, zoomStart); | |
457 registerEvent("mousedown", elemScaler, zoomStart); | |
458 window.focus(); | |
396 | 459 |
407 | 460 // mousedown handler: start moving |
412 | 461 function zoomStart(evt) { |
462 pt1 = evtPosition(evt); | |
463 unregisterEvent("mousedown", overlay, zoomStart); | |
464 unregisterEvent("mousedown", elemScaler, zoomStart); | |
465 // unregisterEvent("mousedown", zoomdiv, zoomStart); | |
466 // setup and show zoom div | |
467 moveElement(zoomdiv, Rectangle(pt1.x, pt1.y, 0, 0)); | |
468 showElement(zoomdiv, true); | |
469 // register move events | |
470 registerEvent("mousemove", overlay, zoomMove); | |
471 registerEvent("mousemove", zoomdiv, zoomMove); | |
472 registerEvent("mousemove", elemScaler, zoomMove); | |
473 // register up events for drag end | |
474 registerEvent("mouseup", overlay, zoomEnd); | |
475 registerEvent("mouseup", zoomdiv, zoomEnd); | |
476 registerEvent("mouseup", elemScaler, zoomEnd); | |
477 return stopEvent(evt); | |
478 } | |
479 | |
407 | 480 // mouseup handler: end moving |
412 | 481 function zoomEnd(evt) { |
482 pt2 = evtPosition(evt); | |
483 // assume a click if the area is too small (up to 3 x 3 pixel) | |
484 var clickArea = getRect(pt1, pt2).getArea(); | |
485 if (clickArea <= MIN_AREA_SIZE) return stopEvent(evt); | |
486 // hide zoom div | |
487 showElement(zoomdiv, false); | |
488 showElement(overlay, false); | |
489 // unregister move events | |
490 unregisterEvent("mousemove", overlay, zoomMove); | |
491 unregisterEvent("mousemove", zoomdiv, zoomMove); | |
492 unregisterEvent("mousemove", elemScaler, zoomMove); | |
493 // unregister drag events | |
494 unregisterEvent("mouseup", overlay, zoomEnd); | |
495 unregisterEvent("mouseup", zoomdiv, zoomEnd); | |
496 unregisterEvent("mouseup", elemScaler, zoomMove); | |
497 // calc offsets | |
498 var area = getRect( | |
499 // FIX ME: liefert negative x/y Werte, wenn hmir/vmir=1 | |
500 dlTrafo.invtransform(pt1), | |
501 dlTrafo.invtransform(pt2) | |
502 ); | |
503 setParameter("wx", cropFloat(area.x)); | |
504 setParameter("wy", cropFloat(area.y)); | |
505 setParameter("ww", cropFloat(area.width)); | |
506 setParameter("wh", cropFloat(area.height)); | |
507 // parseArea(); // why? | |
508 // zoomed is always fit | |
509 setParameter("ws", 1); | |
510 display(); | |
511 return stopEvent(evt); | |
512 } | |
513 | |
407 | 514 // mouse move handler |
412 | 515 function zoomMove(evt) { |
516 pt2 = evtPosition(evt); | |
517 // update zoom div | |
518 moveElement(zoomdiv, getRect(pt1, pt2)); | |
519 return stopEvent(evt); | |
520 } | |
521 | |
522 // get a rectangle from two points | |
523 function getRect(p1, p2) { | |
524 return new Rectangle( | |
525 Math.min(p1.x, p2.x), | |
526 Math.min(p1.y, p2.y), | |
527 Math.abs(p1.x - p2.x), | |
528 Math.abs(p1.y - p2.y) | |
529 ); | |
530 } | |
396 | 531 } |
532 | |
533 function zoomBy(factor) { | |
534 // zooms by the given factor | |
535 var newarea = dlArea.copy(); | |
536 newarea.width /= factor; | |
537 newarea.height /= factor; | |
538 newarea.x -= 0.5 * (newarea.width - dlArea.width); | |
539 newarea.y -= 0.5 * (newarea.height - dlArea.height); | |
540 newarea = dlMaxArea.fit(newarea); | |
541 setParamFromArea(newarea); | |
542 display(); | |
543 } | |
544 | |
545 | |
546 function zoomFullpage() { | |
547 // zooms out to show the whole image | |
548 setParameter("wx", 0.0); | |
549 setParameter("wy", 0.0); | |
550 setParameter("ww", 1.0); | |
551 setParameter("wh", 1.0); | |
552 display(); | |
553 } | |
554 | |
555 | |
556 function moveCenter() { | |
557 // move visible area so that it's centered around the clicked point | |
558 if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) { | |
559 // nothing to do | |
560 return; | |
561 } | |
562 window.focus(); | |
563 | |
564 function moveCenterEvent(evt) { | |
565 // move to handler | |
425
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
566 var pt = dlTrafo.invtransform(evtPosition(evt)); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
567 var newarea = new Rectangle( |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
568 pt.x - 0.5 * dlArea.width, |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
569 pt.y - 0.5 * dlArea.height, |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
570 dlArea.width, |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
571 dlArea.height |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
572 ); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
573 newarea.stayInside(dlMaxArea); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
574 // newarea = dlMaxArea.fit(newarea); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
575 // debugProps(newarea, "newarea"); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
576 // debugProps(dlArea, "dlArea"); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
577 if (newarea.equals(dlArea)) return; // keep event handler |
396 | 578 unregisterEvent("mousedown", elemScaler, moveCenterEvent); |
579 // set parameters | |
580 setParamFromArea(newarea); | |
581 parseArea(); | |
582 display(); | |
583 } | |
584 | |
585 // starting event capture | |
586 registerEvent("mousedown", elemScaler, moveCenterEvent); | |
587 } | |
588 | |
412 | 589 function isFullArea(area) { |
590 if (!area) area = dlArea; | |
591 return ((area.width == 1.0) && (area.height == 1.0)); | |
592 } | |
593 | |
594 function canMove(movx, movy) { | |
425
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
595 if (isFullArea()) return false; |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
596 // debugProps(dlArea); |
412 | 597 return ((movx < 0) && (dlArea.x > 0)) |
598 || ((movy < 0) && (dlArea.y > 0)) | |
599 || ((movx > 0) && (dlArea.x + dlArea.width < 1.0)) | |
600 || ((movy > 0) && (dlArea.y + dlArea.height < 1.0)) | |
601 } | |
602 | |
396 | 603 function moveBy(movx, movy) { |
604 // move visible area by movx and movy (in units of ww, wh) | |
425
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
605 if (!canMove(movx, movy)) return; // nothing to do |
396 | 606 var newarea = dlArea.copy(); |
607 newarea.x += parseFloat(movx)*dlArea.width; | |
608 newarea.y += parseFloat(movy)*dlArea.height; | |
609 newarea = dlMaxArea.fit(newarea); | |
610 // set parameters | |
611 setParamFromArea(newarea); | |
612 parseArea(); | |
613 display(); | |
614 } | |
615 | |
407 | 616 function getRef(baseURL) { |
396 | 617 // returns a reference to the current digilib set |
425
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
618 if (!baseUrl) baseUrl |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
619 = location.protocol |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
620 + "//" |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
621 + location.host |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
622 + location.pathname; |
396 | 623 var hyperlinkRef = baseUrl; |
412 | 624 var params = getAllParameters(PARAM_ALL & ~(PARAM_DPI | PARAM_PAGES)); // all without ddpi, pt |
407 | 625 if (params.length > 0) hyperlinkRef += "?" + params; |
626 return hyperlinkRef; | |
396 | 627 } |
628 | |
629 function getRefWin(type, msg) { | |
630 // shows an alert with a reference to the current digilib set | |
407 | 631 if (! msg) msg = "URL reference to the current view"; |
632 prompt(msg, getRef()); | |
396 | 633 } |
634 | |
635 function getQuality() { | |
407 | 636 // returns the current q setting |
396 | 637 for (var i = 0; i < 3; i++) { |
407 | 638 if (hasFlag("q"+i)) return i; |
412 | 639 } |
407 | 640 return 1 |
396 | 641 } |
642 | |
643 function setQuality(qual) { | |
644 // set the image quality | |
407 | 645 for (var i = 0; i < 3; i++) removeFlag("q" + i); |
646 if (qual > 2) return alert("Quality number not supported"); | |
647 addFlag("q" + i); | |
396 | 648 setParameter("mo", getAllFlags()); |
649 display(); | |
407 | 650 } |
396 | 651 |
652 function setQualityWin(msg) { | |
412 | 653 // dialog for setting quality |
654 if (! msg) msg = "Quality (0..2)"; | |
655 var q = getQuality(); | |
656 var newq = window.prompt(msg, q); | |
657 if (newq) setQuality(newq); | |
658 } | |
396 | 659 |
660 function mirror(dir) { | |
661 // mirror the image horizontally or vertically | |
425
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
662 toggleFlag(dir == "h" |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
663 ? "hmir" |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
664 : "vmir" |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
665 ); |
396 | 666 setParameter("mo", getAllFlags()); |
667 display(); | |
668 } | |
669 | |
670 function gotoPage(gopage, keep) { | |
412 | 671 // goto given page nr (+/-: relative) |
672 var oldpn = parseInt(getParameter("pn")); | |
673 setParameter("pn", gopage, true); | |
674 var pn = parseInt(getParameter("pn")); | |
675 if (pn < 1) { | |
676 alert("No such page! (Page number too low)"); | |
677 setParameter("pn", oldpn); | |
678 return; | |
679 } | |
680 if (hasParameter("pt")) { | |
681 pt = parseInt(getParameter("pt")) | |
682 if (pn > pt) { | |
683 alert("No such page! (Page number too high)"); | |
684 setParameter("pn", oldpn); | |
685 return; | |
686 } | |
687 } | |
688 if (keep) { | |
689 display(PARAM_ALL & ~PARAM_MARK); // all, no mark | |
690 } else { | |
691 display(PARAM_FILE | PARAM_MODE | PARAM_PAGES); // fn, pn, ws, mo + pt | |
692 // FIX ME: currently the mirror status gets propagated to the other pages | |
693 // hmir and vmir should not be mode flags, but boolean params!!! | |
694 } | |
396 | 695 } |
696 | |
697 function gotoPageWin() { | |
412 | 698 // dialog to ask for new page nr |
699 var pn = getParameter("pn"); | |
700 var gopage = window.prompt("Go to page", pn); | |
701 if (gopage) gotoPage(gopage); | |
702 } | |
396 | 703 |
704 function setParamWin(param, text, relative) { | |
412 | 705 // dialog to ask for new parameter value |
706 var val = getParameter(param); | |
707 var newval = window.prompt(text, val); | |
708 if (newval) { | |
709 setParameter(param, newval, relative); | |
710 display(); | |
711 } | |
396 | 712 } |
713 | |
714 function showOptions(show) { | |
412 | 715 // show or hide option div |
716 var elem = getElement("dloptions"); | |
717 showElement(elem, show); | |
718 // FIX ME: get rid of the dotted line around the buttons when focused | |
719 } | |
407 | 720 |
721 function showAboutDiv(show) { | |
412 | 722 // show or hide "about" div |
723 var elem = getElement("about"); | |
724 if (elem == null) { | |
725 if (!show) return; | |
726 alert("About Digilib - dialog missing in HTML code!" | |
727 + "\nDigilib Version: " + digilibVersion | |
728 + "\ndlLib Version: " + dllibVersion | |
729 + "\nbaseLib Version: " + baseLibVersion); | |
730 return; | |
731 } | |
732 document.getElementById("digilib-version").innerHTML = "Digilib Version: " + digilibVersion; | |
733 document.getElementById("baselib-version").innerHTML = "baseLib Version: " + baseLibVersion; | |
734 document.getElementById("dllib-version").innerHTML = "dlLib Version: " + dllibVersion; | |
735 showElement(elem, show); | |
736 } | |
737 | |
738 function loadBirdImage() { | |
739 var img = getElement("bird-image"); | |
740 var src = "../servlet/Scaler?" | |
741 + getQueryString(PARAM_FILE | PARAM_MODE) | |
742 + "&dw=" + BIRD_MAXX | |
743 + "&dh=" + BIRD_MAXY; | |
744 img.src = src; | |
745 } | |
746 | |
747 function showBirdDiv(show) { | |
748 // show or hide "bird's eye" div | |
749 var startPos; // anchor for dragging | |
750 var newRect; // position after drag | |
751 var birdImg = getElement("bird-image"); | |
752 showElement(birdImg, show); | |
753 var birdArea = getElement("bird-area"); | |
754 // dont show selector if area is full size | |
755 if (!show || isFullArea()) { | |
756 // hide area | |
757 showElement(birdArea, false); | |
758 return; | |
759 }; | |
760 var birdImgRect = getElementRect(birdImg); | |
761 var area = parseArea(); | |
762 // scale area down to img size | |
763 var birdAreaRect = new Rectangle( | |
764 // what about borders ?? | |
765 birdImgRect.x + birdImgRect.width * area.x, | |
766 birdImgRect.y + birdImgRect.height * area.y, | |
767 birdImgRect.width * area.width, | |
768 birdImgRect.height * area.height | |
769 ); | |
770 moveElement(birdArea, birdAreaRect); | |
771 showElement(birdArea, show); | |
772 registerEvent("mousedown", birdArea, birdAreaStartDrag); | |
773 | |
774 function birdAreaStartDrag(evt) { | |
775 // mousedown handler: start drag | |
776 startPos = evtPosition(evt); | |
777 registerEvent("mousemove", birdArea, birdAreaMove); | |
778 registerEvent("mousemove", birdImg, birdAreaMove); | |
779 registerEvent("mouseup", birdArea, birdAreaEndDrag); | |
780 registerEvent("mouseup", birdImg, birdAreaEndDrag); | |
781 | |
782 // debugProps(getElementRect(bird)) | |
783 return stopEvent(evt); | |
784 } | |
785 | |
786 function birdAreaMove(evt) { | |
787 // mousemove handler: drag | |
788 var pos = evtPosition(evt); | |
789 var dx = pos.x - startPos.x; | |
790 var dy = pos.y - startPos.y; | |
791 // move birdArea div, keeping size | |
792 newRect = new Rectangle( | |
793 birdAreaRect.x + dx, | |
794 birdAreaRect.y + dy, | |
795 birdAreaRect.width, | |
796 birdAreaRect.height); | |
797 // stay within image | |
798 newRect.stayInside(birdImgRect); | |
799 moveElement(birdArea, newRect); | |
800 showElement(birdArea, true); | |
801 return stopEvent(evt); | |
802 } | |
803 | |
804 function birdAreaEndDrag(evt) { | |
805 // mouseup handler: reload page | |
806 unregisterEvent("mousemove", birdArea, birdAreaMove); | |
807 unregisterEvent("mouseup", birdArea, birdAreaEndDrag); | |
808 unregisterEvent("mousemove", birdImg, birdAreaMove); | |
809 unregisterEvent("mouseup", birdImg, birdAreaEndDrag); | |
810 setParameter("wx", cropFloat((newRect.x - birdImgRect.x) / birdImgRect.width)); | |
811 setParameter("wy", cropFloat((newRect.y - birdImgRect.y) / birdImgRect.height)); | |
812 // width and height parameters remain the same | |
813 // setParameter("ww", cropFloat(newRect.width / birdImgRect.width)); | |
814 // setParameter("ww", cropFloat(newRect.height / birdImgRect.height)); | |
815 // parseArea(); // why? | |
816 // zoomed is always fit | |
817 setParameter("ws", 1); | |
818 display(); | |
819 return stopEvent(evt); | |
820 } | |
821 } | |
822 | |
425
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
823 function showArrow(name, rect, show) { |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
824 var arrow = getElement(name); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
825 moveElement(arrow, rect); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
826 showElement(arrow, show); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
827 } |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
828 |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
829 function showArrows() { |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
830 if (defined(picElem.complete) && !picElem.complete && !browserType.isN4 ) { |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
831 setTimeout("showArrows()", 100); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
832 return; |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
833 } |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
834 var r = getElementRect(picElem); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
835 showArrow('up', |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
836 new Rectangle(r.x, r.y, r.width, ARROW_WIDTH), |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
837 canMove(0, -1) |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
838 ); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
839 showArrow('down', |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
840 new Rectangle(r.x, r.y + r.height - ARROW_WIDTH, r.width, ARROW_WIDTH), |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
841 canMove(0, 1) |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
842 ); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
843 showArrow('left', |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
844 new Rectangle(r.x, r.y, ARROW_WIDTH, r.height), |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
845 canMove(-1, 0) |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
846 ); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
847 showArrow('right', |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
848 new Rectangle(r.x + r.width - ARROW_WIDTH, r.y, ARROW_WIDTH, r.height), |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
849 canMove(1, 0) |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
850 ); |
ab2557f079fc
added showArrows() function (navigation arrows overlay)
hertzhaft
parents:
412
diff
changeset
|
851 } |
412 | 852 |