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