comparison client/digitallibrary/jquery/jquery.digilib.birdseye.js @ 786:912519475259 jquery

documentation for new plugin api in jquery-digilib-plugin.txt. more steps towards plugification of birdseye view.
author robcast
date Fri, 18 Feb 2011 15:16:30 +0100
parents 966d5c938b4c
children 040e9bc1602e
comparison
equal deleted inserted replaced
784:966d5c938b4c 786:912519475259
6 // affine geometry plugin stub 6 // affine geometry plugin stub
7 var geom; 7 var geom;
8 8
9 var FULL_AREA; 9 var FULL_AREA;
10 10
11 var buttons = {
12 bird : {
13 onclick : "showBirdDiv",
14 tooltip : "show bird's eye view",
15 icon : "birds-eye.png"
16 }
17 };
18
11 var actions = { 19 var actions = {
20 // event handler: toggles the visibility of the bird's eye window
21 showBirdDiv : function (data, show) {
22 var settings = data.settings;
23 if (data.$birdDiv == null) {
24 // no bird div -> create
25 setupBirdDiv(data);
26 }
27 var on = showDiv(settings.isBirdDivVisible, data.$birdDiv, show);
28 settings.isBirdDivVisible = on;
29 highlightButtons(data, 'bird', on);
30 updateBirdDiv(data);
31 storeOptions(data);
32 }
12 }; 33 };
13 34
14 // init: plugin initialization 35 // plugin initialization called by digilib on plugin object.
15 var plugInit = function(data) { 36 var install = function() {
16 // import geometry classes 37 // import geometry classes
17 geom = digilib.fn.geometry; 38 geom = this.fn.geometry;
18 FULL_AREA = digilib.fn.FULL_AREA; 39 FULL_AREA = digilib.fn.FULL_AREA;
19 // TODO: add actions 40 // TODO: add actions
20 // TODO: add buttons 41 // TODO: add buttons
21 // TODO: add event handlers 42 // TODO: add event handlers
22 }; 43 };
23 44
24 45
46 // returns URL for bird's eye view image
47 var getBirdImgUrl = function (data, moreParams) {
48 var settings = data.settings;
49 var birdDivOptions = {
50 dw : settings.birdDivWidth,
51 dh : settings.birdDivHeight
52 };
53 var birdSettings = $.extend({}, settings, birdDivOptions);
54 // use only the relevant parameters
55 if (moreParams == null) {
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;
73 return url;
74 };
75
76 // creates HTML structure for the bird's eye view in elem
77 var setupBirdDiv = function (data) {
78 var $elem = data.$elem;
79 // the bird's eye div
80 var $birdDiv = $('<div class="birdview" style="display:none"/>');
81 // the detail indicator frame
82 var $birdZoom = $('<div class="birdzoom" style="display:none; background-color:transparent;"/>');
83 // the small image
84 var $birdImg = $('<img class="birdimg"/>');
85 data.$birdDiv = $birdDiv;
86 data.$birdZoom = $birdZoom;
87 data.$birdImg = $birdImg;
88 $elem.append($birdDiv);
89 $birdDiv.append($birdZoom);
90 $birdDiv.append($birdImg);
91 // $birdZoom.css(data.settings.birdIndicatorStyle);
92 var birdUrl = getBirdImgUrl(data);
93 $birdImg.load(birdImgLoadedHandler(data));
94 $birdImg.error(function () {console.error("error loading birdview image");});
95 $birdImg.attr('src', birdUrl);
96 };
97
98 // update bird's eye view
99 var updateBirdDiv = function (data) {
100 if (!data.settings.isBirdDivVisible) return;
101 var $birdImg = data.$birdImg;
102 var oldsrc = $birdImg.attr('src');
103 var newsrc = getBirdImgUrl(data);
104 if (oldsrc !== newsrc) {
105 $birdImg.attr('src', newsrc);
106 // onload handler re-renders
107 } else {
108 // re-render
109 renderBirdArea(data);
110 // enable click and drag
111 setupBirdDrag(data);
112 }
113 };
114
115 // returns function for load event of bird's eye view img
116 var birdImgLoadedHandler = function (data) {
117 return function () {
118 var $birdImg = $(this);
119 var birdRect = geom.rectangle($birdImg);
120 console.debug("birdImg loaded!", $birdImg, "rect=", birdRect, "data=", data);
121 if (birdRect.width === 0) {
122 // malheureusement IE7 calls load handler when there is no size info yet
123 setTimeout(function () { $birdImg.triggerHandler('load'); }, 200);
124 }
125 // update display (zoom area indicator)
126 updateDisplay(data);
127 };
128 };
129
130 // show zoom area indicator on bird's eye view
131 var renderBirdArea = function (data) {
132 if (data.$birdImg == null || ! data.$birdImg.get(0).complete) return;
133 var $birdZoom = data.$birdZoom;
134 var zoomArea = data.zoomArea;
135 var normalSize = isFullArea(zoomArea);
136 if (normalSize) {
137 $birdZoom.hide();
138 return;
139 } else {
140 $birdZoom.show();
141 }
142 // create Transform from current area and picsize
143 data.birdTrafo = getImgTrafo(data.$birdImg, FULL_AREA);
144 var zoomRect = data.birdTrafo.transform(zoomArea);
145 console.debug("renderBirdArea:", zoomRect, "zoomArea:", zoomArea, "$birdTrafo:", data.birdTrafo);
146 // acount for border width
147 var bw = getBorderWidth($birdZoom);
148 zoomRect.addPosition({x : -bw, y : -bw});
149 if (data.settings.interactionMode === 'fullscreen') {
150 // no animation for fullscreen
151 zoomRect.adjustDiv($birdZoom);
152 } else {
153 // nice animation for embedded mode :-)
154 // correct offsetParent because animate doesn't use offset
155 var ppos = $birdZoom.offsetParent().offset();
156 var dest = {
157 left : (zoomRect.x - ppos.left) + 'px',
158 top : (zoomRect.y - ppos.top) + 'px',
159 width : zoomRect.width,
160 height : zoomRect.height
161 };
162 $birdZoom.animate(dest);
163 }
164 };
165
166 // bird's eye view zoom area click and drag handler
167 var setupBirdDrag = function(data) {
168 var $birdImg = data.$birdImg;
169 var $birdZoom = data.$birdZoom;
170 var $document = $(document);
171 var $scaler = data.$scaler;
172 var startPos, newRect, birdImgRect, birdZoomRect, fullRect, scalerPos;
173 var bw = getBorderWidth($birdZoom);
174
175 // mousedown handler: start dragging bird zoom to a new position
176 var birdZoomStartDrag = function(evt) {
177 startPos = geom.position(evt);
178 // position may have changed
179 data.birdTrafo = getImgTrafo($birdImg, FULL_AREA);
180 birdImgRect = geom.rectangle($birdImg);
181 birdZoomRect = geom.rectangle($birdZoom);
182 scalerPos = geom.position($scaler);
183 newRect = null;
184 fullRect = setZoomBG(data); // setup zoom background image
185 $document.bind("mousemove.dlBirdMove", birdZoomMove);
186 $document.bind("mouseup.dlBirdMove", birdZoomEndDrag);
187 return false;
188 };
189
190 // mousemove handler: drag
191 var birdZoomMove = function(evt) {
192 var pos = geom.position(evt);
193 var delta = startPos.delta(pos);
194 // move birdZoom div, keeping size
195 newRect = birdZoomRect.copy();
196 newRect.addPosition(delta);
197 newRect.stayInside(birdImgRect);
198 // reflect birdview zoom position in scaler image
199 var area = data.birdTrafo.invtransform(newRect);
200 var imgArea = data.imgTrafo.transform(area);
201 var offset = imgArea.getPosition().neg();
202 offset.add(scalerPos);
203 if (fullRect) {
204 var bgPos = fullRect.getPosition().add(offset);
205 } else {
206 var bgPos = offset;
207 }
208 // move the background image to the new position
209 data.$scaler.css({
210 'background-position' : bgPos.x + "px " + bgPos.y + "px"
211 });
212 // acount for border width
213 newRect.addPosition({x : -bw, y : -bw});
214 newRect.adjustDiv($birdZoom);
215 return false;
216 };
217
218 // mouseup handler: reload page
219 var birdZoomEndDrag = function(evt) {
220 var settings = data.settings;
221 $document.unbind("mousemove.dlBirdMove", birdZoomMove);
222 $document.unbind("mouseup.dlBirdMove", birdZoomEndDrag);
223 if (newRect == null) {
224 // no movement happened - set center to click position
225 startPos = birdZoomRect.getCenter();
226 birdZoomMove(evt);
227 }
228 // ugly, but needed to prevent double border width compensation
229 newRect.addPosition({x : bw, y : bw});
230 var newArea = data.birdTrafo.invtransform(newRect);
231 data.zoomArea = newArea;
232 redisplay(data);
233 return false;
234 };
235
236 // clear old handler
237 $document.unbind(".dlBirdMove");
238 $birdImg.unbind(".dlBirdMove");
239 $birdZoom.unbind(".dlBirdMove");
240 if (! isFullArea(data.zoomArea)) {
241 // set new handler
242 $birdImg.bind("mousedown.dlBirdMove", birdZoomStartDrag);
243 $birdZoom.bind("mousedown.dlBirdMove", birdZoomStartDrag);
244 }
245 };
246
247 // move bird zoom indicator to reflect zoomed detail area
248 var setBirdZoom = function(data, rect) {
249 var part = data.imgTrafo.invtransform(rect);
250 // area = FULL_AREA.fit(part); // no, we want to see where we transcend the borders
251 birdTrafo = getImgTrafo(data.$birdImg, FULL_AREA);
252 var birdRect = birdTrafo.transform(part);
253 var $birdZoom = data.$birdZoom;
254 // acount for border width
255 var bw = getBorderWidth($birdZoom);
256 birdRect.addPosition({x : -bw, y : -bw});
257 birdRect.adjustDiv(data.$birdZoom);
258 };
259
25 // plugin object with name and init 260 // plugin object with name and init
26 // shared objects filled by digilib on registration 261 // shared objects filled by digilib on registration
27 var digilib = { 262 var digilib = {
28 name : 'birdseye', 263 name : 'birdseye',
29 init : plugInit, 264 install : install,
30 buttons : {}, 265 buttons : {},
31 actions : {}, 266 actions : {},
32 fn : {}, 267 fn : {},
33 plugins : {} 268 plugins : {}
34 }; 269 };