Mercurial > hg > digilib
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) { |