# HG changeset patch
# User hertzhaft
# Date 1351433441 -3600
# Node ID ffda96c2fde011172228cb1a65b84466d0c13f8d
# Parent ae796bcac7f433319f7caa505196c887427a2bc0
use RegExp for finding regions; use ID for highlighting
diff -r ae796bcac7f4 -r ffda96c2fde0 webapp/src/main/webapp/jquery/jquery.digilib.css
--- a/webapp/src/main/webapp/jquery/jquery.digilib.css Sun Oct 28 00:53:31 2012 +0200
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.css Sun Oct 28 15:10:41 2012 +0100
@@ -141,6 +141,7 @@
}
div.dl-digilib div.dl-highlightregion {
+ background-color: transparent;
border: 5px solid orange;
opacity: 0.8;
}
diff -r ae796bcac7f4 -r ffda96c2fde0 webapp/src/main/webapp/jquery/jquery.digilib.regions.js
--- a/webapp/src/main/webapp/jquery/jquery.digilib.regions.js Sun Oct 28 00:53:31 2012 +0200
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.regions.js Sun Oct 28 15:10:41 2012 +0100
@@ -56,6 +56,8 @@
var geom = null;
// convenience variable, set in init()
var CSS = '';
+ // generate ids
+ var IDCOUNT = 20000;
var buttons = {
defineregion : {
@@ -112,6 +114,8 @@
'onNewRegion' : null,
// turn any region into a clickable link to its detail view (DEPRECATED)
'autoZoomOnClick' : false,
+ // zoom in when displaying the found region
+ 'autoZoomOnFind' : false,
// css selector for area/a elements (must also be marked with class "dl-keep")
'areaSelector' : 'map.dl-regioncontent area, map.dl-regioncontent a',
// general buttonset of this plugin
@@ -164,13 +168,22 @@
alert("Please turn on regions visibility!");
return;
}
- var selector = 'div.'+CSS+'findregion';
- var $regions = data.$elem.find(selector);
- if ($regions.length > 0) {
- $regions.remove();
+ // remove highlights
+ var selector = 'div.'+CSS+'highlightregion';
+ var $highlights = data.$elem.find(selector);
+ if ($highlights.length > 0) {
+ $highlights.removeClass(CSS+'highlightregion');
+ return;
+ }
+ // remove findregion divs
+ selector = 'div.'+CSS+'findregion';
+ var $findregions = data.$elem.find(selector);
+ if ($findregions.length > 0) {
+ $findregions.remove();
redisplay(data);
return;
}
+ // remove most recently added user region
selector = 'div.'+CSS+'regionURL';
var $region = data.$elem.find(selector).last();
if ($region.length > 0) {
@@ -248,7 +261,7 @@
fn.centerOnScreen(data, $info);
},
- // display region coordinates in an edit line
+ // display region coordinates in a selected edit line (for copying)
showRegionCoords : function (data, $regionDiv) {
var $elem = data.$elem;
var rect = $regionDiv.data('rect');
@@ -303,6 +316,14 @@
redisplay(data);
},
+ // highlight regions by id
+ highlightRegions : function (data, ids) {
+ if (ids == null || ids.length < 1) return;
+ var selector = '#'+ids.join(',#');
+ var $regions = data.$elem.find(selector);
+ $regions.addClass(CSS+'highlightregion');
+ },
+
// find coordinates and display as new region
findCoords : function (data) {
var $elem = data.$elem;
@@ -343,7 +364,7 @@
$input.focus();
},
- // find text data and display as new region
+ // find a region by text data and higlight it
findData : function (data) {
var $elem = data.$elem;
var findSelector = '#'+CSS+'regionFindData';
@@ -372,14 +393,15 @@
var $options = $select.find('option');
// callback if a region is selected by name
var findRegion = function () {
- var coords = $select.val();
- actions.regionFromCoords(data, coords);
+ var id = [$select.val()];
+ actions.highlightRegions(data, id);
fn.withdraw($info);
return false;
};
// adapt dropdown, show only matching entries
var filterOptions = function (text) {
if (!text) {
+ // not text, display all options, select first (empty)
$options.show();
$select.prop("selectedIndex", 0);
return;
@@ -388,7 +410,7 @@
$options.each(function (index) {
var $option = $(this);
// TODO: more sophisticated matching
- if ($option.text().indexOf(text) > 1) {
+ if (matchText($option.text(), text)) {
$option.show();
if (first) {
$select.prop("selectedIndex", index);
@@ -397,7 +419,7 @@
} else {
if (index > 0) $option.hide();
}
- if (first) {
+ if (first) { // no hit, display and select empty option
$select.prop("selectedIndex", 0);
}
});
@@ -407,7 +429,10 @@
$select.on('change', findRegion);
$input.on('keyup', function (event) {
// ugly: we need setTimeout here to get an updated val();
- window.setTimeout(filterOptions, 50, $input.val());
+ window.setTimeout(filterOptions, 100, $input.val());
+ if (event.keyCode == '38' || event.keyCode == '40') { // arrows
+ $select.focus();
+ }
});
// handle cancel
$form.find('.'+CSS+'cancel').on('click', function () {
@@ -419,6 +444,19 @@
}
};
+ // match search text
+ var matchText = function (optiontext, text) {
+ // sanitize and split
+ var parts = text.replace(/([\\\(\)\-\!.+?*])/g, '\\$1').split(/\s+/);
+ // match all parts anywhere in optiontext
+ var regexparts = $.map(parts, function(part) {
+ return '(?=.*'+part+')'; // one lookahead for each part
+ });
+ var RE = new RegExp(regexparts.join(''), 'i');
+ var result = optiontext.match(RE);
+ return result;
+ };
+
// make a coords string
var packCoords = function (rect, sep) {
if (sep == null) sep = ','; // comma as default separator
@@ -472,6 +510,11 @@
if (attributes['title']) {
$regionDiv.data('text', attributes['title']);
}
+ // create an ID if none exists
+ if (!attributes['id']) {
+ attributes['id'] = CSS+IDCOUNT.toString(16);
+ IDCOUNT += 1;
+ }
$regionDiv.attr(attributes);
};
@@ -568,13 +611,14 @@
var rect = $region.data('rect');
if (rect == null)
return null;
- var coords = packCoords(rect, ',');
+ // var coords = packCoords(rect, ',');
+ var id = $region.attr('id');
var text = $region.data('text');
var sortstring = $region.data('sort')
|| (typeof sortfunc === 'function')
? sortfunc(text)
: text;
- var option = '';
+ var option = '';
options.push([sortstring, option]);
};
var $regions = getRegions(data, selector);