Mercurial > hg > digilib
annotate client/digitallibrary/jquery/jquery.digilib.js @ 607:dc6b2e7f3621 jquery
highlight hovered buttons
| author | hertzhaft |
|---|---|
| date | Sun, 16 Jan 2011 14:05:17 +0100 |
| parents | d08d095430c3 |
| children | 5de82bb5022d |
| 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 = { |
| 603 | 139 // base URL to Scaler servlet |
| 140 'scalerBaseUrl' : 'http://digilib.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler', | |
| 141 // list of Scaler parameters | |
| 602 | 142 'scalerParamNames' : ['fn','pn','dw','dh','ww','wh','wx','wy','ws','mo', |
| 143 'rot','cont','brgt','rgbm','rgba','ddpi','ddpix','ddpiy'], | |
| 603 | 144 // mode of operation. |
| 145 // fullscreen: takes parameters from page URL, keeps state in page URL | |
| 146 // embedded: takes parameters from Javascript options, keeps state inside object | |
| 147 'interactionMode' : 'fullscreen', | |
| 148 // buttons | |
| 149 'buttons' : buttons, | |
| 605 | 150 // path to button images (must end with a slash) |
| 151 'buttonsImagePath' : '../greyskin/', | |
| 603 | 152 // button groups |
| 153 'buttonsStandard' : ["reference","zoomin","zoomout","zoomarea","zoomfull","pagewidth","back","fwd","page","bird","SEP","help","reset","options"], | |
| 154 'buttonsSpecial' : ["mark","delmark","hmir","vmir","rot","brgt","cont","rgb","quality","size","calibrationx","scale","SEP","options"], | |
| 604 | 155 'buttonsCustom' : [] |
| 603 | 156 }; |
| 598 | 157 |
| 601 | 158 // parameters from the query string |
| 600 | 159 var queryParams = {}; |
| 601 | 160 |
| 161 // affine geometry classes | |
| 162 var geom = dlGeometry(); | |
| 597 | 163 |
| 164 var methods = { | |
| 601 | 165 // digilib initialization |
| 597 | 166 init : function(options) { |
| 601 | 167 // settings for this digilib instance are merged from defaults and options |
| 600 | 168 var settings = $.extend({}, defaults, options); |
| 169 var isFullscreen = settings.interactionMode === 'fullscreen'; | |
| 170 if (isFullscreen) { | |
| 171 queryParams = parseQueryParams(); | |
| 172 }; | |
| 597 | 173 return this.each(function() { |
| 598 | 174 var $elem = $(this); |
| 175 var data = $elem.data('digilib'); | |
| 600 | 176 var elemSettings; |
| 601 | 177 // if the plugin hasn't been initialized yet |
| 597 | 178 if (!data) { |
| 598 | 179 // merge query parameters |
| 600 | 180 if (isFullscreen) { |
| 181 elemSettings = $.extend({}, settings, queryParams); | |
| 182 } else { | |
| 183 elemSettings = $.extend({}, settings, parseImgParams($elem)); | |
| 184 }; | |
| 598 | 185 // store in data element |
| 186 $elem.data('digilib', { | |
| 187 target : $elem, | |
| 600 | 188 settings : elemSettings |
| 597 | 189 }); |
| 190 } | |
| 601 | 191 // create HTML structure |
| 192 setupScalerDiv($elem, elemSettings); | |
| 604 | 193 setupButtons($elem, elemSettings, 'buttonsStandard'); |
| 597 | 194 }); |
| 195 }, | |
| 601 | 196 |
| 197 // clean up digilib | |
| 597 | 198 destroy : function() { |
| 199 return this.each(function(){ | |
| 200 var $this = $(this); | |
| 201 var data = $this.data('digilib'); | |
| 202 // Namespacing FTW | |
| 598 | 203 $(window).unbind('.digilib'); // unbinds all digilibs(?) |
| 597 | 204 data.digilib.remove(); |
| 205 $this.removeData('digilib'); | |
| 206 }); | |
| 207 } | |
| 598 | 208 }; |
| 597 | 209 |
| 601 | 210 // returns parameters from page url |
| 600 | 211 var parseQueryParams = function() { |
| 212 return parseQueryString(location.search.slice(1)); | |
| 213 }; | |
| 214 | |
| 601 | 215 // returns parameters taken from embedded img-element |
| 600 | 216 var parseImgParams = function($elem) { |
|
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
217 var src = $elem.find('img').first().attr('src'); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
218 if (!src) { |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
219 return null; |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
220 } |
| 600 | 221 var pos = src.indexOf('?'); |
| 222 var query = (pos < 0) ? '' : src.substring(pos + 1); | |
| 223 var scalerUrl = src.substring(0, pos); | |
| 224 var hash = parseQueryString(query); | |
| 602 | 225 hash.scalerBaseUrl = scalerUrl; |
| 600 | 226 // console.log(hash); |
| 227 return hash; | |
| 228 }; | |
| 229 | |
| 601 | 230 // parses query parameter string into parameter object |
| 600 | 231 var parseQueryString = function(query) { |
| 232 var pairs = query.split("&"); | |
| 233 var hash = {}; | |
| 234 for (var i = 0; i < pairs.length; i++) { | |
| 235 var pair = pairs[i].split("="); | |
| 236 if (pair.length === 2) { | |
| 601 | 237 hash[pair[0]] = pair[1]; |
| 600 | 238 }; |
| 239 }; | |
| 240 return hash; | |
| 241 }; | |
| 597 | 242 |
| 601 | 243 // returns URL and query string for Scaler |
| 244 var getScalerString = function (settings) { | |
| 602 | 245 var url = settings.scalerBaseUrl + '?'; |
| 246 var i, parm, latter; | |
| 247 // go through param names and get values from settings | |
| 248 for (i = 0; i < settings.scalerParamNames.length; ++i) { | |
| 249 parm = settings.scalerParamNames[i]; | |
| 250 if (settings[parm]) { | |
| 251 // first parm gets no '&' | |
| 252 url += latter ? '&' : ''; | |
| 253 latter = 1; | |
| 254 // add parm=val | |
| 255 url += parm + '=' + settings[parm]; | |
| 256 } | |
| 257 } | |
| 258 return url; | |
| 259 }; | |
| 260 | |
| 261 // returns maximum size for scaler img in fullscreen mode | |
| 262 var getFullscreenImgSize = function($elem) { | |
| 263 var winH = $(window).height(); | |
| 264 var winW = $(window).width(); | |
| 265 // TODO: account for borders? | |
| 266 return geom.size(winW, winH); | |
| 601 | 267 }; |
| 268 | |
| 269 // creates HTML structure for digilib in elem | |
| 270 var setupScalerDiv = function ($elem, settings) { | |
|
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
271 var rewrite; |
| 601 | 272 if (settings.interactionMode === 'fullscreen') { |
| 602 | 273 // fullscreen |
| 274 var imgSize = getFullscreenImgSize($elem); | |
| 275 settings.dw = imgSize.width; | |
| 276 settings.dh = imgSize.height; | |
|
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
277 $img = $('<img/>'); |
| 602 | 278 var scalerUrl = getScalerString(settings); |
| 279 $img.attr('src', scalerUrl); | |
|
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
280 $img.addClass('pic'); |
| 602 | 281 } else { |
|
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
282 // embedded mode -- try to keep img tag |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
283 var $img = $elem.find('img'); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
284 if ($img.length > 0) { |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
285 console.debug("img detach:",$img); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
286 $img.detach(); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
287 $img.addClass('picsi'); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
288 } else { |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
289 $img = $('<img/>'); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
290 var scalerUrl = getScalerString(settings); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
291 $img.attr('src', scalerUrl); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
292 $img.addClass('pic'); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
293 } |
| 601 | 294 } |
|
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
295 // create new html |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
296 $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
|
297 var $scaler = $('<div class="scaler"/>'); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
298 $elem.append($scaler); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
299 $scaler.append($img); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
300 $img.load(scalerImgLoadedFn(settings)); |
| 601 | 301 }; |
| 302 | |
| 603 | 303 // creates HTML structure for buttons in elem |
| 304 var setupButtons = function ($elem, settings, buttonGroup) { | |
| 305 if (settings.interactionMode === 'fullscreen') { | |
| 306 // fullscreen -- create new | |
| 605 | 307 var $buttonsDiv = $('<div class="buttons"></div>'); |
| 308 $elem.append($buttonsDiv); | |
| 603 | 309 var buttonNames = settings[buttonGroup]; |
| 310 for (var i = 0; i < buttonNames.length; i++) { | |
| 311 var buttonName = buttonNames[i]; | |
| 605 | 312 var buttonSettings = settings.buttons[buttonName]; |
| 313 // construct the button html | |
| 314 var $button = $('<div class="button"></div>'); | |
| 315 var $a = $('<a/>'); | |
| 607 | 316 var $img = $('<img class="button"/>'); |
| 605 | 317 $buttonsDiv.append($button); |
| 318 $button.append($a); | |
| 319 $a.append($img); | |
| 320 // add attributes and bindings | |
| 321 $button.attr('title', buttonSettings.tooltip); | |
| 322 $button.addClass('button-' + buttonName); | |
| 323 // let the clicked <a> element know about the digilib context | |
| 324 $a.data('digilib', { 'name' : buttonName, 'settings' : settings } ); | |
|
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
325 $a.bind('click', function() { |
| 605 | 326 // get the context settings |
| 327 var data = $(this).data('digilib'); | |
| 328 // find the action for the clicked element | |
| 329 console.log(data.settings.buttons[data.name].onclick); | |
| 330 }); | |
| 331 // binding mit closure | |
| 332 //(function(){ var action = buttonSettings.onclick; | |
| 333 // $a.bind('click', function(){ console.log( action )} ); | |
| 334 //})(); | |
| 335 $img.attr('src', settings.buttonsImagePath + buttonSettings.img); | |
| 604 | 336 }; |
| 337 } | |
| 605 | 338 return $buttonsDiv; |
| 603 | 339 }; |
| 340 | |
|
606
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
341 // returns function for load event of scaler img |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
342 var scalerImgLoadedFn = function(settings) { |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
343 return function() { |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
344 console.debug("img loaded! settings=", settings); |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
345 }; |
|
d08d095430c3
keeping img tag for embedded mode seems to work now
robcast
parents:
605
diff
changeset
|
346 }; |
| 598 | 347 // hook plugin into jquery |
| 348 $.fn.digilib = function(method) { | |
| 349 if (methods[method]) { | |
| 350 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); | |
| 351 } else if (typeof(method) === 'object' || !method) { | |
| 352 return methods.init.apply(this, arguments); | |
| 353 } else { | |
| 354 $.error( 'Method ' + method + ' does not exist on jQuery.digilib' ); | |
| 355 } | |
| 356 }; | |
| 597 | 357 |
| 358 })(jQuery); |
