Mercurial > hg > digilib-old
diff client/digitallibrary/jquery/jquery.digilib.js @ 741:ee620bcf4ab0 jquery
image-drag now with full background image :-)
if your browser supports background-size.
and some cleanups.
author | robcast |
---|---|
date | Wed, 02 Feb 2011 20:03:36 +0100 |
parents | 95987594a1b0 |
children | 2b6d3ef57d68 |
line wrap: on
line diff
--- a/client/digitallibrary/jquery/jquery.digilib.js Wed Feb 02 14:56:50 2011 +0100 +++ b/client/digitallibrary/jquery/jquery.digilib.js Wed Feb 02 20:03:36 2011 +0100 @@ -245,7 +245,9 @@ // style of zoom area "rubber band" 'zoomrectStyle' : {'border' : '2px solid #ff0000' }, // is the "about" window shown? - 'isAboutDivVisible' : false + 'isAboutDivVisible' : false, + // maximum width of background image for drag-scroll + 'maxBgSize' : 10000 }; @@ -313,6 +315,14 @@ $elem.data('digilib', data); } unpackParams(data); + // check if browser knows background-size + for (var bs in {'':1, '-moz-':1, '-webkit-':1, '-o-':1}) { + if ($elem.css(bs+'background-size')) { + data.hasBgSize = true; + data.bgSizeName = bs+'background-size'; + break; + } + } // create HTML structure for scaler setupScalerDiv(data); // add buttons @@ -618,17 +628,31 @@ // returns URL and query string for Scaler var getScalerUrl = function (data) { + packParams(data); var settings = data.settings; if (settings.scalerBaseUrl == null) { alert("ERROR: URL of digilib Scaler servlet missing!"); } - packParams(data); var keys = settings.scalerParamNames; var queryString = getParamString(settings, keys, defaults); var url = settings.scalerBaseUrl + '?' + queryString; return url; }; + // returns URL for bird's eye view image + var getBirdImgUrl = function (data) { + var settings = data.settings; + var birdDivOptions = { + dw : settings.birdDivWidth, + dh : settings.birdDivHeight + }; + var birdSettings = $.extend({}, settings, birdDivOptions); + // use only the relevant parameters + var url = settings.scalerBaseUrl + '?' + + getParamString(birdSettings, settings.birdDivParams); + return url; + }; + // returns URL and query string for current digilib var getDigilibUrl = function (data) { packParams(data); @@ -927,20 +951,6 @@ return $buttonsDiv; }; - // returns URL for bird's eye view image - var getBirdImgUrl = function (data) { - var settings = data.settings; - var birdDivOptions = { - dw : settings.birdDivWidth, - dh : settings.birdDivHeight - }; - var birdSettings = $.extend({}, settings, birdDivOptions); - // use only the relevant parameters - var birdUrl = settings.scalerBaseUrl + '?' + - getParamString(birdSettings, settings.birdDivParams); - return birdUrl; - }; - // creates HTML structure for the bird's eye view in elem var setupBirdDiv = function (data) { var $elem = data.$elem; @@ -1105,7 +1115,7 @@ imgRect.adjustDiv($scaler); // show image in case it was hidden (for example in zoomDrag) $img.css('visibility', 'visible'); - $scaler.css('opacity', '1'); + $scaler.css({'opacity' : '1', 'background-image' : 'none'}); // display marks renderMarks(data); // TODO: digilib.showArrows(); // show arrow overlays for zoom navigation @@ -1159,13 +1169,14 @@ // position may have changed data.birdTrafo = getImgTrafo(data.$birdImg, FULL_AREA); var zoomRect = data.birdTrafo.transform(zoomArea); - // TODO: acount for frame width + // acount for border width + zoomRect.addPosition({x : -2, y : -2}); if (data.settings.interactionMode === 'fullscreen') { // no animation for fullscreen zoomRect.adjustDiv($birdZoom); } else { // nice animation for embedded mode :-) - // correct offsetParent because animate is relative + // correct offsetParent because animate doesn't use offset var ppos = $birdZoom.offsetParent().offset(); var dest = { left : (zoomRect.x - ppos.left) + 'px', @@ -1230,6 +1241,16 @@ return false; }; + // mouse move handler + var zoomMove = function (evt) { + pt2 = geom.position(evt); + var rect = geom.rectangle(pt1, pt2); + rect.clipTo(picRect); + // update zoom div + rect.adjustDiv($zoomDiv); + return false; + }; + // mouseup handler: end moving var zoomEnd = function (evt) { pt2 = geom.position(evt); @@ -1253,16 +1274,6 @@ return false; }; - // mouse move handler - var zoomMove = function (evt) { - pt2 = geom.position(evt); - var rect = geom.rectangle(pt1, pt2); - rect.clipTo(picRect); - // update zoom div - rect.adjustDiv($zoomDiv); - return false; - }; - // clear old handler $scaler.unbind('.dlZoomArea'); $elem.unbind('.dlZoomArea'); @@ -1277,6 +1288,21 @@ var $document = $(document); var startPos, newRect, birdImgRect, birdZoomRect; + // mousedown handler: start dragging bird zoom to a new position + var birdZoomStartDrag = function(evt) { + startPos = geom.position(evt); + // position may have changed + data.birdTrafo = getImgTrafo($birdImg, FULL_AREA); + birdImgRect = geom.rectangle($birdImg); + birdZoomRect = geom.rectangle($birdZoom); + newRect = null; + $document.bind("mousemove.dlBirdMove", birdZoomMove); + $document.bind("mouseup.dlBirdMove", birdZoomEndDrag); + $birdZoom.bind("mousemove.dlBirdMove", birdZoomMove); + $birdZoom.bind("mouseup.dlBirdMove", birdZoomEndDrag); + return false; + }; + // mousemove handler: drag var birdZoomMove = function(evt) { var pos = geom.position(evt); @@ -1308,20 +1334,6 @@ return false; }; - // mousedown handler: start dragging bird zoom to a new position - var birdZoomStartDrag = function(evt) { - startPos = geom.position(evt); - // position may have changed - data.birdTrafo = getImgTrafo($birdImg, FULL_AREA); - birdImgRect = geom.rectangle($birdImg); - birdZoomRect = geom.rectangle($birdZoom); - $document.bind("mousemove.dlBirdMove", birdZoomMove); - $document.bind("mouseup.dlBirdMove", birdZoomEndDrag); - $birdZoom.bind("mousemove.dlBirdMove", birdZoomMove); - $birdZoom.bind("mouseup.dlBirdMove", birdZoomEndDrag); - return false; - }; - // clear old handler $document.unbind(".dlBirdMove"); $birdImg.unbind(".dlBirdMove"); @@ -1335,7 +1347,7 @@ // setup handlers for dragging the zoomed image var setupZoomDrag = function(data) { - var startPos, delta; + var startPos, delta, fullRect; var $document = $(document); var $elem = data.$elem; var $scaler = data.$scaler; @@ -1346,16 +1358,33 @@ // don't start dragging if not zoomed if (isFullArea(data.zoomArea)) return false; startPos = geom.position(evt); - $imgRect = geom.rectangle($img); - // hide the scaler img, show it as background of div instead + fullRect = null; + delta = null; + // hide the scaler img, show background of div instead $img.css('visibility', 'hidden'); - $scaler.css({ - 'background-image' : 'url(' + $img.attr('src') + ')', - 'background-repeat' : 'no-repeat', - 'background-position' : 'top left', - 'opacity' : '0.5', - 'cursor' : 'move' - }); + var scalerCss = { + 'background-image' : 'url(' + $img.attr('src') + ')', + 'background-repeat' : 'no-repeat', + 'background-position' : 'left top', + 'opacity' : '0.5', + 'cursor' : 'move' + }; + if (data.hasBgSize) { + // full-size background using CSS3-background-size + fullRect = data.imgTrafo.transform(FULL_AREA); + if (fullRect.height < data.settings.maxBgSize && fullRect.width < data.settings.maxBgSize) { + // correct offset because background is relative + var scalePos = geom.position($scaler); + fullRect.addPosition(scalePos.neg()); + scalerCss['background-image'] = 'url(' + getBirdImgUrl(data) + ')'; + scalerCss[data.bgSizeName] = fullRect.width + 'px ' + fullRect.height + 'px'; + scalerCss['background-position'] = fullRect.x + 'px '+ fullRect.y + 'px'; + } else { + // too big + fullRect = null; + } + } + $scaler.css(scalerCss); $document.bind("mousemove.dlZoomDrag", dragMove); $document.bind("mouseup.dlZoomDrag", dragEnd); return false; @@ -1364,10 +1393,15 @@ // mousemove handler: drag zoomed image var dragMove = function (evt) { var pos = geom.position(evt); - delta = pos.delta(startPos); + delta = startPos.delta(pos); + if (fullRect) { + var bgPos = fullRect.getPosition().add(delta); + } else { + var bgPos = delta; + } // move the background image to the new position $scaler.css({ - 'background-position' : (-delta.x) + "px " + (-delta.y) + "px" + 'background-position' : bgPos.x + "px " + bgPos.y + "px" }); return false; }; @@ -1380,12 +1414,13 @@ if (delta == null || delta.distance() < 2) { // no movement $img.css('visibility', 'visible'); + $scaler.css({'opacity' : '1', 'background-image' : 'none'}); return false; } // get old zoom area (screen coordinates) - var za = data.imgTrafo.transform(data.zoomArea); + var za = geom.rectangle($img); // move - za.addPosition(delta); + za.addPosition(delta.neg()); // transform back var newArea = data.imgTrafo.invtransform(za); data.zoomArea = FULL_AREA.fit(newArea); @@ -1395,7 +1430,8 @@ // clear old handler $document.unbind(".dlZoomDrag"); - $scaler.unbind(".dlBirdMove"); + $scaler.unbind(".dlZoomDrag"); + // set handler $scaler.bind("mousedown.dlZoomDrag", dragStart); };