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