Mercurial > hg > digilib-old
annotate webapp/src/main/webapp/jquery/jquery.digilib.regions.js @ 1095:20ad0034f1e5
more refactoring
author | hertzhaft |
---|---|
date | Sun, 21 Oct 2012 23:39:18 +0200 |
parents | 8d6bc18f7145 |
children | 3c75dda660bf |
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); |
1095 | 133 var $regionDiv = newRegionDiv(data); |
134 copyRegionAttributes(data, $regionDiv, {'class' : cssPrefix+"regionURL"}); | |
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); |
1095 | 172 storeRegionDiv(data, $regionDiv); |
792 | 173 // fn.redisplay(data); |
1091 | 174 fn.highlightButtons(data, 'defineregion', 0); |
813 | 175 redisplay(data); |
1095 | 176 $(data).trigger('newRegion', [$regionDiv]); |
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; |
1095 | 194 var $regionDiv = r.$div; // DEPRECATED |
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 |
1095 | 266 showRegionCoords : function (data, $regionDiv) { |
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; |
1095 | 269 var rect = $regionDiv.data('rect'); |
270 var coords = packCoords(rect, ','); | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
271 var html = '\ |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
272 <div id="'+cssPrefix+'regionInfo" class="'+cssPrefix+'keep '+cssPrefix+'regionInfo">\ |
1091 | 273 <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
|
274 </div>'; |
1091 | 275 var $info = $(html); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
276 $info.appendTo($elem); |
1091 | 277 $input = $info.find('input'); |
278 $input.on('focus.regioninfo', function (event) { | |
279 this.select(); | |
280 }); | |
281 $input.on('blur.regioninfo', function (event) { | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
282 fn.withdraw($info); |
1091 | 283 return false; |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
284 }); |
1091 | 285 $input.on('keypress.regioninfo', function (event) { |
1092 | 286 fn.withdraw($info); // OBS: "return false" disables copy! |
1091 | 287 }); |
288 $input.prop("readonly",true); | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
289 $info.fadeIn(); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
290 fn.centerOnScreen(data, $info); |
1091 | 291 $input.focus(); |
292 console.debug('showRegionCoords', coords); | |
1092 | 293 }, |
1091 | 294 |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
295 // 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
|
296 regionFromCoords : function (data, coords) { |
1095 | 297 var rect = parseCoords(data, coords); |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
298 if (rect == null) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
299 alert('invalid coordinates: ' + coords); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
300 return; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
301 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
302 var cssPrefix = data.settings.cssPrefix; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
303 var attr = { 'class' : cssPrefix+'regionURL '+cssPrefix+'findregion' }; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
304 createRegion(data, data.userRegions, rect, attr); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
305 var za = data.zoomArea; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
306 if (!fn.isFullArea(za)) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
307 za.setCenter(rect.getCenter()).stayInside(FULL_AREA); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
308 if (!za.containsRect(rect)) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
309 za = FULL_AREA.copy(); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
310 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
311 fn.setZoomArea(data, za); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
312 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
313 console.debug('regionFromCoords', coords, rect, za); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
314 redisplay(data); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
315 }, |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
316 |
1092 | 317 // find coordinates and display as new region |
318 findCoords : function (data) { | |
319 var $elem = data.$elem; | |
320 var cssPrefix = data.settings.cssPrefix; | |
321 var html = '\ | |
322 <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
|
323 <div>coordinates to find:</div>\ |
1092 | 324 <form class="'+cssPrefix+'form">\ |
325 <div>\ | |
326 <input class="'+cssPrefix+'input" name="coords" type="text" size="30" maxlength="40"/> \ | |
327 </div>\ | |
328 <input class="'+cssPrefix+'submit" type="submit" name="sub" value="Ok"/>\ | |
329 <input class="'+cssPrefix+'cancel" type="button" value="Cancel"/>\ | |
330 </form>\ | |
331 </div>'; | |
332 var $info = $(html); | |
333 $info.appendTo($elem); | |
334 var $form = $info.find('form'); | |
335 var $input = $info.find('input.'+cssPrefix+'input'); | |
336 // handle submit | |
337 $form.on('submit', function () { | |
338 var coords = $input.val(); | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
339 actions.regionFromCoords(data, coords); |
1092 | 340 fn.withdraw($info); |
341 return false; | |
342 }); | |
343 // handle cancel | |
344 $form.find('.'+cssPrefix+'cancel').on('click', function () { | |
345 fn.withdraw($info); | |
346 }); | |
347 $info.fadeIn(); | |
348 fn.centerOnScreen(data, $info); | |
349 $input.focus(); | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
350 } |
792 | 351 }; |
352 | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
353 // make a coords string |
1095 | 354 var packCoords = function (rect, sep) { |
1091 | 355 if (sep == null) sep = ','; // comma as default separator |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
356 return [ |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
357 fn.cropFloatStr(rect.x), |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
358 fn.cropFloatStr(rect.y), |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
359 fn.cropFloatStr(rect.width), |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
360 fn.cropFloatStr(rect.height) |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
361 ].join(sep); |
813 | 362 }; |
363 | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
364 // create a rectangle from a coords string |
1095 | 365 var parseCoords = function (data, coords) { |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
366 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
|
367 if (pos == null) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
368 return null; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
369 } |
1092 | 370 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
|
371 if (!fn.isNumber(rect.x) || !fn.isNumber(rect.y)) { |
1092 | 372 return null; |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
373 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
374 if (!rect.getArea()) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
375 var pt = rect.getPosition(); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
376 rect.width = data.settings.regionWidth; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
377 rect.height = rect.width; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
378 rect.setCenter(pt); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
379 } |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
380 return rect; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
381 }; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
382 |
1095 | 383 // create a new regionDiv and add it to data.$elem |
384 var newRegionDiv = function (data) { | |
385 var settings = data.settings; | |
386 var cssPrefix = settings.cssPrefix; | |
387 var cls = cssPrefix+'region '+cssPrefix+'overlay'; | |
388 var $regionDiv = $('<div class="'+cls+'" style="display:none"/>'); | |
389 data.$elem.append($regionDiv); | |
390 return $regionDiv; | |
391 }; | |
392 | |
393 // push the digilib coordinates of a completed user-defined region onto the stack | |
394 var storeRegionDiv = function (data, $regionDiv) { | |
395 var regions = data.userRegions; | |
396 var rectangle = geom.rectangle($regionDiv); | |
397 var rect = data.imgTrafo.invtransform(rectangle); | |
398 $regionDiv.data('rect', rect); | |
399 rect.$div = $regionDiv; // DEPRECATED | |
400 regions.push(rect); | |
401 console.debug("storeRegionDiv", data.userRegions, "rect", rect); | |
402 return rect; | |
403 }; | |
404 | |
405 // copy attributes to a region div | |
406 var copyRegionAttributes = function (data, $regionDiv, attributes) { | |
407 if (attributes == null) return; | |
408 var settings = data.settings; | |
409 var cssPrefix = settings.cssPrefix; | |
410 if (attributes['class']) { | |
411 $regionDiv.addClass(attributes['class']); | |
412 delete attributes['class']; | |
413 } | |
414 $regionDiv.data('href', attributes.href); // TODO: href from HTML? | |
415 delete attributes.href; | |
416 $regionDiv.attr(attributes); | |
417 }; | |
418 | |
419 // set region number | |
420 var addRegionNumber = function (data, $regionDiv, index) { | |
421 var settings = data.settings; | |
422 var cssPrefix = settings.cssPrefix; | |
423 if (!settings.showRegionNumbers) return; | |
424 var $number = $('<a class="'+cssPrefix+'regionnumber">'+index+'</a>'); | |
425 $regionDiv.append($number); | |
426 return $regionDiv; | |
427 }; | |
428 | |
429 // add a region to data.$elem | |
430 var addRegionDiv = function (data, regions, index, attributes) { | |
431 var settings = data.settings; | |
432 var cssPrefix = settings.cssPrefix; | |
433 var $regionDiv = newRegionDiv(data); | |
434 copyRegionAttributes(data, $regionDiv, attributes); | |
435 addRegionNumber(data, $regionDiv, index); | |
436 | |
437 // handle click events on div | |
438 $regionDiv.on('click.dlRegion', function(evt) { | |
439 $(data).trigger('regionClick', [$regionDiv]); | |
440 }); | |
441 return $regionDiv; | |
442 }; | |
443 | |
444 // create a region div from the data.regions array | |
445 var createRegionDiv = function (data, regions, index, attributes) { | |
446 var rect = regions[index]; | |
447 // check if div exists, DEPRECATED | |
448 if (rect.$div != null) return rect.$div; | |
449 // create and add div | |
450 var $regionDiv = addRegionDiv(data, regions, index, attributes); | |
451 $regionDiv.data('rect', rect); | |
452 rect.$div = $regionDiv; // DEPRECATED | |
453 return $regionDiv; | |
454 }; | |
455 | |
456 // create a region from a rectangle | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
457 var createRegion = function (data, regions, rect, attributes) { |
1092 | 458 var index = regions.length; |
459 regions.push(rect); | |
460 var $regionDiv = createRegionDiv(data, regions, index, attributes); | |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
461 return $regionDiv; |
1092 | 462 }; |
463 | |
851 | 464 // create regions from URL parameters |
465 var createRegionsFromURL = function (data) { | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
466 var cssPrefix = data.settings.cssPrefix; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
467 var attr = {'class' : cssPrefix+"regionURL"}; |
1095 | 468 var regions = unpackRegions(data); |
469 data.userRegions = regions; | |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
470 $.each(regions, function(index, region) { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
471 createRegionDiv(data, regions, index, attr); |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
472 }); |
792 | 473 }; |
474 | |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
475 // create regions from HTML |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
476 var createRegionsFromHTML = function (data) { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
477 var cssPrefix = data.settings.cssPrefix; |
1091 | 478 var regions = data.htmlRegions; |
1025 | 479 // regions are defined in "area" tags |
1067 | 480 var $content = data.$elem.find(data.settings.htmlRegionsSelector); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
481 console.debug("createRegionsFromHTML. Number of elems: ", $content.length); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
482 $content.each(function(index, area) { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
483 var $area = $(area); |
852 | 484 // the "coords" attribute contains the region coords (0..1) |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
485 var coords = $area.attr('coords'); |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
486 var title = $area.attr('title'); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
487 // create the rectangle |
1095 | 488 var rect = parseCoords(data, coords); |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
489 if (rect == null) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
490 return console.error('bad coords in HTML:', title, coords); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
491 } |
1095 | 492 // copy attributes |
873 | 493 var attributes = {}; |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
494 for (var n in data.settings.regionAttributes) { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
495 attributes[n] = $area.attr(n); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
496 } |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
497 // mark div as regionHTML |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
498 regionClass = cssPrefix+'regionHTML'; |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
499 if (attributes['class']) { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
500 attributes['class'] += ' ' + regionClass |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
501 } else { |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
502 attributes['class'] = regionClass |
1024 | 503 } |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
504 var $regionDiv = createRegion(data, regions, rect, attributes); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
505 var $contents = $area.contents().clone(); |
1095 | 506 if (attributes.href != null) { // TODO: href set in region??? |
1025 | 507 // wrap contents in a-tag |
508 var $ca = $('<a href="'+attributes.href+'"/>'); | |
509 $ca.append($contents); | |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
510 // 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
|
511 $ca.append($area.attr('alt')); |
1025 | 512 $regionDiv.append($ca); |
513 } else { | |
514 $regionDiv.append($contents); | |
515 // 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
|
516 $regionDiv.append($area.attr('alt')); |
1025 | 517 } |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
518 }); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
519 }; |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
520 |
1094
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
521 // 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
|
522 var matchRegionText = function (data, text) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
523 var regions = data.htmlRegions; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
524 var re = new RegExp(text); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
525 return $.grep(regions, function(item, index) { |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
526 return re.match(item.text); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
527 }); |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
528 }; |
8d6bc18f7145
some polishing and refactoring, preparation for region text search
hertzhaft
parents:
1093
diff
changeset
|
529 |
1095 | 530 // html for later insertion |
531 var regionInfoHTML = function (data) { | |
532 var cssPrefix = data.settings.cssPrefix; | |
533 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'html"/>'); | |
534 $infoDiv.append($('<div/>').text('<map class="'+cssPrefix+'keep '+cssPrefix+'regioncontent">')); | |
535 $.each(data.userRegions, function(index, r) { | |
536 var coords = packCoords(r, ','); | |
537 $infoDiv.append($('<div/>').text('<area coords="' + coords + '"/>')); | |
538 }); | |
539 $infoDiv.append($('<div/>').text('</map>')); | |
540 return $infoDiv; | |
541 }; | |
542 | |
543 // SVG-style | |
544 var regionInfoSVG = function (data) { | |
545 var cssPrefix = data.settings.cssPrefix; | |
546 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'svgattr"/>'); | |
547 $.each(data.userRegions, function(index, r) { | |
548 var coords = packCoords(r, ' '); | |
549 $infoDiv.append($('<div/>').text('"' + coords + '"')); | |
550 }); | |
551 return $infoDiv; | |
552 }; | |
553 | |
554 // CSV-style | |
555 var regionInfoCSV = function (data) { | |
556 var cssPrefix = data.settings.cssPrefix; | |
557 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'csv"/>'); | |
558 $.each(data.userRegions, function(index, r) { | |
559 var coords = packCoords(r, ','); | |
560 $infoDiv.append($('<div/>').text(index+1 + ": " + coords)); | |
561 }); | |
562 return $infoDiv; | |
563 }; | |
564 | |
565 // digilib-style (h,w@x,y) | |
566 var regionInfoDigilib = function (data) { | |
567 var cssPrefix = data.settings.cssPrefix; | |
568 var $infoDiv = $('<div class="'+cssPrefix+'info '+cssPrefix+'digilib"/>'); | |
569 $.each(data.userRegions, function(index, r) { | |
570 var coords = r.toString(); | |
571 $infoDiv.append($('<div/>').text(coords)); | |
572 }); | |
573 return $infoDiv; | |
574 }; | |
575 | |
813 | 576 // show a region on top of the scaler image |
1095 | 577 var renderRegion = function (data, rect, anim) { |
813 | 578 if (!data.imgTrafo) return; |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
947
diff
changeset
|
579 var zoomArea = data.zoomArea; |
1095 | 580 var $regionDiv = rect.$div; // DEPRECATED |
813 | 581 if (!$regionDiv) { |
1095 | 582 console.error("renderRegion: rect has no $div", rect); |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
583 // alert("renderRegion: region has no $div to show"); |
813 | 584 return; |
585 } | |
1095 | 586 var regionRect = rect.copy(); |
813 | 587 var show = data.settings.isRegionVisible; |
1067 | 588 if (show && zoomArea.overlapsRect(regionRect) && !regionRect.containsRect(zoomArea)) { |
950
164d69e2c481
much nicer implementation of preview for scrolling and zooming.
robcast
parents:
947
diff
changeset
|
589 regionRect.clipTo(zoomArea); |
813 | 590 var screenRect = data.imgTrafo.transform(regionRect); |
1067 | 591 // console.debug("renderRegion: pos=",geom.position(screenRect)); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
592 if (anim) { |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
593 $regionDiv.fadeIn(); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
594 } else{ |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
595 $regionDiv.show(); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
596 } |
1024 | 597 // adjustDiv sets wrong coords when called BEFORE show() |
851 | 598 screenRect.adjustDiv($regionDiv); |
813 | 599 } else { |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
600 if (anim) { |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
601 $regionDiv.fadeOut(); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
602 } else{ |
824 | 603 $regionDiv.hide(); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
604 } |
813 | 605 } |
606 }; | |
607 | |
608 // show regions | |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
609 var renderRegions = function (data, anim) { |
1091 | 610 $.each(data.htmlRegions, function(index, region) { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
611 renderRegion(data, region, anim); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
612 }); |
1091 | 613 $.each(data.userRegions, function(index, region) { |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
614 renderRegion(data, region, anim); |
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
615 }); |
813 | 616 }; |
617 | |
1091 | 618 // read region data from URL parameters |
813 | 619 var unpackRegions = function (data) { |
620 var rg = data.settings.rg; | |
1095 | 621 if (rg == null) return []; |
622 var coords = rg.split(","); | |
623 var regions = $map(coords, function(coord, index) { | |
624 var pos = coord.split("/", 4); | |
813 | 625 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); |
1095 | 626 return rect; |
627 }); | |
628 return regions; | |
792 | 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 } | |
1095 | 638 var coords = $.map(regions, function(region, index) { |
639 packCoords(region, '/'); | |
640 }); | |
641 var rg = coords.join(','); | |
813 | 642 data.settings.rg = rg; |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
643 console.debug('pack regions:', rg); |
792 | 644 }; |
645 | |
1095 | 646 // zoom to the region coordinates |
647 var zoomToRegion = function (data, region) { | |
648 digilib.actions.zoomArea(data, region); | |
649 }; | |
650 | |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
651 // reload display after a region has been added or removed |
813 | 652 var redisplay = function (data) { |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
653 if (data.settings.processUserRegions) { |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
654 packRegions(data); |
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
655 } |
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); |
1048 | 698 // regions with content are given in HTML divs |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
699 if (settings.processHtmlRegions) { |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
700 createRegionsFromHTML(data); |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
701 } |
1048 | 702 // regions are defined in the URL |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
703 if (settings.processUserRegions) { |
851 | 704 createRegionsFromURL(data); |
818
eff74cfaaf97
read regions from HTML (not working yet), show info
hertzhaft
parents:
815
diff
changeset
|
705 } |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
706 }; |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
707 |
851 | 708 // 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
|
709 var handleUpdate = function (evt) { |
941 | 710 var data = this; |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
711 console.debug("regions: handleUpdate"); |
848 | 712 var settings = data.settings; |
713 fn.highlightButtons(data, 'regions' , settings.isRegionVisible); | |
850
47a6b93bde43
always show html-defined regions. wrong pos still not fixed
hertzhaft
parents:
848
diff
changeset
|
714 renderRegions(data); |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
715 }; |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
716 |
1048 | 717 // additional buttons |
718 var installButtons = function (data) { | |
719 var settings = data.settings; | |
720 var mode = settings.interactionMode; | |
721 var buttonSettings = settings.buttonSettings[mode]; | |
722 // configure buttons through digilib "regionSet" option | |
723 var buttonSet = settings.regionSet || regionSet; | |
724 // set regionSet to [] or '' for no buttons (when showing regions only) | |
725 if (buttonSet.length && buttonSet.length > 0) { | |
726 buttonSettings.regionSet = buttonSet; | |
727 buttonSettings.buttonSets.push('regionSet'); | |
728 } | |
729 }; | |
730 | |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
731 // plugin installation called by digilib on plugin object. |
813 | 732 var install = function(plugin) { |
733 digilib = plugin; | |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
734 console.debug('installing regions plugin. digilib:', digilib); |
1048 | 735 // import digilib functions |
736 $.extend(fn, digilib.fn); | |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
737 // import geometry classes |
813 | 738 geom = fn.geometry; |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
739 // add defaults, actions, buttons |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
740 $.extend(digilib.defaults, defaults); |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
741 $.extend(digilib.actions, actions); |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
742 $.extend(digilib.buttons, buttons); |
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 |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
745 // plugin initialization |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
746 var init = function (data) { |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
747 console.debug('initialising regions plugin. data:', data); |
835 | 748 var $elem = data.$elem; |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
749 var settings = data.settings; |
996 | 750 var cssPrefix = data.settings.cssPrefix; |
1093
75a54db031dd
move found region into view, keep zoom factor if possible
hertzhaft
parents:
1092
diff
changeset
|
751 FULL_AREA = geom.rectangle(0, 0, 1, 1); |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
752 // region arrays |
1091 | 753 data.userRegions = []; |
754 data.htmlRegions = []; | |
1048 | 755 // install event handlers |
848 | 756 var $data = $(data); |
920 | 757 $data.on('setup', handleSetup); |
758 $data.on('update', handleUpdate); | |
1091 | 759 $data.on('newRegion', handleNewRegion); |
760 $data.on('regionClick', handleRegionClick); | |
1095 | 761 // default: autoZoom to region, when clicked - DEPRECATED |
762 if (settings.autoZoomOnClick && settings.onClickRegion == null) { | |
763 settings.onClickRegion = zoomToRegion; | |
764 } | |
765 // install region buttons if user defined regions are allowed | |
1027
ff19b9e936d3
allow predefined and user regions at the same time.
robcast
parents:
1025
diff
changeset
|
766 if (settings.processUserRegions) { |
1091 | 767 // add "rg" to digilibParamNames |
1088
16215fc22fbf
better separation of HTML and user defined regions
hertzhaft
parents:
1067
diff
changeset
|
768 // settings.digilibParamNames.push('rg'); |
1091 | 769 // TODO: this leads double params, because |
770 // settings.additionalParamNames is created earlier than this plugin's init() action | |
1048 | 771 if (digilib.plugins.buttons != null) { |
772 installButtons(data); | |
823 | 773 } |
813 | 774 } |
792 | 775 }; |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
776 |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
777 // plugin object with name and install/init methods |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
778 // shared objects filled by digilib on registration |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
779 var pluginProperties = { |
1048 | 780 name : 'regions', |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
781 install : install, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
782 init : init, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
783 buttons : {}, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
784 actions : {}, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
785 fn : {}, |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
786 plugins : {} |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
787 }; |
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
788 |
792 | 789 if ($.fn.digilib == null) { |
808
ae8e98c479d5
stub for new plugins; overlay div for regions plugin
hertzhaft
parents:
799
diff
changeset
|
790 $.error("jquery.digilib.regions must be loaded after jquery.digilib!"); |
792 | 791 } else { |
799
12f790cb30de
started to adapt regions plugin to new plugin mechanism
hertzhaft
parents:
792
diff
changeset
|
792 $.fn.digilib('plugin', pluginProperties); |
792 | 793 } |
794 })(jQuery); |