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