comparison client/digitallibrary/jquery/jquery.digilib.birdseye.js @ 788:040e9bc1602e jquery

birds eye view now as a plugin. digilib now 200 lines less!
author robcast
date Fri, 18 Feb 2011 18:58:52 +0100
parents 912519475259
children 32d1d6601968
comparison
equal deleted inserted replaced
787:1eef3e7a2270 788:040e9bc1602e
14 tooltip : "show bird's eye view", 14 tooltip : "show bird's eye view",
15 icon : "birds-eye.png" 15 icon : "birds-eye.png"
16 } 16 }
17 }; 17 };
18 18
19 var defaults = {
20 // is birdView shown?
21 'isBirdDivVisible' : false,
22 // dimensions of bird's eye div
23 'birdDivWidth' : 200,
24 'birdDivHeight' : 200,
25 // parameters used by bird's eye div
26 'birdDivParams' : ['fn','pn','dw','dh']
27 };
28
19 var actions = { 29 var actions = {
20 // event handler: toggles the visibility of the bird's eye window 30 // event handler: toggles the visibility of the bird's eye window
21 showBirdDiv : function (data, show) { 31 showBirdDiv : function (data, show) {
22 var settings = data.settings; 32 var settings = data.settings;
23 if (data.$birdDiv == null) { 33 if (data.$birdDiv == null) {
24 // no bird div -> create 34 // no bird div -> create
25 setupBirdDiv(data); 35 setupBirdDiv(data);
26 } 36 }
27 var on = showDiv(settings.isBirdDivVisible, data.$birdDiv, show); 37 var on = digilib.fn.showDiv(settings.isBirdDivVisible, data.$birdDiv, show);
28 settings.isBirdDivVisible = on; 38 settings.isBirdDivVisible = on;
29 highlightButtons(data, 'bird', on); 39 digilib.fn.highlightButtons(data, 'bird', on);
30 updateBirdDiv(data); 40 updateBirdDiv(data);
31 storeOptions(data); 41 digilib.fn.storeOptions(data);
32 } 42 }
33 }; 43 };
34 44
35 // plugin initialization called by digilib on plugin object. 45 // plugin installation called by digilib on plugin object.
36 var install = function() { 46 var install = function(digilib) {
37 // import geometry classes 47 // import geometry classes
38 geom = this.fn.geometry; 48 geom = digilib.fn.geometry;
39 FULL_AREA = digilib.fn.FULL_AREA; 49 FULL_AREA = geom.rectangle(0,0,1,1);
40 // TODO: add actions 50 // add defaults
41 // TODO: add buttons 51 $.extend(digilib.defaults, defaults);
42 // TODO: add event handlers 52 // add actions
53 $.extend(digilib.actions, actions);
54 // add buttons
55 $.extend(digilib.buttons, buttons);
56 // insert in button list -- not elegant
57 digilib.defaults.buttonSettings.fullscreen.standardSet.splice(9, 0, 'bird');
58 digilib.defaults.buttonSettings.embedded.standardSet.splice(5, 0, 'bird');
59 };
60
61 // plugin initialization
62 var init = function (data) {
63 var $data = $(data);
64 // install event handler
65 $data.bind('setup', handleSetup);
66 $data.bind('update', handleUpdate);
67 $data.bind('dragZoom', handleDragZoom);
43 }; 68 };
44 69
45 70
71 var handleSetup = function (evt) {
72 console.debug("birdseye: handleSetup");
73 data = this;
74 // bird's eye view creation
75 if (data.settings.isBirdDivVisible) {
76 setupBirdDiv(data);
77 data.$birdDiv.show();
78 }
79 };
80
81 var handleUpdate = function (evt) {
82 console.debug("birdseye: handleUpdate");
83 data = this;
84 if (data.settings.isBirdDivVisible) {
85 renderBirdArea(data);
86 setupBirdDrag(data);
87 }
88 };
89
90 var handleDragZoom = function (evt, zoomArea) {
91 //console.debug("birdseye: handleDragZoom za="+zoomArea);
92 data = this;
93 if (data.settings.isBirdDivVisible) {
94 setBirdZoom(data, zoomArea);
95 }
96 };
97
46 // returns URL for bird's eye view image 98 // returns URL for bird's eye view image
47 var getBirdImgUrl = function (data, moreParams) { 99 var getBirdImgUrl = function (data) {
48 var settings = data.settings; 100 var settings = data.settings;
49 var birdDivOptions = { 101 var birdDivOptions = {
50 dw : settings.birdDivWidth, 102 dw : settings.birdDivWidth,
51 dh : settings.birdDivHeight 103 dh : settings.birdDivHeight
52 }; 104 };
53 var birdSettings = $.extend({}, settings, birdDivOptions); 105 var birdSettings = $.extend({}, settings, birdDivOptions);
54 // use only the relevant parameters 106 // use only the relevant parameters
55 if (moreParams == null) { 107 var params = digilib.fn.getParamString(birdSettings, settings.birdDivParams, digilib.defaults);
56 var params = getParamString(birdSettings, settings.birdDivParams, defaults);
57 } else {
58 // filter scaler flags
59 if (birdSettings.mo != null) {
60 var mo = '';
61 if (data.scalerFlags.hmir != null) {
62 mo += 'hmir,';
63 }
64 if (data.scalerFlags.vmir != null) {
65 mo += 'vmir';
66 }
67 birdSettings.mo = mo;
68 }
69 var params = getParamString(birdSettings,
70 settings.birdDivParams.concat(moreParams), defaults);
71 }
72 var url = settings.scalerBaseUrl + '?' + params; 108 var url = settings.scalerBaseUrl + '?' + params;
73 return url; 109 return url;
74 }; 110 };
75 111
76 // creates HTML structure for the bird's eye view in elem 112 // creates HTML structure for the bird's eye view in elem
121 if (birdRect.width === 0) { 157 if (birdRect.width === 0) {
122 // malheureusement IE7 calls load handler when there is no size info yet 158 // malheureusement IE7 calls load handler when there is no size info yet
123 setTimeout(function () { $birdImg.triggerHandler('load'); }, 200); 159 setTimeout(function () { $birdImg.triggerHandler('load'); }, 200);
124 } 160 }
125 // update display (zoom area indicator) 161 // update display (zoom area indicator)
126 updateDisplay(data); 162 digilib.fn.updateDisplay(data);
127 }; 163 };
128 }; 164 };
129 165
130 // show zoom area indicator on bird's eye view 166 // show zoom area indicator on bird's eye view
131 var renderBirdArea = function (data) { 167 var renderBirdArea = function (data) {
132 if (data.$birdImg == null || ! data.$birdImg.get(0).complete) return; 168 if (data.$birdImg == null || ! data.$birdImg.get(0).complete) return;
133 var $birdZoom = data.$birdZoom; 169 var $birdZoom = data.$birdZoom;
134 var zoomArea = data.zoomArea; 170 var zoomArea = data.zoomArea;
135 var normalSize = isFullArea(zoomArea); 171 var normalSize = digilib.fn.isFullArea(zoomArea);
136 if (normalSize) { 172 if (normalSize) {
137 $birdZoom.hide(); 173 $birdZoom.hide();
138 return; 174 return;
139 } else { 175 } else {
140 $birdZoom.show(); 176 $birdZoom.show();
141 } 177 }
142 // create Transform from current area and picsize 178 // create Transform from current area and picsize
143 data.birdTrafo = getImgTrafo(data.$birdImg, FULL_AREA); 179 data.birdTrafo = digilib.fn.getImgTrafo(data.$birdImg, FULL_AREA);
144 var zoomRect = data.birdTrafo.transform(zoomArea); 180 var zoomRect = data.birdTrafo.transform(zoomArea);
145 console.debug("renderBirdArea:", zoomRect, "zoomArea:", zoomArea, "$birdTrafo:", data.birdTrafo); 181 console.debug("renderBirdArea:", zoomRect, "zoomArea:", zoomArea, "$birdTrafo:", data.birdTrafo);
146 // acount for border width 182 // acount for border width
147 var bw = getBorderWidth($birdZoom); 183 var bw = digilib.fn.getBorderWidth($birdZoom);
148 zoomRect.addPosition({x : -bw, y : -bw}); 184 zoomRect.addPosition({x : -bw, y : -bw});
149 if (data.settings.interactionMode === 'fullscreen') { 185 if (data.settings.interactionMode === 'fullscreen') {
150 // no animation for fullscreen 186 // no animation for fullscreen
151 zoomRect.adjustDiv($birdZoom); 187 zoomRect.adjustDiv($birdZoom);
152 } else { 188 } else {
168 var $birdImg = data.$birdImg; 204 var $birdImg = data.$birdImg;
169 var $birdZoom = data.$birdZoom; 205 var $birdZoom = data.$birdZoom;
170 var $document = $(document); 206 var $document = $(document);
171 var $scaler = data.$scaler; 207 var $scaler = data.$scaler;
172 var startPos, newRect, birdImgRect, birdZoomRect, fullRect, scalerPos; 208 var startPos, newRect, birdImgRect, birdZoomRect, fullRect, scalerPos;
173 var bw = getBorderWidth($birdZoom); 209 var bw = digilib.fn.getBorderWidth($birdZoom);
174 210
175 // mousedown handler: start dragging bird zoom to a new position 211 // mousedown handler: start dragging bird zoom to a new position
176 var birdZoomStartDrag = function(evt) { 212 var birdZoomStartDrag = function(evt) {
177 startPos = geom.position(evt); 213 startPos = geom.position(evt);
178 // position may have changed 214 // position may have changed
179 data.birdTrafo = getImgTrafo($birdImg, FULL_AREA); 215 data.birdTrafo = digilib.fn.getImgTrafo($birdImg, FULL_AREA);
180 birdImgRect = geom.rectangle($birdImg); 216 birdImgRect = geom.rectangle($birdImg);
181 birdZoomRect = geom.rectangle($birdZoom); 217 birdZoomRect = geom.rectangle($birdZoom);
182 scalerPos = geom.position($scaler); 218 scalerPos = geom.position($scaler);
183 newRect = null; 219 newRect = null;
184 fullRect = setZoomBG(data); // setup zoom background image 220 fullRect = digilib.fn.setZoomBG(data); // setup zoom background image
185 $document.bind("mousemove.dlBirdMove", birdZoomMove); 221 $document.bind("mousemove.dlBirdMove", birdZoomMove);
186 $document.bind("mouseup.dlBirdMove", birdZoomEndDrag); 222 $document.bind("mouseup.dlBirdMove", birdZoomEndDrag);
187 return false; 223 return false;
188 }; 224 };
189 225
227 } 263 }
228 // ugly, but needed to prevent double border width compensation 264 // ugly, but needed to prevent double border width compensation
229 newRect.addPosition({x : bw, y : bw}); 265 newRect.addPosition({x : bw, y : bw});
230 var newArea = data.birdTrafo.invtransform(newRect); 266 var newArea = data.birdTrafo.invtransform(newRect);
231 data.zoomArea = newArea; 267 data.zoomArea = newArea;
232 redisplay(data); 268 digilib.fn.redisplay(data);
233 return false; 269 return false;
234 }; 270 };
235 271
236 // clear old handler 272 // clear old handler
237 $document.unbind(".dlBirdMove"); 273 $document.unbind(".dlBirdMove");
238 $birdImg.unbind(".dlBirdMove"); 274 $birdImg.unbind(".dlBirdMove");
239 $birdZoom.unbind(".dlBirdMove"); 275 $birdZoom.unbind(".dlBirdMove");
240 if (! isFullArea(data.zoomArea)) { 276 if (! digilib.fn.isFullArea(data.zoomArea)) {
241 // set new handler 277 // set new handler
242 $birdImg.bind("mousedown.dlBirdMove", birdZoomStartDrag); 278 $birdImg.bind("mousedown.dlBirdMove", birdZoomStartDrag);
243 $birdZoom.bind("mousedown.dlBirdMove", birdZoomStartDrag); 279 $birdZoom.bind("mousedown.dlBirdMove", birdZoomStartDrag);
244 } 280 }
245 }; 281 };
246 282
247 // move bird zoom indicator to reflect zoomed detail area 283 // move bird zoom indicator to reflect zoomed detail area
248 var setBirdZoom = function(data, rect) { 284 var setBirdZoom = function(data, rect) {
249 var part = data.imgTrafo.invtransform(rect); 285 var part = data.imgTrafo.invtransform(rect);
250 // area = FULL_AREA.fit(part); // no, we want to see where we transcend the borders 286 // area = FULL_AREA.fit(part); // no, we want to see where we transcend the borders
251 birdTrafo = getImgTrafo(data.$birdImg, FULL_AREA); 287 birdTrafo = digilib.fn.getImgTrafo(data.$birdImg, FULL_AREA);
252 var birdRect = birdTrafo.transform(part); 288 var birdRect = birdTrafo.transform(part);
253 var $birdZoom = data.$birdZoom; 289 var $birdZoom = data.$birdZoom;
254 // acount for border width 290 // acount for border width
255 var bw = getBorderWidth($birdZoom); 291 var bw = digilib.fn.getBorderWidth($birdZoom);
256 birdRect.addPosition({x : -bw, y : -bw}); 292 birdRect.addPosition({x : -bw, y : -bw});
257 birdRect.adjustDiv(data.$birdZoom); 293 birdRect.adjustDiv(data.$birdZoom);
258 }; 294 };
259 295
260 // plugin object with name and init 296 // plugin object with name and init
261 // shared objects filled by digilib on registration 297 // shared objects filled by digilib on registration
262 var digilib = { 298 var digilib = {
263 name : 'birdseye', 299 name : 'birdseye',
264 install : install, 300 install : install,
301 init : init,
265 buttons : {}, 302 buttons : {},
266 actions : {}, 303 actions : {},
267 fn : {}, 304 fn : {},
268 plugins : {} 305 plugins : {}
269 }; 306 };