Mercurial > hg > digilib
annotate client/digitallibrary/jquery/jquery.digilib.js @ 609:e18dedef32fb jquery
setup the 'about' window
author | hertzhaft |
---|---|
date | Sun, 16 Jan 2011 19:52:06 +0100 |
parents | 5de82bb5022d |
children | 2f2cd8c44a1c |
rev | line source |
---|---|
597 | 1 /* |
2 * digilib jQuery plugin | |
3 * | |
4 */ | |
5 | |
6 (function($) { | |
603 | 7 var buttons = { |
8 reference : { | |
9 onclick : "javascript:getRefWin()", | |
10 tooltip : "get a reference URL", | |
11 img : "reference.png" | |
12 }, | |
13 zoomin : { | |
14 onclick : "javascript:dl.zoomBy(1.4)", | |
15 tooltip : "zoom in", | |
16 img : "zoom-in.png" | |
17 }, | |
18 zoomout : { | |
19 onclick : "javascript:zoomBy(0.7)", | |
20 tooltip : "zoom out", | |
21 img : "zoom-out.png" | |
22 }, | |
23 zoomarea : { | |
24 onclick : "javascript:zoomArea()", | |
25 tooltip : "zoom area", | |
26 img : "zoom-area.png" | |
27 }, | |
28 zoomfull : { | |
29 onclick : "javascript:zoomFullpage()", | |
30 tooltip : "view the whole image", | |
31 img : "zoom-full.png" | |
32 }, | |
33 pagewidth : { | |
34 onclick : "javascript:zoomFullpage('width')", | |
35 tooltip : "page width", | |
36 img : "pagewidth.png" | |
37 }, | |
38 back : { | |
39 onclick : "javascript:gotoPage('-1')", | |
40 tooltip : "goto previous image", | |
41 img : "back.png" | |
42 }, | |
43 fwd : { | |
44 onclick : "javascript:gotoPage('+1')", | |
45 tooltip : "goto next image", | |
46 img : "fwd.png" | |
47 }, | |
48 page : { | |
49 onclick : "javascript:gotoPageWin()", | |
50 tooltip : "specify image", | |
51 img : "page.png" | |
52 }, | |
53 bird : { | |
54 onclick : "javascript:toggleBirdDiv()", | |
55 tooltip : "show bird's eye view", | |
56 img : "birds-eye.png" | |
57 }, | |
58 help : { | |
59 onclick : "javascript:toggleAboutDiv()", | |
60 tooltip : "about Digilib", | |
61 img : "help.png" | |
62 }, | |
63 reset : { | |
64 onclick : "javascript:resetImage()", | |
65 tooltip : "reset image", | |
66 img : "reset.png" | |
67 }, | |
68 mark : { | |
69 onclick : "javascript:setMark()", | |
70 tooltip : "set a mark", | |
71 img : "mark.png" | |
72 }, | |
73 delmark : { | |
74 onclick : "javascript:removeMark()", | |
75 tooltip : "delete the last mark", | |
76 img : "delmark.png" | |
77 }, | |
78 hmir : { | |
79 onclick : "javascript:mirror('h')", | |
80 tooltip : "mirror horizontally", | |
81 img : "mirror-horizontal.png" | |
82 }, | |
83 vmir : { | |
84 onclick : "javascript:mirror('v')", | |
85 tooltip : "mirror vertically", | |
86 img : "mirror-vertical.png" | |
87 }, | |
88 rot : { | |
89 onclick : "javascript:setParamWin('rot', 'Rotate (0..360) clockwise')", | |
90 tooltip : "rotate image", | |
91 img : "rotate.png" | |
92 }, | |
93 brgt : { | |
94 onclick : "javascript:setParamWin('brgt', 'Brightness (-255..255)')", | |
95 tooltip : "set brightness", | |
96 img : "brightness.png" | |
97 }, | |
98 cont : { | |
99 onclick : "javascript:setParamWin('cont', 'Contrast (0..8)')", | |
100 tooltip : "set contrast", | |
101 img : "contrast.png" | |
102 }, | |
103 rgb : { | |
104 onclick : "javascript:setParamWin('rgb', '...')", | |
105 tooltip : "set rgb values", | |
106 img : "rgb.png" | |
107 }, | |
108 quality : { | |
109 onclick : "javascript:setQualityWin('Quality (0..2)')", | |
110 tooltip : "set image quality", | |
111 img : "quality.png" | |
112 }, | |
113 size : { | |
114 onclick : "javascript:toggleSizeMenu()", | |
115 tooltip : "set page size", | |
116 img : "size.png" | |
117 }, | |
118 calibrationx : { | |
119 onclick : "javascript:calibrate('x')", | |
120 tooltip : "calibrate screen x-ratio", | |
121 img : "calibration-x.png" | |
122 }, | |
123 scale : { | |
124 onclick : "javascript:toggleScaleMenu()", | |
125 tooltip : "change image scale", | |
126 img : "original-size.png" | |
127 }, | |
128 options : { | |
129 onclick : "javascript:toggleOptionDiv()", | |
130 tooltip : "hide options", | |
131 img : "options.png" | |
132 }, | |
133 SEP : { | |
134 img : "sep.png" | |
135 } | |
136 }; | |
137 | |
598 | 138 var defaults = { |
609 | 139 // version of this script |
140 'version' : 'jquery.digilib.js 1.0', | |
141 // logo url | |
142 'logoUrl' : '../img/digilib-logo-text1.png', | |
143 // repository url | |
144 'reposUrl' : 'http://digilib.berlios.de', | |
603 | 145 // base URL to Scaler servlet |
146 'scalerBaseUrl' : 'http://digilib.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler', | |
147 // list of Scaler parameters | |
602 | 148 'scalerParamNames' : ['fn','pn','dw','dh','ww','wh','wx','wy','ws','mo', |
149 'rot','cont','brgt','rgbm','rgba','ddpi','ddpix','ddpiy'], | |
603 | 150 // mode of operation. |
151 // fullscreen: takes parameters from page URL, keeps state in page URL | |
152 // embedded: takes parameters from Javascript options, keeps state inside object | |
153 'interactionMode' : 'fullscreen', | |
154 // buttons | |
155 'buttons' : buttons, | |
605 | 156 // path to button images (must end with a slash) |
157 'buttonsImagePath' : '../greyskin/', | |
603 | 158 // button groups |
159 'buttonsStandard' : ["reference","zoomin","zoomout","zoomarea","zoomfull","pagewidth","back","fwd","page","bird","SEP","help","reset","options"], | |
160 'buttonsSpecial' : ["mark","delmark","hmir","vmir","rot","brgt","cont","rgb","quality","size","calibrationx","scale","SEP","options"], | |
608 | 161 'buttonsCustom' : [], |
609 | 162 // is birdView shown? |
163 'isBirdDivVisible' : false, | |
608 | 164 // dimensions of bird's eye window |
165 'birdMaxX' : 200, | |
609 | 166 'birdMaxY' : 200, |
167 // is the "about" window shown? | |
168 'isAboutDivVisible' : false | |
169 | |
603 | 170 }; |
598 | 171 |
601 | 172 // parameters from the query string |
600 | 173 var queryParams = {}; |
601 | 174 |
175 // affine geometry classes | |
176 var geom = dlGeometry(); | |
597 | 177 |
178 var methods = { | |
601 | 179 // digilib initialization |
597 | 180 init : function(options) { |
601 | 181 // settings for this digilib instance are merged from defaults and options |
600 | 182 var settings = $.extend({}, defaults, options); |
183 var isFullscreen = settings.interactionMode === 'fullscreen'; | |
184 if (isFullscreen) { | |
185 queryParams = parseQueryParams(); | |
186 }; | |
597 | 187 return this.each(function() { |
598 | 188 var $elem = $(this); |
189 var data = $elem.data('digilib'); | |
600 | 190 var elemSettings; |
601 | 191 // if the plugin hasn't been initialized yet |
597 | 192 if (!data) { |
598 | 193 // merge query parameters |
600 | 194 if (isFullscreen) { |
195 elemSettings = $.extend({}, settings, queryParams); | |
196 } else { | |
197 elemSettings = $.extend({}, settings, parseImgParams($elem)); | |
198 }; | |
598 | 199 // store in data element |
200 $elem.data('digilib', { | |
201 target : $elem, | |
600 | 202 settings : elemSettings |
597 | 203 }); |
204 } | |
601 | 205 // create HTML structure |
206 setupScalerDiv($elem, elemSettings); | |
604 | 207 setupButtons($elem, elemSettings, 'buttonsStandard'); |
608 | 208 setupBirdviewDiv($elem, elemSettings); |
609 | 209 setupAboutDiv($elem, elemSettings); |
597 | 210 }); |
211 }, | |
601 | 212 |
213 // clean up digilib | |
597 | 214 destroy : function() { |
215 return this.each(function(){ | |
216 var $this = $(this); | |
217 var data = $this.data('digilib'); | |
218 // Namespacing FTW | |
598 | 219 $(window).unbind('.digilib'); // unbinds all digilibs(?) |
597 | 220 data.digilib.remove(); |
221 $this.removeData('digilib'); | |
222 }); | |
223 } | |
598 | 224 }; |
597 | 225 |
601 | 226 // returns parameters from page url |
600 | 227 var parseQueryParams = function() { |
228 return parseQueryString(location.search.slice(1)); | |
229 }; | |
230 | |
601 | 231 // returns parameters taken from embedded img-element |
600 | 232 var parseImgParams = function($elem) { |
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
233 var src = $elem.find('img').first().attr('src'); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
234 if (!src) { |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
235 return null; |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
236 } |
600 | 237 var pos = src.indexOf('?'); |
238 var query = (pos < 0) ? '' : src.substring(pos + 1); | |
239 var scalerUrl = src.substring(0, pos); | |
240 var hash = parseQueryString(query); | |
602 | 241 hash.scalerBaseUrl = scalerUrl; |
600 | 242 // console.log(hash); |
243 return hash; | |
244 }; | |
245 | |
601 | 246 // parses query parameter string into parameter object |
600 | 247 var parseQueryString = function(query) { |
248 var pairs = query.split("&"); | |
249 var hash = {}; | |
250 for (var i = 0; i < pairs.length; i++) { | |
251 var pair = pairs[i].split("="); | |
252 if (pair.length === 2) { | |
601 | 253 hash[pair[0]] = pair[1]; |
600 | 254 }; |
255 }; | |
256 return hash; | |
257 }; | |
597 | 258 |
608 | 259 // returns a query string from key names from a parameter hash |
260 var makeParamString = function (settings, keys) { | |
261 var paramString = ''; | |
262 var latter = false; | |
263 for (i = 0; i < keys.length; ++i) { | |
264 var key = keys[i]; | |
265 if (settings[key]) { | |
266 // first param gets no '&' | |
267 paramString += latter ? '&' : ''; | |
268 latter = true; | |
269 // add parm=val | |
270 paramString += key + '=' + settings[key]; | |
271 }; | |
272 } | |
273 return paramString; | |
274 }; | |
275 | |
601 | 276 // returns URL and query string for Scaler |
277 var getScalerString = function (settings) { | |
608 | 278 var keys = settings.scalerParamNames; |
279 var queryString = makeParamString(settings, keys); | |
280 var url = settings.scalerBaseUrl + '?' + queryString; | |
602 | 281 return url; |
282 }; | |
608 | 283 |
602 | 284 // returns maximum size for scaler img in fullscreen mode |
285 var getFullscreenImgSize = function($elem) { | |
286 var winH = $(window).height(); | |
287 var winW = $(window).width(); | |
288 // TODO: account for borders? | |
289 return geom.size(winW, winH); | |
601 | 290 }; |
291 | |
292 // creates HTML structure for digilib in elem | |
293 var setupScalerDiv = function ($elem, settings) { | |
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
294 var rewrite; |
601 | 295 if (settings.interactionMode === 'fullscreen') { |
602 | 296 // fullscreen |
297 var imgSize = getFullscreenImgSize($elem); | |
298 settings.dw = imgSize.width; | |
299 settings.dh = imgSize.height; | |
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
300 $img = $('<img/>'); |
602 | 301 var scalerUrl = getScalerString(settings); |
302 $img.attr('src', scalerUrl); | |
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
303 $img.addClass('pic'); |
602 | 304 } else { |
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
305 // embedded mode -- try to keep img tag |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
306 var $img = $elem.find('img'); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
307 if ($img.length > 0) { |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
308 console.debug("img detach:",$img); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
309 $img.detach(); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
310 $img.addClass('picsi'); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
311 } else { |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
312 $img = $('<img/>'); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
313 var scalerUrl = getScalerString(settings); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
314 $img.attr('src', scalerUrl); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
315 $img.addClass('pic'); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
316 } |
601 | 317 } |
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
318 // create new html |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
319 $elem.empty(); // TODO: should we keep stuff for customization? |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
320 var $scaler = $('<div class="scaler"/>'); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
321 $elem.append($scaler); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
322 $scaler.append($img); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
323 $img.load(scalerImgLoadedFn(settings)); |
601 | 324 }; |
608 | 325 |
603 | 326 // creates HTML structure for buttons in elem |
327 var setupButtons = function ($elem, settings, buttonGroup) { | |
328 if (settings.interactionMode === 'fullscreen') { | |
329 // fullscreen -- create new | |
605 | 330 var $buttonsDiv = $('<div class="buttons"></div>'); |
331 $elem.append($buttonsDiv); | |
603 | 332 var buttonNames = settings[buttonGroup]; |
333 for (var i = 0; i < buttonNames.length; i++) { | |
334 var buttonName = buttonNames[i]; | |
605 | 335 var buttonSettings = settings.buttons[buttonName]; |
336 // construct the button html | |
337 var $button = $('<div class="button"></div>'); | |
338 var $a = $('<a/>'); | |
607 | 339 var $img = $('<img class="button"/>'); |
605 | 340 $buttonsDiv.append($button); |
341 $button.append($a); | |
342 $a.append($img); | |
343 // add attributes and bindings | |
344 $button.attr('title', buttonSettings.tooltip); | |
345 $button.addClass('button-' + buttonName); | |
346 // let the clicked <a> element know about the digilib context | |
347 $a.data('digilib', { 'name' : buttonName, 'settings' : settings } ); | |
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
348 $a.bind('click', function() { |
605 | 349 // get the context settings |
350 var data = $(this).data('digilib'); | |
351 // find the action for the clicked element | |
352 console.log(data.settings.buttons[data.name].onclick); | |
353 }); | |
354 // binding mit closure | |
355 //(function(){ var action = buttonSettings.onclick; | |
356 // $a.bind('click', function(){ console.log( action )} ); | |
357 //})(); | |
358 $img.attr('src', settings.buttonsImagePath + buttonSettings.img); | |
604 | 359 }; |
360 } | |
605 | 361 return $buttonsDiv; |
603 | 362 }; |
608 | 363 |
364 // creates HTML structure for the bird's eye view in elem | |
365 var setupBirdviewDiv = function ($elem, settings) { | |
366 // use only the relevant parameters | |
367 var keys = ['fn','pn','dw','dh']; | |
368 var birdDimensions = { | |
369 'dw' : settings.birdMaxX, | |
370 'dh' : settings.birdMaxY | |
371 }; | |
372 var birdSettings = $.extend({}, settings, birdDimensions); | |
373 var birdUrl = settings.scalerBaseUrl + '?' + makeParamString(birdSettings, keys); | |
374 // the bird's eye div | |
375 var $birdviewDiv = $('<div class="birdview"/>'); | |
376 // the detail indicator frame | |
377 var $birdzoomDiv = $('<div class="birdzoom"/>'); | |
378 // the small image | |
379 var $birdImg = $('<img class="birdimg"/>'); | |
380 $elem.append($birdviewDiv); | |
381 $birdviewDiv.append($birdzoomDiv); | |
382 $birdviewDiv.append($birdImg); | |
383 $birdImg.attr('src', birdUrl); | |
384 }; | |
385 | |
609 | 386 // creates HTML structure for the bird's eye view in elem |
387 var setupAboutDiv = function ($elem, settings) { | |
388 var $aboutDiv = $('<div class="about"/>'); | |
389 var $header = $('<p>Digilib Graphic Viewer</p>'); | |
390 var $link = $('<a/>'); | |
391 var $logo = $('<img class="logo" title="digilib"/>'); | |
392 var $content = $('<p/>'); | |
393 $elem.append($aboutDiv); | |
394 $aboutDiv.append($header); | |
395 $aboutDiv.append($link); | |
396 $aboutDiv.append($content); | |
397 $link.append($logo); | |
398 $logo.attr('src', settings.logoUrl); | |
399 $link.attr('href', settings.reposUrl); | |
400 $content.text('Version: ' + settings.version); | |
401 }; | |
402 | |
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
403 // returns function for load event of scaler img |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
404 var scalerImgLoadedFn = function(settings) { |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
405 return function() { |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
406 console.debug("img loaded! settings=", settings); |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
407 }; |
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
408 }; |
598 | 409 // hook plugin into jquery |
410 $.fn.digilib = function(method) { | |
411 if (methods[method]) { | |
412 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); | |
413 } else if (typeof(method) === 'object' || !method) { | |
414 return methods.init.apply(this, arguments); | |
415 } else { | |
416 $.error( 'Method ' + method + ' does not exist on jQuery.digilib' ); | |
417 } | |
418 }; | |
597 | 419 |
420 })(jQuery); |