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];