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