Mercurial > hg > digilib
comparison client/digitallibrary/jquery/jquery.digilib.regions.js @ 843:76c23870ac0b jquery
always show html-defined regions. wrong pos still not fixed
author | hertzhaft |
---|---|
date | Mon, 07 Mar 2011 00:38:20 +0100 |
parents | f381d088da88 |
children | 8aa2891583f1 |
comparison
equal
deleted
inserted
replaced
842:10a6ea8b25ad | 843:76c23870ac0b |
---|---|
1 /** optional digilib regions plugin | 1 /** optional digilib regions plugin |
2 | 2 |
3 markup a digilib image with rectangular regions | 3 markup a digilib image with rectangular regions |
4 | 4 |
5 TODO: | 5 TODO: |
6 - store region in params/cookie, regarding zoom, mirror, rotation (like marks) | 6 how to display regions correctly in embedded mode? |
7 - set regions programmatically | |
8 - read regions from params/cookie and display | |
9 - backlink mechanism | |
10 - don't write to data.settings? | |
11 */ | 7 */ |
12 | 8 |
13 (function($) { | 9 (function($) { |
14 // the digilib object | 10 // the digilib object |
15 var digilib; | 11 var digilib; |
52 'isRegionVisible' : true, | 48 'isRegionVisible' : true, |
53 // are region numbers shown? | 49 // are region numbers shown? |
54 'showRegionNumbers' : false, | 50 'showRegionNumbers' : false, |
55 // is window with region HTML shown? | 51 // is window with region HTML shown? |
56 'showRegionHTML' : false, | 52 'showRegionHTML' : false, |
57 // should digilib look for region content in the page? | 53 // is there region content in the page? |
58 'includeRegionContent' : false, | 54 'hasRegionContent' : false, |
59 // turn any region into a clickable link to its detail view | 55 // turn any region into a clickable link to its detail view |
60 'autoRegionLinks' : false, | 56 'autoRegionLinks' : false, |
61 // class name for content divs (must additionally be marked with class "keep") | 57 // class name for content divs (must additionally be marked with class "keep") |
62 'regionContentSelector' : 'div.regioncontent', | 58 'regionContentSelector' : 'div.regioncontent', |
63 // buttonset of this plugin | 59 // buttonset of this plugin |
150 // show/hide regions | 146 // show/hide regions |
151 "toggleRegions" : function (data) { | 147 "toggleRegions" : function (data) { |
152 var show = !data.settings.isRegionVisible; | 148 var show = !data.settings.isRegionVisible; |
153 data.settings.isRegionVisible = show; | 149 data.settings.isRegionVisible = show; |
154 fn.highlightButtons(data, 'regions', show); | 150 fn.highlightButtons(data, 'regions', show); |
155 showRegionDivs(data, 1); | 151 renderRegions(data, 1); |
156 }, | 152 }, |
157 | 153 |
158 // show/hide region HTML code | 154 // show/hide region HTML code |
159 "showRegionHTML" : function (data) { | 155 "showRegionHTML" : function (data) { |
160 var show = !data.settings.showRegionHTML; | 156 var show = !data.settings.showRegionHTML; |
176 $html.append($('<div/>').text('<a href="" rel="' + area + '">')); | 172 $html.append($('<div/>').text('<a href="" rel="' + area + '">')); |
177 $html.append($('<div/>').text('</a>')); | 173 $html.append($('<div/>').text('</a>')); |
178 }); | 174 }); |
179 $html.append($('<div/>').text('</div>')); | 175 $html.append($('<div/>').text('</div>')); |
180 $html.fadeIn(); | 176 $html.fadeIn(); |
177 }, | |
178 | |
179 "redraw" : function (data) { | |
180 renderRegions(data); | |
181 } | 181 } |
182 }; | 182 }; |
183 | 183 |
184 // store a region div | 184 // store a region div |
185 var storeRegion = function (data, $regionDiv) { | 185 var storeRegion = function (data, $regionDiv) { |
239 | 239 |
240 // create regions from HTML | 240 // create regions from HTML |
241 var createRegionsFromHTML = function (data) { | 241 var createRegionsFromHTML = function (data) { |
242 var regions = data.regions; | 242 var regions = data.regions; |
243 var selector = data.settings.regionContentSelector; | 243 var selector = data.settings.regionContentSelector; |
244 // regions are defined in "a" tags | |
244 var $content = data.$elem.contents(selector).contents('a'); | 245 var $content = data.$elem.contents(selector).contents('a'); |
245 console.debug("createRegionsFromHTML", $content); | 246 console.debug("createRegionsFromHTML", $content); |
246 $content.each(function(index, a) { | 247 $content.each(function(index, a) { |
247 var $a = $(a); | 248 var $a = $(a); |
248 var href = $a.attr('href'); | 249 // the "rel" attribute has area coords |
249 var rel = $a.attr('rel'); | 250 var rel = $a.attr('rel'); |
250 var area = rel.replace(/^area:/i, ''); | 251 var area = rel.replace(/^area:/i, ''); |
251 var pos = area.split("/", 4); | 252 var pos = area.split("/", 4); |
252 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); | 253 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); |
253 regions.push(rect); | 254 regions.push(rect); |
254 var $regionDiv = createRegionDiv(regions, index); | 255 var $regionDiv = createRegionDiv(regions, index); |
256 var href = $a.attr('href'); | |
257 var text = $a.text(); | |
255 $regionDiv.append($a.clone()); | 258 $regionDiv.append($a.clone()); |
256 // $a.show(); | 259 // $a.show(); |
257 }); | 260 }); |
258 }; | 261 }; |
259 | 262 |
260 // show a region on top of the scaler image | 263 // show a region on top of the scaler image |
261 var showRegionDiv = function (data, index, anim) { | 264 var renderRegion = function (data, index, anim) { |
262 if (!data.imgTrafo) return; | 265 if (!data.imgTrafo) return; |
263 var $elem = data.$elem; | 266 var $elem = data.$elem; |
264 var regions = data.regions; | 267 var regions = data.regions; |
265 if (index > regions.length) return; | 268 if (index > regions.length) return; |
266 var region = regions[index] | 269 var region = regions[index] |
267 var $regionDiv = region.$div; | 270 var $regionDiv = region.$div; |
268 if (!$regionDiv) { | 271 if (!$regionDiv) { |
269 console.debug("showRegionDiv: region has no $div", region); | 272 console.debug("renderRegion: region has no $div", region); |
270 // alert("showRegionDiv: region has no $div to show"); | 273 // alert("renderRegion: region has no $div to show"); |
271 return; | 274 return; |
272 } | 275 } |
273 var regionRect = region.copy(); | 276 var regionRect = region.copy(); |
274 var show = data.settings.isRegionVisible; | 277 var show = data.settings.isRegionVisible; |
275 if (show && data.zoomArea.overlapsRect(regionRect)) { | 278 if (show && data.zoomArea.overlapsRect(regionRect)) { |
276 regionRect.clipTo(data.zoomArea); | 279 regionRect.clipTo(data.zoomArea); |
277 var screenRect = data.imgTrafo.transform(regionRect); | 280 var screenRect = data.imgTrafo.transform(regionRect); |
281 // console.debug('renderRegion:', screenRect, regionRect, "imgTrafo=", data.imgTrafo); | |
282 console.debug("renderRegion: mpos=",geom.position(screenRect)); | |
278 screenRect.adjustDiv($regionDiv); | 283 screenRect.adjustDiv($regionDiv); |
279 if (anim) { | 284 if (anim) { |
280 $regionDiv.fadeIn(); | 285 $regionDiv.fadeIn(); |
281 } else{ | 286 } else{ |
282 $regionDiv.show(); | 287 $regionDiv.show(); |
289 } | 294 } |
290 } | 295 } |
291 }; | 296 }; |
292 | 297 |
293 // show regions | 298 // show regions |
294 var showRegionDivs = function (data, anim) { | 299 var renderRegions = function (data, anim) { |
295 for (var i = 0; i < data.regions.length ; i++) { | 300 for (var i = 0; i < data.regions.length ; i++) { |
296 showRegionDiv(data, i, anim); | 301 renderRegion(data, i, anim); |
297 } | 302 } |
298 }; | 303 }; |
299 | 304 |
300 var unpackRegions = function (data) { | 305 var unpackRegions = function (data) { |
301 // create regions from parameters | 306 // create regions from parameters |
334 data.settings.rg = rg; | 339 data.settings.rg = rg; |
335 }; | 340 }; |
336 | 341 |
337 // reload display after a region has been added or removed | 342 // reload display after a region has been added or removed |
338 var redisplay = function (data) { | 343 var redisplay = function (data) { |
339 if (!data.settings.includeRegionContent) { | 344 if (!data.settings.hasRegionContent) { |
340 packRegions(data); | 345 packRegions(data); |
341 } | 346 } |
342 fn.redisplay(data); | 347 fn.redisplay(data); |
343 }; | 348 }; |
344 | 349 |
362 // event handler, reads region parameter and creates region divs | 367 // event handler, reads region parameter and creates region divs |
363 var handleSetup = function (evt) { | 368 var handleSetup = function (evt) { |
364 data = this; | 369 data = this; |
365 console.debug("regions: handleSetup", data.settings.rg); | 370 console.debug("regions: handleSetup", data.settings.rg); |
366 // regions with content are given in HTML divs | 371 // regions with content are given in HTML divs |
367 if (data.settings.includeRegionContent) { | 372 if (data.settings.hasRegionContent) { |
368 createRegionsFromHTML(data); | 373 createRegionsFromHTML(data); |
369 // regions are defined in the URL | 374 // regions are defined in the URL |
370 } else { | 375 } else { |
371 unpackRegions(data); | 376 unpackRegions(data); |
372 createRegionDivs(data); | 377 createRegionDivs(data); |
375 }; | 380 }; |
376 | 381 |
377 // event handler, sets buttons and shows regions | 382 // event handler, sets buttons and shows regions |
378 var handleUpdate = function (evt) { | 383 var handleUpdate = function (evt) { |
379 data = this; | 384 data = this; |
385 console.debug("regions: handleUpdate"); | |
380 var settings = data.settings; | 386 var settings = data.settings; |
381 fn.highlightButtons(data, 'regions' , settings.isRegionVisible); | 387 fn.highlightButtons(data, 'regions' , settings.isRegionVisible); |
382 fn.highlightButtons(data, 'regionhtml' , settings.showRegionHTML); | 388 fn.highlightButtons(data, 'regionhtml' , settings.showRegionHTML); |
383 showRegionDivs(data); | 389 renderRegions(data); |
384 console.debug("regions: handleUpdate", settings.rg); | |
385 }; | 390 }; |
386 | 391 |
387 // event handler, redisplays regions (e.g. in a new position) | 392 // event handler, redisplays regions (e.g. in a new position) |
388 var handleRedisplay = function (evt) { | 393 var handleRedisplay = function (evt) { |
389 data = this; | 394 data = this; |
390 showRegionDivs(data); | |
391 console.debug("regions: handleRedisplay"); | 395 console.debug("regions: handleRedisplay"); |
396 renderRegions(data); | |
392 }; | 397 }; |
393 | 398 |
394 // event handler | 399 // event handler |
395 var handleDragZoom = function (evt, zoomArea) { | 400 var handleDragZoom = function (evt, zoomArea) { |
396 // console.debug("regions: handleDragZoom, zoomArea:", zoomArea); | 401 // console.debug("regions: handleDragZoom, zoomArea:", zoomArea); |
426 $data.bind('setup', handleSetup); | 431 $data.bind('setup', handleSetup); |
427 $data.bind('update', handleUpdate); | 432 $data.bind('update', handleUpdate); |
428 $data.bind('redisplay', handleRedisplay); | 433 $data.bind('redisplay', handleRedisplay); |
429 $data.bind('dragZoom', handleDragZoom); | 434 $data.bind('dragZoom', handleDragZoom); |
430 var settings = data.settings; | 435 var settings = data.settings; |
431 var hasRegionContent = settings.includeRegionContent; | 436 var selector = data.settings.regionContentSelector; |
432 // no URL-defined regions, no buttons when regions are predefined in HTML | 437 settings.hasRegionContent = $elem.has(selector).length > 0; |
433 if (!hasRegionContent) { | 438 // neither URL-defined regions nor buttons when regions are predefined in HTML |
439 if (!settings.hasRegionContent) { | |
434 var mode = settings.interactionMode; | 440 var mode = settings.interactionMode; |
435 // add "rg" to digilibParamNames | 441 // add "rg" to digilibParamNames |
436 settings.digilibParamNames.push('rg'); | 442 settings.digilibParamNames.push('rg'); |
437 // additional buttons | 443 // additional buttons |
438 var buttonSettings = settings.buttonSettings[mode]; | 444 var buttonSettings = settings.buttonSettings[mode]; |