Mercurial > hg > digilib-old
annotate webapp/src/main/webapp/jquery/jquery.digilib.regions.js @ 1094:8d6bc18f7145
some polishing and refactoring, preparation for region text search
author | hertzhaft |
---|---|
date | Fri, 19 Oct 2012 19:19:27 +0200 |
parents | 75a54db031dd |
children | 20ad0034f1e5 |
rev | line source |
---|---|
792 | 1 /** optional digilib regions plugin |
2 | |
1023 | 3 Mark up a digilib image with rectangular regions. |
4 | |
5 If hasRegionInfo=true reads regions from page HTML. | |
6 Element with regions has to be in digilib element, e.g. | |
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. | |
16 To have regions with content use "a" tags, e.g. | |
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 | |
792 | 28 */ |
29 | |
30 (function($) { | |
813 | 31 // the digilib object |
996 | 32 var digilib = null; |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
33 // the normal zoom area |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
34 var FULL_AREA = null; |
813 | 35 // the functions made available by digilib |
1048 | 36 var fn = { |
37 // dummy function to avoid errors, gets overwritten by buttons plugin | |
38 highlightButtons : function () { | |
39 console.debug('regions: dummy function - highlightButtons'); | |
40 } | |
41 }; | |
813 | 42 // affine geometry plugin |
996 | 43 var geom = null; |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
44 |
792 | 45 var buttons = { |
1091 | 46 defineregion : { |
47 onclick : "defineUserRegion", | |
813 | 48 tooltip : "define a region", |
792 | 49 icon : "addregion.png" |
50 }, | |
1091 | 51 removeregion : { |
52 onclick : "removeUserRegion", | |
53 tooltip : "delete the last user defined region", | |
792 | 54 icon : "delregion.png" |
55 }, | |
1091 | 56 removeallregions : { |
57 onclick : "removeAllUserRegions", | |
58 tooltip : "delete all user defined regions", | |
1067 | 59 icon : "delallregions.png" |
60 }, | |
792 | 61 regions : { |
62 onclick : "toggleRegions", | |
63 tooltip : "show or hide regions", | |
64 icon : "regions.png" | |
65 }, | |
1092 | 66 findcoords : { |
67 onclick : "findCoords", | |
68 tooltip : "find coords and display as a new region", | |
69 icon : "regions.png" | |
70 }, | |
1048 | 71 regioninfo : { |
855 | 72 onclick : "showRegionInfo", |
1091 | 73 tooltip : "show information about user defined regions", |
792 | 74 icon : "regioninfo.png" |
75 } | |
76 }; | |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
77 |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
78 var defaults = { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
79 // are regions being edited? |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
80 'editRegions' : false, |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
81 // are regions shown? |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
82 'isRegionVisible' : true, |
813 | 83 // are region numbers shown? |
1023 | 84 'showRegionNumbers' : true, |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
85 // default width for region when only point is given |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
86 'regionWidth' : 0.005, |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
87 // is there region content in the page? |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
88 'processHtmlRegions' : false, |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
89 // region defined by users and in the URL |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
90 'processUserRegions' : true, |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
91 // callback for click on region |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
92 'onClickRegion' : null, |
1091 | 93 // callback when new user region is defined |
94 'onNewRegion' : null, | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
95 // turn any region into a clickable link to its detail view (DEPRECATED) |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
96 'autoZoomOnClick' : false, |
1091 | 97 // css selector for area/a elements (must also be marked with class "dl-keep") |
1067 | 98 'htmlRegionsSelector' : 'map.dl-regioncontent area, map.dl-regioncontent a', |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
99 // buttonset of this plugin |
1092 | 100 'regionSet' : ['regions', 'defineregion', 'removeregion', 'removeallregions', 'regioninfo', 'findcoords', 'lessoptions'], |
813 | 101 // url param for regions |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
102 'rg' : null, |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
103 // region attributes to copy from HTML |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
104 'regionAttributes' : { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
105 'id' :1, |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
106 'href' :1, |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
107 'title' :1, |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
108 'target':1, |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
109 'style' :1, |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
110 'class' :1 |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
111 } |
813 | 112 }; |
792 | 113 |
114 var actions = { | |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
115 |
792 | 116 // define a region interactively with two clicked points |
1091 | 117 defineUserRegion : function(data) { |
813 | 118 if (!data.settings.isRegionVisible) { |
119 alert("Please turn on regions visibility!"); | |
120 return; | |
121 } | |
996 | 122 var cssPrefix = data.settings.cssPrefix; |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
123 var $elem = data.$elem; |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
124 var $body = $('body'); |
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
125 var bodyRect = geom.rectangle($body); |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
126 var $scaler = data.$scaler; |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
127 var scalerRect = geom.rectangle($scaler); |
792 | 128 var pt1, pt2; |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
129 // overlay prevents other elements from reacting to mouse events |
996 | 130 var $overlay = $('<div class="'+cssPrefix+'overlay" style="position:absolute"/>'); |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
131 $body.append($overlay); |
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
132 bodyRect.adjustDiv($overlay); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
133 var attr = {'class' : cssPrefix+"regionURL"}; |
1091 | 134 var $regionDiv = addRegionDiv(data, data.userRegions, data.userRegions.length, attr); |
792 | 135 |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
136 // mousedown handler: start sizing |
792 | 137 var regionStart = function (evt) { |
138 pt1 = geom.position(evt); | |
139 // setup and show zoom div | |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
140 pt1.adjustDiv($regionDiv); |
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
141 $regionDiv.width(0).height(0); |
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
142 $regionDiv.show(); |
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
143 // register mouse events |
920 | 144 $overlay.on("mousemove.dlRegion", regionMove); |
145 $overlay.on("mouseup.dlRegion", regionEnd); | |
792 | 146 return false; |
147 }; | |
148 | |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
149 // mousemove handler: size region |
792 | 150 var regionMove = function (evt) { |
151 pt2 = geom.position(evt); | |
152 var rect = geom.rectangle(pt1, pt2); | |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
153 rect.clipTo(scalerRect); |
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
154 // update region |
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
155 rect.adjustDiv($regionDiv); |
792 | 156 return false; |
157 }; | |
158 | |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
159 // mouseup handler: end sizing |
792 | 160 var regionEnd = function (evt) { |
161 pt2 = geom.position(evt); | |
162 // assume a click and continue if the area is too small | |
163 var clickRect = geom.rectangle(pt1, pt2); | |
164 if (clickRect.getArea() <= 5) return false; | |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
165 // unregister mouse events and get rid of overlay |
920 | 166 $overlay.off("mousemove.dlRegion", regionMove); |
167 $overlay.off("mouseup.dlRegion", regionEnd); | |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
168 $overlay.remove(); |
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
169 // clip region |
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
170 clickRect.clipTo(scalerRect); |
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
171 clickRect.adjustDiv($regionDiv); |
1091 | 172 var region = storeUserRegion(data, $regionDiv); |
792 | 173 // fn.redisplay(data); |
1091 | 174 fn.highlightButtons(data, 'defineregion', 0); |
813 | 175 redisplay(data); |
1091 | 176 $(data).trigger('newRegion', region); |
792 | 177 return false; |
178 }; | |
179 | |
180 // bind start zoom handler | |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
181 $overlay.one('mousedown.dlRegion', regionStart); |
1091 | 182 fn.highlightButtons(data, 'defineregion', 1); |
792 | 183 }, |
184 | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
185 // remove the last added URL region |
1091 | 186 removeUserRegion : function (data) { |
813 | 187 if (!data.settings.isRegionVisible) { |
188 alert("Please turn on regions visibility!"); | |
189 return; | |
190 } | |
1091 | 191 var r = data.userRegions.pop(); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
192 // no more URL regions to delete |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
193 if (r == null) return; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
194 var $regionDiv = r.$div; |
792 | 195 $regionDiv.remove(); |
813 | 196 redisplay(data); |
792 | 197 }, |
198 | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
199 // remove all manually added regions (defined through URL "rg" parameter) |
1091 | 200 removeAllUserRegions : function (data) { |
1067 | 201 if (!data.settings.isRegionVisible) { |
202 alert("Please turn on regions visibility!"); | |
203 return; | |
204 } | |
205 var cssPrefix = data.settings.cssPrefix; | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
206 var $regions = data.$elem.find('div.'+cssPrefix+'regionURL'); |
1067 | 207 $regions.remove(); |
1091 | 208 data.userRegions = []; // remove only URL regions |
1067 | 209 redisplay(data); |
210 }, | |
211 | |
813 | 212 // show/hide regions |
1060 | 213 toggleRegions : function (data) { |
813 | 214 var show = !data.settings.isRegionVisible; |
215 data.settings.isRegionVisible = show; | |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
216 fn.highlightButtons(data, 'regions', show); |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
217 renderRegions(data, 1); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
218 }, |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
219 |
1048 | 220 // show region info in a window |
1060 | 221 showRegionInfo : function (data) { |
1048 | 222 var $elem = data.$elem; |
223 var cssPrefix = data.settings.cssPrefix; | |
1060 | 224 var infoselector = '#'+cssPrefix+'regionInfo'; |
225 if (fn.find(data, infoselector)) { | |
1048 | 226 fn.withdraw($info); |
227 return; | |
228 } | |
229 var html = '\ | |
230 <div id="'+cssPrefix+'regionInfo" class="'+cssPrefix+'keep '+cssPrefix+'regionInfo">\ | |
1060 | 231 <table class="'+cssPrefix+'infoheader">\ |
232 <tr>\ | |
233 <td class="'+cssPrefix+'infobutton html">HTML</td>\ | |
234 <td class="'+cssPrefix+'infobutton svgattr">SVG</td>\ | |
235 <td class="'+cssPrefix+'infobutton csv">CSV</td>\ | |
236 <td class="'+cssPrefix+'infobutton digilib">Digilib</td>\ | |
237 <td class="'+cssPrefix+'infobutton x">X</td>\ | |
238 </tr>\ | |
239 </table>\ | |
1048 | 240 </div>'; |
241 $info = $(html); | |
242 $info.appendTo($elem); | |
243 $info.append(regionInfoHTML(data)); | |
244 $info.append(regionInfoSVG(data)); | |
1060 | 245 $info.append(regionInfoCSV(data)); |
1048 | 246 $info.append(regionInfoDigilib(data)); |
247 var bind = function(name) { | |
1060 | 248 $info.find('.'+name).on('click.regioninfo', function () { |
1048 | 249 $info.find('div.'+cssPrefix+'info').hide(); |
250 $info.find('div.'+cssPrefix+name).show(); | |
1060 | 251 fn.centerOnScreen(data, $info); |
832
e4133946a9ad
display regions as HTML for use in digilib element
hertzhaft
parents:
824
diff
changeset
|
252 }); |
1048 | 253 }; |
254 bind('html'); | |
255 bind('svgattr'); | |
1060 | 256 bind('csv'); |
1048 | 257 bind('digilib'); |
258 $info.find('.x').on('click.regioninfo', function () { | |
259 fn.withdraw($info); | |
260 }); | |
261 $info.fadeIn(); | |
1060 | 262 fn.centerOnScreen(data, $info); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
263 }, |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
264 |
1091 | 265 // display region coordinates in an edit line |
266 showRegionCoords : function (data, region) { | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
267 var $elem = data.$elem; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
268 var cssPrefix = data.settings.cssPrefix; |
1091 | 269 // var infoselector = '#'+cssPrefix+'regionInfo'; |
270 // var $info = fn.find(data, infoselector); | |
271 var coords = regionCoordsString(region, ','); | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
272 var html = '\ |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
273 <div id="'+cssPrefix+'regionInfo" class="'+cssPrefix+'keep '+cssPrefix+'regionInfo">\ |
1091 | 274 <input name="coords" type="text" size="30" maxlength="40" value="'+coords+'"/>\ |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
275 </div>'; |
1091 | 276 var $info = $(html); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
277 $info.appendTo($elem); |
1091 | 278 $input = $info.find('input'); |
279 $input.on('focus.regioninfo', function (event) { | |
280 this.select(); | |
281 }); | |
282 $input.on('blur.regioninfo', function (event) { | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
283 fn.withdraw($info); |
1091 | 284 return false; |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
285 }); |
1091 | 286 $input.on('keypress.regioninfo', function (event) { |
1092 | 287 fn.withdraw($info); // OBS: "return false" disables copy! |
1091 | 288 }); |
289 $input.prop("readonly",true); | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
290 $info.fadeIn(); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
291 fn.centerOnScreen(data, $info); |
1091 | 292 $input.focus(); |
293 console.debug('showRegionCoords', coords); | |
1092 | 294 }, |
1091 | 295 |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
296 // 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
|
297 regionFromCoords : function (data, coords) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
298 var rect = parseCoordsString(data, coords); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
299 if (rect == null) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
300 alert('invalid coordinates: ' + coords); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
301 return; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
302 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
303 var cssPrefix = data.settings.cssPrefix; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
304 var attr = { 'class' : cssPrefix+'regionURL '+cssPrefix+'findregion' }; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
305 createRegion(data, data.userRegions, rect, attr); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
306 var za = data.zoomArea; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
307 if (!fn.isFullArea(za)) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
308 za.setCenter(rect.getCenter()).stayInside(FULL_AREA); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
309 if (!za.containsRect(rect)) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
310 za = FULL_AREA.copy(); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
311 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
312 fn.setZoomArea(data, za); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
313 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
314 console.debug('regionFromCoords', coords, rect, za); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
315 redisplay(data); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
316 }, |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
317 |
1092 | 318 // find coordinates and display as new region |
319 findCoords : function (data) { | |
320 var $elem = data.$elem; | |
321 var cssPrefix = data.settings.cssPrefix; | |
322 var html = '\ | |
323 <div id="'+cssPrefix+'regionInfo" class="'+cssPrefix+'keep '+cssPrefix+'regionInfo">\ | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
324 <div>coordinates to find:</div>\ |
1092 | 325 <form class="'+cssPrefix+'form">\ |
326 <div>\ | |
327 <input class="'+cssPrefix+'input" name="coords" type="text" size="30" maxlength="40"/> \ | |
328 </div>\ | |
329 <input class="'+cssPrefix+'submit" type="submit" name="sub" value="Ok"/>\ | |
330 <input class="'+cssPrefix+'cancel" type="button" value="Cancel"/>\ | |
331 </form>\ | |
332 </div>'; | |
333 var $info = $(html); | |
334 $info.appendTo($elem); | |
335 var $form = $info.find('form'); | |
336 var $input = $info.find('input.'+cssPrefix+'input'); | |
337 // handle submit | |
338 $form.on('submit', function () { | |
339 var coords = $input.val(); | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
340 actions.regionFromCoords(data, coords); |
1092 | 341 fn.withdraw($info); |
342 return false; | |
343 }); | |
344 // handle cancel | |
345 $form.find('.'+cssPrefix+'cancel').on('click', function () { | |
346 fn.withdraw($info); | |
347 }); | |
348 $info.fadeIn(); | |
349 fn.centerOnScreen(data, $info); | |
350 $input.focus(); | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
351 } |
792 | 352 }; |
353 | |
813 | 354 // store a region div |
1091 | 355 var storeUserRegion = function (data, $regionDiv) { |
356 var regions = data.userRegions; | |
813 | 357 var rect = geom.rectangle($regionDiv); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
358 var rectangle = data.imgTrafo.invtransform(rect); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
359 rectangle.$div = $regionDiv; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
360 regions.push(rectangle); |
1091 | 361 console.debug("storeUserRegion", data.userRegions, "rectangle", rectangle); |
362 return rectangle; | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
363 }; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
364 |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
365 // open region as detail |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
366 var openDetail = function (data, region) { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
367 digilib.actions.zoomArea(data, region); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
368 }; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
369 |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
370 // make a coords string |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
371 var regionCoordsString = function (rect, sep) { |
1091 | 372 if (sep == null) sep = ','; // comma as default separator |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
373 return [ |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
374 fn.cropFloatStr(rect.x), |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
375 fn.cropFloatStr(rect.y), |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
376 fn.cropFloatStr(rect.width), |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
377 fn.cropFloatStr(rect.height) |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
378 ].join(sep); |
813 | 379 }; |
380 | |
855 | 381 // html for later insertion |
382 var regionInfoHTML = function (data) { | |
996 | 383 var cssPrefix = data.settings.cssPrefix; |
384 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'html"/>'); | |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
385 $infoDiv.append($('<div/>').text('<map class="'+cssPrefix+'keep '+cssPrefix+'regioncontent">')); |
1091 | 386 $.each(data.userRegions, function(index, r) { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
387 var coords = regionCoordsString(r, ','); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
388 $infoDiv.append($('<div/>').text('<area coords="' + coords + '"/>')); |
855 | 389 }); |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
390 $infoDiv.append($('<div/>').text('</map>')); |
855 | 391 return $infoDiv; |
392 }; | |
393 | |
394 // SVG-style | |
395 var regionInfoSVG = function (data) { | |
996 | 396 var cssPrefix = data.settings.cssPrefix; |
397 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'svgattr"/>'); | |
1091 | 398 $.each(data.userRegions, function(index, r) { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
399 var coords = regionCoordsString(r, ' '); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
400 $infoDiv.append($('<div/>').text('"' + coords + '"')); |
855 | 401 }); |
402 return $infoDiv; | |
403 }; | |
404 | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
405 // CSV-style |
1060 | 406 var regionInfoCSV = function (data) { |
407 var cssPrefix = data.settings.cssPrefix; | |
408 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'csv"/>'); | |
1091 | 409 $.each(data.userRegions, function(index, r) { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
410 var coords = regionCoordsString(r, ','); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
411 $infoDiv.append($('<div/>').text(index+1 + ": " + coords)); |
1060 | 412 }); |
413 return $infoDiv; | |
414 }; | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
415 |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
416 // digilib-style (h,w@x,y) |
855 | 417 var regionInfoDigilib = function (data) { |
996 | 418 var cssPrefix = data.settings.cssPrefix; |
419 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'digilib"/>'); | |
1091 | 420 $.each(data.userRegions, function(index, r) { |
1067 | 421 if (r.fromHtml) return; |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
422 var coords = r.toString(); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
423 $infoDiv.append($('<div/>').text(coords)); |
855 | 424 }); |
425 return $infoDiv; | |
426 }; | |
427 | |
813 | 428 // add a region to data.$elem |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
429 var addRegionDiv = function (data, regions, index, attributes) { |
1025 | 430 var settings = data.settings; |
431 var cssPrefix = settings.cssPrefix; | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
432 // var nr = regions.length; // we count regions from 1 |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
433 var cls = cssPrefix+'region '+cssPrefix+'overlay'; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
434 if (attributes && attributes['class']) { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
435 cls = cls+' '+attributes['class']; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
436 delete attributes['class']; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
437 } |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
438 var $regionDiv = $('<div class="'+cls+'" style="display:none"/>'); |
813 | 439 data.$elem.append($regionDiv); |
1025 | 440 if (settings.showRegionNumbers) { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
441 var $regionLink = $('<a class="'+cssPrefix+'regionnumber">'+index+'</a>'); |
920 | 442 if (attributes) $regionLink.attr(attributes); |
851 | 443 $regionDiv.append($regionLink); |
813 | 444 } |
1025 | 445 if (attributes) { |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
446 // copy attributes to div except href |
1025 | 447 if (attributes.href) { |
1091 | 448 region.href = attributes.href; |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
449 // copy attributes |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
450 var attrs = $.extend({}, attributes); |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
451 delete attrs.href; |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
452 $regionDiv.attr(attrs); |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
453 } else { |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
454 $regionDiv.attr(attributes); |
1025 | 455 } |
456 } | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
457 // DEPRECATED |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
458 if (settings.autoZoomOnClick) { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
459 if (settings.onClickRegion == null) settings.onClickRegion = openDetail; |
823 | 460 } |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
461 // handle click events on div |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
462 var region = regions[index]; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
463 $regionDiv.on('click.dlRegion', function(evt) { |
1091 | 464 $(data).trigger('regionClick', region); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
465 }); |
813 | 466 return $regionDiv; |
467 }; | |
468 | |
851 | 469 // create a region div from the data.regions array |
947 | 470 var createRegionDiv = function (data, regions, index, attributes) { |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
471 var region = regions[index]; |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
472 // check if div exists |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
473 if (region.$div != null) return region.$div; |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
474 // create and add div |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
475 var $regionDiv = addRegionDiv(data, regions, index, attributes); |
813 | 476 region.$div = $regionDiv; |
477 return $regionDiv; | |
478 }; | |
479 | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
480 // create a rectangle from a coords string |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
481 var parseCoordsString = function (data, coords) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
482 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
|
483 if (pos == null) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
484 return null; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
485 } |
1092 | 486 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
|
487 if (!fn.isNumber(rect.x) || !fn.isNumber(rect.y)) { |
1092 | 488 return null; |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
489 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
490 if (!rect.getArea()) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
491 var pt = rect.getPosition(); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
492 rect.width = data.settings.regionWidth; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
493 rect.height = rect.width; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
494 rect.setCenter(pt); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
495 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
496 return rect; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
497 }; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
498 |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
499 // create a regions from a rectangle |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
500 var createRegion = function (data, regions, rect, attributes) { |
1092 | 501 var index = regions.length; |
502 regions.push(rect); | |
503 var $regionDiv = createRegionDiv(data, regions, index, attributes); | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
504 return $regionDiv; |
1092 | 505 }; |
506 | |
851 | 507 // create regions from URL parameters |
508 var createRegionsFromURL = function (data) { | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
509 var cssPrefix = data.settings.cssPrefix; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
510 var attr = {'class' : cssPrefix+"regionURL"}; |
851 | 511 unpackRegions(data); |
1091 | 512 var regions = data.userRegions; |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
513 $.each(regions, function(index, region) { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
514 createRegionDiv(data, regions, index, attr); |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
515 }); |
792 | 516 }; |
517 | |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
518 // create regions from HTML |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
519 var createRegionsFromHTML = function (data) { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
520 var cssPrefix = data.settings.cssPrefix; |
1091 | 521 var regions = data.htmlRegions; |
1025 | 522 // regions are defined in "area" tags |
1067 | 523 var $content = data.$elem.find(data.settings.htmlRegionsSelector); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
524 console.debug("createRegionsFromHTML. Number of elems: ", $content.length); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
525 $content.each(function(index, area) { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
526 var $area = $(area); |
852 | 527 // the "coords" attribute contains the region coords (0..1) |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
528 var coords = $area.attr('coords'); |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
529 var title = $area.attr('title'); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
530 // create the rectangle |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
531 var rect = parseCoordsString(data, coords); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
532 if (rect == null) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
533 return console.error('bad coords in HTML:', title, coords); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
534 } |
1024 | 535 // copy some attributes |
873 | 536 var attributes = {}; |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
537 for (var n in data.settings.regionAttributes) { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
538 attributes[n] = $area.attr(n); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
539 } |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
540 // mark div as regionHTML |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
541 regionClass = cssPrefix+'regionHTML'; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
542 if (attributes['class']) { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
543 attributes['class'] += ' ' + regionClass |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
544 } else { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
545 attributes['class'] = regionClass |
1024 | 546 } |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
547 rect.text = title; |
1092 | 548 rect.fromHtml = true; |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
549 var $regionDiv = createRegion(data, regions, rect, attributes); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
550 var $contents = $area.contents().clone(); |
1025 | 551 if (attributes.href != null) { |
552 // wrap contents in a-tag | |
553 var $ca = $('<a href="'+attributes.href+'"/>'); | |
554 $ca.append($contents); | |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
555 // alt attribute is also content (BTW: area-tag has no content()) |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
556 $ca.append($area.attr('alt')); |
1025 | 557 $regionDiv.append($ca); |
558 } else { | |
559 $regionDiv.append($contents); | |
560 // alt attribute is also content (BTW: area-tag has no content()) | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
561 $regionDiv.append($area.attr('alt')); |
1025 | 562 } |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
563 }); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
564 }; |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
565 |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
566 // list of HTML regions matching text in its title attribute |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
567 var matchRegionText = function (data, text) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
568 var regions = data.htmlRegions; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
569 var re = new RegExp(text); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
570 return $.grep(regions, function(item, index) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
571 return re.match(item.text); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
572 }); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
573 }; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
574 |
813 | 575 // show a region on top of the scaler image |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
576 var renderRegion = function (data, region, anim) { |
813 | 577 if (!data.imgTrafo) return; |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
947
diff
changeset
|
578 var zoomArea = data.zoomArea; |
813 | 579 var $regionDiv = region.$div; |
580 if (!$regionDiv) { | |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
947
diff
changeset
|
581 console.error("renderRegion: region has no $div", region); |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
582 // alert("renderRegion: region has no $div to show"); |
813 | 583 return; |
584 } | |
585 var regionRect = region.copy(); | |
586 var show = data.settings.isRegionVisible; | |
1067 | 587 if (show && zoomArea.overlapsRect(regionRect) && !regionRect.containsRect(zoomArea)) { |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
947
diff
changeset
|
588 regionRect.clipTo(zoomArea); |
813 | 589 var screenRect = data.imgTrafo.transform(regionRect); |
1067 | 590 // console.debug("renderRegion: pos=",geom.position(screenRect)); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
591 if (anim) { |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
592 $regionDiv.fadeIn(); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
593 } else{ |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
594 $regionDiv.show(); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
595 } |
1024 | 596 // adjustDiv sets wrong coords when called BEFORE show() |
851 | 597 screenRect.adjustDiv($regionDiv); |
813 | 598 } else { |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
599 if (anim) { |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
600 $regionDiv.fadeOut(); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
601 } else{ |
824 | 602 $regionDiv.hide(); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
603 } |
813 | 604 } |
605 }; | |
606 | |
607 // show regions | |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
608 var renderRegions = function (data, anim) { |
1091 | 609 $.each(data.htmlRegions, function(index, region) { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
610 renderRegion(data, region, anim); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
611 }); |
1091 | 612 $.each(data.userRegions, function(index, region) { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
613 renderRegion(data, region, anim); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
614 }); |
813 | 615 }; |
616 | |
1091 | 617 // read region data from URL parameters |
813 | 618 var unpackRegions = function (data) { |
619 var rg = data.settings.rg; | |
620 if (rg == null) return; | |
1091 | 621 var regions = data.userRegions; |
958
2a2e8c039c29
changed regions parameter separator to the same as for marks
hertzhaft
parents:
950
diff
changeset
|
622 var rs = rg.split(","); |
813 | 623 for (var i = 0; i < rs.length; i++) { |
624 var r = rs[i]; | |
958
2a2e8c039c29
changed regions parameter separator to the same as for marks
hertzhaft
parents:
950
diff
changeset
|
625 var pos = r.split("/", 4); |
813 | 626 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); |
627 regions.push(rect); | |
792 | 628 } |
629 }; | |
630 | |
1091 | 631 // pack user regions array into a URL parameter string |
813 | 632 var packRegions = function (data) { |
1091 | 633 var regions = data.userRegions; |
815 | 634 if (!regions.length) { |
635 data.settings.rg = null; | |
636 return; | |
637 } | |
813 | 638 var rg = ''; |
639 for (var i = 0; i < regions.length; i++) { | |
1024 | 640 var region = regions[i]; |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
641 if (rg) { |
958
2a2e8c039c29
changed regions parameter separator to the same as for marks
hertzhaft
parents:
950
diff
changeset
|
642 rg += ','; |
792 | 643 } |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
644 rg += regionCoordsString(region, '/'); |
813 | 645 } |
646 data.settings.rg = rg; | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
647 console.debug('pack regions:', rg); |
792 | 648 }; |
649 | |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
650 // reload display after a region has been added or removed |
813 | 651 var redisplay = function (data) { |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
652 if (data.settings.processUserRegions) { |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
653 packRegions(data); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
654 } |
813 | 655 fn.redisplay(data); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
656 }; |
813 | 657 |
1091 | 658 // event handler, gets called when a newRegion event is triggered |
659 var handleNewRegion = function (evt, region) { | |
660 var data = this; | |
661 var settings = data.settings; | |
662 console.debug("regions: handleNewRegion", region); | |
663 if (typeof settings.onNewRegion === 'function') { | |
664 // execute callback | |
665 return settings.onNewRegion(data, region); | |
666 } | |
667 if (typeof settings.onNewRegion === 'string') { | |
668 // execute action | |
669 return actions[settings.onNewRegion](data, region); | |
670 } | |
671 }; | |
672 | |
673 // event handler, gets called when a regionClick event is triggered | |
674 var handleRegionClick = function (evt, region) { | |
675 var data = this; | |
676 var settings = data.settings; | |
677 console.debug("regions: handleRegionClick", region); | |
678 if (region.href) { | |
679 // follow the href attribute of the region area | |
680 window.location = region.href; //TODO: how about target? | |
681 } | |
682 if (typeof settings.onClickRegion === 'function') { | |
683 // execute callback | |
684 return settings.onClickRegion(data, region); | |
685 } | |
686 if (typeof settings.onClickRegion === 'string') { | |
687 // execute action | |
688 return actions[settings.onClickRegion](data, region); | |
689 } | |
690 }; | |
691 | |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
692 // 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
|
693 var handleSetup = function (evt) { |
941 | 694 var data = this; |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
695 var settings = data.settings; |
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
696 console.debug("regions: handleSetup", settings.rg); |
1048 | 697 // regions with content are given in HTML divs |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
698 if (settings.processHtmlRegions) { |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
699 createRegionsFromHTML(data); |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
700 } |
1048 | 701 // regions are defined in the URL |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
702 if (settings.processUserRegions) { |
851 | 703 createRegionsFromURL(data); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
704 } |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
705 }; |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
706 |
851 | 707 // 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
|
708 var handleUpdate = function (evt) { |
941 | 709 var data = this; |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
710 console.debug("regions: handleUpdate"); |
848 | 711 var settings = data.settings; |
712 fn.highlightButtons(data, 'regions' , settings.isRegionVisible); | |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
713 renderRegions(data); |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
714 }; |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
715 |
1048 | 716 // additional buttons |
717 var installButtons = function (data) { | |
718 var settings = data.settings; | |
719 var mode = settings.interactionMode; | |
720 var buttonSettings = settings.buttonSettings[mode]; | |
721 // configure buttons through digilib "regionSet" option | |
722 var buttonSet = settings.regionSet || regionSet; | |
723 // set regionSet to [] or '' for no buttons (when showing regions only) | |
724 if (buttonSet.length && buttonSet.length > 0) { | |
725 buttonSettings.regionSet = buttonSet; | |
726 buttonSettings.buttonSets.push('regionSet'); | |
727 } | |
728 }; | |
729 | |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
730 // plugin installation called by digilib on plugin object. |
813 | 731 var install = function(plugin) { |
732 digilib = plugin; | |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
733 console.debug('installing regions plugin. digilib:', digilib); |
1048 | 734 // import digilib functions |
735 $.extend(fn, digilib.fn); | |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
736 // import geometry classes |
813 | 737 geom = fn.geometry; |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
738 // add defaults, actions, buttons |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
739 $.extend(digilib.defaults, defaults); |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
740 $.extend(digilib.actions, actions); |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
741 $.extend(digilib.buttons, buttons); |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
742 }; |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
743 |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
744 // plugin initialization |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
745 var init = function (data) { |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
746 console.debug('initialising regions plugin. data:', data); |
835 | 747 var $elem = data.$elem; |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
748 var settings = data.settings; |
996 | 749 var cssPrefix = data.settings.cssPrefix; |
1093
75a54db031dd
move found region into view, keep zoom factor if possible
hertzhaft
parents:
1092
diff
changeset
|
750 FULL_AREA = geom.rectangle(0, 0, 1, 1); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
751 // region arrays |
1091 | 752 data.userRegions = []; |
753 data.htmlRegions = []; | |
1048 | 754 // install event handlers |
848 | 755 var $data = $(data); |
920 | 756 $data.on('setup', handleSetup); |
757 $data.on('update', handleUpdate); | |
1091 | 758 $data.on('newRegion', handleNewRegion); |
759 $data.on('regionClick', handleRegionClick); | |
1048 | 760 // install buttons |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
761 if (settings.processUserRegions) { |
1091 | 762 // add "rg" to digilibParamNames |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
763 // settings.digilibParamNames.push('rg'); |
1091 | 764 // TODO: this leads double params, because |
765 // settings.additionalParamNames is created earlier than this plugin's init() action | |
1048 | 766 if (digilib.plugins.buttons != null) { |
767 installButtons(data); | |
823 | 768 } |
813 | 769 } |
792 | 770 }; |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
771 |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
772 // plugin object with name and install/init methods |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
773 // shared objects filled by digilib on registration |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
774 var pluginProperties = { |
1048 | 775 name : 'regions', |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
776 install : install, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
777 init : init, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
778 buttons : {}, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
779 actions : {}, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
780 fn : {}, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
781 plugins : {} |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
782 }; |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
783 |
792 | 784 if ($.fn.digilib == null) { |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
785 $.error("jquery.digilib.regions must be loaded after jquery.digilib!"); |
792 | 786 } else { |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
787 $.fn.digilib('plugin', pluginProperties); |
792 | 788 } |
789 })(jQuery); |