comparison webapp/src/main/webapp/jquery/jquery.digilib.regions.js @ 1096:3c75dda660bf

more refactoring: use jquery selections instead of arrays
author hertzhaft
date Tue, 23 Oct 2012 23:20:45 +0200
parents 20ad0034f1e5
children f677b9ac5110
comparison
equal deleted inserted replaced
1095:20ad0034f1e5 1096:3c75dda660bf
93 // callback when new user region is defined 93 // callback when new user region is defined
94 'onNewRegion' : null, 94 'onNewRegion' : null,
95 // turn any region into a clickable link to its detail view (DEPRECATED) 95 // turn any region into a clickable link to its detail view (DEPRECATED)
96 'autoZoomOnClick' : false, 96 'autoZoomOnClick' : false,
97 // css selector for area/a elements (must also be marked with class "dl-keep") 97 // css selector for area/a elements (must also be marked with class "dl-keep")
98 'htmlRegionsSelector' : 'map.dl-regioncontent area, map.dl-regioncontent a', 98 'areaSelector' : 'map.dl-regioncontent area, map.dl-regioncontent a',
99 // buttonset of this plugin 99 // buttonset of this plugin
100 'regionSet' : ['regions', 'defineregion', 'removeregion', 'removeallregions', 'regioninfo', 'findcoords', 'lessoptions'], 100 'regionSet' : ['regions', 'defineregion', 'removeregion', 'removeallregions', 'regioninfo', 'findcoords', 'lessoptions'],
101 // url param for regions 101 // url param for regions
102 'rg' : null, 102 'rg' : null,
103 // region attributes to copy from HTML 103 // region attributes to copy from HTML
129 // overlay prevents other elements from reacting to mouse events 129 // overlay prevents other elements from reacting to mouse events
130 var $overlay = $('<div class="'+cssPrefix+'overlay" style="position:absolute"/>'); 130 var $overlay = $('<div class="'+cssPrefix+'overlay" style="position:absolute"/>');
131 $body.append($overlay); 131 $body.append($overlay);
132 bodyRect.adjustDiv($overlay); 132 bodyRect.adjustDiv($overlay);
133 var $regionDiv = newRegionDiv(data); 133 var $regionDiv = newRegionDiv(data);
134 copyRegionAttributes(data, $regionDiv, {'class' : cssPrefix+"regionURL"}); 134 addRegionAttributes(data, $regionDiv, {'class' : cssPrefix+"regionURL"});
135 135
136 // mousedown handler: start sizing 136 // mousedown handler: start sizing
137 var regionStart = function (evt) { 137 var regionStart = function (evt) {
138 pt1 = geom.position(evt); 138 pt1 = geom.position(evt);
139 // setup and show zoom div 139 // setup and show zoom div
167 $overlay.off("mouseup.dlRegion", regionEnd); 167 $overlay.off("mouseup.dlRegion", regionEnd);
168 $overlay.remove(); 168 $overlay.remove();
169 // clip region 169 // clip region
170 clickRect.clipTo(scalerRect); 170 clickRect.clipTo(scalerRect);
171 clickRect.adjustDiv($regionDiv); 171 clickRect.adjustDiv($regionDiv);
172 storeRegionDiv(data, $regionDiv); 172 regionTrafo(data, $regionDiv);
173 // fn.redisplay(data);
174 fn.highlightButtons(data, 'defineregion', 0); 173 fn.highlightButtons(data, 'defineregion', 0);
175 redisplay(data); 174 redisplay(data);
176 $(data).trigger('newRegion', [$regionDiv]); 175 $(data).trigger('newRegion', [$regionDiv]);
177 return false; 176 return false;
178 }; 177 };
186 removeUserRegion : function (data) { 185 removeUserRegion : function (data) {
187 if (!data.settings.isRegionVisible) { 186 if (!data.settings.isRegionVisible) {
188 alert("Please turn on regions visibility!"); 187 alert("Please turn on regions visibility!");
189 return; 188 return;
190 } 189 }
191 var r = data.userRegions.pop(); 190 var selector = 'div.'+data.settings.cssPrefix+'regionURL';
192 // no more URL regions to delete 191 var $regionDiv = data.$elem.find(selector).last();
193 if (r == null) return;
194 var $regionDiv = r.$div; // DEPRECATED
195 $regionDiv.remove(); 192 $regionDiv.remove();
196 redisplay(data); 193 redisplay(data);
197 }, 194 },
198 195
199 // remove all manually added regions (defined through URL "rg" parameter) 196 // remove all manually added regions (defined through URL "rg" parameter)
200 removeAllUserRegions : function (data) { 197 removeAllUserRegions : function (data) {
201 if (!data.settings.isRegionVisible) { 198 if (!data.settings.isRegionVisible) {
202 alert("Please turn on regions visibility!"); 199 alert("Please turn on regions visibility!");
203 return; 200 return;
204 } 201 }
205 var cssPrefix = data.settings.cssPrefix; 202 var selector = 'div.'+data.settings.cssPrefix+'regionURL';
206 var $regions = data.$elem.find('div.'+cssPrefix+'regionURL'); 203 var $regionDivs = data.$elem.find(selector);
207 $regions.remove(); 204 $regionDivs.remove();
208 data.userRegions = []; // remove only URL regions
209 redisplay(data); 205 redisplay(data);
210 }, 206 },
211 207
212 // show/hide regions 208 // show/hide regions
213 toggleRegions : function (data) { 209 toggleRegions : function (data) {
238 </tr>\ 234 </tr>\
239 </table>\ 235 </table>\
240 </div>'; 236 </div>';
241 $info = $(html); 237 $info = $(html);
242 $info.appendTo($elem); 238 $info.appendTo($elem);
243 $info.append(regionInfoHTML(data)); 239 var $regions = getRegions(data, 'regionURL');
244 $info.append(regionInfoSVG(data)); 240 $info.append(regionInfoHTML(data, $regions));
245 $info.append(regionInfoCSV(data)); 241 $info.append(regionInfoSVG(data, $regions));
246 $info.append(regionInfoDigilib(data)); 242 $info.append(regionInfoCSV(data, $regions));
243 $info.append(regionInfoDigilib(data, $regions));
247 var bind = function(name) { 244 var bind = function(name) {
248 $info.find('.'+name).on('click.regioninfo', function () { 245 $info.find('.'+name).on('click.regioninfo', function () {
249 $info.find('div.'+cssPrefix+'info').hide(); 246 $info.find('div.'+cssPrefix+'info').hide();
250 $info.find('div.'+cssPrefix+name).show(); 247 $info.find('div.'+cssPrefix+name).show();
251 fn.centerOnScreen(data, $info); 248 fn.centerOnScreen(data, $info);
265 // display region coordinates in an edit line 262 // display region coordinates in an edit line
266 showRegionCoords : function (data, $regionDiv) { 263 showRegionCoords : function (data, $regionDiv) {
267 var $elem = data.$elem; 264 var $elem = data.$elem;
268 var cssPrefix = data.settings.cssPrefix; 265 var cssPrefix = data.settings.cssPrefix;
269 var rect = $regionDiv.data('rect'); 266 var rect = $regionDiv.data('rect');
270 var coords = packCoords(rect, ','); 267 var text = $regionDiv.data('text');
268 var coordString = packCoords(rect, ',');
271 var html = '\ 269 var html = '\
272 <div id="'+cssPrefix+'regionInfo" class="'+cssPrefix+'keep '+cssPrefix+'regionInfo">\ 270 <div id="'+cssPrefix+'regionInfo" class="'+cssPrefix+'keep '+cssPrefix+'regionInfo">\
273 <input name="coords" type="text" size="30" maxlength="40" value="'+coords+'"/>\ 271 <div/>\
272 <input name="coords" type="text" size="30" maxlength="40" value="'+coordString+'"/>\
274 </div>'; 273 </div>';
275 var $info = $(html); 274 var $info = $(html);
276 $info.appendTo($elem); 275 $info.appendTo($elem);
276 $div = $info.find('div');
277 $div.text(text);
277 $input = $info.find('input'); 278 $input = $info.find('input');
278 $input.on('focus.regioninfo', function (event) { 279 $input.on('focus.regioninfo', function (event) {
279 this.select(); 280 this.select();
280 }); 281 });
281 $input.on('blur.regioninfo', function (event) { 282 $input.on('blur.regioninfo', function (event) {
287 }); 288 });
288 $input.prop("readonly",true); 289 $input.prop("readonly",true);
289 $info.fadeIn(); 290 $info.fadeIn();
290 fn.centerOnScreen(data, $info); 291 fn.centerOnScreen(data, $info);
291 $input.focus(); 292 $input.focus();
292 console.debug('showRegionCoords', coords); 293 console.debug('showRegionCoords', coordString);
293 }, 294 },
294 295
295 // draw a find region from coords and move into view 296 // draw a find region from coords and move into view
296 regionFromCoords : function (data, coords) { 297 regionFromCoords : function (data, coords) {
297 var rect = parseCoords(data, coords); 298 var rect = parseCoords(data, coords);
299 alert('invalid coordinates: ' + coords); 300 alert('invalid coordinates: ' + coords);
300 return; 301 return;
301 } 302 }
302 var cssPrefix = data.settings.cssPrefix; 303 var cssPrefix = data.settings.cssPrefix;
303 var attr = { 'class' : cssPrefix+'regionURL '+cssPrefix+'findregion' }; 304 var attr = { 'class' : cssPrefix+'regionURL '+cssPrefix+'findregion' };
304 createRegion(data, data.userRegions, rect, attr); 305 addRegionDiv(data, rect, attr);
305 var za = data.zoomArea; 306 var za = data.zoomArea;
306 if (!fn.isFullArea(za)) { 307 if (!fn.isFullArea(za)) {
307 za.setCenter(rect.getCenter()).stayInside(FULL_AREA); 308 za.setCenter(rect.getCenter()).stayInside(FULL_AREA);
308 if (!za.containsRect(rect)) { 309 if (!za.containsRect(rect)) {
309 za = FULL_AREA.copy(); 310 za = FULL_AREA.copy();
388 var $regionDiv = $('<div class="'+cls+'" style="display:none"/>'); 389 var $regionDiv = $('<div class="'+cls+'" style="display:none"/>');
389 data.$elem.append($regionDiv); 390 data.$elem.append($regionDiv);
390 return $regionDiv; 391 return $regionDiv;
391 }; 392 };
392 393
393 // push the digilib coordinates of a completed user-defined region onto the stack 394 // calculate the digilib coordinates of a completed user-defined region
394 var storeRegionDiv = function (data, $regionDiv) { 395 var regionTrafo = function (data, $regionDiv) {
395 var regions = data.userRegions; 396 var screenRect = geom.rectangle($regionDiv);
396 var rectangle = geom.rectangle($regionDiv); 397 var rect = data.imgTrafo.invtransform(screenRect);
397 var rect = data.imgTrafo.invtransform(rectangle);
398 $regionDiv.data('rect', rect); 398 $regionDiv.data('rect', rect);
399 rect.$div = $regionDiv; // DEPRECATED 399 console.debug("regionTrafo", $regionDiv, rect);
400 regions.push(rect);
401 console.debug("storeRegionDiv", data.userRegions, "rect", rect);
402 return rect; 400 return rect;
403 }; 401 };
404 402
405 // copy attributes to a region div 403 // copy attributes to a region div
406 var copyRegionAttributes = function (data, $regionDiv, attributes) { 404 var addRegionAttributes = function (data, $regionDiv, attributes) {
407 if (attributes == null) return; 405 if (attributes == null) return;
408 var settings = data.settings; 406 var settings = data.settings;
409 var cssPrefix = settings.cssPrefix; 407 var cssPrefix = settings.cssPrefix;
410 if (attributes['class']) { 408 if (attributes['class']) {
411 $regionDiv.addClass(attributes['class']); 409 $regionDiv.addClass(attributes['class']);
412 delete attributes['class']; 410 delete attributes['class'];
413 } 411 }
414 $regionDiv.data('href', attributes.href); // TODO: href from HTML? 412 if (attributes['href']) {
415 delete attributes.href; 413 $regionDiv.data('href', attributes['href']); // TODO: href from HTML?
414 delete attributes['href'];
415 }
416 if (attributes['title']) {
417 $regionDiv.data('text', attributes['title']);
418 }
416 $regionDiv.attr(attributes); 419 $regionDiv.attr(attributes);
417 }; 420 };
418 421
419 // set region number 422 // set region number
420 var addRegionNumber = function (data, $regionDiv, index) { 423 var addRegionNumber = function (data, $regionDiv, index) {
421 var settings = data.settings; 424 var settings = data.settings;
422 var cssPrefix = settings.cssPrefix; 425 var cssPrefix = settings.cssPrefix;
423 if (!settings.showRegionNumbers) return;
424 var $number = $('<a class="'+cssPrefix+'regionnumber">'+index+'</a>'); 426 var $number = $('<a class="'+cssPrefix+'regionnumber">'+index+'</a>');
425 $regionDiv.append($number); 427 $regionDiv.append($number);
426 return $regionDiv; 428 return $regionDiv;
427 }; 429 };
428 430
429 // add a region to data.$elem 431 // construct a region from a rectangle
430 var addRegionDiv = function (data, regions, index, attributes) { 432 var addRegionDiv = function (data, rect, attributes, number) { // ###
431 var settings = data.settings; 433 var settings = data.settings;
432 var cssPrefix = settings.cssPrefix; 434 var cssPrefix = settings.cssPrefix;
433 var $regionDiv = newRegionDiv(data); 435 var $regionDiv = newRegionDiv(data);
434 copyRegionAttributes(data, $regionDiv, attributes); 436 addRegionAttributes(data, $regionDiv, attributes);
435 addRegionNumber(data, $regionDiv, index); 437 if (settings.showRegionNumbers && number) {
436 438 addRegionNumber(data, $regionDiv, number);
439 }
440 $regionDiv.data('rect', rect);
437 // handle click events on div 441 // handle click events on div
438 $regionDiv.on('click.dlRegion', function(evt) { 442 $regionDiv.on('click.dlRegion', function(evt) {
439 $(data).trigger('regionClick', [$regionDiv]); 443 $(data).trigger('regionClick', [$regionDiv]);
440 }); 444 });
441 return $regionDiv; 445 return $regionDiv;
442 }; 446 };
443 447
444 // create a region div from the data.regions array
445 var createRegionDiv = function (data, regions, index, attributes) {
446 var rect = regions[index];
447 // check if div exists, DEPRECATED
448 if (rect.$div != null) return rect.$div;
449 // create and add div
450 var $regionDiv = addRegionDiv(data, regions, index, attributes);
451 $regionDiv.data('rect', rect);
452 rect.$div = $regionDiv; // DEPRECATED
453 return $regionDiv;
454 };
455
456 // create a region from a rectangle
457 var createRegion = function (data, regions, rect, attributes) {
458 var index = regions.length;
459 regions.push(rect);
460 var $regionDiv = createRegionDiv(data, regions, index, attributes);
461 return $regionDiv;
462 };
463
464 // create regions from URL parameters 448 // create regions from URL parameters
465 var createRegionsFromURL = function (data) { 449 var createRegionsFromURL = function (data) {
466 var cssPrefix = data.settings.cssPrefix; 450 var cssPrefix = data.settings.cssPrefix;
467 var attr = {'class' : cssPrefix+"regionURL"}; 451 var attr = {'class' : cssPrefix+"regionURL"};
468 var regions = unpackRegions(data); 452 var userRegions = unpackRegions(data);
469 data.userRegions = regions; 453 $.each(userRegions, function(index, rect) {
470 $.each(regions, function(index, region) { 454 addRegionDiv(data, rect, attr, index+1);
471 createRegionDiv(data, regions, index, attr);
472 }); 455 });
473 }; 456 };
474 457
475 // create regions from HTML 458 // create regions from HTML
476 var createRegionsFromHTML = function (data) { 459 var createRegionsFromHTML = function (data) {
460 // regions are defined in "area" tags
461 var $content = data.$elem.find(data.settings.areaSelector);
477 var cssPrefix = data.settings.cssPrefix; 462 var cssPrefix = data.settings.cssPrefix;
478 var regions = data.htmlRegions; 463 console.debug("createRegionsFromHTML. elems found: ", $content.length);
479 // regions are defined in "area" tags
480 var $content = data.$elem.find(data.settings.htmlRegionsSelector);
481 console.debug("createRegionsFromHTML. Number of elems: ", $content.length);
482 $content.each(function(index, area) { 464 $content.each(function(index, area) {
483 var $area = $(area); 465 var $area = $(area);
484 // the "coords" attribute contains the region coords (0..1) 466 // the "coords" attribute contains the region coords (0..1)
485 var coords = $area.attr('coords'); 467 var coords = $area.attr('coords');
486 var title = $area.attr('title'); 468 var title = $area.attr('title');
487 // create the rectangle 469 // create the rectangle
488 var rect = parseCoords(data, coords); 470 var rect = parseCoords(data, coords);
492 // copy attributes 474 // copy attributes
493 var attributes = {}; 475 var attributes = {};
494 for (var n in data.settings.regionAttributes) { 476 for (var n in data.settings.regionAttributes) {
495 attributes[n] = $area.attr(n); 477 attributes[n] = $area.attr(n);
496 } 478 }
479 var $regionDiv = addRegionDiv(data, rect, attributes);
497 // mark div as regionHTML 480 // mark div as regionHTML
498 regionClass = cssPrefix+'regionHTML'; 481 $regionDiv.addClass(cssPrefix+'regionHTML');
499 if (attributes['class']) {
500 attributes['class'] += ' ' + regionClass
501 } else {
502 attributes['class'] = regionClass
503 }
504 var $regionDiv = createRegion(data, regions, rect, attributes);
505 var $contents = $area.contents().clone(); 482 var $contents = $area.contents().clone();
506 if (attributes.href != null) { // TODO: href set in region??? 483 if (attributes.href != null) { // TODO: href set in region???
507 // wrap contents in a-tag 484 // wrap contents in a-tag
508 var $ca = $('<a href="'+attributes.href+'"/>'); 485 var $ca = $('<a href="'+attributes.href+'"/>');
509 $ca.append($contents); 486 $ca.append($contents);
516 $regionDiv.append($area.attr('alt')); 493 $regionDiv.append($area.attr('alt'));
517 } 494 }
518 }); 495 });
519 }; 496 };
520 497
498 // select region divs (HTML or URL)
499 var getRegions = function (data, selector) {
500 var cssPrefix = data.settings.cssPrefix;
501 var $regions = data.$elem.find('div.'+cssPrefix+selector);
502 return $regions;
503 };
504
521 // list of HTML regions matching text in its title attribute 505 // list of HTML regions matching text in its title attribute
522 var matchRegionText = function (data, text) { 506 var matchRegionText = function (data, text) {
523 var regions = data.htmlRegions; 507 var $regions = getRegions(data, 'regionsHTML');
524 var re = new RegExp(text); 508 var re = new RegExp(text);
525 return $.grep(regions, function(item, index) { 509 return $.grep($regions, function($item, index) {
526 return re.match(item.text); 510 return re.match($item.data('text'));
527 }); 511 });
528 }; 512 };
529 513
530 // html for later insertion 514 // html for later insertion
531 var regionInfoHTML = function (data) { 515 var regionInfoHTML = function (data, $regions) {
532 var cssPrefix = data.settings.cssPrefix; 516 var cssPrefix = data.settings.cssPrefix;
533 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'html"/>'); 517 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'html"/>');
534 $infoDiv.append($('<div/>').text('<map class="'+cssPrefix+'keep '+cssPrefix+'regioncontent">')); 518 $infoDiv.append($('<div/>').text('<map class="'+cssPrefix+'keep '+cssPrefix+'regioncontent">'));
535 $.each(data.userRegions, function(index, r) { 519 $regions.each(function(index, region) {
536 var coords = packCoords(r, ','); 520 var rect = $(region).data('rect');
521 var coords = packCoords(rect, ',');
537 $infoDiv.append($('<div/>').text('<area coords="' + coords + '"/>')); 522 $infoDiv.append($('<div/>').text('<area coords="' + coords + '"/>'));
538 }); 523 });
539 $infoDiv.append($('<div/>').text('</map>')); 524 $infoDiv.append($('<div/>').text('</map>'));
540 return $infoDiv; 525 return $infoDiv;
541 }; 526 };
542 527
543 // SVG-style 528 // SVG-style
544 var regionInfoSVG = function (data) { 529 var regionInfoSVG = function (data, $regions) {
545 var cssPrefix = data.settings.cssPrefix; 530 var cssPrefix = data.settings.cssPrefix;
546 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'svgattr"/>'); 531 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'svgattr"/>');
547 $.each(data.userRegions, function(index, r) { 532 $regions.each(function(index, region) {
548 var coords = packCoords(r, ' '); 533 var rect = $(region).data('rect');
534 var coords = packCoords(rect, ',');
549 $infoDiv.append($('<div/>').text('"' + coords + '"')); 535 $infoDiv.append($('<div/>').text('"' + coords + '"'));
550 }); 536 });
551 return $infoDiv; 537 return $infoDiv;
552 }; 538 };
553 539
554 // CSV-style 540 // CSV-style
555 var regionInfoCSV = function (data) { 541 var regionInfoCSV = function (data, $regions) {
556 var cssPrefix = data.settings.cssPrefix; 542 var cssPrefix = data.settings.cssPrefix;
557 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'csv"/>'); 543 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'csv"/>');
558 $.each(data.userRegions, function(index, r) { 544 $regions.each(function(index, region) {
559 var coords = packCoords(r, ','); 545 var rect = $(region).data('rect');
546 var coords = packCoords(rect, ',');
560 $infoDiv.append($('<div/>').text(index+1 + ": " + coords)); 547 $infoDiv.append($('<div/>').text(index+1 + ": " + coords));
561 }); 548 });
562 return $infoDiv; 549 return $infoDiv;
563 }; 550 };
564 551
565 // digilib-style (h,w@x,y) 552 // digilib-style (h,w@x,y)
566 var regionInfoDigilib = function (data) { 553 var regionInfoDigilib = function (data, $regions) {
567 var cssPrefix = data.settings.cssPrefix; 554 var cssPrefix = data.settings.cssPrefix;
568 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'digilib"/>'); 555 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'digilib"/>');
569 $.each(data.userRegions, function(index, r) { 556 $regions.each(function(index, region) {
570 var coords = r.toString(); 557 var rect = $(region).data('rect');
558 var coords = packCoords(rect, ',');
571 $infoDiv.append($('<div/>').text(coords)); 559 $infoDiv.append($('<div/>').text(coords));
572 }); 560 });
573 return $infoDiv; 561 return $infoDiv;
574 }; 562 };
575 563
576 // show a region on top of the scaler image 564 // show a region on top of the scaler image
577 var renderRegion = function (data, rect, anim) { 565 var renderRegion = function (data, $regionDiv, anim) {
578 if (!data.imgTrafo) return; 566 if (!data.imgTrafo) return;
579 var zoomArea = data.zoomArea; 567 var zoomArea = data.zoomArea;
580 var $regionDiv = rect.$div; // DEPRECATED 568 var rect = $regionDiv.data('rect').copy();
581 if (!$regionDiv) {
582 console.error("renderRegion: rect has no $div", rect);
583 // alert("renderRegion: region has no $div to show");
584 return;
585 }
586 var regionRect = rect.copy();
587 var show = data.settings.isRegionVisible; 569 var show = data.settings.isRegionVisible;
588 if (show && zoomArea.overlapsRect(regionRect) && !regionRect.containsRect(zoomArea)) { 570 if (show && zoomArea.overlapsRect(rect) && !rect.containsRect(zoomArea)) {
589 regionRect.clipTo(zoomArea); 571 rect.clipTo(zoomArea);
590 var screenRect = data.imgTrafo.transform(regionRect); 572 var screenRect = data.imgTrafo.transform(rect);
591 // console.debug("renderRegion: pos=",geom.position(screenRect)); 573 // console.debug("renderRegion: pos=",geom.position(screenRect));
592 if (anim) { 574 if (anim) {
593 $regionDiv.fadeIn(); 575 $regionDiv.fadeIn();
594 } else{ 576 } else{
595 $regionDiv.show(); 577 $regionDiv.show();
605 } 587 }
606 }; 588 };
607 589
608 // show regions 590 // show regions
609 var renderRegions = function (data, anim) { 591 var renderRegions = function (data, anim) {
610 $.each(data.htmlRegions, function(index, region) { 592 var render = function(index, region) {
611 renderRegion(data, region, anim); 593 renderRegion(data, $(region), anim);
612 }); 594 };
613 $.each(data.userRegions, function(index, region) { 595 var $regions = getRegions(data, 'region')
614 renderRegion(data, region, anim); 596 $regions.each(render);
615 });
616 }; 597 };
617 598
618 // read region data from URL parameters 599 // read region data from URL parameters
619 var unpackRegions = function (data) { 600 var unpackRegions = function (data) {
620 var rg = data.settings.rg; 601 var rg = data.settings.rg;
628 return regions; 609 return regions;
629 }; 610 };
630 611
631 // pack user regions array into a URL parameter string 612 // pack user regions array into a URL parameter string
632 var packRegions = function (data) { 613 var packRegions = function (data) {
633 var regions = data.userRegions; 614 var $regions = getRegions(data, 'regionsURL');
634 if (!regions.length) { 615 if ($regions.length == 0) {
635 data.settings.rg = null; 616 data.settings.rg = null;
636 return; 617 return;
637 } 618 }
638 var coords = $.map(regions, function(region, index) { 619 var coords = $.map($regions, function($region, index) {
639 packCoords(region, '/'); 620 packCoords($region, '/');
640 }); 621 });
641 var rg = coords.join(','); 622 var rg = coords.join(',');
642 data.settings.rg = rg; 623 data.settings.rg = rg;
643 console.debug('pack regions:', rg); 624 console.debug('pack regions:', rg);
644 }; 625 };
747 console.debug('initialising regions plugin. data:', data); 728 console.debug('initialising regions plugin. data:', data);
748 var $elem = data.$elem; 729 var $elem = data.$elem;
749 var settings = data.settings; 730 var settings = data.settings;
750 var cssPrefix = data.settings.cssPrefix; 731 var cssPrefix = data.settings.cssPrefix;
751 FULL_AREA = geom.rectangle(0, 0, 1, 1); 732 FULL_AREA = geom.rectangle(0, 0, 1, 1);
752 // region arrays
753 data.userRegions = [];
754 data.htmlRegions = [];
755 // install event handlers 733 // install event handlers
756 var $data = $(data); 734 var $data = $(data);
757 $data.on('setup', handleSetup); 735 $data.on('setup', handleSetup);
758 $data.on('update', handleUpdate); 736 $data.on('update', handleUpdate);
759 $data.on('newRegion', handleNewRegion); 737 $data.on('newRegion', handleNewRegion);