comparison client/digitallibrary/greyskin/dllib.js @ 416:7e4c5617585b

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