Mercurial > hg > digilib-old
comparison webapp/src/main/webapp/jquery/jquery.digilib.regions.js @ 1088:16215fc22fbf
better separation of HTML and user defined regions
author | hertzhaft |
---|---|
date | Mon, 01 Oct 2012 19:03:45 +0200 |
parents | a45894a81e40 |
children | 897268e47ce4 |
comparison
equal
deleted
inserted
replaced
1087:e1b29f51d224 | 1088:16215fc22fbf |
---|---|
39 }; | 39 }; |
40 // affine geometry plugin | 40 // affine geometry plugin |
41 var geom = null; | 41 var geom = null; |
42 | 42 |
43 var buttons = { | 43 var buttons = { |
44 addregion : { | 44 defineurlregion : { |
45 onclick : "defineRegion", | 45 onclick : "defineURLRegion", |
46 tooltip : "define a region", | 46 tooltip : "define a region", |
47 icon : "addregion.png" | 47 icon : "addregion.png" |
48 }, | 48 }, |
49 delregion : { | 49 removeurlregion : { |
50 onclick : "removeRegion", | 50 onclick : "removeURLRegion", |
51 tooltip : "delete the last region", | 51 tooltip : "delete the last region", |
52 icon : "delregion.png" | 52 icon : "delregion.png" |
53 }, | 53 }, |
54 delallregions : { | 54 removeallurlregions : { |
55 onclick : "removeAllRegions", | 55 onclick : "removeAllURLRegions", |
56 tooltip : "delete all regions", | 56 tooltip : "delete all regions", |
57 icon : "delallregions.png" | 57 icon : "delallregions.png" |
58 }, | 58 }, |
59 regions : { | 59 regions : { |
60 onclick : "toggleRegions", | 60 onclick : "toggleRegions", |
67 icon : "regioninfo.png" | 67 icon : "regioninfo.png" |
68 } | 68 } |
69 }; | 69 }; |
70 | 70 |
71 var defaults = { | 71 var defaults = { |
72 // are regions being edited? | |
73 'editRegions' : false, | |
72 // are regions shown? | 74 // are regions shown? |
73 'isRegionVisible' : true, | 75 'isRegionVisible' : true, |
74 // are region numbers shown? | 76 // are region numbers shown? |
75 'showRegionNumbers' : true, | 77 'showRegionNumbers' : true, |
76 // is there region content in the page? | 78 // is there region content in the page? |
77 'processHtmlRegions' : false, | 79 'processHtmlRegions' : false, |
78 // region defined by users and in the URL | 80 // region defined by users and in the URL |
79 'processUserRegions' : true, | 81 'processUserRegions' : true, |
80 // turn any region into a clickable link to its detail view | 82 // callback for click on region |
81 'autoZoomRegionLinks' : false, | 83 'onClickRegion' : null, |
82 // use full region as klickable link (instead of only number and text) | 84 // turn any region into a clickable link to its detail view (DEPRECATED) |
83 'fullRegionLinks' : false, | 85 'autoZoomOnClick' : false, |
84 // css selector for area elements (must also be marked with class "dl-keep") | 86 // css selector for area elements (must also be marked with class "dl-keep") |
85 'htmlRegionsSelector' : 'map.dl-regioncontent area, map.dl-regioncontent a', | 87 'htmlRegionsSelector' : 'map.dl-regioncontent area, map.dl-regioncontent a', |
86 // buttonset of this plugin | 88 // buttonset of this plugin |
87 'regionSet' : ['regions', 'addregion', 'delregion', 'delallregions', 'regioninfo', 'lessoptions'], | 89 'regionSet' : ['regions', 'defineurlregion', 'removeurlregion', 'removeallurlregions', 'regioninfo', 'lessoptions'], |
88 // url param for regions | 90 // url param for regions |
89 'rg' : null | 91 'rg' : null, |
92 // region attributes to copy from HTML | |
93 'regionAttributes' : { | |
94 'id' :1, | |
95 'href' :1, | |
96 'title' :1, | |
97 'target':1, | |
98 'style' :1, | |
99 'class' :1 | |
100 } | |
90 }; | 101 }; |
91 | 102 |
92 var actions = { | 103 var actions = { |
93 | 104 |
94 // define a region interactively with two clicked points | 105 // define a region interactively with two clicked points |
95 defineRegion : function(data) { | 106 defineURLRegion : function(data) { |
96 if (!data.settings.isRegionVisible) { | 107 if (!data.settings.isRegionVisible) { |
97 alert("Please turn on regions visibility!"); | 108 alert("Please turn on regions visibility!"); |
98 return; | 109 return; |
99 } | 110 } |
100 var cssPrefix = data.settings.cssPrefix; | 111 var cssPrefix = data.settings.cssPrefix; |
106 var pt1, pt2; | 117 var pt1, pt2; |
107 // overlay prevents other elements from reacting to mouse events | 118 // overlay prevents other elements from reacting to mouse events |
108 var $overlay = $('<div class="'+cssPrefix+'overlay" style="position:absolute"/>'); | 119 var $overlay = $('<div class="'+cssPrefix+'overlay" style="position:absolute"/>'); |
109 $body.append($overlay); | 120 $body.append($overlay); |
110 bodyRect.adjustDiv($overlay); | 121 bodyRect.adjustDiv($overlay); |
111 var $regionDiv = addRegionDiv(data, data.regions.length); | 122 var attr = {'class' : cssPrefix+"regionURL"}; |
123 var $regionDiv = addRegionDiv(data, data.regionsURL, data.regionsURL.length, attr); | |
112 | 124 |
113 // mousedown handler: start sizing | 125 // mousedown handler: start sizing |
114 var regionStart = function (evt) { | 126 var regionStart = function (evt) { |
115 pt1 = geom.position(evt); | 127 pt1 = geom.position(evt); |
116 // setup and show zoom div | 128 // setup and show zoom div |
144 $overlay.off("mouseup.dlRegion", regionEnd); | 156 $overlay.off("mouseup.dlRegion", regionEnd); |
145 $overlay.remove(); | 157 $overlay.remove(); |
146 // clip region | 158 // clip region |
147 clickRect.clipTo(scalerRect); | 159 clickRect.clipTo(scalerRect); |
148 clickRect.adjustDiv($regionDiv); | 160 clickRect.adjustDiv($regionDiv); |
149 storeRegion(data, $regionDiv); | 161 storeURLRegion(data, $regionDiv); |
150 // fn.redisplay(data); | 162 // fn.redisplay(data); |
151 fn.highlightButtons(data, 'addregion', 0); | 163 fn.highlightButtons(data, 'addregion', 0); |
152 redisplay(data); | 164 redisplay(data); |
153 return false; | 165 return false; |
154 }; | 166 }; |
156 // bind start zoom handler | 168 // bind start zoom handler |
157 $overlay.one('mousedown.dlRegion', regionStart); | 169 $overlay.one('mousedown.dlRegion', regionStart); |
158 fn.highlightButtons(data, 'addregion', 1); | 170 fn.highlightButtons(data, 'addregion', 1); |
159 }, | 171 }, |
160 | 172 |
161 // remove the last added region | 173 // remove the last added URL region |
162 removeRegion : function (data) { | 174 removeURLRegion : function (data) { |
163 if (!data.settings.isRegionVisible) { | 175 if (!data.settings.isRegionVisible) { |
164 alert("Please turn on regions visibility!"); | 176 alert("Please turn on regions visibility!"); |
165 return; | 177 return; |
166 } | 178 } |
167 var region = data.regions.pop(); | 179 var r = data.regionsURL.pop(); |
168 if (region == null) return; | 180 // no more URL regions to delete |
169 var $regionDiv = region.$div; | 181 if (r == null) return; |
182 var $regionDiv = r.$div; | |
170 $regionDiv.remove(); | 183 $regionDiv.remove(); |
171 redisplay(data); | 184 redisplay(data); |
172 }, | 185 }, |
173 | 186 |
174 // remove the last added region | 187 // remove all manually added regions (defined through URL "rg" parameter) |
175 removeAllRegions : function (data) { | 188 removeAllURLRegions : function (data) { |
176 if (!data.settings.isRegionVisible) { | 189 if (!data.settings.isRegionVisible) { |
177 alert("Please turn on regions visibility!"); | 190 alert("Please turn on regions visibility!"); |
178 return; | 191 return; |
179 } | 192 } |
180 var cssPrefix = data.settings.cssPrefix; | 193 var cssPrefix = data.settings.cssPrefix; |
181 var $regions = data.$elem.find('div.'+cssPrefix+'region'); | 194 var $regions = data.$elem.find('div.'+cssPrefix+'regionURL'); |
182 $regions.remove(); | 195 $regions.remove(); |
183 data.regions = []; | 196 data.regionsURL = []; // remove only URL regions |
184 redisplay(data); | 197 redisplay(data); |
185 }, | 198 }, |
186 | 199 |
187 // show/hide regions | 200 // show/hide regions |
188 toggleRegions : function (data) { | 201 toggleRegions : function (data) { |
233 $info.find('.x').on('click.regioninfo', function () { | 246 $info.find('.x').on('click.regioninfo', function () { |
234 fn.withdraw($info); | 247 fn.withdraw($info); |
235 }); | 248 }); |
236 $info.fadeIn(); | 249 $info.fadeIn(); |
237 fn.centerOnScreen(data, $info); | 250 fn.centerOnScreen(data, $info); |
238 } | 251 }, |
252 | |
253 // show region coordinates in an edit line | |
254 showRegionCoords : function (data) { | |
255 var $elem = data.$elem; | |
256 var cssPrefix = data.settings.cssPrefix; | |
257 var infoselector = '#'+cssPrefix+'regionInfo'; | |
258 if (fn.find(data, infoselector)) { | |
259 fn.withdraw($info); | |
260 return; | |
261 } | |
262 var html = '\ | |
263 <div id="'+cssPrefix+'regionInfo" class="'+cssPrefix+'keep '+cssPrefix+'regionInfo">\ | |
264 <input name="coords" type="text" size="30" maxlength="40"/>\ | |
265 <input type="button" name="close" />\ | |
266 </div>'; | |
267 $info = $(html); | |
268 $info.appendTo($elem); | |
269 var bind = function(name) { | |
270 $info.find('.'+name).on('click.regioninfo', function () { | |
271 $info.find('div.'+cssPrefix+'info').hide(); | |
272 $info.find('div.'+cssPrefix+name).show(); | |
273 fn.centerOnScreen(data, $info); | |
274 }); | |
275 }; | |
276 $info.bind('button').on('click.regioninfo', function () { | |
277 fn.withdraw($info); | |
278 }); | |
279 $info.fadeIn(); | |
280 fn.centerOnScreen(data, $info); | |
281 } | |
282 | |
239 }; | 283 }; |
240 | 284 |
241 // store a region div | 285 // store a region div |
242 var storeRegion = function (data, $regionDiv) { | 286 var storeURLRegion = function (data, $regionDiv) { |
243 var regions = data.regions; | 287 var regions = data.regionsURL; |
244 var rect = geom.rectangle($regionDiv); | 288 var rect = geom.rectangle($regionDiv); |
245 var regionRect = data.imgTrafo.invtransform(rect); | 289 var rectangle = data.imgTrafo.invtransform(rect); |
246 regionRect.$div = $regionDiv; | 290 rectangle.$div = $regionDiv; |
247 regions.push(regionRect); | 291 regions.push(rectangle); |
248 console.debug("regions", data.regions, "regionRect", regionRect); | 292 console.debug("storeURLregion", data.regionsURL, "rectangle", rectangle); |
293 }; | |
294 | |
295 // open region as detail | |
296 var openDetail = function (data, region) { | |
297 digilib.actions.zoomArea(data, region); | |
298 }; | |
299 | |
300 // make a coords string | |
301 var regionCoordsString = function (rect, sep) { | |
302 return [ | |
303 fn.cropFloatStr(rect.x), | |
304 fn.cropFloatStr(rect.y), | |
305 fn.cropFloatStr(rect.width), | |
306 fn.cropFloatStr(rect.height) | |
307 ].join(sep); | |
249 }; | 308 }; |
250 | 309 |
251 // html for later insertion | 310 // html for later insertion |
252 var regionInfoHTML = function (data) { | 311 var regionInfoHTML = function (data) { |
253 var cssPrefix = data.settings.cssPrefix; | 312 var cssPrefix = data.settings.cssPrefix; |
254 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'html"/>'); | 313 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'html"/>'); |
255 $infoDiv.append($('<div/>').text('<map class="'+cssPrefix+'keep '+cssPrefix+'regioncontent">')); | 314 $infoDiv.append($('<div/>').text('<map class="'+cssPrefix+'keep '+cssPrefix+'regioncontent">')); |
256 $.each(data.regions, function(index, r) { | 315 $.each(data.regionsURL, function(index, r) { |
257 if (r.fromHtml) return; | 316 var coords = regionCoordsString(r, ','); |
258 var area = [ | 317 $infoDiv.append($('<div/>').text('<area coords="' + coords + '"/>')); |
259 fn.cropFloatStr(r.x), | |
260 fn.cropFloatStr(r.y), | |
261 fn.cropFloatStr(r.width), | |
262 fn.cropFloatStr(r.height)].join(','); | |
263 $infoDiv.append($('<div/>').text('<area coords="' + area + '"/>')); | |
264 }); | 318 }); |
265 $infoDiv.append($('<div/>').text('</map>')); | 319 $infoDiv.append($('<div/>').text('</map>')); |
266 return $infoDiv; | 320 return $infoDiv; |
267 }; | 321 }; |
268 | 322 |
269 // SVG-style | 323 // SVG-style |
270 var regionInfoSVG = function (data) { | 324 var regionInfoSVG = function (data) { |
271 var cssPrefix = data.settings.cssPrefix; | 325 var cssPrefix = data.settings.cssPrefix; |
272 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'svgattr"/>'); | 326 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'svgattr"/>'); |
273 $.each(data.regions, function(index, r) { | 327 $.each(data.regionsURL, function(index, r) { |
274 if (r.fromHtml) return; | 328 var coords = regionCoordsString(r, ' '); |
275 var area = [ | 329 $infoDiv.append($('<div/>').text('"' + coords + '"')); |
276 fn.cropFloatStr(r.x), | |
277 fn.cropFloatStr(r.y), | |
278 fn.cropFloatStr(r.width), | |
279 fn.cropFloatStr(r.height)].join(' '); | |
280 $infoDiv.append($('<div/>').text('"' + area + '"')); | |
281 }); | 330 }); |
282 return $infoDiv; | 331 return $infoDiv; |
283 }; | 332 }; |
284 | 333 |
285 // SVG-style | 334 // CSV-style |
286 var regionInfoCSV = function (data) { | 335 var regionInfoCSV = function (data) { |
287 var cssPrefix = data.settings.cssPrefix; | 336 var cssPrefix = data.settings.cssPrefix; |
288 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'csv"/>'); | 337 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'csv"/>'); |
289 $.each(data.regions, function(index, r) { | 338 $.each(data.regionsURL, function(index, r) { |
290 if (r.fromHtml) return; | 339 var coords = regionCoordsString(r, ','); |
291 var area = [ | 340 $infoDiv.append($('<div/>').text(index+1 + ": " + coords)); |
292 fn.cropFloatStr(r.x), | |
293 fn.cropFloatStr(r.y), | |
294 fn.cropFloatStr(r.width), | |
295 fn.cropFloatStr(r.height)].join(','); | |
296 $infoDiv.append($('<div/>').text(index+1 + ": " + area)); | |
297 }); | 341 }); |
298 return $infoDiv; | 342 return $infoDiv; |
299 }; | 343 }; |
300 // digilib-style | 344 |
345 // digilib-style (h,w@x,y) | |
301 var regionInfoDigilib = function (data) { | 346 var regionInfoDigilib = function (data) { |
302 var cssPrefix = data.settings.cssPrefix; | 347 var cssPrefix = data.settings.cssPrefix; |
303 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'digilib"/>'); | 348 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'digilib"/>'); |
304 $.each(data.regions, function(index, r) { | 349 $.each(data.regionsURL, function(index, r) { |
305 if (r.fromHtml) return; | 350 if (r.fromHtml) return; |
306 var area = r.toString(); | 351 var coords = r.toString(); |
307 $infoDiv.append($('<div/>').text(area)); | 352 $infoDiv.append($('<div/>').text(coords)); |
308 }); | 353 }); |
309 return $infoDiv; | 354 return $infoDiv; |
310 }; | 355 }; |
311 | 356 |
312 // add a region to data.$elem | 357 // add a region to data.$elem |
313 var addRegionDiv = function (data, index, attributes) { | 358 var addRegionDiv = function (data, regions, index, attributes) { |
314 var settings = data.settings; | 359 var settings = data.settings; |
315 var cssPrefix = settings.cssPrefix; | 360 var cssPrefix = settings.cssPrefix; |
316 var nr = index + 1; // we count regions from 1 | 361 // var nr = regions.length; // we count regions from 1 |
317 var $regionDiv = $('<div class="'+cssPrefix+'region '+cssPrefix+'overlay" style="display:none"/>'); | 362 var cls = cssPrefix+'region '+cssPrefix+'overlay'; |
363 if (attributes && attributes['class']) { | |
364 cls = cls+' '+attributes['class']; | |
365 delete attributes['class']; | |
366 } | |
367 var $regionDiv = $('<div class="'+cls+'" style="display:none"/>'); | |
318 data.$elem.append($regionDiv); | 368 data.$elem.append($regionDiv); |
319 if (settings.showRegionNumbers) { | 369 if (settings.showRegionNumbers) { |
320 var $regionLink = $('<a class="'+cssPrefix+'regionnumber">'+nr+'</a>'); | 370 var $regionLink = $('<a class="'+cssPrefix+'regionnumber">'+index+'</a>'); |
321 if (attributes) $regionLink.attr(attributes); | 371 if (attributes) $regionLink.attr(attributes); |
322 $regionDiv.append($regionLink); | 372 $regionDiv.append($regionLink); |
323 } | 373 } |
324 var url = null; | 374 var url = null; |
325 if (attributes) { | 375 if (attributes) { |
332 $regionDiv.attr(attrs); | 382 $regionDiv.attr(attrs); |
333 } else { | 383 } else { |
334 $regionDiv.attr(attributes); | 384 $regionDiv.attr(attributes); |
335 } | 385 } |
336 } | 386 } |
337 if (settings.autoZoomRegionLinks || settings.fullRegionLinks) { | 387 // DEPRECATED |
338 // handle click events on div | 388 if (settings.autoZoomOnClick) { |
339 var region = data.regions[index]; | 389 if (settings.onClickRegion == null) settings.onClickRegion = openDetail; |
340 $regionDiv.on('click.dlRegion', function(evt) { | 390 } |
341 if (settings.fullRegionLinks && url) { | 391 // handle click events on div |
342 //TODO: how about target? | 392 var region = regions[index]; |
343 window.location = url; | 393 $regionDiv.on('click.dlRegion', function(evt) { |
344 } | 394 if (settings.fullRegionLinks && url) { |
345 if (evt.target !== $regionDiv.get(0)) { | 395 //TODO: how about target? |
346 // this was not our event | 396 window.location = url; |
347 return; | 397 } |
348 } | 398 if (evt.target !== $regionDiv.get(0)) { |
349 if (settings.autoZoomRegionLinks) { | 399 // this was not our event |
350 // zoom to region | 400 return; |
351 digilib.actions.zoomArea(data, region); | 401 } |
352 } | 402 if (typeof settings.onClickRegion === 'function') { |
353 }); | 403 // execute callback |
354 } | 404 settings.onClickRegion(data, region); |
405 } | |
406 }); | |
355 return $regionDiv; | 407 return $regionDiv; |
356 }; | 408 }; |
357 | 409 |
358 // create a region div from the data.regions array | 410 // create a region div from the data.regions array |
359 var createRegionDiv = function (data, regions, index, attributes) { | 411 var createRegionDiv = function (data, regions, index, attributes) { |
360 var region = regions[index]; | 412 var region = regions[index]; |
361 // check if div exists | 413 // check if div exists |
362 if (region.$div != null) return region.$div; | 414 if (region.$div != null) return region.$div; |
363 // create and add div | 415 // create and add div |
364 var $regionDiv = addRegionDiv(data, index, attributes); | 416 var $regionDiv = addRegionDiv(data, regions, index, attributes); |
365 region.$div = $regionDiv; | 417 region.$div = $regionDiv; |
366 return $regionDiv; | 418 return $regionDiv; |
367 }; | 419 }; |
368 | 420 |
369 // create regions from URL parameters | 421 // create regions from URL parameters |
370 var createRegionsFromURL = function (data) { | 422 var createRegionsFromURL = function (data) { |
423 var cssPrefix = data.settings.cssPrefix; | |
424 var attr = {'class' : cssPrefix+"regionURL"}; | |
371 unpackRegions(data); | 425 unpackRegions(data); |
372 var regions = data.regions; | 426 var regions = data.regionsURL; |
373 $.each(regions, function(i) { | 427 $.each(regions, function(index, region) { |
374 createRegionDiv(data, regions, i); | 428 createRegionDiv(data, regions, index, attr); |
375 }); | 429 }); |
376 }; | 430 }; |
377 | 431 |
378 // create regions from HTML | 432 // create regions from HTML |
379 var createRegionsFromHTML = function (data) { | 433 var createRegionsFromHTML = function (data) { |
380 var regions = data.regions; | 434 var cssPrefix = data.settings.cssPrefix; |
435 var regions = data.regionsHTML; | |
381 // regions are defined in "area" tags | 436 // regions are defined in "area" tags |
382 var $content = data.$elem.find(data.settings.htmlRegionsSelector); | 437 var $content = data.$elem.find(data.settings.htmlRegionsSelector); |
383 console.debug("createRegionsFromHTML. elems: ", $content); | 438 console.debug("createRegionsFromHTML. Number of elems: ", $content.length); |
384 $content.each(function(index, a) { | 439 $content.each(function(index, area) { |
385 var $a = $(a); | 440 var $area = $(area); |
386 // the "coords" attribute contains the region coords (0..1) | 441 // the "coords" attribute contains the region coords (0..1) |
387 var coords = $a.attr('coords'); | 442 var coords = $area.attr('coords'); |
388 var pos = coords.split(',', 4); | 443 var pos = coords.split(',', 4); |
389 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); | 444 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); |
390 rect.fromHtml = true; | 445 rect.fromHtml = true; |
391 regions.push(rect); | 446 regions.push(rect); |
392 // copy some attributes | 447 // copy some attributes |
393 var attributes = {}; | 448 var attributes = {}; |
394 for (var n in {'id':1, 'href':1, 'title':1, 'target':1, 'style':1}) { | 449 for (var n in data.settings.regionAttributes) { |
395 attributes[n] = $a.attr(n); | 450 attributes[n] = $area.attr(n); |
451 } | |
452 // mark div as regionHTML | |
453 regionClass = cssPrefix+'regionHTML'; | |
454 if (attributes['class']) { | |
455 attributes['class'] += ' ' + regionClass | |
456 } else { | |
457 attributes['class'] = regionClass | |
396 } | 458 } |
397 // create the div | 459 // create the div |
398 var $regionDiv = createRegionDiv(data, regions, index, attributes); | 460 var $regionDiv = createRegionDiv(data, regions, index, attributes); |
399 var $contents = $a.contents().clone(); | 461 var $contents = $area.contents().clone(); |
400 if (attributes.href != null) { | 462 if (attributes.href != null) { |
401 // wrap contents in a-tag | 463 // wrap contents in a-tag |
402 var $ca = $('<a href="'+attributes.href+'"/>'); | 464 var $ca = $('<a href="'+attributes.href+'"/>'); |
403 $ca.append($contents); | 465 $ca.append($contents); |
404 // alt attribute is also content (BTW: area-tag has no content()) | 466 // alt attribute is also content (BTW: area-tag has no content()) |
405 $ca.append($a.attr('alt')); | 467 $ca.append($area.attr('alt')); |
406 $regionDiv.append($ca); | 468 $regionDiv.append($ca); |
407 } else { | 469 } else { |
408 $regionDiv.append($contents); | 470 $regionDiv.append($contents); |
409 // alt attribute is also content (BTW: area-tag has no content()) | 471 // alt attribute is also content (BTW: area-tag has no content()) |
410 $regionDiv.append($a.attr('alt')); | 472 $regionDiv.append($area.attr('alt')); |
411 } | 473 } |
412 }); | 474 }); |
413 }; | 475 }; |
414 | 476 |
415 // show a region on top of the scaler image | 477 // show a region on top of the scaler image |
416 var renderRegion = function (data, index, anim) { | 478 var renderRegion = function (data, region, anim) { |
417 if (!data.imgTrafo) return; | 479 if (!data.imgTrafo) return; |
418 var regions = data.regions; | |
419 var zoomArea = data.zoomArea; | 480 var zoomArea = data.zoomArea; |
420 if (index > regions.length) return; | |
421 var region = regions[index]; | |
422 var $regionDiv = region.$div; | 481 var $regionDiv = region.$div; |
423 if (!$regionDiv) { | 482 if (!$regionDiv) { |
424 console.error("renderRegion: region has no $div", region); | 483 console.error("renderRegion: region has no $div", region); |
425 // alert("renderRegion: region has no $div to show"); | 484 // alert("renderRegion: region has no $div to show"); |
426 return; | 485 return; |
447 } | 506 } |
448 }; | 507 }; |
449 | 508 |
450 // show regions | 509 // show regions |
451 var renderRegions = function (data, anim) { | 510 var renderRegions = function (data, anim) { |
452 for (var i = 0; i < data.regions.length ; i++) { | 511 $.each(data.regionsHTML, function(index, region) { |
453 renderRegion(data, i, anim); | 512 renderRegion(data, region, anim); |
454 } | 513 }); |
514 $.each(data.regionsURL, function(index, region) { | |
515 renderRegion(data, region, anim); | |
516 }); | |
455 }; | 517 }; |
456 | 518 |
457 var unpackRegions = function (data) { | 519 var unpackRegions = function (data) { |
458 // create regions from parameters | 520 // create regions from parameters |
459 var rg = data.settings.rg; | 521 var rg = data.settings.rg; |
460 if (rg == null) return; | 522 if (rg == null) return; |
461 var regions = data.regions; | 523 var regions = data.regionsURL; |
462 var rs = rg.split(","); | 524 var rs = rg.split(","); |
463 for (var i = 0; i < rs.length; i++) { | 525 for (var i = 0; i < rs.length; i++) { |
464 var r = rs[i]; | 526 var r = rs[i]; |
465 var pos = r.split("/", 4); | 527 var pos = r.split("/", 4); |
466 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); | 528 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); |
468 } | 530 } |
469 }; | 531 }; |
470 | 532 |
471 // pack regions array into a parameter string | 533 // pack regions array into a parameter string |
472 var packRegions = function (data) { | 534 var packRegions = function (data) { |
473 var regions = data.regions; | 535 var regions = data.regionsURL; |
474 if (!regions.length) { | 536 if (!regions.length) { |
475 data.settings.rg = null; | 537 data.settings.rg = null; |
476 return; | 538 return; |
477 } | 539 } |
478 var rg = ''; | 540 var rg = ''; |
479 for (var i = 0; i < regions.length; i++) { | 541 for (var i = 0; i < regions.length; i++) { |
480 var region = regions[i]; | 542 var region = regions[i]; |
481 // skip regions from HTML | |
482 if (region.fromHtml != null) continue; | |
483 if (rg) { | 543 if (rg) { |
484 rg += ','; | 544 rg += ','; |
485 } | 545 } |
486 rg += [ | 546 rg += regionCoordsString(region, '/'); |
487 fn.cropFloatStr(region.x), | |
488 fn.cropFloatStr(region.y), | |
489 fn.cropFloatStr(region.width), | |
490 fn.cropFloatStr(region.height) | |
491 ].join('/'); | |
492 } | 547 } |
493 data.settings.rg = rg; | 548 data.settings.rg = rg; |
549 console.debug('pack regions:', rg); | |
494 }; | 550 }; |
495 | 551 |
496 // reload display after a region has been added or removed | 552 // reload display after a region has been added or removed |
497 var redisplay = function (data) { | 553 var redisplay = function (data) { |
498 if (data.settings.processUserRegions) { | 554 if (data.settings.processUserRegions) { |
557 var init = function (data) { | 613 var init = function (data) { |
558 console.debug('initialising regions plugin. data:', data); | 614 console.debug('initialising regions plugin. data:', data); |
559 var $elem = data.$elem; | 615 var $elem = data.$elem; |
560 var settings = data.settings; | 616 var settings = data.settings; |
561 var cssPrefix = data.settings.cssPrefix; | 617 var cssPrefix = data.settings.cssPrefix; |
562 // regions array | 618 // region arrays |
563 data.regions = []; | 619 data.regionsURL = []; |
620 data.regionsHTML = []; | |
564 // install event handlers | 621 // install event handlers |
565 var $data = $(data); | 622 var $data = $(data); |
566 $data.on('setup', handleSetup); | 623 $data.on('setup', handleSetup); |
567 $data.on('update', handleUpdate); | 624 $data.on('update', handleUpdate); |
568 // install buttons | 625 // install buttons |
569 if (settings.processUserRegions) { | 626 if (settings.processUserRegions) { |
570 // add "rg" to digilibParamNames | 627 // add "rg" to digilibParamNames: TODO - check with settings.additionalParamNames? |
571 settings.digilibParamNames.push('rg'); | 628 // settings.digilibParamNames.push('rg'); |
572 if (digilib.plugins.buttons != null) { | 629 if (digilib.plugins.buttons != null) { |
573 installButtons(data); | 630 installButtons(data); |
574 } | 631 } |
575 } | 632 } |
576 }; | 633 }; |