comparison client/digitallibrary/greyskin/dllib.js @ 446:8f8d7c1a12b9

experimental intermediary release - more object-orientation in javascript - more changes afoot - reloading works properly - setting a mark reloads quickly
author robcast
date Mon, 23 Jan 2006 18:29:52 +0100
parents a7bd9e2e1bbe
children c3a36b515a73
comparison
equal deleted inserted replaced
445:bd9e35b0b17c 446:8f8d7c1a12b9
22 22
23 ! Requires baselib.js ! 23 ! Requires baselib.js !
24 24
25 */ 25 */
26 digilibVersion = "Digilib NG"; 26 digilibVersion = "Digilib NG";
27 dllibVersion = "2.031"; 27 dllibVersion = "2.040";
28 isDigilibInitialized = false; // gets set to true in dl_param_init 28
29 reloadPage = true; // reload the page when parameters are changed, otherwise update only "src" attribute of scaler img 29 /****************************************************
30 30 * digilib specific classes (must be defined first)
31 // global variables 31 ****************************************************/
32 dlTrafo = new Transform(); 32
33 dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0); 33 /*
34 dlArea = null; 34 * Marks class
35 dlMarks = null; 35 */
36 dlFlags = null; 36 function Marks() {
37 return this;
38 }
39 // Marks inherits from Array
40 Marks.prototype = new Array();
41 Marks.prototype.parse = function(query) {
42 this.length = 0;
43 if (query.indexOf(";") >= 0) {
44 var pa = query.split(";"); // old format with ";"
45 } else {
46 var pa = query.split(","); // new format
47 }
48 for (var i = 0; i < pa.length ; i++) {
49 var pos = pa[i].split("/");
50 if (pos.length > 1) this.push(new Position(pos[0], pos[1]));
51 }
52 }
53 Marks.prototype.getAll = function() {
54 var ma = new Array();
55 for (var i = 0; i < this.length; i++) {
56 ma.push(cropFloat(this[i].x) + "/" + cropFloat(this[i].y));
57 }
58 return ma.join(",");
59 }
60 Marks.prototype.addEvent = function(evt) {
61 // add a mark from a screen event
62 var pos = dlTrafo.invtransform(evtPosition(evt));
63 this.push(pos);
64 }
65
66 /*
67 * DLParameters -- digilibs own parameter class
68 */
69 function DLParameters() {
70 // flags for parameter sets
71 this.PARAM_FILE = 1;
72 this.PARAM_MODE = 2;
73 this.PARAM_DIM = 4;
74 this.PARAM_IMAGE = 8;
75 this.PARAM_DPI = 16;
76 this.PARAM_SIZE = 32;
77 this.PARAM_MARK = 64;
78 this.PARAM_PAGES = 128;
79 this.PARAM_ALL = 255;
80 return this;
81 }
82 DLParameters.prototype = new Parameters();
83 // move the inherited getAll because we need it later
84 DLParameters.prototype._getAll = Parameters.prototype.getAll;
85 DLParameters.prototype.getAll = function(paDetail, moDetail) {
86 // get Flags and Marks first
87 var mo = dlFlags.getAll(moDetail);
88 this.set("mo", mo);
89 var mk = dlMarks.getAll();
90 this.set("mk", mk);
91 var ret = this._getAll(paDetail);
92 return ret;
93 }
94
95 /*
96 * DLModes -- digilibs own flags class
97 */
98 function DLFlags() {
99 // flags for mode sets
100 this.MODE_QUAL = 1;
101 this.MODE_SIZE = 2;
102 this.MODE_MIR = 4;
103 this.MODE_OTHER = 128;
104 this.MODE_ALL = 255;
105 return this;
106 }
107 // inherits from Flags
108 DLFlags.prototype = new Flags();
109
110 /********************************
111 * global variables
112 ********************************/
113
114 var isDigilibInitialized = false; // gets set to true in dl_param_init
115
116 var dlParams;
117 var dlTrafo;
118 var dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0); // should be CONST
119 var dlArea;
120 var dlFlags;
121 var dlMarks;
37 122
38 // global elements 123 // global elements
39 scalerDiv = null; 124 var scalerDiv = null;
40 scalerImg = null; 125 var scalerImg = null;
41 126
42 // default inset (for scalerImg relativ to scalerDiv 127 // default inset (for scalerImg relativ to scalerDiv
43 INSET = 40; // because of scrollbars of main window and scaler [Firefox bug?] 128 INSET = 40; // because of scrollbars of main window and scaler [Firefox bug?]
44 129
45 // flags for parameter sets 130 /* old parameter function compatibility stuff */
46 PARAM_FILE = 1; 131 function newParameter(a,b,c) {return dlParams.define(a,b,c)};
47 PARAM_MODE = 2; 132 function resetParameter(a) {return dlParams.reset(a)};
48 PARAM_DIM = 4; 133 function deleteParameter(a) {return dlParams.remove(a)};
49 PARAM_IMAGE = 8; 134 function getParameter(a) {return dlParams.get(a)};
50 PARAM_DPI = 16; 135 function setParameter(a,b,c) {return dlParams.set(a,b,c)};
51 PARAM_MARK = 32; 136 function hasParameter(a) {return dlParams.isSet(a)};
52 PARAM_PAGES = 64; 137 function getAllParameters(a) {return dlParams.getAll(a)};
53 PARAM_SIZE = 128; 138 getQueryString = getAllParameters;
54 PARAM_ALL = PARAM_FILE | PARAM_MODE | PARAM_DIM | PARAM_IMAGE | PARAM_DPI | PARAM_MARK | PARAM_PAGES | PARAM_SIZE; 139 function parseParameters(a) {return dlParams.parse(a)};
140 function getAllMarks() {return dlMarks.getAll()};
141 getMarksQueryString = getAllMarks;
142 function addMark(evt) {return dlMarks.addEvent(evt)};
143 function deleteMark() {return dlMarks.pop()};
144 function deleteAllMarks() {return dlMarks = new Marks()};
145 function hasFlag(mode) {return dlFlags.get(mode)};
146 function addFlag(mode) {return dlFlags.set(mode)};
147 function removeFlag(mode) {return dlFlags.reset(mode)};
148 function toggleFlag(mode) {return dlFlags.toggle(mode)};
149 function getAllFlags() {return dlFlags.getAll()};
150
151
55 152
56 // mouse drag area that counts as one click 153 // mouse drag area that counts as one click
57 MIN_AREA_SIZE = 3 * 3 + 1; 154 MIN_AREA_SIZE = 3 * 3 + 1;
58 155
59 // standard zoom factor 156 // standard zoom factor
72 function identify() { 169 function identify() {
73 // used for identifying a digilib instance 170 // used for identifying a digilib instance
74 // Relato uses that function - lugi 171 // Relato uses that function - lugi
75 return digilibVersion; 172 return digilibVersion;
76 } 173 }
174
77 /* 175 /*
78 * more parameter handling 176 * more parameter handling
79 */ 177 */
80 178
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
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);
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);
106 // size
107 newParameter('ws', '1.0', PARAM_SIZE);
108 }
109
110 function parseArea() { 179 function parseArea() {
111 // returns area Rectangle from current parameters 180 // returns area Rectangle from current parameters
112 return new Rectangle( 181 return new Rectangle(
113 getParameter("wx"), 182 dlParams.get("wx"),
114 getParameter("wy"), 183 dlParams.get("wy"),
115 getParameter("ww"), 184 dlParams.get("ww"),
116 getParameter("wh")); 185 dlParams.get("wh"));
117 } 186 }
118 187
119 function setParamFromArea(rect) { 188 function setParamFromArea(rect) {
120 // sets digilib wx etc. from rect 189 // sets digilib wx etc. from rect
121 setParameter("wx", cropFloat(rect.x)); 190 dlParams.set("wx", cropFloat(rect.x));
122 setParameter("wy", cropFloat(rect.y)); 191 dlParams.set("wy", cropFloat(rect.y));
123 setParameter("ww", cropFloat(rect.width)); 192 dlParams.set("ww", cropFloat(rect.width));
124 setParameter("wh", cropFloat(rect.height)); 193 dlParams.set("wh", cropFloat(rect.height));
125 return true; 194 return true;
126 } 195 }
196
197 function initParameters() {
198 // initialisation before onload
199 if (!baseLibVersion) alert("ERROR: baselib.js not loaded!");
200 if (isDigilibInitialized) return false; // dl_param_init was already run
201 dlParams = new DLParameters();
202 dlFlags = new DLFlags();
203 dlMarks = new Marks();
204 /* request parameters */
205 with (dlParams) {
206 // file
207 define('fn', '', PARAM_FILE);
208 define('pn', '1', PARAM_FILE);
209 // mode
210 define('mo', '', PARAM_MODE);
211 // relative dimensions of zoomed image
212 define('wx', '0.0', PARAM_DIM);
213 define('wy', '0.0', PARAM_DIM);
214 define('ww', '1.0', PARAM_DIM);
215 define('wh', '1.0', PARAM_DIM);
216 // image manipulation
217 define('brgt', '0.0', PARAM_IMAGE);
218 define('cont', '0.0', PARAM_IMAGE);
219 define('rot', '0.0', PARAM_IMAGE);
220 define('rgba', '', PARAM_IMAGE);
221 define('rgbm', '', PARAM_IMAGE);
222 // resolution
223 define('ddpi', '', PARAM_DPI);
224 define('ddpix', '', PARAM_DPI);
225 define('ddpiy', '', PARAM_DPI);
226 // marks
227 define('mk', '', PARAM_MARK);
228 // pages total
229 define('pt', '0', PARAM_PAGES);
230 // size
231 define('ws', '1.0', PARAM_SIZE);
232 }
233 /* mode flags */
234 with (dlFlags) {
235 define('q0', MODE_QUAL);
236 define('q1', MODE_QUAL);
237 define('q2', MODE_QUAL);
238 define('fit', MODE_SIZE);
239 define('clip', MODE_SIZE);
240 define('osize', MODE_SIZE);
241 define('vmir', MODE_MIR);
242 define('hmir', MODE_MIR);
243 }
244 // parse parameters
245 parseAllParameters();
246 isDigilibInitialized = true;
247 }
127 248
128 /* ********************************************** 249 /* **********************************************
129 * parse parameters routines 250 * parse parameters routines
130 * ******************************************** */ 251 * ******************************************** */
131 252
138 trafo.concat(getScale(new Size(1/dlArea.width, 1/dlArea.height))); 259 trafo.concat(getScale(new Size(1/dlArea.width, 1/dlArea.height)));
139 // scale to screen size 260 // scale to screen size
140 trafo.concat(getScale(picsize)); 261 trafo.concat(getScale(picsize));
141 trafo.concat(getTranslation(picsize)); 262 trafo.concat(getTranslation(picsize));
142 // FIX ME: Robert, kannst Du mal nachsehen, ob das folgende tut, was es soll? 263 // FIX ME: Robert, kannst Du mal nachsehen, ob das folgende tut, was es soll?
143 // oder gibt es dafür neuen Code? 264 // oder gibt es dafuer neuen Code? -- ROC: Bisher funktioniert es nicht!
144 // rotate 265 // rotate
145 var rot = getRotation(- getParameter("rot"), new Position(0.5*picsize.width, 0.5*picsize.height)); 266 //var rot = getRotation(- dlParams.get("rot"), new Position(0.5*picsize.width, 0.5*picsize.height));
146 trafo.concat(rot); 267 //trafo.concat(rot);
147 // mirror 268 // mirror
148 if (hasFlag("hmir")) trafo.m00 = - trafo.m00; // ?? 269 //if (hasFlag("hmir")) trafo.m00 = - trafo.m00; // ??
149 if (hasFlag("vmir")) trafo.m11 = - trafo.m11; // ?? 270 //if (hasFlag("vmir")) trafo.m11 = - trafo.m11; // ??
150 return trafo; 271 return trafo;
151 } 272 }
152
153 function parseMarks() {
154 // returns marks array from current parameters
155 var marks = new Array();
156 var param = getParameter("mk");
157 var pairs = (param.indexOf(";") >= 0)
158 ? param.split(";") // old format with ";"
159 : param.split(","); // new format
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;
165 }
166 273
167 /* ********************************************** 274 /* **********************************************
168 * marks routines 275 * marks routines
169 * ******************************************** */ 276 * ******************************************** */
170
171 function getAllMarks() {
172 // returns a string with all marks in query format
173 var marks = new Array();
174 for (var i = 0; i < dlMarks.length; i++)
175 marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y));
176 return marks.join(",");
177 }
178
179 getMarksQueryString = getAllMarks;
180
181 function addMark(evt) {
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 }
202 277
203 function createMarkDiv(index) { 278 function createMarkDiv(index) {
204 var div = document.createElement("div"); 279 var div = document.createElement("div");
205 div.className = "mark"; 280 div.className = "mark";
206 div.id = "mark" + index; 281 div.id = "mark" + index;
207 div.innerHTML = index + 1; 282 div.innerHTML = index + 1;
208 document.body.appendChild(div); 283 document.body.appendChild(div);
209 return div; 284 return div;
210 } 285 }
211 286
212 /* ********************************************** 287
213 * flag routines
214 * ******************************************** */
215
216 function hasFlag(mode) {
217 // returns if mode flag is set
218 return (dlFlags[mode]);
219 }
220
221 function addFlag(mode) {
222 // add a mode flag
223 dlFlags[mode] = mode;
224 setParameter("mo", getAllFlags());
225 return true;
226 }
227
228 function removeFlag(mode) {
229 // remove a mode flag
230 if (dlFlags[mode]) delete dlFlags[mode];
231 setParameter("mo", getAllFlags());
232 return true;
233 }
234
235 function toggleFlag(mode) {
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 }
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;
268 }
269 288
270 289
271 function bestPicSize(elem, inset) { 290 function bestPicSize(elem, inset) {
272 // returns a Size with the best image size for the given element 291 // returns a Size with the best image size for the given element
273 if (! defined(inset)) { 292 if (! defined(inset)) {
292 } else if (s.name && s.value) { 311 } else if (s.name && s.value) {
293 nam = s.name; 312 nam = s.name;
294 val = s.value; 313 val = s.value;
295 } 314 }
296 if (nam && val) { 315 if (nam && val) {
297 setParameter(nam, val, relative); 316 dlParams.set(nam, val, relative);
298 display(); 317 display();
299 } else { 318 } else {
300 alert("ERROR: unable to process event!"); 319 alert("ERROR: unable to process event!");
301 } 320 }
302 return true; 321 return true;
308 * ******************************************** */ 327 * ******************************************** */
309 328
310 329
311 function parseAllParameters() { 330 function parseAllParameters() {
312 // put the query parameters (sans "?") in the parameters array 331 // put the query parameters (sans "?") in the parameters array
313 parseParameters(location.search.slice(1)); 332 dlParams.parse(location.search.slice(1));
314 // treat special parameters 333 // treat special parameters
315 dlMarks = parseMarks(); 334 dlMarks.parse(dlParams.get("mk"));
316 dlArea = parseArea(); 335 dlArea = parseArea();
317 dlFlags = parseFlags(); 336 dlFlags.parse(dlParams.get("mo"));
318 } 337 }
319 338
320 function dl_param_init() { 339 function dl_param_init() {
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; 340 return true;
331 } 341 }
332 342
333 function dl_init() { 343 function dl_init() {
334 // initalisation on load 344 // initalisation on load
335 if (!isDigilibInitialized) dl_param_init(); 345 if (!isDigilibInitialized) dl_param_init();
336 scalerDiv = getElement("scaler");
337 scalerImg = getElement("pic", true);
338 // in N4 pic is in the scaler layer
339 if (scalerImg == null && scalerDiv) {
340 scalerImg = scalerDiv.document.images[0];
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 346 // wait for image to load and display marks
349 renderMarks(); 347 renderMarks();
350 // done 348 // done
351 focus(); 349 focus();
352 } 350 }
353 351
354 initScaler = dl_init; 352 function setScalerImage(detail) {
355 353 // set the scaler image source (needs the browser size)
356 function loadScalerImage(detail) { 354 if (!scalerDiv) scalerDiv = getElement("scaler");
357 var pic = getElement('pic'); 355 if (!scalerImg) scalerImg = getElement("pic");
358 var scaler = getElement('scaler'); 356 var picsize = bestPicSize(scalerDiv, 50);
359 var zoomdiv = getElement("zoom"); // test for presence only
360 var overlay = getElement("overlay"); // test for presence only
361 var about = getElement("about"); // test for presence only
362 var bird = getElement("bird"); // test for presence only
363 var picsize = bestPicSize(scaler, 50);
364 var src = "../servlet/Scaler?" 357 var src = "../servlet/Scaler?"
365 + getQueryString() 358 + dlParams.getAll(dlParams.PARAM_ALL & ~(dlParams.PARAM_MARK | dlParams.PARAM_PAGES))
366 + "&dw=" + picsize.width 359 + "&dw=" + picsize.width
367 + "&dh=" + picsize.height; 360 + "&dh=" + picsize.height;
368 // debug(src); 361 // debug(src);
369 pic.src = src; 362 scalerImg.onload = onImgLoad;
370 initScaler(); // dl_init braucht die endgültigen Maße des pic Elements 363 scalerImg.src = src;
371 } 364 //initScaler(); // dl_init braucht die endgueltigen Masze des pic Elements
372 365 }
373 function display(detail) { 366
367 function display(detail, moDetail) {
374 // redisplay the page 368 // redisplay the page
375 if (! detail) detail = PARAM_ALL; 369 var queryString = dlParams.getAll(detail, moDetail);
376 var queryString = getAllParameters(detail); 370 location.href
377 if (reloadPage) { 371 = location.protocol + "//"
378 location.href 372 + location.host
379 = location.protocol + "//" 373 + location.pathname
380 + location.host 374 + "?" + queryString;
381 + location.pathname 375 }
382 + "?" + queryString;
383 } else {
384 loadScalerImage();
385 }
386 }
387 376
388 /* ********************************************** 377 /* **********************************************
389 * interactive digilib functions 378 * interactive digilib functions
390 * ******************************************** */ 379 * ******************************************** */
391 function renderMarks() { 380 function renderMarks() {
392 // make sure the image is loaded so we know its size 381 // make sure the image is loaded so we know its size
393 if (defined(scalerImg.complete) && !scalerImg.complete && !browserType.isN4 ) { 382 if (!dlTrafo) {
394 setTimeout("renderMarks()", 100); 383 alert("ERROR: cannot render marks!");
395 return; 384 return;
396 } 385 }
397 // put the visible marks on the image
398 dlTrafo = parseTrafo(scalerImg);
399 // debugProps(dlArea, "dlArea"); 386 // debugProps(dlArea, "dlArea");
400 for (var i = 0; i < dlMarks.length; i++) { 387 for (var i = 0; i < dlMarks.length; i++) {
401 var div = getElement("mark" + i) || createMarkDiv(i); 388 var div = getElement("mark" + i, true) || createMarkDiv(i);
402 var mark = dlMarks[i]; 389 var mark = dlMarks[i];
403 // debugProps(mark, "mark"); 390 // debugProps(mark, "mark");
404 if (dlArea.containsPosition(mark)) { 391 if (dlArea.containsPosition(mark)) {
405 var mpos = dlTrafo.transform(mark); // FIX ME: transform does not change anything 392 var mpos = dlTrafo.transform(mark);
406 // debugProps(mark, "mpos"); 393 // debugProps(mark, "mpos");
407 // suboptimal to place -5 pixels and not half size of mark-image 394 // suboptimal to place -5 pixels and not half size of mark-image
408 // better not hide the marked spot (MR) 395 // better not hide the marked spot (MR)
409 // mpos.x = mpos.x -5; 396 // mpos.x = mpos.x -5;
410 // mpos.y = mpos.y -5; 397 // mpos.y = mpos.y -5;
411 moveElement(div, mpos); 398 moveElement(div, mpos);
412 showElement(div, true); 399 showElement(div, true);
413 } else { 400 } else {
414 // hide the other marks 401 // hide the other marks
415 showElement(div, false); 402 showElement(div, false);
416 } 403 }
417 } 404 }
418 } 405 }
419 406
420 function setMark(reload) { 407 function setMark(reload) {
421 408
422 function markEvent(evt) { 409 function markEvent(evt) {
423 // event handler adding a new mark 410 // event handler adding a new mark
424 unregisterEvent("mousedown", scalerDiv, markEvent); 411 unregisterEvent("mousedown", scalerDiv, markEvent);
425 addMark(evt); 412 dlMarks.addEvent(evt);
426 if ( defined(reload) && !reload ) { 413 if ( defined(reload) && !reload ) {
427 // don't redisplay 414 // don't redisplay
428 renderMarks(); 415 renderMarks();
429 return; 416 return;
430 } 417 }
431 display(); 418 display();
432 return stopEvent(evt); 419 return stopEvent(evt);
433 } 420 }
434 421
435 // add a mark where clicked 422 // add a mark where clicked
436 window.focus(); 423 window.focus();
437 moveCenter(false); 424 moveCenter(false);
438 // start event capturing 425 // start event capturing
439 registerEvent("mousedown", scalerDiv, markEvent); 426 registerEvent("mousedown", scalerDiv, markEvent);
440 } 427 }
441 428
442 function removeMark(reload) { 429 function removeMark(reload) {
443 // remove the last mark 430 // remove the last mark
444 deleteMark(); 431 dlMarks.pop();
445 if (defined(reload)&&(!reload)) { 432 if (defined(reload)&&(!reload)) {
446 // don't redisplay 433 // don't redisplay
447 renderMarks(); 434 renderMarks();
448 return; 435 return;
449 } 436 }
476 showElement(zoomdiv, true); 463 showElement(zoomdiv, true);
477 // register events 464 // register events
478 registerEvent("mousemove", document, zoomMove); 465 registerEvent("mousemove", document, zoomMove);
479 registerEvent("mouseup", document, zoomEnd); 466 registerEvent("mouseup", document, zoomEnd);
480 return stopEvent(evt); 467 return stopEvent(evt);
481 } 468 }
482 469
483 // mouseup handler: end moving 470 // mouseup handler: end moving
484 function zoomEnd(evt) { 471 function zoomEnd(evt) {
485 pt2 = evtPosition(evt); 472 pt2 = evtPosition(evt);
486 // assume a click if the area is too small (up to 3 x 3 pixel) 473 // assume a click if the area is too small (up to 3 x 3 pixel)
487 var clickRect = getRect(pt1, pt2); 474 var clickRect = new Rectangle(pt1, pt2);
475 clickRect.normalize();
488 if (clickRect.getArea() <= MIN_AREA_SIZE) return stopEvent(evt); 476 if (clickRect.getArea() <= MIN_AREA_SIZE) return stopEvent(evt);
489 // hide zoom div 477 // hide zoom div
490 showElement(zoomdiv, false); 478 showElement(zoomdiv, false);
491 showElement(overlay, false); 479 showElement(overlay, false);
492 // unregister events 480 // unregister events
493 unregisterEvent("mousemove", document, zoomMove); 481 unregisterEvent("mousemove", document, zoomMove);
494 unregisterEvent("mouseup", document, zoomMove); 482 unregisterEvent("mouseup", document, zoomMove);
495 // calc offsets 483 // clip and transform
496 clickRect.clipTo(picRect); 484 clickRect.clipTo(picRect);
497 var area = getRect( 485 var area = dlTrafo.invtransform(clickRect);
498 // FIX ME: liefert negative x/y Werte, wenn hmir/vmir=1 486 setParamFromArea(area);
499 dlTrafo.invtransform(clickRect.getPt1()),
500 dlTrafo.invtransform(clickRect.getPt2())
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 487 // zoomed is always fit
508 setParameter("ws", 1); 488 dlParams.set("ws", 1);
509 display(); 489 display();
510 return stopEvent(evt); 490 return stopEvent(evt);
511 } 491 }
512 492
513 // mouse move handler 493 // mouse move handler
514 function zoomMove(evt) { 494 function zoomMove(evt) {
515 pt2 = evtPosition(evt); 495 pt2 = evtPosition(evt);
516 var rect = getRect(pt1, pt2); 496 var rect = new Rectangle(pt1, pt2);
497 rect.normalize();
517 rect.clipTo(picRect); 498 rect.clipTo(picRect);
518 // update zoom div 499 // update zoom div
519 moveElement(zoomdiv, rect); 500 moveElement(zoomdiv, rect);
520 return stopEvent(evt); 501 return stopEvent(evt);
521 } 502 }
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 }
532 } 503 }
533 504
534 function zoomBy(factor) { 505 function zoomBy(factor) {
535 // zooms by the given factor 506 // zooms by the given factor
536 var newarea = dlArea.copy(); 507 var newarea = dlArea.copy();
544 } 515 }
545 516
546 517
547 function zoomFullpage() { 518 function zoomFullpage() {
548 // zooms out to show the whole image 519 // zooms out to show the whole image
549 setParameter("wx", 0.0); 520 dlParams.set("wx", 0.0);
550 setParameter("wy", 0.0); 521 dlParams.set("wy", 0.0);
551 setParameter("ww", 1.0); 522 dlParams.set("ww", 1.0);
552 setParameter("wh", 1.0); 523 dlParams.set("wh", 1.0);
553 display(); 524 display();
554 } 525 }
555 526
556 527
557 function moveCenter(on) { 528 function moveCenter(on) {
620 = location.protocol 591 = location.protocol
621 + "//" 592 + "//"
622 + location.host 593 + location.host
623 + location.pathname; 594 + location.pathname;
624 var hyperlinkRef = baseUrl; 595 var hyperlinkRef = baseUrl;
625 var params = getAllParameters(PARAM_ALL & ~(PARAM_DPI | PARAM_PAGES)); // all without ddpi, pt 596 var params = dlParams.getAll(dlParams.PARAM_ALL & ~(dlParams.PARAM_DPI | dlParams.PARAM_PAGES)); // all without ddpi, pt
626 if (params.length > 0) hyperlinkRef += "?" + params; 597 if (params.length > 0) hyperlinkRef += "?" + params;
627 return hyperlinkRef; 598 return hyperlinkRef;
628 } 599 }
629 600
630 function getRefWin(type, msg) { 601 function getRefWin(type, msg) {
631 // shows an alert with a reference to the current digilib set 602 // shows an alert with a reference to the current digilib set
632 if (! msg) msg = "URL reference to the current view"; 603 if (! msg) msg = "URL reference to the current view";
633 prompt(msg, getRef()); 604 prompt(msg, getRef());
634 } 605 }
635 606
636 function getQuality() { 607 function getQuality() {
637 // returns the current q setting 608 // returns the current q setting
638 for (var i = 0; i < 3; i++) { 609 for (var i = 0; i < 3; i++) {
639 if (hasFlag("q"+i)) return i; 610 if (dlFlags.get("q"+i)) return i;
640 } 611 }
641 return 1 612 return 1
642 } 613 }
643 614
644 function setQuality(qual) { 615 function setQuality(qual) {
645 // set the image quality 616 // set the image quality
646 for (var i = 0; i < 3; i++) removeFlag("q" + i); 617 for (var i = 0; i < 3; i++) dlFlags.reset("q" + i);
647 if (qual > 2) return alert("Quality number not supported"); 618 if ((qual < 0)||(qual > 2)) return alert("Quality setting not supported");
648 addFlag("q" + i); 619 dlFlags.set("q" + qual);
649 setParameter("mo", getAllFlags());
650 display(); 620 display();
651 } 621 }
652 622
653 function setQualityWin(msg) { 623 function setQualityWin(msg) {
654 // dialog for setting quality 624 // dialog for setting quality
655 if (! msg) msg = "Quality (0..2)"; 625 if (! msg) msg = "Quality (0..2)";
656 var q = getQuality(); 626 var q = getQuality();
657 var newq = window.prompt(msg, q); 627 var newq = window.prompt(msg, q);
658 if (newq) setQuality(newq); 628 if (newq) setQuality(newq);
659 } 629 }
660 630
661 function mirror(dir) { 631 function mirror(dir) {
662 // mirror the image horizontally or vertically 632 // mirror the image horizontally or vertically
663 toggleFlag(dir == "h" 633 if (dir == "h") {
664 ? "hmir" 634 dlFlags.toggle("hmir");
665 : "vmir" 635 } else {
666 ); 636 dlFlags.toggle("vmir");
667 setParameter("mo", getAllFlags()); 637 }
668 display(); 638 display();
669 } 639 }
670 640
671 function gotoPage(gopage, keep) { 641 function gotoPage(gopage, keep) {
672 // goto given page nr (+/-: relative) 642 // goto given page nr (+/-: relative)
673 var oldpn = parseInt(getParameter("pn")); 643 var oldpn = parseInt(dlParams.get("pn"));
674 setParameter("pn", gopage, true); 644 dlParams.set("pn", gopage, true);
675 var pn = parseInt(getParameter("pn")); 645 var pn = parseInt(dlParams.get("pn"));
676 if (pn < 1) { 646 if (pn < 1) {
677 alert("No such page! (Page number too low)"); 647 alert("No such page! (Page number too low)");
678 setParameter("pn", oldpn); 648 dlParams.set("pn", oldpn);
679 return; 649 return;
680 } 650 }
681 if (hasParameter("pt")) { 651 if (dlParams.isSet("pt")) {
682 pt = parseInt(getParameter("pt")) 652 pt = parseInt(dlParams.get("pt"))
683 if (pn > pt) { 653 if (pn > pt) {
684 alert("No such page! (Page number too high)"); 654 alert("No such page! (Page number too high)");
685 setParameter("pn", oldpn); 655 dlParams.set("pn", oldpn);
686 return; 656 return;
687 } 657 }
688 } 658 }
689 if (keep) { 659 if (keep) {
690 display(PARAM_ALL & ~PARAM_MARK); // all, no mark 660 display(dlParams.PARAM_ALL & ~dlParams.PARAM_MARK); // all, no mark
691 } else { 661 } else {
692 display(PARAM_FILE | PARAM_MODE | PARAM_PAGES); // fn, pn, ws, mo + pt 662 display(dlParams.PARAM_FILE | dlParams.PARAM_MODE | dlParams.PARAM_PAGES, dlParams.MODE_QUAL | dlParams.MODE_OTHER); // 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 } 663 }
696 } 664 }
697 665
698 function gotoPageWin() { 666 function gotoPageWin() {
699 // dialog to ask for new page nr 667 // dialog to ask for new page nr
700 var pn = getParameter("pn"); 668 var pn = dlParams.get("pn");
701 var gopage = window.prompt("Go to page", pn); 669 var gopage = window.prompt("Go to page", pn);
702 if (gopage) gotoPage(gopage); 670 if (gopage) gotoPage(gopage);
703 } 671 }
704 672
705 function setParamWin(param, text, relative) { 673 function setParamWin(param, text, relative) {
706 // dialog to ask for new parameter value 674 // dialog to ask for new parameter value
707 var val = getParameter(param); 675 var val = dlParams.get(param);
708 var newval = window.prompt(text, val); 676 var newval = window.prompt(text, val);
709 if (newval) { 677 if (newval) {
710 setParameter(param, newval, relative); 678 dlParams.set(param, newval, relative);
711 display(); 679 display();
712 } 680 }
713 } 681 }
714 682
715 function showOptions(show) { 683 function showOptions(show) {
743 } 711 }
744 712
745 function loadBirdImage() { 713 function loadBirdImage() {
746 var img = getElement("bird-image"); 714 var img = getElement("bird-image");
747 var src = "../servlet/Scaler?" 715 var src = "../servlet/Scaler?"
748 + getQueryString(PARAM_FILE) 716 + dlParams.getAll(dlParams.PARAM_FILE)
749 + "&dw=" + BIRD_MAXX 717 + "&dw=" + BIRD_MAXX
750 + "&dh=" + BIRD_MAXY; 718 + "&dh=" + BIRD_MAXY;
751 img.src = src; 719 img.src = src;
752 } 720 }
753 721
819 showElement(overlay, false); 787 showElement(overlay, false);
820 if (newRect == null) { // no movement happened 788 if (newRect == null) { // no movement happened
821 startPos = birdAreaRect.getCenter(); 789 startPos = birdAreaRect.getCenter();
822 birdAreaMove(evt); // set center to click position 790 birdAreaMove(evt); // set center to click position
823 } 791 }
824 setParameter("wx", cropFloat((newRect.x - birdImgRect.x) / birdImgRect.width)); 792 dlParams.set("wx", cropFloat((newRect.x - birdImgRect.x) / birdImgRect.width));
825 setParameter("wy", cropFloat((newRect.y - birdImgRect.y) / birdImgRect.height)); 793 dlParams.set("wy", cropFloat((newRect.y - birdImgRect.y) / birdImgRect.height));
826 // zoomed is always fit 794 // zoomed is always fit
827 setParameter("ws", 1); 795 dlParams.set("ws", 1);
828 display(); 796 display();
829 return stopEvent(evt); 797 return stopEvent(evt);
830 } 798 }
831 } 799 }
832 800
930 var dpi = cookie.get("ddpi"); 898 var dpi = cookie.get("ddpi");
931 if (dpi == null) { 899 if (dpi == null) {
932 alert("Screen has not yet been calibrated - using default value of 72 dpi"); 900 alert("Screen has not yet been calibrated - using default value of 72 dpi");
933 dpi = 72; 901 dpi = 72;
934 } 902 }
935 setParameter("ddpi", dpi); 903 dlParams.set("ddpi", dpi);
936 addFlag("osize"); 904 addFlag("osize");
937 display(); 905 display();
938 } 906 }
939 else removeFlag("osize"); 907 else removeFlag("osize");
940 } 908 }
951 function pageWidth() { 919 function pageWidth() {
952 var divSize = getElementSize(scalerDiv); 920 var divSize = getElementSize(scalerDiv);
953 divSize.width -= INSET; // allow for scrollbars [Firefox bug?] 921 divSize.width -= INSET; // allow for scrollbars [Firefox bug?]
954 var imgSize = getElementSize(scalerImg); 922 var imgSize = getElementSize(scalerImg);
955 if (imgSize.width < divSize.width) { 923 if (imgSize.width < divSize.width) {
956 setParameter("ws", cropFloat(divSize.width / imgSize.width)); 924 dlParams.set("ws", cropFloat(divSize.width / imgSize.width));
957 display(PARAM_ALL & ~PARAM_DIM); // no zoom 925 display(dlParams.PARAM_ALL & ~dlParams.PARAM_DIM); // no zoom
958 }; 926 };
959 // TODO: how to calculate correct width if zoom is on? (plus size?) 927 // TODO: how to calculate correct width if zoom is on? (plus size?)
960 928
961 } 929 }
962 930
963 function resize(factor) { 931 function resize(factor) {
964 setParameter("ws", factor); 932 dlParams.set("ws", factor);
965 showSizeMenu(false); 933 showSizeMenu(false);
966 display(); 934 display();
967 } 935 }
968 936
969 function showSizeMenu(show) { 937 function showSizeMenu(show) {