Mercurial > hg > digilib-old
annotate webapp/src/main/webapp/jquery/jquery.digilib.regions.js @ 1158:2ee261676828 default tip
better out-of-the box experience:
* digilib works without config files using sensible defaults
* new sample images folder used by default
* config files moved to templates
author | robcast |
---|---|
date | Tue, 19 Feb 2013 17:32:25 +0100 |
parents | bbb09797d7fc |
children |
rev | line source |
---|---|
792 | 1 /** optional digilib regions plugin |
2 | |
1023 | 3 Mark up a digilib image with rectangular regions. |
4 | |
1102 | 5 If the parameter "processHtmlRegions" is set, the plugin reads region data from HTML. |
6 Region data should be declared inside in the digilib element, like so: | |
792 | 7 |
1025 | 8 <map class="dl-keep dl-regioncontent"> |
9 <area href="http://www.mpiwg-berlin.mpg.de" coords="0.1,0.1,0.4,0.1" alt="MPI fuer Wissenschaftsgeschichte"/> | |
10 <area href="http://www.biblhertz.it" coords="0.5,0.8,0.4,0.1" alt="Bibliotheca Hertziana"/> | |
11 <area coords="0.3,0.5,0.15,0.1" /> | |
12 </map> | |
1023 | 13 |
1067 | 14 According to the HTML specs, "area" and "a" elements are allowed inside of a "map". |
15 Both can have a "coords" attribute, but "area" elements can't contain child nodes. | |
1102 | 16 To have regions with content use "a" tags, like so:. |
1067 | 17 |
18 <map class="dl-keep dl-regioncontent"> | |
19 <a href="http://www.mpiwg-berlin.mpg.de" coords="0.4907,0.3521,0.1458,0.107"> | |
20 MPI fuer Wissenschaftsgeschichte | |
21 </a> | |
22 <a href="http://www.biblhertz.it" coords="0.3413,0.2912,0.4345,0.2945"> | |
23 Bibliotheca Hertziana | |
24 </a> | |
25 <area coords="0.3,0.5,0.15,0.1" /> | |
26 </map> | |
27 | |
1102 | 28 Regions can also be defined in Javascript: |
29 Set the parameter "regions" to an array with items. | |
30 Each item should be an object containing the following fields: | |
31 | |
32 rect | |
33 a retangle with relative coordinates (0..1); | |
34 index (optional) | |
35 a number to display in the region | |
36 attributes (optional) | |
37 HTML attributes for the region (id, class, title) | |
38 inner (optional) | |
39 inner HTML (has to be a jQuery object) | |
40 | |
792 | 41 */ |
42 | |
1109 | 43 (function ($) { |
813 | 44 // the digilib object |
996 | 45 var digilib = null; |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
46 // the normal zoom area |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
47 var FULL_AREA = null; |
813 | 48 // the functions made available by digilib |
1048 | 49 var fn = { |
50 // dummy function to avoid errors, gets overwritten by buttons plugin | |
51 highlightButtons : function () { | |
52 console.debug('regions: dummy function - highlightButtons'); | |
53 } | |
54 }; | |
813 | 55 // affine geometry plugin |
996 | 56 var geom = null; |
1102 | 57 // convenience variable, set in init() |
58 var CSS = ''; | |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
59 // generate ids |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
60 var IDCOUNT = 20000; |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
61 |
792 | 62 var buttons = { |
1091 | 63 defineregion : { |
64 onclick : "defineUserRegion", | |
813 | 65 tooltip : "define a region", |
792 | 66 icon : "addregion.png" |
67 }, | |
1091 | 68 removeregion : { |
69 onclick : "removeUserRegion", | |
70 tooltip : "delete the last user defined region", | |
792 | 71 icon : "delregion.png" |
72 }, | |
1091 | 73 removeallregions : { |
74 onclick : "removeAllUserRegions", | |
75 tooltip : "delete all user defined regions", | |
1137 | 76 icon : "delregions.png" |
1067 | 77 }, |
792 | 78 regions : { |
79 onclick : "toggleRegions", | |
80 tooltip : "show or hide regions", | |
1137 | 81 icon : "showregions.png" |
792 | 82 }, |
1092 | 83 findcoords : { |
84 onclick : "findCoords", | |
1098 | 85 tooltip : "find a region by entering its relative coordinates", |
1137 | 86 icon : "findcoords.png" |
1098 | 87 }, |
88 finddata : { | |
89 onclick : "findData", | |
90 tooltip : "find a region by entering text", | |
1137 | 91 icon : "findregion.png" |
792 | 92 } |
93 }; | |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
94 |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
95 var defaults = { |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
96 // are regions shown? |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
97 'isRegionVisible' : true, |
813 | 98 // are region numbers shown? |
1023 | 99 'showRegionNumbers' : true, |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
100 // default width for region when only point is given |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
101 'regionWidth' : 0.005, |
1137 | 102 // zoomfactor for displaying larger area around region (for autoZoomOnClick) |
103 'regionAutoZoomFactor' : 3, | |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
104 // is there region content in the page? |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
105 'processHtmlRegions' : false, |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
106 // region defined by users and in the URL |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
107 'processUserRegions' : true, |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
108 // callback for click on region |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
109 'onClickRegion' : null, |
1091 | 110 // callback when new user region is defined |
111 'onNewRegion' : null, | |
1137 | 112 // turn any region into a clickable link to its detail view |
113 'autoZoomOnClick' : true, | |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
114 // zoom in when displaying the found region |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
115 'autoZoomOnFind' : false, |
1091 | 116 // css selector for area/a elements (must also be marked with class "dl-keep") |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
117 'areaSelector' : 'map.dl-regioncontent area, map.dl-regioncontent a', |
1104 | 118 // general buttonset of this plugin |
1137 | 119 'regionSet' : ['regions', 'finddata', 'findcoords', 'lessoptions'], |
1104 | 120 // buttonset for region editing by user |
1137 | 121 'userRegionSet' : ['defineregion', 'removeregion', 'removeallregions'], |
813 | 122 // url param for regions |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
123 'rg' : null, |
1102 | 124 // array with region data |
125 'regions' : null, | |
1109 | 126 // function for extracting the sort string (for the region search window) |
127 'regionSortString' : null, | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
128 // region attributes to copy from HTML |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
129 'regionAttributes' : { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
130 'id' :1, |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
131 'href' :1, |
1102 | 132 'name' :1, |
133 'alt' :1, | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
134 'target':1, |
1102 | 135 'title' :1, |
136 'style' :1 | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
137 } |
813 | 138 }; |
792 | 139 |
140 var actions = { | |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
141 |
792 | 142 // define a region interactively with two clicked points |
1109 | 143 defineUserRegion : function (data) { |
813 | 144 if (!data.settings.isRegionVisible) { |
145 alert("Please turn on regions visibility!"); | |
146 return; | |
147 } | |
1109 | 148 var onComplete = function (data, rect) { |
1107 | 149 if (rect == null) return; |
1103 | 150 var count = getRegions(data, 'regionURL').length; |
1107 | 151 var attr = {'class' : CSS+'regionURL '+CSS+'overlay'}; |
152 var item = {'rect' : rect, 'index' : count, 'attributes' : attr}; | |
153 var $regionDiv = addRegionDiv(data, item); | |
1091 | 154 fn.highlightButtons(data, 'defineregion', 0); |
813 | 155 redisplay(data); |
1095 | 156 $(data).trigger('newRegion', [$regionDiv]); |
1107 | 157 }; |
1091 | 158 fn.highlightButtons(data, 'defineregion', 1); |
1107 | 159 fn.defineArea(data, onComplete, CSS+'regionArea'); |
792 | 160 }, |
161 | |
1109 | 162 // remove all findregions or the last added user-defined region |
1091 | 163 removeUserRegion : function (data) { |
813 | 164 if (!data.settings.isRegionVisible) { |
165 alert("Please turn on regions visibility!"); | |
166 return; | |
167 } | |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
168 // remove highlights |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
169 var selector = 'div.'+CSS+'highlightregion'; |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
170 var $highlights = data.$elem.find(selector); |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
171 if ($highlights.length > 0) { |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
172 $highlights.removeClass(CSS+'highlightregion'); |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
173 return; |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
174 } |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
175 // remove findregion divs |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
176 selector = 'div.'+CSS+'findregion'; |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
177 var $findregions = data.$elem.find(selector); |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
178 if ($findregions.length > 0) { |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
179 $findregions.remove(); |
1109 | 180 redisplay(data); |
181 return; | |
182 } | |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
183 // remove most recently added user region |
1109 | 184 selector = 'div.'+CSS+'regionURL'; |
185 var $region = data.$elem.find(selector).last(); | |
186 if ($region.length > 0) { | |
1137 | 187 $region.remove(); |
1109 | 188 redisplay(data); |
189 return; | |
190 } | |
792 | 191 }, |
192 | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
193 // remove all manually added regions (defined through URL "rg" parameter) |
1091 | 194 removeAllUserRegions : function (data) { |
1067 | 195 if (!data.settings.isRegionVisible) { |
196 alert("Please turn on regions visibility!"); | |
197 return; | |
198 } | |
1109 | 199 var selector = 'div.'+CSS+'regionURL, div.'+CSS+'findregion'; |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
200 var $regionDivs = data.$elem.find(selector); |
1107 | 201 if ($regionDivs.length == 0) return; |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
202 $regionDivs.remove(); |
1067 | 203 redisplay(data); |
204 }, | |
205 | |
813 | 206 // show/hide regions |
1060 | 207 toggleRegions : function (data) { |
813 | 208 var show = !data.settings.isRegionVisible; |
209 data.settings.isRegionVisible = show; | |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
210 fn.highlightButtons(data, 'regions', show); |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
211 renderRegions(data, 1); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
212 }, |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
213 |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
214 // display region coordinates in a selected edit line (for copying) |
1095 | 215 showRegionCoords : function (data, $regionDiv) { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
216 var $elem = data.$elem; |
1095 | 217 var rect = $regionDiv.data('rect'); |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
218 var text = $regionDiv.data('text'); |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
219 var coordString = packCoords(rect, ','); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
220 var html = '\ |
1102 | 221 <div id="'+CSS+'regionInfo" class="'+CSS+'keep '+CSS+'regionInfo">\ |
1098 | 222 <div>'+text+'</div>\ |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
223 <input name="coords" type="text" size="30" maxlength="40" value="'+coordString+'"/>\ |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
224 </div>'; |
1091 | 225 var $info = $(html); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
226 $info.appendTo($elem); |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
227 $div = $info.find('div'); |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
228 $div.text(text); |
1091 | 229 $input = $info.find('input'); |
230 $input.on('focus.regioninfo', function (event) { | |
231 this.select(); | |
232 }); | |
233 $input.on('blur.regioninfo', function (event) { | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
234 fn.withdraw($info); |
1091 | 235 return false; |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
236 }); |
1091 | 237 $input.on('keypress.regioninfo', function (event) { |
1092 | 238 fn.withdraw($info); // OBS: "return false" disables copy! |
1091 | 239 }); |
240 $input.prop("readonly",true); | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
241 $info.fadeIn(); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
242 fn.centerOnScreen(data, $info); |
1091 | 243 $input.focus(); |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
244 console.debug('showRegionCoords', coordString); |
1092 | 245 }, |
1091 | 246 |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
247 // draw a find region from coords and move into view |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
248 regionFromCoords : function (data, coords) { |
1095 | 249 var rect = parseCoords(data, coords); |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
250 if (rect == null) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
251 alert('invalid coordinates: ' + coords); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
252 return; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
253 } |
1107 | 254 var attr = { 'class' : CSS+'findregion' }; |
1102 | 255 var item = { 'rect' : rect, 'attributes' : attr }; |
256 var $regionDiv = addRegionDiv(data, item); | |
1111
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1110
diff
changeset
|
257 var newZoomArea = fn.centerZoomArea(data, rect); |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1110
diff
changeset
|
258 console.debug('regionFromCoords', coords, rect, newZoomArea); |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
259 redisplay(data); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
260 }, |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
261 |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
262 // highlight regions by id |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
263 highlightRegions : function (data, ids) { |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
264 if (ids == null || ids.length < 1) return; |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
265 var selector = '#'+ids.join(',#'); |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
266 var $regions = data.$elem.find(selector); |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
267 $regions.addClass(CSS+'highlightregion'); |
1111
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1110
diff
changeset
|
268 if (ids.length == 1) { |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1110
diff
changeset
|
269 var rect = $regions.data('rect'); |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1110
diff
changeset
|
270 fn.centerZoomArea(data, rect); |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1110
diff
changeset
|
271 redisplay(data); |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1110
diff
changeset
|
272 } |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
273 }, |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
274 |
1092 | 275 // find coordinates and display as new region |
276 findCoords : function (data) { | |
277 var $elem = data.$elem; | |
1102 | 278 var findSelector = '#'+CSS+'regionFindCoords'; |
1098 | 279 if (fn.isOnScreen(data, findSelector)) return; // already onscreen |
1092 | 280 var html = '\ |
1102 | 281 <div id="'+CSS+'regionFindCoords" class="'+CSS+'keep '+CSS+'regionInfo">\ |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
282 <div>coordinates to find:</div>\ |
1102 | 283 <form class="'+CSS+'form">\ |
1092 | 284 <div>\ |
1109 | 285 <input class="'+CSS+'input" name="coords" type="text" size="30"/> \ |
1092 | 286 </div>\ |
1102 | 287 <input class="'+CSS+'submit" type="submit" name="sub" value="Ok"/>\ |
288 <input class="'+CSS+'cancel" type="button" value="Cancel"/>\ | |
1092 | 289 </form>\ |
290 </div>'; | |
291 var $info = $(html); | |
292 $info.appendTo($elem); | |
293 var $form = $info.find('form'); | |
1102 | 294 var $input = $info.find('input.'+CSS+'input'); |
1092 | 295 // handle submit |
296 $form.on('submit', function () { | |
297 var coords = $input.val(); | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
298 actions.regionFromCoords(data, coords); |
1092 | 299 fn.withdraw($info); |
300 return false; | |
1102 | 301 }); |
1107 | 302 // handle blur |
303 $input.on('blur', function () { | |
304 fn.withdraw($info); | |
305 }); | |
1092 | 306 // handle cancel |
1102 | 307 $form.find('.'+CSS+'cancel').on('click', function () { |
1092 | 308 fn.withdraw($info); |
1102 | 309 }); |
1092 | 310 $info.fadeIn(); |
311 fn.centerOnScreen(data, $info); | |
312 $input.focus(); | |
1098 | 313 }, |
314 | |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
315 // find a region by text data and higlight it |
1098 | 316 findData : function (data) { |
317 var $elem = data.$elem; | |
1102 | 318 var findSelector = '#'+CSS+'regionFindData'; |
1098 | 319 if (fn.isOnScreen(data, findSelector)) return; // already onscreen |
1141 | 320 var options = filteredOptions(data, 'regionHTML'); |
1098 | 321 var html = '\ |
1102 | 322 <div id="'+CSS+'regionFindData" class="'+CSS+'keep '+CSS+'regionInfo">\ |
1141 | 323 <div>Find object:</div>\ |
1102 | 324 <form class="'+CSS+'form">\ |
1098 | 325 <div>\ |
1109 | 326 <select class="'+CSS+'finddata">\ |
327 <option/>\ | |
1141 | 328 '+options+'\ |
1098 | 329 </select>\ |
330 </div>\ | |
1109 | 331 <input class="'+CSS+'input" name="data" type="text" size="30" /> \ |
1102 | 332 <input class="'+CSS+'submit" type="submit" name="sub" value="Ok"/>\ |
333 <input class="'+CSS+'cancel" type="button" value="Cancel"/>\ | |
1098 | 334 </form>\ |
335 </div>'; | |
336 var $info = $(html); | |
337 $info.appendTo($elem); | |
338 var $form = $info.find('form'); | |
1102 | 339 var $input = $info.find('input.'+CSS+'input'); |
1098 | 340 var $select = $info.find('select'); |
1109 | 341 var $options = $select.find('option'); |
342 // callback if a region is selected by name | |
1098 | 343 var findRegion = function () { |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
344 var id = [$select.val()]; |
1111
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1110
diff
changeset
|
345 fn.withdraw($info); |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
346 actions.highlightRegions(data, id); |
1098 | 347 return false; |
348 }; | |
1109 | 349 // adapt dropdown, show only matching entries |
1141 | 350 var filterOptions = function (filter) { |
351 var options = filteredOptions(data, 'regionHTML', filter); | |
352 $select.empty(); | |
353 $select.append($(options)); | |
1109 | 354 }; |
1098 | 355 // handle submit |
356 $form.on('submit', findRegion); | |
357 $select.on('change', findRegion); | |
1109 | 358 $input.on('keyup', function (event) { |
359 // ugly: we need setTimeout here to get an updated val(); | |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
360 window.setTimeout(filterOptions, 100, $input.val()); |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
361 if (event.keyCode == '38' || event.keyCode == '40') { // arrows |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
362 $select.focus(); |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
363 } |
1109 | 364 }); |
1098 | 365 // handle cancel |
1102 | 366 $form.find('.'+CSS+'cancel').on('click', function () { |
1098 | 367 fn.withdraw($info); |
1102 | 368 }); |
1098 | 369 $info.fadeIn(); |
370 fn.centerOnScreen(data, $info); | |
371 $input.focus(); | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
372 } |
792 | 373 }; |
374 | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
375 // make a coords string |
1095 | 376 var packCoords = function (rect, sep) { |
1091 | 377 if (sep == null) sep = ','; // comma as default separator |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
378 return [ |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
379 fn.cropFloatStr(rect.x), |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
380 fn.cropFloatStr(rect.y), |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
381 fn.cropFloatStr(rect.width), |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
382 fn.cropFloatStr(rect.height) |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
383 ].join(sep); |
813 | 384 }; |
385 | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
386 // create a rectangle from a coords string |
1095 | 387 var parseCoords = function (data, coords) { |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
388 var pos = coords.match(/[0-9.]+/g); // TODO: check validity? |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
389 if (pos == null) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
390 return null; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
391 } |
1092 | 392 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
393 if (!fn.isNumber(rect.x) || !fn.isNumber(rect.y)) { |
1092 | 394 return null; |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
395 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
396 if (!rect.getArea()) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
397 var pt = rect.getPosition(); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
398 rect.width = data.settings.regionWidth; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
399 rect.height = rect.width; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
400 rect.setCenter(pt); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
401 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
402 return rect; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
403 }; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
404 |
1095 | 405 // create a new regionDiv and add it to data.$elem |
1102 | 406 var newRegionDiv = function (data, attr) { |
407 var cls = CSS+'region'; | |
1107 | 408 var $regionDiv = $('<div class="'+cls+'"/>'); |
1102 | 409 addRegionAttributes(data, $regionDiv, attr); |
1095 | 410 data.$elem.append($regionDiv); |
411 return $regionDiv; | |
412 }; | |
413 | |
414 // copy attributes to a region div | |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
415 var addRegionAttributes = function (data, $regionDiv, attributes) { |
1095 | 416 if (attributes == null) return; |
417 if (attributes['class']) { | |
418 $regionDiv.addClass(attributes['class']); | |
419 delete attributes['class']; | |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
420 } |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
421 if (attributes['href']) { |
1102 | 422 $regionDiv.data('href', attributes['href']); |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
423 delete attributes['href']; |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
424 } |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
425 if (attributes['title']) { |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
426 $regionDiv.data('text', attributes['title']); |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
427 } |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
428 // create an ID if none exists |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
429 if (!attributes['id']) { |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
430 attributes['id'] = CSS+IDCOUNT.toString(16); |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
431 IDCOUNT += 1; |
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
432 } |
1095 | 433 $regionDiv.attr(attributes); |
434 }; | |
435 | |
436 // set region number | |
437 var addRegionNumber = function (data, $regionDiv, index) { | |
1103 | 438 if (!data.settings.showRegionNumbers) return; |
439 if (!fn.isNumber(index)) return; | |
1102 | 440 var $number = $('<a class="'+CSS+'regionnumber">'+index+'</a>'); |
1095 | 441 $regionDiv.append($number); |
442 return $regionDiv; | |
443 }; | |
444 | |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
445 // construct a region from a rectangle |
1102 | 446 var addRegionDiv = function (data, item) { |
447 var $regionDiv = newRegionDiv(data, item.attributes); | |
1095 | 448 var settings = data.settings; |
1102 | 449 // add region number |
1103 | 450 addRegionNumber(data, $regionDiv, item.index); |
1102 | 451 // add inner HTML |
452 if (item.inner) { | |
453 $regionDiv.append(item.inner); | |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
454 } |
1102 | 455 // store the coordinates in data |
456 $regionDiv.data('rect', item.rect); | |
457 // trigger a region event on click | |
1109 | 458 $regionDiv.on('click.dlRegion', function (event) { |
1102 | 459 $(data).trigger('regionClick', [$regionDiv]); |
460 }); | |
1095 | 461 return $regionDiv; |
462 }; | |
463 | |
1102 | 464 // create regions from a Javascript array of items |
465 var createRegionsFromJS = function (data, items) { | |
1109 | 466 $.each(items, function (index, item) { |
1102 | 467 addRegionDiv(data, item); |
468 }); | |
469 }; | |
470 | |
851 | 471 // create regions from URL parameters |
472 var createRegionsFromURL = function (data) { | |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
473 var userRegions = unpackRegions(data); |
1102 | 474 if (!userRegions) return; |
475 createRegionsFromJS(data, userRegions); | |
792 | 476 }; |
477 | |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
478 // create regions from HTML |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
479 var createRegionsFromHTML = function (data) { |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
480 // regions are defined in "area" tags |
1102 | 481 var $areas = data.$elem.find(data.settings.areaSelector); |
482 console.debug("createRegionsFromHTML - elems found: ", $areas.length); | |
1109 | 483 $areas.each(function (index, area) { |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
484 var $area = $(area); |
1102 | 485 // the "title" attribute contains the text for the tooltip |
486 var title = $area.attr('title'); | |
852 | 487 // the "coords" attribute contains the region coords (0..1) |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
488 var coords = $area.attr('coords'); |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
489 // create the rectangle |
1095 | 490 var rect = parseCoords(data, coords); |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
491 if (rect == null) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
492 return console.error('bad coords in HTML:', title, coords); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
493 } |
1102 | 494 // mark div class as regionHTML |
495 var cls = $area.attr('class') || ''; | |
1107 | 496 cls += ' '+CSS+'regionHTML '+CSS+'overlay'; |
1102 | 497 var attr = {'class' : cls}; |
1095 | 498 // copy attributes |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
499 for (var n in data.settings.regionAttributes) { |
1102 | 500 attr[n] = $area.attr(n); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
501 } |
1102 | 502 // copy inner HTML |
503 var $inner = $area.contents().clone(); | |
504 if (attr.href != null) { | |
1025 | 505 // wrap contents in a-tag |
1102 | 506 var $a = $('<a href="'+attr.href+'"/>'); |
507 $inner = $a.append($inner); | |
1025 | 508 } |
1102 | 509 var item = {'rect' : rect, 'attributes' : attr, 'inner' : $inner}; |
510 var $regionDiv = addRegionDiv(data, item); | |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
511 }); |
1111
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1110
diff
changeset
|
512 // $areas.removeAttr('id'); |
0a01d5cc66fe
center zoom area (not yet working for text search + highlight)
hertzhaft
parents:
1110
diff
changeset
|
513 $areas.remove(); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
514 }; |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
515 |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
516 // select region divs (HTML or URL) |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
517 var getRegions = function (data, selector) { |
1102 | 518 var $regions = data.$elem.find('div.'+CSS+selector); |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
519 return $regions; |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
520 }; |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
521 |
1141 | 522 // create a filter text matcher |
523 var getFilterRE = function (filter) { | |
524 if (!filter) return null; | |
525 // sanitize and split | |
526 var parts = filter.replace(/([\\\(\)\-\!.+?*])/g, '\\$1').split(/\s+/); | |
527 // match all parts anywhere in optiontext | |
528 var regexparts = $.map(parts, function(part) { | |
529 // one lookahead for each filter part | |
530 return '(?=.*'+part+')'; | |
531 }); | |
532 var RE = new RegExp(regexparts.join(''), 'i'); | |
533 return RE; | |
534 }; | |
535 | |
1109 | 536 // make HTML option from regions text data |
1141 | 537 var filteredOptions = function (data, selector, filter) { |
1109 | 538 var options = []; |
1141 | 539 var sort = data.settings.regionSortString; |
540 var RE = getFilterRE(filter); | |
1109 | 541 var createOption = function (index, region) { |
542 var $region = $(region); | |
543 var rect = $region.data('rect'); | |
1141 | 544 if (rect == null) return; |
1110
ffda96c2fde0
use RegExp for finding regions; use ID for highlighting
hertzhaft
parents:
1109
diff
changeset
|
545 // var coords = packCoords(rect, ','); |
1109 | 546 var text = $region.data('text'); |
1141 | 547 if (RE == null || text.match(RE)) { |
548 var id = $region.attr('id'); | |
549 var sortstring = $region.data('sort') | |
550 || (typeof sort === 'function') | |
551 ? sort(text) | |
552 : text; | |
553 var option = '<option value="'+id+'">'+text+'</option>'; | |
554 options.push([sortstring, option]); | |
555 } | |
1098 | 556 }; |
557 var $regions = getRegions(data, selector); | |
1109 | 558 $.each($regions, createOption); |
559 options.sort(function (a, b) { | |
560 return a[0].localeCompare(b[0]); | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
561 }); |
1109 | 562 var sorted = $.map(options, function (str, index) { |
563 return str[1]; | |
564 }); | |
565 // prepend an empty option | |
566 return sorted.join(''); | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
567 }; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
568 |
813 | 569 // show a region on top of the scaler image |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
570 var renderRegion = function (data, $regionDiv, anim) { |
813 | 571 if (!data.imgTrafo) return; |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
947
diff
changeset
|
572 var zoomArea = data.zoomArea; |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
573 var rect = $regionDiv.data('rect').copy(); |
813 | 574 var show = data.settings.isRegionVisible; |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
575 if (show && zoomArea.overlapsRect(rect) && !rect.containsRect(zoomArea)) { |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
576 rect.clipTo(zoomArea); |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
577 var screenRect = data.imgTrafo.transform(rect); |
1067 | 578 // console.debug("renderRegion: pos=",geom.position(screenRect)); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
579 if (anim) { |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
580 $regionDiv.fadeIn(); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
581 } else{ |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
582 $regionDiv.show(); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
583 } |
1024 | 584 // adjustDiv sets wrong coords when called BEFORE show() |
851 | 585 screenRect.adjustDiv($regionDiv); |
813 | 586 } else { |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
587 if (anim) { |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
588 $regionDiv.fadeOut(); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
589 } else{ |
824 | 590 $regionDiv.hide(); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
591 } |
813 | 592 } |
593 }; | |
594 | |
595 // show regions | |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
596 var renderRegions = function (data, anim) { |
1109 | 597 var render = function (index, region) { |
1096
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
598 renderRegion(data, $(region), anim); |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
599 }; |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
600 var $regions = getRegions(data, 'region') |
3c75dda660bf
more refactoring: use jquery selections instead of arrays
hertzhaft
parents:
1095
diff
changeset
|
601 $regions.each(render); |
813 | 602 }; |
603 | |
1091 | 604 // read region data from URL parameters |
813 | 605 var unpackRegions = function (data) { |
606 var rg = data.settings.rg; | |
1095 | 607 if (rg == null) return []; |
608 var coords = rg.split(","); | |
1109 | 609 var regions = $.map(coords, function (coord, index) { |
1095 | 610 var pos = coord.split("/", 4); |
813 | 611 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); |
1107 | 612 var attr = {'class' : CSS+"regionURL "+CSS+"overlay"}; |
1102 | 613 var item = {'rect' : rect, 'index' : index+1, 'attributes' : attr}; |
614 return item; | |
1095 | 615 }); |
616 return regions; | |
792 | 617 }; |
618 | |
1091 | 619 // pack user regions array into a URL parameter string |
813 | 620 var packRegions = function (data) { |
1102 | 621 var $regions = getRegions(data, 'regionURL'); |
1103 | 622 if ($regions.length == 0 || !data.settings.processUserRegions) { |
815 | 623 data.settings.rg = null; |
624 return; | |
625 } | |
1109 | 626 var pack = function (region, index) { |
1099 | 627 var $region = $(region); |
628 var rect = $region.data('rect'); | |
1102 | 629 var packed = packCoords(rect, '/'); |
630 return packed; | |
1099 | 631 }; |
1102 | 632 var coords = $.map($regions, pack); |
1095 | 633 var rg = coords.join(','); |
813 | 634 data.settings.rg = rg; |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
635 console.debug('pack regions:', rg); |
792 | 636 }; |
637 | |
1137 | 638 // zoom in, displaying the region in the middle of the screen |
639 var zoomToRegion = function (data, $regionDiv) { | |
640 var settings = data.settings; | |
641 var rect = $regionDiv.data('rect'); | |
642 var za = rect.copy(); | |
643 var factor = settings.regionAutoZoomFactor; | |
644 za.width *= factor; | |
645 za.height *= factor; | |
646 // var screen = fn.getFullscreenRect(data); | |
647 za.setProportion(1, true); // avoid extreme zoomArea proportions | |
648 za.setCenter(rect.getCenter()).stayInside(FULL_AREA); | |
649 fn.setZoomArea(data, za); | |
650 fn.redisplay(data); | |
1095 | 651 }; |
652 | |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
653 // reload display after a region has been added or removed |
813 | 654 var redisplay = function (data) { |
1103 | 655 packRegions(data); |
813 | 656 fn.redisplay(data); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
657 }; |
813 | 658 |
1091 | 659 // event handler, gets called when a newRegion event is triggered |
1095 | 660 var handleNewRegion = function (evt, $regionDiv) { |
1091 | 661 var data = this; |
662 var settings = data.settings; | |
1095 | 663 console.debug("regions: handleNewRegion", $regionDiv); |
1091 | 664 if (typeof settings.onNewRegion === 'function') { |
665 // execute callback | |
1095 | 666 return settings.onNewRegion(data, $regionDiv); |
1091 | 667 } |
668 if (typeof settings.onNewRegion === 'string') { | |
669 // execute action | |
1095 | 670 return actions[settings.onNewRegion](data, $regionDiv); |
1091 | 671 } |
672 }; | |
673 | |
674 // event handler, gets called when a regionClick event is triggered | |
1095 | 675 var handleRegionClick = function (evt, $regionDiv) { |
1091 | 676 var data = this; |
677 var settings = data.settings; | |
1095 | 678 console.debug("regions: handleRegionClick", $regionDiv); |
679 if ($regionDiv.data('href')) { | |
1091 | 680 // follow the href attribute of the region area |
1095 | 681 window.location = $regionDiv.data('href'); //TODO: how about target? |
1091 | 682 } |
683 if (typeof settings.onClickRegion === 'function') { | |
684 // execute callback | |
1095 | 685 return settings.onClickRegion(data, $regionDiv); |
1091 | 686 } |
687 if (typeof settings.onClickRegion === 'string') { | |
688 // execute action | |
1095 | 689 return actions[settings.onClickRegion](data, $regionDiv); |
1091 | 690 } |
691 }; | |
692 | |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
693 // event handler, reads region parameter and creates region divs |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
694 var handleSetup = function (evt) { |
941 | 695 var data = this; |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
696 var settings = data.settings; |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
697 console.debug("regions: handleSetup", settings.rg); |
1102 | 698 // regions with content are given in a Javascript array |
699 if (settings.regions) { | |
700 createRegionsFromJS(data, settings.regions); | |
701 } | |
1048 | 702 // regions with content are given in HTML divs |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
703 if (settings.processHtmlRegions) { |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
704 createRegionsFromHTML(data); |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
705 } |
1048 | 706 // regions are defined in the URL |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
707 if (settings.processUserRegions) { |
851 | 708 createRegionsFromURL(data); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
709 } |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
710 }; |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
711 |
851 | 712 // event handler, sets buttons and shows regions when scaler img is reloaded |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
713 var handleUpdate = function (evt) { |
941 | 714 var data = this; |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
715 console.debug("regions: handleUpdate"); |
848 | 716 var settings = data.settings; |
717 fn.highlightButtons(data, 'regions' , settings.isRegionVisible); | |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
718 renderRegions(data); |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
719 }; |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
720 |
1048 | 721 // additional buttons |
722 var installButtons = function (data) { | |
723 var settings = data.settings; | |
724 var mode = settings.interactionMode; | |
725 var buttonSettings = settings.buttonSettings[mode]; | |
1104 | 726 var buttonSet = settings.regionSet; |
727 if (settings.processUserRegions) { | |
728 var first = buttonSet.slice(0,1); | |
729 var rest = buttonSet.slice(1); | |
730 buttonSet = first.concat(settings.userRegionSet, rest); | |
731 } | |
1048 | 732 // set regionSet to [] or '' for no buttons (when showing regions only) |
733 if (buttonSet.length && buttonSet.length > 0) { | |
734 buttonSettings.regionSet = buttonSet; | |
735 buttonSettings.buttonSets.push('regionSet'); | |
736 } | |
737 }; | |
738 | |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
739 // plugin installation called by digilib on plugin object. |
1109 | 740 var install = function (plugin) { |
813 | 741 digilib = plugin; |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
742 console.debug('installing regions plugin. digilib:', digilib); |
1048 | 743 // import digilib functions |
744 $.extend(fn, digilib.fn); | |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
745 // import geometry classes |
813 | 746 geom = fn.geometry; |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
747 // add defaults, actions, buttons |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
748 $.extend(digilib.defaults, defaults); |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
749 $.extend(digilib.actions, actions); |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
750 $.extend(digilib.buttons, buttons); |
1103 | 751 // add "rg" to digilibParamNames |
752 digilib.defaults.digilibParamNames.push('rg'); | |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
753 }; |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
754 |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
755 // plugin initialization |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
756 var init = function (data) { |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
757 console.debug('initialising regions plugin. data:', data); |
835 | 758 var $elem = data.$elem; |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
759 var settings = data.settings; |
1102 | 760 CSS = settings.cssPrefix; |
1093
75a54db031dd
move found region into view, keep zoom factor if possible
hertzhaft
parents:
1092
diff
changeset
|
761 FULL_AREA = geom.rectangle(0, 0, 1, 1); |
1048 | 762 // install event handlers |
848 | 763 var $data = $(data); |
920 | 764 $data.on('setup', handleSetup); |
765 $data.on('update', handleUpdate); | |
1091 | 766 $data.on('newRegion', handleNewRegion); |
767 $data.on('regionClick', handleRegionClick); | |
1137 | 768 // default: autoZoom to region, when clicked |
1095 | 769 if (settings.autoZoomOnClick && settings.onClickRegion == null) { |
770 settings.onClickRegion = zoomToRegion; | |
771 } | |
772 // install region buttons if user defined regions are allowed | |
1104 | 773 if (digilib.plugins.buttons != null) { |
1103 | 774 installButtons(data); |
813 | 775 } |
792 | 776 }; |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
777 |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
778 // plugin object with name and install/init methods |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
779 // shared objects filled by digilib on registration |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
780 var pluginProperties = { |
1048 | 781 name : 'regions', |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
782 install : install, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
783 init : init, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
784 buttons : {}, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
785 actions : {}, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
786 fn : {}, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
787 plugins : {} |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
788 }; |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
789 |
792 | 790 if ($.fn.digilib == null) { |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
791 $.error("jquery.digilib.regions must be loaded after jquery.digilib!"); |
792 | 792 } else { |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
793 $.fn.digilib('plugin', pluginProperties); |
792 | 794 } |
795 })(jQuery); |