Mercurial > hg > digilib-old
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 } |