comparison client/digitallibrary/jquery/jquery.digilib.js @ 636:687447a0e799 jquery

zoomin and -out works now gotopage resets (some) parameters reload takes changed parameters (to put in url) getParamString omits parameters with default values (for shorter urls)
author robcast
date Wed, 19 Jan 2011 20:03:44 +0100
parents 3223fabd53bc
children 71cc855e2e4b
comparison
equal deleted inserted replaced
635:0547e61e4e3d 636:687447a0e799
18 onclick : "javascript:getRefWin()", 18 onclick : "javascript:getRefWin()",
19 tooltip : "get a reference URL", 19 tooltip : "get a reference URL",
20 img : "reference.png" 20 img : "reference.png"
21 }, 21 },
22 zoomin : { 22 zoomin : {
23 onclick : "javascript:dl.zoomBy(1.4)", 23 onclick : ["zoomBy", 1.4],
24 tooltip : "zoom in", 24 tooltip : "zoom in",
25 img : "zoom-in.png" 25 img : "zoom-in.png"
26 }, 26 },
27 zoomout : { 27 zoomout : {
28 onclick : "javascript:zoomBy(0.7)", 28 onclick : ["zoomBy", 0.7],
29 tooltip : "zoom out", 29 tooltip : "zoom out",
30 img : "zoom-out.png" 30 img : "zoom-out.png"
31 }, 31 },
32 zoomarea : { 32 zoomarea : {
33 onclick : "javascript:zoomArea()", 33 onclick : "javascript:zoomArea()",
157 'scalerBaseUrl' : 'http://digilib.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler', 157 'scalerBaseUrl' : 'http://digilib.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler',
158 // list of Scaler parameters 158 // list of Scaler parameters
159 'scalerParamNames' : ['fn','pn','dw','dh','ww','wh','wx','wy','ws','mo', 159 'scalerParamNames' : ['fn','pn','dw','dh','ww','wh','wx','wy','ws','mo',
160 'rot','cont','brgt','rgbm','rgba','ddpi','ddpix','ddpiy'], 160 'rot','cont','brgt','rgbm','rgba','ddpi','ddpix','ddpiy'],
161 // Scaler parameter defaults 161 // Scaler parameter defaults
162 'pn' : 1,
162 'ww' : 1.0, 163 'ww' : 1.0,
163 'wh' : 1.0, 164 'wh' : 1.0,
164 'wx' : 0.0, 165 'wx' : 0.0,
165 'wy' : 0.0, 166 'wy' : 0.0,
166 'ws' : 1.0, 167 'ws' : 1.0,
167 'pn' : 1, 168 'mo' : '',
168 // mode of operation. 169 'rot' : 0,
169 // fullscreen: takes parameters from page URL, keeps state in page URL 170 'cont' : 0,
170 // embedded: takes parameters from Javascript options, keeps state inside object 171 'brgt' : 0,
172 'rgbm' : '0/0/0',
173 'rgba' : '0/0/0',
174 'ddpi' : null,
175 'ddpix' : null,
176 'ddpiy' : null,
177 // digilib defaults
178 'mk' : '',
179 // mode of operation:
180 // fullscreen = take parameters from page URL, keep state in page URL
181 // embedded = take parameters from Javascript options, keep state inside object
171 'interactionMode' : 'fullscreen', 182 'interactionMode' : 'fullscreen',
172 // actions 183 // actions
173 'actions' : actions, 184 'actions' : actions,
174 // path to button images (must end with a slash) 185 // path to button images (must end with a slash)
175 'buttonsImagePath' : '../greyskin/', 186 'buttonsImagePath' : '../greyskin/',
186 197
187 }; 198 };
188 199
189 // affine geometry classes 200 // affine geometry classes
190 var geom = dlGeometry(); 201 var geom = dlGeometry();
202
203 var MAX_ZOOMAREA = geom.rectangle(0, 0, 1, 1);
191 204
192 var methods = { 205 var methods = {
193 // digilib initialization 206 // digilib initialization
194 init : function(options) { 207 init : function(options) {
195 // settings for this digilib instance are merged from defaults and options 208 // settings for this digilib instance are merged from defaults and options
264 data.settings.isBirdDivVisible = showDiv(data.settings.isBirdDivVisible, data.$birdDiv, show); 277 data.settings.isBirdDivVisible = showDiv(data.settings.isBirdDivVisible, data.$birdDiv, show);
265 }, 278 },
266 279
267 // goto given page nr (+/-: relative) 280 // goto given page nr (+/-: relative)
268 gotoPage : function (pageNr) { 281 gotoPage : function (pageNr) {
269 var $elem = $(this); // the clicked button 282 var $elem = $(this);
270 var data = $elem.data('digilib'); 283 var data = $elem.data('digilib');
271 var settings = data.settings; 284 var settings = data.settings;
272 var oldpn = settings.pn; 285 var oldpn = settings.pn;
273 var pn = setNumValue(settings, "pn", pageNr); 286 var pn = setNumValue(settings, "pn", pageNr);
274 if (pn == null) return false; // nothing happened 287 if (pn == null) return false; // nothing happened
282 alert("no such page (page number too high)"); 295 alert("no such page (page number too high)");
283 settings.pn = oldpn; 296 settings.pn = oldpn;
284 return false; 297 return false;
285 } 298 }
286 } 299 }
287 // add pn to param list and remove mk and others(?) 300 // add pn to param list and reset mk and others(?)
288 data.queryParams.pn = pn; 301 data.marks = [];
289 delete data.queryParams.mk; 302 data.zoomArea = MAX_ZOOMAREA;
290 // then reload 303 // then reload
291 redisplay(data); 304 redisplay(data, ['pn']);
305 },
306
307 // zoom by a given factor
308 zoomBy : function (factor) {
309 var $elem = $(this);
310 var data = $elem.data('digilib');
311 zoomBy(data, factor);
292 } 312 }
293 }; 313 };
294 314
295 // sets a key to a value (relative values with +/- if relative=true) 315 // sets a key to a value (relative values with +/- if relative=true)
296 var setNumValue = function(settings, key, value) { 316 var setNumValue = function(settings, key, value) {
340 } 360 }
341 } 361 }
342 return params; 362 return params;
343 }; 363 };
344 364
345 // returns a query string from key names from a parameter hash 365 // returns a query string from key names from a parameter hash (ignoring if the same value is in defaults)
346 var getParamString = function (settings, keys) { 366 var getParamString = function (settings, keys, defaults) {
347 var paramString = ''; 367 var paramString = '';
348 var latter = false; 368 var latter = false;
349 for (i = 0; i < keys.length; ++i) { 369 for (i = 0; i < keys.length; ++i) {
350 var key = keys[i]; 370 var key = keys[i];
351 if (settings[key]) { 371 if ((settings[key] != null) && ((defaults == null) || (settings[key] !== defaults[key]))) {
352 // first param gets no '&' 372 // first param gets no '&'
353 paramString += latter ? '&' : ''; 373 paramString += latter ? '&' : '';
354 latter = true; 374 latter = true;
355 // add parm=val 375 // add parm=val
356 paramString += key + '=' + settings[key]; 376 paramString += key + '=' + settings[key];
357 } 377 }
358 } 378 }
359 return paramString; 379 return paramString;
360 }; 380 };
361 381
362 // returns URL and query string for Scaler 382 // returns URL and query string for Scaler
363 var getScalerUrl = function (data) { 383 var getScalerUrl = function (data) {
364 var settings = data.settings; 384 var settings = data.settings;
365 var keys = settings.scalerParamNames; 385 var keys = settings.scalerParamNames;
366 var queryString = getParamString(settings, keys); 386 var queryString = getParamString(settings, keys, defaults);
367 var url = settings.scalerBaseUrl + '?' + queryString; 387 var url = settings.scalerBaseUrl + '?' + queryString;
368 return url; 388 return url;
369 }; 389 };
370 390
371 // returns URL and query string for current digilib 391 // returns URL and query string for current digilib
372 var getDigilibUrl = function (data) { 392 var getDigilibUrl = function (data, changedParams) {
373 var settings = data.settings; 393 packParams(data);
394 var settings = data.settings;
395 var queryParams = data.queryParams;
396 // add changedParams
397 if (changedParams != null) {
398 for (var i=0; i < changedParams.length; ++i) {
399 var k = changedParams[i];
400 if (queryParams[k] == null) {
401 // add param (value doesn't matter)
402 queryParams[k] = k;
403 }
404 }
405 }
374 // make list from queryParams keys 406 // make list from queryParams keys
375 var keys = []; 407 var keys = [];
376 for (var k in data.queryParams) { 408 for (var k in data.queryParams) {
377 keys.push(k); 409 keys.push(k);
378 } 410 }
379 var queryString = getParamString(settings, keys); 411 var queryString = getParamString(settings, keys, defaults);
380 var url = window.location.toString(); 412 var url = window.location.toString();
381 var pos = url.indexOf('?'); 413 var pos = url.indexOf('?');
382 var baseUrl = url.substring(0, pos); 414 var baseUrl = url.substring(0, pos);
383 var newurl = baseUrl + '?' + queryString; 415 var newurl = baseUrl + '?' + queryString;
384 return newurl; 416 return newurl;
387 // processes some parameters into objects and stuff 419 // processes some parameters into objects and stuff
388 var unpackParams = function (data) { 420 var unpackParams = function (data) {
389 var settings = data.settings; 421 var settings = data.settings;
390 // zoom area 422 // zoom area
391 var zoomArea = geom.rectangle(settings.wx, settings.wy, settings.ww, settings.wh); 423 var zoomArea = geom.rectangle(settings.wx, settings.wy, settings.ww, settings.wh);
392 settings.zoomArea = zoomArea; 424 data.zoomArea = zoomArea;
393 // marks 425 // marks
394 var marks = []; 426 var marks = [];
395 var mk = settings.mk || ''; 427 var mk = settings.mk || '';
396 if (mk.indexOf(";") >= 0) { 428 if (mk.indexOf(";") >= 0) {
397 var pa = mk.split(";"); // old format with ";" 429 var pa = mk.split(";"); // old format with ";"
402 var pos = pa[i].split("/"); 434 var pos = pa[i].split("/");
403 if (pos.length > 1) { 435 if (pos.length > 1) {
404 marks.push(geom.position(pos[0], pos[1])); 436 marks.push(geom.position(pos[0], pos[1]));
405 } 437 }
406 } 438 }
407 settings.marks = marks; 439 data.marks = marks;
408 }; 440 };
409 441
410 // put objects back into parameters 442 // put objects back into parameters
411 var packParams = function (data) { 443 var packParams = function (data) {
412 var settings = data.settings; 444 var settings = data.settings;
413 // zoom area 445 // zoom area
414 if (settings.zoomArea) { 446 if (data.zoomArea) {
415 settings.wx = settings.zoomArea.x; 447 settings.wx = data.zoomArea.x;
416 settings.wy = settings.zoomArea.y; 448 settings.wy = data.zoomArea.y;
417 settings.ww = settings.zoomArea.width; 449 settings.ww = data.zoomArea.width;
418 settings.wh = settings.zoomArea.height; 450 settings.wh = data.zoomArea.height;
419 } 451 }
420 // marks 452 // marks
421 if (settings.marks) { 453 if (data.marks) {
422 var ma = []; 454 var ma = [];
423 for (var i = 0; i < settings.marks.length; i++) { 455 for (var i = 0; i < data.marks.length; i++) {
424 ma.push(cropFloat(settings.marks[i].x) + "/" + cropFloat(settings.marks[i].y)); 456 ma.push(cropFloat(data.marks[i].x) + "/" + cropFloat(data.marks[i].y));
425 } 457 }
426 settings.mk = ma.join(","); 458 settings.mk = ma.join(",");
427 } 459 }
428 }; 460 };
429 461
434 // TODO: account for borders? 466 // TODO: account for borders?
435 return geom.size(winW, winH); 467 return geom.size(winW, winH);
436 }; 468 };
437 469
438 // (re)load the img from a new scaler URL 470 // (re)load the img from a new scaler URL
439 var redisplay = function (data) { 471 var redisplay = function (data, changedParams) {
440 var settings = data.settings; 472 var settings = data.settings;
441 if (settings.interactionMode === 'fullscreen') { 473 if (settings.interactionMode === 'fullscreen') {
442 // update location.href (browser URL) in fullscreen mode 474 // update location.href (browser URL) in fullscreen mode
443 var url = getDigilibUrl(data); 475 var url = getDigilibUrl(data, changedParams);
444 var history = window.history; 476 var history = window.history;
445 if (typeof(history.pushState) === 'function') { 477 if (typeof(history.pushState) === 'function') {
446 console.debug("we could modify history, but we don't..."); 478 console.debug("we could modify history, but we don't...");
447 } 479 }
448 window.location = url; 480 window.location = url;
603 var $elem = data.target; 635 var $elem = data.target;
604 var $img = data.$img; 636 var $img = data.$img;
605 637
606 return function () { 638 return function () {
607 console.debug("img loaded! this=", this, " data=", data); 639 console.debug("img loaded! this=", this, " data=", data);
608 var area = settings.zoomArea; 640 var area = data.zoomArea;
609 // create Transform from current area and picsize 641 // create Transform from current area and picsize
610 var picpos = $img.offset(); 642 var picpos = $img.offset();
611 var picrect = geom.rectangle(picpos.left, picpos.top, $img.width(), $img.height()); 643 var picrect = geom.rectangle(picpos.left, picpos.top, $img.width(), $img.height());
612 var trafo = geom.transform(); 644 var trafo = geom.transform();
613 // subtract area offset and size 645 // subtract area offset and size
617 trafo.concat(trafo.getScale(picrect)); 649 trafo.concat(trafo.getScale(picrect));
618 trafo.concat(trafo.getTranslation(picrect)); 650 trafo.concat(trafo.getTranslation(picrect));
619 data.imgTrafo = trafo; 651 data.imgTrafo = trafo;
620 // display marks 652 // display marks
621 renderMarks(data); 653 renderMarks(data);
622 // show birds eye view
623 //showDiv(settings.isBirdDivVisible);
624 //digilib.showArrows(); // show arrow overlays for zoom navigation 654 //digilib.showArrows(); // show arrow overlays for zoom navigation
625 // done -- hide about div --- 655 // done -- hide about div ---
626 // --- why? This only leads to suprise effects when displayed programmatically 656 // --- why? This only leads to suprise effects when displayed programmatically
627 // settings.isAboutDivVisible = showDiv(null, data.$aboutDiv, 0); 657 // settings.isAboutDivVisible = showDiv(null, data.$aboutDiv, 0);
628 }; 658 };
629 }; 659 };
630 660
631 // place marks on the image 661 // place marks on the image
632 var renderMarks = function (data) { 662 var renderMarks = function (data) {
633 var $elem = data.target; 663 var $elem = data.target;
634 var marks = data.settings.marks; 664 var marks = data.marks;
635 for (var i = 0; i < marks.length; i++) { 665 for (var i = 0; i < marks.length; i++) {
636 var mark = marks[i]; 666 var mark = marks[i];
637 if (data.settings.zoomArea.containsPosition(mark)) { 667 if (data.zoomArea.containsPosition(mark)) {
638 var mpos = data.imgTrafo.transform(mark); 668 var mpos = data.imgTrafo.transform(mark);
639 // create mark 669 // create mark
640 var html = '<div class="mark">'+(i+1)+'</div>'; 670 var html = '<div class="mark">'+(i+1)+'</div>';
641 var $mark = $(html); 671 var $mark = $(html);
642 $elem.append($mark); 672 $elem.append($mark);
643 $mark.offset({ left : mpos.x, top : mpos.y}); 673 $mark.offset({ left : mpos.x, top : mpos.y});
644 } 674 }
645 } 675 }
646 }; 676 };
647 677
678 var zoomBy = function(data, factor) {
679 // zooms by the given factor
680 var area = data.zoomArea;
681 var newarea = area.copy();
682 // scale
683 newarea.width /= factor;
684 newarea.height /= factor;
685 // and recenter
686 newarea.x -= 0.5 * (newarea.width - area.width);
687 newarea.y -= 0.5 * (newarea.height - area.height);
688 newarea = MAX_ZOOMAREA.fit(newarea);
689 data.zoomArea = newarea;
690 redisplay(data, ['wx', 'wy', 'ww', 'wh']);
691 };
692
648 // auxiliary function (from Douglas Crockford, A.10) 693 // auxiliary function (from Douglas Crockford, A.10)
649 var isNumber = function isNumber(value) { 694 var isNumber = function isNumber(value) {
650 return typeof value === 'number' && isFinite(value); 695 return typeof value === 'number' && isFinite(value);
651 }; 696 };
652 697