comparison client/digitallibrary/jquery/jquery.digilib.js @ 636:7049579a0097 jquery

last and next page works now implemented redisplay function (only tested with fullscreen) parameters that are changed need to be in data.queryParams to get in the url on redisplay
author robcast
date Tue, 18 Jan 2011 21:30:03 +0100
parents 7293a42f44f5
children d904c0c74c15
comparison
equal deleted inserted replaced
635:7293a42f44f5 636:7049579a0097
1 /* 1 /*
2 * digilib jQuery plugin 2 * digilib jQuery plugin
3 * 3 *
4 */ 4 */
5
6 // fallback for console.log calls
7 if (typeof(console) === 'undefined') {
8 var console = {
9 log : function(){},
10 debug : function(){},
11 error : function(){}
12 };
13 }
5 14
6 (function($) { 15 (function($) {
7 var actions = { 16 var actions = {
8 reference : { 17 reference : {
9 onclick : "javascript:getRefWin()", 18 onclick : "javascript:getRefWin()",
175 // is the "about" window shown? 184 // is the "about" window shown?
176 'isAboutDivVisible' : false 185 'isAboutDivVisible' : false
177 186
178 }; 187 };
179 188
180 // parameters from the query string
181 var queryParams = {};
182
183 // affine geometry classes 189 // affine geometry classes
184 var geom = dlGeometry(); 190 var geom = dlGeometry();
185 191
186 var methods = { 192 var methods = {
187 // digilib initialization 193 // digilib initialization
188 init : function(options) { 194 init : function(options) {
189 // settings for this digilib instance are merged from defaults and options 195 // settings for this digilib instance are merged from defaults and options
190 var settings = $.extend({}, defaults, options); 196 var settings = $.extend({}, defaults, options);
191 var isFullscreen = settings.interactionMode === 'fullscreen'; 197 var isFullscreen = settings.interactionMode === 'fullscreen';
198 var queryParams = {};
192 if (isFullscreen) { 199 if (isFullscreen) {
193 queryParams = parseQueryParams(); 200 queryParams = parseQueryParams();
194 } 201 }
195 return this.each(function() { 202 return this.each(function() {
196 var $elem = $(this); 203 var $elem = $(this);
197 var data = $elem.data('digilib'); 204 var data = $elem.data('digilib');
198 var elemSettings; 205 var elemSettings;
199 // if the plugin hasn't been initialized yet 206 // if the plugin hasn't been initialized yet
206 } 213 }
207 // store $(this) element in the settings 214 // store $(this) element in the settings
208 elemSettings.digilibRoot = $elem; 215 elemSettings.digilibRoot = $elem;
209 data = { 216 data = {
210 target : $elem, 217 target : $elem,
211 settings : elemSettings 218 settings : elemSettings,
219 queryParams : queryParams
212 }; 220 };
213 // store in data element 221 // store in data element
214 $elem.data('digilib', data); 222 $elem.data('digilib', data);
215 } 223 }
216 unpackParams(data); 224 unpackParams(data);
225 }, 233 },
226 234
227 // clean up digilib 235 // clean up digilib
228 destroy : function() { 236 destroy : function() {
229 return this.each(function(){ 237 return this.each(function(){
230 var $this = $(this); 238 var $elem = $(this);
231 var data = $this.data('digilib'); 239 var data = $elem.data('digilib');
232 // Namespacing FTW 240 // Namespacing FTW
233 $(window).unbind('.digilib'); // unbinds all digilibs(?) 241 $(window).unbind('.digilib'); // unbinds all digilibs(?)
234 data.digilib.remove(); 242 data.digilib.remove();
235 $this.removeData('digilib'); 243 $elem.removeData('digilib');
236 }); 244 });
237 }, 245 },
238 246
239 // show or hide the 'about' window 247 // show or hide the 'about' window
240 showAboutDiv : function(show) { 248 showAboutDiv : function(show) {
241 var $this = $(this); 249 var $elem = $(this);
242 var data = $this.data('digilib'); 250 var data = $elem.data('digilib');
243 data.settings.isAboutDivVisible = showDiv(data.settings.isAboutDivVisible, data.$aboutDiv, show); 251 data.settings.isAboutDivVisible = showDiv(data.settings.isAboutDivVisible, data.$aboutDiv, show);
244 }, 252 },
245 253
246 // event handler: toggles the visibility of the bird's eye window 254 // event handler: toggles the visibility of the bird's eye window
247 showBirdDiv : function (show) { 255 showBirdDiv : function (show) {
248 var $this = $(this); 256 var $elem = $(this);
249 var data = $this.data('digilib'); 257 var data = $elem.data('digilib');
250 data.settings.isBirdDivVisible = showDiv(data.settings.isBirdDivVisible, data.$birdDiv, show); 258 data.settings.isBirdDivVisible = showDiv(data.settings.isBirdDivVisible, data.$birdDiv, show);
251 }, 259 },
252 260
253 // goto given page nr (+/-: relative) 261 // goto given page nr (+/-: relative)
254 gotoPage : function(pageNr, keepMarks) { 262 gotoPage : function (pageNr) {
255 var $elem = $(this); // the clicked button 263 var $elem = $(this); // the clicked button
256 var settings = $elem.data('digilib').settings; 264 var data = $elem.data('digilib');
265 var settings = data.settings;
257 var oldpn = settings.pn; 266 var oldpn = settings.pn;
258 var pn = setNumValue(settings, "pn", pageNr); 267 var pn = setNumValue(settings, "pn", pageNr);
259 if (pn == null) return false; // nothing happened 268 if (pn == null) return false; // nothing happened
260 if (pn < 1) { 269 if (pn < 1) {
261 alert("no such page (page number too low)"); 270 alert("no such page (page number too low)");
267 alert("no such page (page number too high)"); 276 alert("no such page (page number too high)");
268 settings.pn = oldpn; 277 settings.pn = oldpn;
269 return false; 278 return false;
270 } 279 }
271 } 280 }
272 // TODO: keepMarks 281 // add pn to param list and remove mk and others(?)
273 var $root = settings.digilibRoot; 282 data.queryParams.pn = pn;
274 var $img = $root.find('img.pic'); 283 delete data.queryParams.mk;
275 display($img, settings); 284 // then reload
276 return false; 285 redisplay(data);
277 } 286 }
278 }; 287 };
279 288
280 // sets a key to a value (relative values with +/- if relative=true) 289 // sets a key to a value (relative values with +/- if relative=true)
281 var setNumValue = function(settings, key, value) { 290 var setNumValue = function(settings, key, value) {
290 return settings[key]; 299 return settings[key];
291 }; 300 };
292 301
293 // returns parameters from page url 302 // returns parameters from page url
294 var parseQueryParams = function() { 303 var parseQueryParams = function() {
295 return parseQueryString(location.search.slice(1)); 304 return parseQueryString(window.location.search.slice(1));
296 }; 305 };
297 306
298 // returns parameters taken from embedded img-element 307 // returns parameters from embedded img-element
299 var parseImgParams = function($elem) { 308 var parseImgParams = function($elem) {
300 var src = $elem.find('img').first().attr('src'); 309 var src = $elem.find('img').first().attr('src');
301 if (!src) { 310 if (!src) {
302 return null; 311 return null;
303 } 312 }
304 var pos = src.indexOf('?'); 313 var pos = src.indexOf('?');
305 var query = (pos < 0) ? '' : src.substring(pos + 1); 314 var query = (pos < 0) ? '' : src.substring(pos + 1);
306 var scalerUrl = src.substring(0, pos); 315 var scalerUrl = src.substring(0, pos);
307 var params = parseQueryString(query); 316 var params = parseQueryString(query);
308 params.scalerBaseUrl = scalerUrl; 317 params.scalerBaseUrl = scalerUrl;
309 // console.log(hash);
310 return params; 318 return params;
311 }; 319 };
312 320
313 // parses query parameter string into parameter object 321 // parses query parameter string into parameter object
314 var parseQueryString = function(query) { 322 var parseQueryString = function(query) {
315 var pairs = query.split("&"); 323 var pairs = query.split("&");
316 var params = {}; 324 var params = {};
325 //var keys = [];
317 for (var i = 0; i < pairs.length; i++) { 326 for (var i = 0; i < pairs.length; i++) {
318 var pair = pairs[i].split("="); 327 var pair = pairs[i].split("=");
319 if (pair.length === 2) { 328 if (pair.length === 2) {
320 params[pair[0]] = pair[1]; 329 params[pair[0]] = pair[1];
321 } 330 //keys.push(pair[0]);
322 } 331 }
332 }
323 return params; 333 return params;
324 }; 334 };
325 335
326 // returns a query string from key names from a parameter hash 336 // returns a query string from key names from a parameter hash
327 var getParamString = function (settings, keys) { 337 var getParamString = function (settings, keys) {
328 var paramString = ''; 338 var paramString = '';
329 var latter = false; 339 var latter = false;
338 } 348 }
339 } 349 }
340 return paramString; 350 return paramString;
341 }; 351 };
342 352
353 // returns URL and query string for Scaler
354 var getScalerUrl = function (data) {
355 var settings = data.settings;
356 var keys = settings.scalerParamNames;
357 var queryString = getParamString(settings, keys);
358 var url = settings.scalerBaseUrl + '?' + queryString;
359 return url;
360 };
361
362 // returns URL and query string for current digilib
363 var getDigilibUrl = function (data) {
364 var settings = data.settings;
365 // make list from queryParams keys
366 var keys = [];
367 for (var k in data.queryParams) {
368 keys.push(k);
369 }
370 var queryString = getParamString(settings, keys);
371 var url = window.location.toString();
372 var pos = url.indexOf('?');
373 var baseUrl = url.substring(0, pos);
374 var newurl = baseUrl + '?' + queryString;
375 return newurl;
376 };
377
343 // processes some parameters into objects and stuff 378 // processes some parameters into objects and stuff
344 var unpackParams = function (data) { 379 var unpackParams = function (data) {
345 var settings = data.settings; 380 var settings = data.settings;
346 // read zoom area 381 // zoom area
347 var zoomArea = geom.rectangle(settings.wx, settings.wy, settings.ww, settings.wh); 382 var zoomArea = geom.rectangle(settings.wx, settings.wy, settings.ww, settings.wh);
348 settings.zoomArea = zoomArea; 383 settings.zoomArea = zoomArea;
349 384 // marks
350 // read marks
351 var marks = []; 385 var marks = [];
352 var mk = settings.mk || ''; 386 var mk = settings.mk || '';
353 if (mk.indexOf(";") >= 0) { 387 if (mk.indexOf(";") >= 0) {
354 var pa = mk.split(";"); // old format with ";" 388 var pa = mk.split(";"); // old format with ";"
355 } else { 389 } else {
365 }; 399 };
366 400
367 // put objects back into parameters 401 // put objects back into parameters
368 var packParams = function (data) { 402 var packParams = function (data) {
369 var settings = data.settings; 403 var settings = data.settings;
404 // zoom area
370 if (settings.zoomArea) { 405 if (settings.zoomArea) {
371 settings.wx = settings.zoomArea.x; 406 settings.wx = settings.zoomArea.x;
372 settings.wy = settings.zoomArea.y; 407 settings.wy = settings.zoomArea.y;
373 settings.ww = settings.zoomArea.width; 408 settings.ww = settings.zoomArea.width;
374 settings.wh = settings.zoomArea.height; 409 settings.wh = settings.zoomArea.height;
375 } 410 }
411 // marks
376 if (settings.marks) { 412 if (settings.marks) {
377 var ma = []; 413 var ma = [];
378 for (var i = 0; i < settings.marks.length; i++) { 414 for (var i = 0; i < settings.marks.length; i++) {
379 ma.push(cropFloat(settings.marks[i].x) + "/" + cropFloat(settings.marks[i].y)); 415 ma.push(cropFloat(settings.marks[i].x) + "/" + cropFloat(settings.marks[i].y));
380 } 416 }
381 settings.mk = ma.join(","); 417 settings.mk = ma.join(",");
382 } 418 }
383 }; 419 };
384 420
385 // returns URL and query string for Scaler
386 var getScalerString = function (settings) {
387 var keys = settings.scalerParamNames;
388 var queryString = getParamString(settings, keys);
389 var url = settings.scalerBaseUrl + '?' + queryString;
390 return url;
391 };
392
393 // returns maximum size for scaler img in fullscreen mode 421 // returns maximum size for scaler img in fullscreen mode
394 var getFullscreenImgSize = function($elem) { 422 var getFullscreenImgSize = function($elem) {
395 var winH = $(window).height(); 423 var winH = $(window).height();
396 var winW = $(window).width(); 424 var winW = $(window).width();
397 // TODO: account for borders? 425 // TODO: account for borders?
398 return geom.size(winW, winH); 426 return geom.size(winW, winH);
399 }; 427 };
400 428
401 // (re)load the img from a new scaler URL 429 // (re)load the img from a new scaler URL
402 var display = function ($img, settings) { 430 var redisplay = function (data) {
403 // TODO: update location.href (browser URL) in fullscreen mode 431 var settings = data.settings;
404 var scalerUrl = getScalerString(settings); 432 if (settings.interactionMode === 'fullscreen') {
405 $img.attr('src', scalerUrl); 433 // update location.href (browser URL) in fullscreen mode
406 // TODO: update bird view? 434 var url = getDigilibUrl(data);
435 var history = window.history;
436 if (typeof(history.pushState) === 'function') {
437 console.debug("we could modify history, but we don't...");
438 }
439 window.location = url;
440 } else {
441 // embedded mode -- just change img src
442 var url = getScalerUrl(data);
443 data.$img.attr('src', url);
444 }
407 }; 445 };
408 446
409 // creates HTML structure for digilib in elem 447 // creates HTML structure for digilib in elem
410 var setupScalerDiv = function (data) { 448 var setupScalerDiv = function (data) {
411 var settings = data.settings; 449 var settings = data.settings;
415 // fullscreen 453 // fullscreen
416 var imgSize = getFullscreenImgSize($elem); 454 var imgSize = getFullscreenImgSize($elem);
417 settings.dw = imgSize.width; 455 settings.dw = imgSize.width;
418 settings.dh = imgSize.height; 456 settings.dh = imgSize.height;
419 $img = $('<img/>'); 457 $img = $('<img/>');
420 display($img, settings); // TODO: is display the right thing here? 458 var scalerUrl = getScalerUrl(data);
459 $img.attr('src', scalerUrl);
421 } else { 460 } else {
422 // embedded mode -- try to keep img tag 461 // embedded mode -- try to keep img tag
423 $img = $elem.find('img'); 462 $img = $elem.find('img');
424 if ($img.length > 0) { 463 if ($img.length > 0) {
425 console.debug("img detach:",$img); 464 console.debug("img detach:",$img);
426 $img.detach(); 465 $img.detach();
427 } else { 466 } else {
428 $img = $('<img/>'); 467 $img = $('<img/>');
429 display($img, settings); // dito 468 var scalerUrl = getScalerUrl(data);
469 $img.attr('src', scalerUrl);
430 } 470 }
431 } 471 }
432 // create new html 472 // create new html
433 $elem.empty(); // TODO: should we keep stuff for customization? 473 $elem.empty(); // TODO: should we keep stuff for customization?
434 var $scaler = $('<div class="scaler"/>'); 474 var $scaler = $('<div class="scaler"/>');
435 $elem.append($scaler); 475 $elem.append($scaler);
436 $scaler.append($img); 476 $scaler.append($img);
437 $img.addClass('pic'); 477 $img.addClass('pic');
438 data.img = $img; 478 data.$img = $img;
439 $img.load(scalerImgLoadedFn(data)); 479 $img.load(scalerImgLoadedHandler(data));
440 }; 480 };
441 481
442 // creates HTML structure for buttons in elem 482 // creates HTML structure for buttons in elem
443 var setupButtons = function (data, actionGroup) { 483 var setupButtons = function (data, actionGroup) {
444 var $elem = data.target; 484 var $elem = data.target;
548 } 588 }
549 return isVisible; 589 return isVisible;
550 }; 590 };
551 591
552 // returns function for load event of scaler img 592 // returns function for load event of scaler img
553 var scalerImgLoadedFn = function (data) { 593 var scalerImgLoadedHandler = function (data) {
554 var settings = data.settings; 594 var settings = data.settings;
555 var $elem = data.target; 595 var $elem = data.target;
556 var $img = data.img; 596 var $img = data.$img;
557 597
558 return function () { 598 return function () {
559 console.debug("img loaded! this=", this, " data=", data); 599 console.debug("img loaded! this=", this, " data=", data);
560 var area = settings.zoomArea; 600 var area = settings.zoomArea;
561 // create Transform from current area and picsize 601 // create Transform from current area and picsize
598 638
599 // auxiliary function to crop senseless precision 639 // auxiliary function to crop senseless precision
600 var cropFloat = function (x) { 640 var cropFloat = function (x) {
601 return parseInt(10000 * x) / 10000; 641 return parseInt(10000 * x) / 10000;
602 }; 642 };
603 643
604 // hook plugin into jquery 644 // hook plugin into jquery
605 $.fn.digilib = function(method) { 645 $.fn.digilib = function(method) {
606 if (methods[method]) { 646 if (methods[method]) {
607 // call method on this with the remaining arguments 647 // call method on this with the remaining arguments
608 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 648 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));