Mercurial > hg > digilib
comparison client/digitallibrary/jquery/jquery.digilib.js @ 760:29b815194375 jquery
pixel-by-pixel scale fully works now.
author | robcast |
---|---|
date | Thu, 10 Feb 2011 20:41:33 +0100 |
parents | 8087657fc7bd |
children | abee36cd7688 |
comparison
equal
deleted
inserted
replaced
757:aaaf5ad520c4 | 760:29b815194375 |
---|---|
20 /** | 20 /** |
21 * digilib jQuery plugin | 21 * digilib jQuery plugin |
22 **/ | 22 **/ |
23 | 23 |
24 | 24 |
25 /* jslint browser: true, debug: true, forin: true | 25 /*jslint browser: true, debug: true, forin: true |
26 */ | 26 */ |
27 | 27 |
28 // fallback for console.log calls | 28 // fallback for console.log calls |
29 if (typeof(console) === 'undefined') { | 29 if (typeof(console) === 'undefined') { |
30 var console = { | 30 var console = { |
342 } | 342 } |
343 } | 343 } |
344 } | 344 } |
345 // get image info from server if needed | 345 // get image info from server if needed |
346 if (data.scaleMode === 'pixel' || data.scaleMode === 'size') { | 346 if (data.scaleMode === 'pixel' || data.scaleMode === 'size') { |
347 getImageInfo(data); // TODO: onload callback | 347 loadImageInfo(data, updateDisplay); // updateDisplay(data) on completion |
348 } | 348 } |
349 // create HTML structure for scaler | 349 // create HTML structure for scaler |
350 setupScalerDiv(data); | 350 setupScalerDiv(data); |
351 // add buttons | 351 // add buttons |
352 for (var i = 0; i < elemSettings.visibleButtonSets; ++i) { | 352 for (var i = 0; i < elemSettings.visibleButtonSets; ++i) { |
403 if (pn < 1) { | 403 if (pn < 1) { |
404 alert("no such page (page number too low)"); | 404 alert("no such page (page number too low)"); |
405 settings.pn = oldpn; | 405 settings.pn = oldpn; |
406 return false; | 406 return false; |
407 } | 407 } |
408 // TODO: how do we get pt? | |
408 if (settings.pt) { | 409 if (settings.pt) { |
409 if (pn > settings.pt) { | 410 if (pn > settings.pt) { |
410 alert("no such page (page number too high)"); | 411 alert("no such page (page number too high)"); |
411 settings.pn = oldpn; | 412 settings.pn = oldpn; |
412 return false; | 413 return false; |
422 // zoom by a given factor | 423 // zoom by a given factor |
423 zoomBy : function (data, factor) { | 424 zoomBy : function (data, factor) { |
424 zoomBy(data, factor); | 425 zoomBy(data, factor); |
425 }, | 426 }, |
426 | 427 |
427 // zoom interactively | 428 // zoom to area (or interactive) |
428 zoomArea : function (data) { | 429 zoomArea : function (data, area) { |
429 zoomArea(data); | 430 var settings = data.settings; |
431 if (area == null) { | |
432 // interactively | |
433 zoomArea(data); | |
434 } else { | |
435 data.zoomArea = geom.rectangle(area); | |
436 redisplay(data); | |
437 } | |
430 }, | 438 }, |
431 | 439 |
432 // zoom out to full page | 440 // zoom out to full page |
433 zoomFull : function (data, mode) { | 441 zoomFull : function (data, mode) { |
434 data.zoomArea = FULL_AREA; | 442 data.zoomArea = FULL_AREA; |
589 } | 597 } |
590 }, | 598 }, |
591 | 599 |
592 // calibrate (only faking) | 600 // calibrate (only faking) |
593 calibrate : function (data) { | 601 calibrate : function (data) { |
594 getImageInfo(data); | 602 loadImageInfo(data); |
595 }, | 603 }, |
596 | 604 |
597 // set image scale mode | 605 // set image scale mode |
598 setScaleMode : function (data, mode) { | 606 setScaleMode : function (data, mode) { |
599 var oldM = getScaleMode(data); | 607 var oldM = getScaleMode(data); |
686 var birdSettings = jQuery.extend({}, settings, birdDivOptions); | 694 var birdSettings = jQuery.extend({}, settings, birdDivOptions); |
687 // use only the relevant parameters | 695 // use only the relevant parameters |
688 if (moreParams == null) { | 696 if (moreParams == null) { |
689 var params = getParamString(birdSettings, settings.birdDivParams, defaults); | 697 var params = getParamString(birdSettings, settings.birdDivParams, defaults); |
690 } else { | 698 } else { |
699 // filter scaler flags | |
700 if (birdSettings.mo != null) { | |
701 var mo = ''; | |
702 if (data.scalerFlags.hmir != null) { | |
703 mo += 'hmir,'; | |
704 } | |
705 if (data.scalerFlags.vmir != null) { | |
706 mo += 'vmir'; | |
707 } | |
708 birdSettings.mo = mo; | |
709 } | |
691 var params = getParamString(birdSettings, | 710 var params = getParamString(birdSettings, |
692 settings.birdDivParams.concat(moreParams), defaults); | 711 settings.birdDivParams.concat(moreParams), defaults); |
693 } | 712 } |
694 var url = settings.scalerBaseUrl + '?' + params; | 713 var url = settings.scalerBaseUrl + '?' + params; |
695 return url; | 714 return url; |
701 var settings = data.settings; | 720 var settings = data.settings; |
702 var queryString = getParamString(settings, settings.digilibParamNames, defaults); | 721 var queryString = getParamString(settings, settings.digilibParamNames, defaults); |
703 return settings.digilibBaseUrl + '?' + queryString; | 722 return settings.digilibBaseUrl + '?' + queryString; |
704 }; | 723 }; |
705 | 724 |
706 // gets image information from digilib server via HTTP and calls complete | 725 // loads image information from digilib server via HTTP (and calls complete-fn) |
707 var getImageInfo = function (data, complete) { | 726 var loadImageInfo = function (data, complete) { |
708 var settings = data.settings; | 727 var settings = data.settings; |
709 var p = settings.scalerBaseUrl.indexOf('/servlet/Scaler'); | 728 var p = settings.scalerBaseUrl.indexOf('/servlet/Scaler'); |
710 var url = settings.scalerBaseUrl.substring(0, p) + '/ImgInfo-json.jsp'; | 729 var url = settings.scalerBaseUrl.substring(0, p) + '/ImgInfo-json.jsp'; |
711 url += '?' + getParamString(settings, ['fn', 'pn'], defaults); | 730 url += '?' + getParamString(settings, ['fn', 'pn'], defaults); |
731 // TODO: better error handling | |
712 jQuery.getJSON(url, function (json) { | 732 jQuery.getJSON(url, function (json) { |
713 console.debug("got json data=", json); | 733 console.debug("got json data=", json); |
714 data.imgInfo = json; | 734 data.imgInfo = json; |
715 if (complete != null) { | 735 if (complete != null) { |
716 complete.call(this, data, json); | 736 complete.call(this, data, json); |
860 // redisplay bird img | 880 // redisplay bird img |
861 updateBirdDiv(data); | 881 updateBirdDiv(data); |
862 } | 882 } |
863 }; | 883 }; |
864 | 884 |
885 // update display (overlays etc.) | |
886 var updateDisplay = function (data) { | |
887 updateImgTrafo(data); | |
888 renderMarks(data); | |
889 setupZoomDrag(data); | |
890 if (data.settings.isBirdDivVisible) { | |
891 renderBirdArea(data); | |
892 setupBirdDrag(data); | |
893 } | |
894 // TODO: update event subscriber? | |
895 }; | |
896 | |
865 // returns maximum size for scaler img in fullscreen mode | 897 // returns maximum size for scaler img in fullscreen mode |
866 var getFullscreenImgSize = function($elem) { | 898 var getFullscreenImgSize = function ($elem) { |
867 var $win = $(window); | 899 var $win = $(window); |
868 var winH = $win.height(); | 900 var winH = $win.height(); |
869 var winW = $win.width(); | 901 var winW = $win.width(); |
870 // TODO: account for borders? | 902 // TODO: account for borders? |
871 return geom.size(winW, winH); | 903 return geom.size(winW, winH); |
916 $img.addClass('pic'); | 948 $img.addClass('pic'); |
917 data.$scaler = $scaler; | 949 data.$scaler = $scaler; |
918 data.$img = $img; | 950 data.$img = $img; |
919 // setup image load handler before setting the src attribute (IE bug) | 951 // setup image load handler before setting the src attribute (IE bug) |
920 $img.load(scalerImgLoadedHandler(data)); | 952 $img.load(scalerImgLoadedHandler(data)); |
953 $img.error(function () {console.error("error loading scaler image");}); | |
921 $img.attr('src', scalerUrl); | 954 $img.attr('src', scalerUrl); |
922 }; | 955 }; |
923 | 956 |
924 // creates HTML structure for buttons in elem | 957 // creates HTML structure for buttons in elem |
925 var createButtons = function (data, buttonSetIdx) { | 958 var createButtons = function (data, buttonSetIdx) { |
1002 $birdDiv.append($birdZoom); | 1035 $birdDiv.append($birdZoom); |
1003 $birdDiv.append($birdImg); | 1036 $birdDiv.append($birdImg); |
1004 $birdZoom.css(data.settings.birdIndicatorStyle); | 1037 $birdZoom.css(data.settings.birdIndicatorStyle); |
1005 var birdUrl = getBirdImgUrl(data); | 1038 var birdUrl = getBirdImgUrl(data); |
1006 $birdImg.load(birdImgLoadedHandler(data)); | 1039 $birdImg.load(birdImgLoadedHandler(data)); |
1040 $birdImg.error(function () {console.error("error loading birdview image");}); | |
1007 $birdImg.attr('src', birdUrl); | 1041 $birdImg.attr('src', birdUrl); |
1008 }; | 1042 }; |
1009 | 1043 |
1010 // update bird's eye view | 1044 // update bird's eye view |
1011 var updateBirdDiv = function (data) { | 1045 var updateBirdDiv = function (data) { |
1144 trafo.concat(trafo.getScale(picrect)); | 1178 trafo.concat(trafo.getScale(picrect)); |
1145 trafo.concat(trafo.getTranslation(picrect)); | 1179 trafo.concat(trafo.getTranslation(picrect)); |
1146 return trafo; | 1180 return trafo; |
1147 }; | 1181 }; |
1148 | 1182 |
1149 // returns function for load event of scaler img | 1183 // update scaler image transform |
1150 var scalerImgLoadedHandler = function (data) { | 1184 var updateImgTrafo = function (data) { |
1151 return function () { | 1185 var $img = data.$img; |
1152 var $img = $(this); | 1186 if ($img != null && $img.get(0).complete) { |
1153 var $scaler = data.$scaler; | |
1154 // create Transform from current zoomArea and image size | 1187 // create Transform from current zoomArea and image size |
1155 data.imgTrafo = getImgTrafo($img, data.zoomArea, | 1188 data.imgTrafo = getImgTrafo($img, data.zoomArea, |
1156 data.settings.rot, data.scalerFlags.hmir, data.scalerFlags.vmir, | 1189 data.settings.rot, data.scalerFlags.hmir, data.scalerFlags.vmir, |
1157 data.scaleMode, data.imgInfo); | 1190 data.scaleMode, data.imgInfo); |
1158 // console.debug("imgTrafo=", data.imgTrafo); | 1191 // console.debug("imgTrafo=", data.imgTrafo); |
1192 } | |
1193 }; | |
1194 | |
1195 // returns function for load event of scaler img | |
1196 var scalerImgLoadedHandler = function (data) { | |
1197 return function () { | |
1198 var $img = $(this); | |
1199 console.debug("scaler img loaded=",$img); | |
1200 var $scaler = data.$scaler; | |
1159 var imgRect = geom.rectangle($img); | 1201 var imgRect = geom.rectangle($img); |
1160 // console.debug("imgrect=", imgRect); | |
1161 // adjust scaler div size | 1202 // adjust scaler div size |
1162 imgRect.adjustDiv($scaler); | 1203 imgRect.adjustDiv($scaler); |
1163 // show image in case it was hidden (for example in zoomDrag) | 1204 // show image in case it was hidden (for example in zoomDrag) |
1164 $img.css('visibility', 'visible'); | 1205 $img.css('visibility', 'visible'); |
1165 $scaler.css({'opacity' : '1', 'background-image' : 'none'}); | 1206 $scaler.css({'opacity' : '1', 'background-image' : 'none'}); |
1166 // display marks | 1207 // update display (render marks, etc.) |
1167 renderMarks(data); | 1208 updateDisplay(data); |
1168 // enable drag-to-scroll | |
1169 setupZoomDrag(data); | |
1170 // TODO: digilib.showArrows(); // show arrow overlays for zoom navigation | |
1171 }; | 1209 }; |
1172 }; | 1210 }; |
1173 | 1211 |
1174 // returns function for load event of bird's eye view img | 1212 // returns function for load event of bird's eye view img |
1175 var birdImgLoadedHandler = function (data) { | 1213 var birdImgLoadedHandler = function (data) { |
1179 console.debug("birdImg loaded!", $birdImg, "rect=", birdRect, "data=", data); | 1217 console.debug("birdImg loaded!", $birdImg, "rect=", birdRect, "data=", data); |
1180 if (birdRect.width === 0) { | 1218 if (birdRect.width === 0) { |
1181 // malheureusement IE7 calls load handler when there is no size info yet | 1219 // malheureusement IE7 calls load handler when there is no size info yet |
1182 setTimeout(function () { $birdImg.triggerHandler('load'); }, 200); | 1220 setTimeout(function () { $birdImg.triggerHandler('load'); }, 200); |
1183 } | 1221 } |
1184 // display red indicator around zoomarea | 1222 // update display (zoom area indicator) |
1185 renderBirdArea(data); | 1223 updateDisplay(data); |
1186 // enable click and drag | |
1187 setupBirdDrag(data); | |
1188 }; | 1224 }; |
1189 }; | 1225 }; |
1190 | 1226 |
1191 // place marks on the image | 1227 // place marks on the image |
1192 var renderMarks = function (data) { | 1228 var renderMarks = function (data) { |
1229 if (data.$img == null || data.imgTrafo == null) return; | |
1230 console.debug("rendermarks img=",data.$img," imgtrafo=",data.imgTrafo); | |
1193 var $elem = data.$elem; | 1231 var $elem = data.$elem; |
1194 var marks = data.marks; | 1232 var marks = data.marks; |
1195 // clear marks | 1233 // clear marks |
1196 $elem.find('div.mark').remove(); | 1234 $elem.find('div.mark').remove(); |
1197 for (var i = 0; i < marks.length; i++) { | 1235 for (var i = 0; i < marks.length; i++) { |
1208 } | 1246 } |
1209 }; | 1247 }; |
1210 | 1248 |
1211 // show zoom area indicator on bird's eye view | 1249 // show zoom area indicator on bird's eye view |
1212 var renderBirdArea = function (data) { | 1250 var renderBirdArea = function (data) { |
1251 if (data.$birdImg == null) return; | |
1213 var $birdZoom = data.$birdZoom; | 1252 var $birdZoom = data.$birdZoom; |
1214 var zoomArea = data.zoomArea; | 1253 var zoomArea = data.zoomArea; |
1215 var normalSize = isFullArea(zoomArea); | 1254 var normalSize = isFullArea(zoomArea); |
1216 if (normalSize) { | 1255 if (normalSize) { |
1217 $birdZoom.hide(); | 1256 $birdZoom.hide(); |
1434 // set zoom background | 1473 // set zoom background |
1435 var setZoomBG = function(data) { | 1474 var setZoomBG = function(data) { |
1436 var $scaler = data.$scaler; | 1475 var $scaler = data.$scaler; |
1437 var $img = data.$img; | 1476 var $img = data.$img; |
1438 var fullRect = null; | 1477 var fullRect = null; |
1478 // hide marks | |
1479 data.$elem.find('div.mark').hide(); | |
1439 // hide the scaler img, show background of div instead | 1480 // hide the scaler img, show background of div instead |
1440 $img.css('visibility', 'hidden'); | 1481 $img.css('visibility', 'hidden'); |
1441 var scalerCss = { | 1482 var scalerCss = { |
1442 'background-image' : 'url(' + $img.attr('src') + ')', | 1483 'background-image' : 'url(' + $img.attr('src') + ')', |
1443 'background-repeat' : 'no-repeat', | 1484 'background-repeat' : 'no-repeat', |
1515 $document.unbind("mouseup.dlZoomDrag", dragEnd); | 1556 $document.unbind("mouseup.dlZoomDrag", dragEnd); |
1516 if (delta == null || delta.distance() < 2) { | 1557 if (delta == null || delta.distance() < 2) { |
1517 // no movement | 1558 // no movement |
1518 $img.css('visibility', 'visible'); | 1559 $img.css('visibility', 'visible'); |
1519 $scaler.css({'opacity' : '1', 'background-image' : 'none'}); | 1560 $scaler.css({'opacity' : '1', 'background-image' : 'none'}); |
1561 // unhide marks | |
1562 data.$elem.find('div.mark').show(); | |
1520 return false; | 1563 return false; |
1521 } | 1564 } |
1522 // get old zoom area (screen coordinates) | 1565 // get old zoom area (screen coordinates) |
1523 var za = geom.rectangle($img); | 1566 var za = geom.rectangle($img); |
1524 // move | 1567 // move |