Mercurial > hg > digilib-old
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); |