diff --git a/build.properties b/build.properties index 33f337fa..04f9c9a1 100644 --- a/build.properties +++ b/build.properties @@ -6,7 +6,7 @@ PROJECT: openseadragon BUILD_MAJOR: 0 BUILD_MINOR: 9 -BUILD_ID: 111 +BUILD_ID: 113s BUILD: ${PROJECT}.${BUILD_MAJOR}.${BUILD_MINOR}.${BUILD_ID} VERSION: ${BUILD_MAJOR}.${BUILD_MINOR}.${BUILD_ID} diff --git a/grunt.js b/grunt.js new file mode 100644 index 00000000..f734d18b --- /dev/null +++ b/grunt.js @@ -0,0 +1,71 @@ +module.exports = function(grunt) { + + var distribution = "openseadragon.js", + sources = [ + "src/openseadragon.js", + "src/eventhandler.js", + "src/mousetracker.js", + "src/control.js", + "src/controldock.js", + "src/viewer.js", + "src/navigator.js", + "src/strings.js", + "src/point.js", + //"src/profiler.js", + "src/tilesource.js", + "src/dzitilesource.js", + "src/iiiftilesource.js", + "src/osmtilesource.js", + "src/tmstilesource.js", + "src/legacytilesource.js", + "src/tilesourcecollection.js", + "src/button.js", + "src/buttongroup.js", + "src/rectangle.js", + "src/referencestrip.js", + "src/displayrectangle.js", + "src/spring.js", + "src/tile.js", + "src/overlay.js", + "src/drawer.js", + "src/viewport.js" + ]; + + // Project configuration. + grunt.initConfig({ + concat: { + dist: { + src: sources, + dest: distribution + } + }, + lint: { + beforeconcat: sources, + afterconcat: [ distribution ] + }, + jshint: { + options: { + browser: true, + eqeqeq: false, + loopfunc: false + /*curly: true, + eqeqeq: true, + immed: true, + latedef: true, + newcap: true, + noarg: true, + sub: true, + undef: true, + eqnull: true,*/ + }, + globals: { + OpenSeadragon: true + } + } + }); + + + // Default task. + grunt.registerTask('default', 'lint:beforeconcat concat lint:afterconcat'); + +}; \ No newline at end of file diff --git a/openseadragon.js b/openseadragon.js index ecfaf58c..ca1ef96b 100644 --- a/openseadragon.js +++ b/openseadragon.js @@ -1,7 +1,7 @@ -/*globals OpenSeadragon */ +/*globals OpenSeadragon*/ /** - * @version OpenSeadragon 0.9.111 + * @version OpenSeadragon 0.9.113s * * @fileOverview *

@@ -315,7 +315,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ * @see jQuery */ $.type = function( obj ) { - return obj == null ? + return ( obj === null ) || ( obj === undefined ) ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }; @@ -419,7 +419,8 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ for ( ; i < length; i++ ) { // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { + options = arguments[ i ]; + if ( options !== null || options !== undefined ) { // Extend the base object for ( name in options ) { src = target[ name ]; @@ -472,6 +473,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ //PAN AND ZOOM SETTINGS AND CONSTRAINTS panHorizontal: true, panVertical: true, + constrainDuringPan: false, wrapHorizontal: false, wrapVertical: false, visibilityRatio: 0.5, @@ -598,10 +600,12 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ * @param {Function} method */ delegate: function( object, method ) { - return function() { - if ( arguments === undefined ) - arguments = []; - return method.apply( object, arguments ); + return function(){ + var args = arguments; + if ( args === undefined ){ + args = []; + } + return method.apply( object, args ); }; }, @@ -832,21 +836,21 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ window.innerWidth, window.innerHeight ); - } + }; } else if ( docElement.clientWidth || docElement.clientHeight ) { $.getWindowSize = function(){ return new $.Point( document.documentElement.clientWidth, document.documentElement.clientHeight ); - } + }; } else if ( body.clientWidth || body.clientHeight ) { $.getWindowSize = function(){ return new $.Point( document.body.clientWidth, document.body.clientHeight ); - } + }; } else { throw new Error("Unknown window size, no known technique."); } @@ -1113,7 +1117,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ $.cancelEvent = function( event ){ // W3C for preventing default event.preventDefault(); - } + }; } else { $.cancelEvent = function( event ){ event = $.getEvent( event ); @@ -1212,6 +1216,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ // we could determine once at startup which activeX object // was supported. This will have significant impact on // performance for IE Browsers DONE + /*jshint loopfunc:true*/ for ( i = 0; i < ACTIVEX.length; i++ ) { try { request = new ActiveXObject( ACTIVEX[ i ] ); @@ -1268,7 +1273,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ /** @ignore */ request.onreadystatechange = function() { if ( request.readyState == 4) { - request.onreadystatechange = new function() { }; + request.onreadystatechange = function(){}; options.success( request ); } }; @@ -1692,7 +1697,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ } else { return element.offsetParent; } - }; + } /** * @private @@ -1724,7 +1729,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ } return processDZIXml( doc, tilesUrl ); - }; + } /** * @private @@ -1758,7 +1763,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ } throw new Error( $.getString( "Errors.Dzi" ) ); - }; + } /** * @private @@ -1772,10 +1777,10 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ var fileFormat = imageNode.getAttribute( "Format" ), sizeNode = imageNode.getElementsByTagName( "Size" )[ 0 ], dispRectNodes = imageNode.getElementsByTagName( "DisplayRect" ), - width = parseInt( sizeNode.getAttribute( "Width" ) ), - height = parseInt( sizeNode.getAttribute( "Height" ) ), - tileSize = parseInt( imageNode.getAttribute( "TileSize" ) ), - tileOverlap = parseInt( imageNode.getAttribute( "Overlap" ) ), + width = parseInt( sizeNode.getAttribute( "Width" ), 10 ), + height = parseInt( sizeNode.getAttribute( "Height" ), 10 ), + tileSize = parseInt( imageNode.getAttribute( "TileSize" ), 10 ), + tileOverlap = parseInt( imageNode.getAttribute( "Overlap" ), 10 ), dispRects = [], dispRectNode, rectNode, @@ -1792,12 +1797,12 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ rectNode = dispRectNode.getElementsByTagName( "Rect" )[ 0 ]; dispRects.push( new $.DisplayRect( - parseInt( rectNode.getAttribute( "X" ) ), - parseInt( rectNode.getAttribute( "Y" ) ), - parseInt( rectNode.getAttribute( "Width" ) ), - parseInt( rectNode.getAttribute( "Height" ) ), + parseInt( rectNode.getAttribute( "X" ), 10 ), + parseInt( rectNode.getAttribute( "Y" ), 10 ), + parseInt( rectNode.getAttribute( "Width" ), 10 ), + parseInt( rectNode.getAttribute( "Height" ), 10 ), 0, // ignore MinLevel attribute, bug in Deep Zoom Composer - parseInt( dispRectNode.getAttribute( "MaxLevel" ) ) + parseInt( dispRectNode.getAttribute( "MaxLevel" ), 10 ) )); } return new $.DziTileSource( @@ -1809,7 +1814,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ fileFormat, dispRects ); - }; + } /** * @private @@ -1823,10 +1828,10 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ var fileFormat = imageData.Format, sizeData = imageData.Size, dispRectData = imageData.DisplayRect || [], - width = parseInt( sizeData.Width ), - height = parseInt( sizeData.Height ), - tileSize = parseInt( imageData.TileSize ), - tileOverlap = parseInt( imageData.Overlap ), + width = parseInt( sizeData.Width, 10 ), + height = parseInt( sizeData.Height, 10 ), + tileSize = parseInt( imageData.TileSize, 10 ), + tileOverlap = parseInt( imageData.Overlap, 10 ), dispRects = [], rectData, i; @@ -1841,12 +1846,12 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ rectData = dispRectData[ i ].Rect; dispRects.push( new $.DisplayRect( - parseInt( rectData.X ), - parseInt( rectData.Y ), - parseInt( rectData.Width ), - parseInt( rectData.Height ), + parseInt( rectData.X, 10 ), + parseInt( rectData.Y, 10 ), + parseInt( rectData.Width, 10 ), + parseInt( rectData.Height, 10 ), 0, // ignore MinLevel attribute, bug in Deep Zoom Composer - parseInt( rectData.MaxLevel ) + parseInt( rectData.MaxLevel, 10 ) )); } return new $.DziTileSource( @@ -1858,7 +1863,8 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ fileFormat, dispRects ); - }; + } + /** * @private * @inner @@ -1872,10 +1878,8 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ message = messageNode.firstChild.nodeValue; throw new Error(message); - }; + } - - }( OpenSeadragon )); /*globals OpenSeadragon */ @@ -2084,23 +2088,23 @@ $.EventHandler.prototype = { * Position of last mouse down */ THIS[ this.hash ] = { - "mouseover": function( event ){ onMouseOver( _this, event ); }, - "mouseout": function( event ){ onMouseOut( _this, event ); }, - "mousedown": function( event ){ onMouseDown( _this, event ); }, - "mouseup": function( event ){ onMouseUp( _this, event ); }, - "click": function( event ){ onMouseClick( _this, event ); }, - "DOMMouseScroll": function( event ){ onMouseWheelSpin( _this, event ); }, - "mousewheel": function( event ){ onMouseWheelSpin( _this, event ); }, - "mouseupie": function( event ){ onMouseUpIE( _this, event ); }, - "mousemoveie": function( event ){ onMouseMoveIE( _this, event ); }, - "mouseupwindow": function( event ){ onMouseUpWindow( _this, event ); }, - "mousemove": function( event ){ onMouseMove( _this, event ); }, - "touchstart": function( event ){ onTouchStart( _this, event ); }, - "touchmove": function( event ){ onTouchMove( _this, event ); }, - "touchend": function( event ){ onTouchEnd( _this, event ); }, - "keypress": function( event ){ onKeyPress( _this, event ); }, - "focus": function( event ){ onFocus( _this, event ); }, - "blur": function( event ){ onBlur( _this, event ); }, + mouseover: function( event ){ onMouseOver( _this, event ); }, + mouseout: function( event ){ onMouseOut( _this, event ); }, + mousedown: function( event ){ onMouseDown( _this, event ); }, + mouseup: function( event ){ onMouseUp( _this, event ); }, + click: function( event ){ onMouseClick( _this, event ); }, + DOMMouseScroll: function( event ){ onMouseWheelSpin( _this, event ); }, + mousewheel: function( event ){ onMouseWheelSpin( _this, event ); }, + mouseupie: function( event ){ onMouseUpIE( _this, event ); }, + mousemoveie: function( event ){ onMouseMoveIE( _this, event ); }, + mouseupwindow: function( event ){ onMouseUpWindow( _this, event ); }, + mousemove: function( event ){ onMouseMove( _this, event ); }, + touchstart: function( event ){ onTouchStart( _this, event ); }, + touchmove: function( event ){ onTouchMove( _this, event ); }, + touchend: function( event ){ onTouchEnd( _this, event ); }, + keypress: function( event ){ onKeyPress( _this, event ); }, + focus: function( event ){ onFocus( _this, event ); }, + blur: function( event ){ onBlur( _this, event ); }, tracking: false, capturing: false, buttonDown: false, @@ -2355,32 +2359,32 @@ $.EventHandler.prototype = { $.removeEvent( tracker.element, "mouseup", - delegate[ "mouseup" ], + delegate.mouseup, false ); $.addEvent( tracker.element, "mouseup", - delegate[ "mouseupie" ], + delegate.mouseupie, true ); $.addEvent( tracker.element, "mousemove", - delegate[ "mousemoveie" ], + delegate.mousemoveie, true ); } else { $.addEvent( window, "mouseup", - delegate[ "mouseupwindow" ], + delegate.mouseupwindow, true ); $.addEvent( window, "mousemove", - delegate[ "mousemove" ], + delegate.mousemove, true ); } @@ -2402,32 +2406,32 @@ $.EventHandler.prototype = { $.removeEvent( tracker.element, "mousemove", - delegate[ "mousemoveie" ], + delegate.mousemoveie, true ); $.removeEvent( tracker.element, "mouseup", - delegate[ "mouseupie" ], + delegate.mouseupie, true ); $.addEvent( tracker.element, "mouseup", - delegate[ "mouseup" ], + delegate.mouseup, false ); } else { $.removeEvent( window, "mousemove", - delegate[ "mousemove" ], + delegate.mousemove, true ); $.removeEvent( window, "mouseup", - delegate[ "mouseupwindow" ], + delegate.mouseupwindow, true ); } @@ -2501,7 +2505,7 @@ $.EventHandler.prototype = { event.keyCode ? event.keyCode : event.charCode, event.shiftKey ); - if( propagate === false ){ + if( !propagate ){ $.cancelEvent( event ); } } @@ -2514,17 +2518,17 @@ $.EventHandler.prototype = { */ function onMouseOver( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], + var delegate = THIS[ tracker.hash ], propagate; + event = $.getEvent( event ); + if ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 9 && delegate.capturing && !isChild( event.srcElement, tracker.element ) ) { triggerOthers( tracker, onMouseOver, event ); - } var to = event.target ? @@ -2560,10 +2564,11 @@ $.EventHandler.prototype = { * @inner */ function onMouseOut( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], + var delegate = THIS[ tracker.hash ], propagate; + event = $.getEvent( event ); + if ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 9 && delegate.capturing && @@ -2607,10 +2612,11 @@ $.EventHandler.prototype = { * @inner */ function onMouseDown( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], + var delegate = THIS[ tracker.hash ], propagate; + event = $.getEvent( event ); + if ( event.button == 2 ) { return; } @@ -2683,14 +2689,15 @@ $.EventHandler.prototype = { * @inner */ function onMouseUp( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], + var delegate = THIS[ tracker.hash ], //were we inside the tracked element when we were pressed insideElementPress = delegate.buttonDown, //are we still inside the tracked element when we released insideElementRelease = delegate.insideElement, propagate; + event = $.getEvent( event ); + if ( event.button == 2 ) { return; } @@ -2721,8 +2728,8 @@ $.EventHandler.prototype = { */ function onTouchEnd( tracker, event ) { - if( event.touches.length == 0 && - event.targetTouches.length == 0 && + if( event.touches.length === 0 && + event.targetTouches.length === 0 && event.changedTouches.length == 1 ){ THIS[ tracker.hash ].lastTouch = null; @@ -2748,10 +2755,11 @@ $.EventHandler.prototype = { * @inner */ function onMouseUpIE( tracker, event ) { - var event = $.getEvent( event ), - othertracker, + var othertracker, i; + event = $.getEvent( event ); + if ( event.button == 2 ) { return; } @@ -2846,10 +2854,11 @@ $.EventHandler.prototype = { * @inner */ function handleMouseClick( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], + var delegate = THIS[ tracker.hash ], propagate; + event = $.getEvent( event ); + if ( event.button == 2 ) { return; } @@ -2879,11 +2888,14 @@ $.EventHandler.prototype = { * @inner */ function onMouseMove( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], - point = getMouseAbsolute( event ), - delta = point.minus( delegate.lastPoint ), - propagate; + var delegate = THIS[ tracker.hash ], + delta, + propagate, + point; + + event = $.getEvent( event ); + point = getMouseAbsolute( event ); + delta = point.minus( delegate.lastPoint ); delegate.lastPoint = point; @@ -3790,7 +3802,7 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, overlay = this.overlayControls[ i ]; - if ( overlay.point != null ) { + if ( overlay.point ) { this.drawer.addOverlay( overlay.id, @@ -3836,7 +3848,7 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, if( this.drawer ){ this.drawer.clearOverlays(); } - + this.source = null; this.drawer = null; @@ -4482,6 +4494,9 @@ function onCanvasDrag( tracker, position, delta, shift ) { delta.negate() ) ); + if( this.constrainDuringPan ){ + this.viewport.applyConstraints(); + } } } @@ -5081,7 +5096,7 @@ $.extend( $, { } return string.replace(/\{\d+\}/g, function(capture) { - var i = parseInt( capture.match( /\d+/ ) ) + 1; + var i = parseInt( capture.match( /\d+/ ), 10 ) + 1; return i < args.length ? args[ i ] : ""; @@ -5341,6 +5356,7 @@ $.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLeve $.extend( true, this, options ); //Any functions that are passed as arguments are bound to the ready callback + /*jshint loopfunc:true*/ for( i = 0; i < arguments.length; i++ ){ if( $.isFunction( arguments[i] ) ){ callback = arguments[ i ]; @@ -5470,7 +5486,6 @@ $.TileSource.prototype = { */ getImageInfo: function( url ) { var _this = this, - url = url, error, callbackName, callback, @@ -5630,6 +5645,7 @@ function processResponse( xhr ){ data = xhr.responseText; } }else if( responseText.match(/\s*[\{\[].*/) ){ + /*jshint evil:true*/ data = eval( '('+responseText+')' ); }else{ data = responseText; @@ -5772,7 +5788,7 @@ $.extend( $.DziTileSource.prototype, $.TileSource.prototype, { } if( url && !options.tilesUrl ){ - if( !( 'http' == url.substring( 0, 4 ) ) ){ + if( 'http' !== url.substring( 0, 4 ) ){ host = location.protocol + '//' + location.host; } dziPath = url.split('/'); @@ -5881,11 +5897,11 @@ function configureFromXML( tileSource, xmlDoc ){ xmlns: "http://schemas.microsoft.com/deepzoom/2008", Format: root.getAttribute( "Format" ), DisplayRect: null, - Overlap: parseInt( root.getAttribute( "Overlap" ) ), - TileSize: parseInt( root.getAttribute( "TileSize" ) ), + Overlap: parseInt( root.getAttribute( "Overlap" ), 10 ), + TileSize: parseInt( root.getAttribute( "TileSize" ), 10 ), Size: { - Height: parseInt( sizeNode.getAttribute( "Height" ) ), - Width: parseInt( sizeNode.getAttribute( "Width" ) ) + Height: parseInt( sizeNode.getAttribute( "Height" ), 10 ), + Width: parseInt( sizeNode.getAttribute( "Width" ), 10 ) } } }; @@ -5903,12 +5919,12 @@ function configureFromXML( tileSource, xmlDoc ){ displayRects.push({ Rect: { - X: parseInt( rectNode.getAttribute( "X" ) ), - Y: parseInt( rectNode.getAttribute( "Y" ) ), - Width: parseInt( rectNode.getAttribute( "Width" ) ), - Height: parseInt( rectNode.getAttribute( "Height" ) ), + X: parseInt( rectNode.getAttribute( "X" ), 10 ), + Y: parseInt( rectNode.getAttribute( "Y" ), 10 ), + Width: parseInt( rectNode.getAttribute( "Width" ), 10 ), + Height: parseInt( rectNode.getAttribute( "Height" ), 10 ), MinLevel: 0, // ignore MinLevel attribute, bug in Deep Zoom Composer - MaxLevel: parseInt( dispRectNode.getAttribute( "MaxLevel" ) ) + MaxLevel: parseInt( dispRectNode.getAttribute( "MaxLevel" ), 10 ) } }); } @@ -5931,7 +5947,7 @@ function configureFromXML( tileSource, xmlDoc ){ } throw new Error( $.getString( "Errors.Dzi" ) ); -}; +} /** * @private @@ -5944,10 +5960,10 @@ function configureFromObject( tileSource, configuration ){ fileFormat = imageData.Format, sizeData = imageData.Size, dispRectData = imageData.DisplayRect || [], - width = parseInt( sizeData.Width ), - height = parseInt( sizeData.Height ), - tileSize = parseInt( imageData.TileSize ), - tileOverlap = parseInt( imageData.Overlap ), + width = parseInt( sizeData.Width, 10 ), + height = parseInt( sizeData.Height, 10 ), + tileSize = parseInt( imageData.TileSize, 10 ), + tileOverlap = parseInt( imageData.Overlap, 10 ), displayRects = [], rectData, i; @@ -5969,12 +5985,12 @@ function configureFromObject( tileSource, configuration ){ rectData = dispRectData[ i ].Rect; displayRects.push( new $.DisplayRect( - parseInt( rectData.X ), - parseInt( rectData.Y ), - parseInt( rectData.Width ), - parseInt( rectData.Height ), + parseInt( rectData.X, 10 ), + parseInt( rectData.Y, 10 ), + parseInt( rectData.Width, 10 ), + parseInt( rectData.Height, 10 ), 0, // ignore MinLevel attribute, bug in Deep Zoom Composer - parseInt( rectData.MaxLevel ) + parseInt( rectData.MaxLevel, 10 ) )); } @@ -5991,7 +6007,7 @@ function configureFromObject( tileSource, configuration ){ displayRects: displayRects /* displayRects */ }; -}; +} }( OpenSeadragon )); (function( $ ){ @@ -6088,7 +6104,7 @@ $.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, { service = url.split('/'); service.pop(); //info.json or info.xml service = service.join('/'); - if( !( 'http' == url.substring( 0, 4 ) ) ){ + if( 'http' !== url.substring( 0, 4 ) ){ host = location.protocol + '//' + location.host; service = host + service; } @@ -6188,7 +6204,6 @@ $.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, { */ function configureFromXml( tileSource, xmlDoc ){ - var configuration = {}; //parse the xml if ( !xmlDoc || !xmlDoc.documentElement ) { @@ -6207,14 +6222,12 @@ function configureFromXml( tileSource, xmlDoc ){ try { - configuration = { "ns": root.namespaceURI }; parseXML( root, configuration ); - return configureFromObject( tileSource, configuration ); } catch ( e ) { @@ -6226,7 +6239,7 @@ function configureFromXml( tileSource, xmlDoc ){ throw new Error( $.getString( "Errors.IIIF" ) ); -}; +} /** @@ -6283,7 +6296,7 @@ function configureFromObject( tileSource, configuration ){ configuration.tilesUrl = configuration.image_host; } return configuration; -}; +} }( OpenSeadragon ));(function( $ ){ @@ -6360,7 +6373,7 @@ $.extend( $.OsmTileSource.prototype, $.TileSource.prototype, { return ( data.type && "openstreetmaps" == data.type - ) + ); }, /** @@ -6781,7 +6794,7 @@ $.TileSourceCollection = function( tileSize, tileSources, rows, layout ) { tilesPerRow = Math.ceil( options.tileSources.length / options.rows ), longSide = tilesPerRow >= options.rows ? tilesPerRow : - options.rows + options.rows; if( 'horizontal' == options.layout ){ options.width = ( options.tileSize ) * tilesPerRow; @@ -6840,7 +6853,7 @@ $.extend( $.TileSourceCollection.prototype, $.TileSource.prototype, { * @name OpenSeadragon.TileSourceCollection.prototype.configure */ configure: function( data, url ){ - return + return; }, @@ -7441,6 +7454,7 @@ $.Rect.prototype = { }( OpenSeadragon )); + (function( $ ){ // dictionary from id to private properties @@ -7473,6 +7487,7 @@ $.ReferenceStrip = function( options ){ miniViewer, minPixelRatio, element, + style, i; //We may need to create a new element and id if they did not @@ -7501,7 +7516,6 @@ $.ReferenceStrip = function( options ){ }); $.extend( this, options ); - //Private state properties THIS[ this.id ] = { "animating": false @@ -7509,17 +7523,16 @@ $.ReferenceStrip = function( options ){ this.minPixelRatio = this.viewer.minPixelRatio; - (function( style ){ - style.marginTop = '0px'; - style.marginRight = '0px'; - style.marginBottom = '0px'; - style.marginLeft = '0px'; - style.left = '0px'; - style.bottom = '0px'; - style.border = '0px'; - style.background = '#000'; - style.position = 'relative'; - }( this.element.style )); + style = thie.element.style; + style.marginTop = '0px'; + style.marginRight = '0px'; + style.marginBottom = '0px'; + style.marginLeft = '0px'; + style.left = '0px'; + style.bottom = '0px'; + style.border = '0px'; + style.background = '#000'; + style.position = 'relative'; $.setElementOpacity( this.element, 0.8 ); @@ -7533,8 +7546,6 @@ $.ReferenceStrip = function( options ){ keyHandler: $.delegate( this, onKeyPress ) }).setTracking( true ); - - //Controls the position and orientation of the reference strip and sets the //appropriate width and height if( options.width && options.height ){ @@ -7585,32 +7596,31 @@ $.ReferenceStrip = function( options ){ this.panelHeight = ( viewerSize.y * this.sizeRatio ) + 8; this.panels = []; + /*jshint loopfunc:true*/ for( i = 0; i < viewer.tileSources.length; i++ ){ element = $.makeNeutralElement('div'); element.id = this.element.id + "-" + i; - (function(style){ - style.width = _this.panelWidth + 'px'; - style.height = _this.panelHeight + 'px'; - style.display = 'inline'; - style.float = 'left'; //Webkit - style.cssFloat = 'left'; //Firefox - style.styleFloat = 'left'; //IE - style.padding = '2px'; - }(element.style)); + element.style.width = _this.panelWidth + 'px'; + element.style.height = _this.panelHeight + 'px'; + element.style.display = 'inline'; + element.style.float = 'left'; //Webkit + element.style.cssFloat = 'left'; //Firefox + element.style.styleFloat = 'left'; //IE + element.style.padding = '2px'; element.innerTracker = new $.MouseTracker({ - element: element, + element: element, clickTimeThreshold: this.clickTimeThreshold, clickDistThreshold: this.clickDistThreshold, pressHandler: function( tracker ){ - tracker.dragging = +new Date; + tracker.dragging = +new Date(); }, releaseHandler: function( tracker, position, insideElementPress, insideElementRelease ){ var id = tracker.element.id, page = Number( id.split( '-' )[ 2 ] ), - now = +new Date; + now = +new Date(); if ( insideElementPress && insideElementRelease && @@ -7747,7 +7757,7 @@ function onStripDrag( tracker, position, delta, shift ) { } return false; -}; +} @@ -7795,7 +7805,7 @@ function onStripScroll( tracker, position, scroll, shift ) { } //cancels event return false; -}; +} function loadPanels(strip, viewerSize, scroll){ @@ -7803,6 +7813,7 @@ function loadPanels(strip, viewerSize, scroll){ activePanelsStart, activePanelsEnd, miniViewer, + style, i; if( 'horizontal' == strip.scroll ){ panelSize = strip.panelWidth; @@ -7833,20 +7844,19 @@ function loadPanels(strip, viewerSize, scroll){ miniViewer.displayRegion.id = element.id + '-displayregion'; miniViewer.displayRegion.className = 'displayregion'; - (function( style ){ - style.position = 'relative'; - style.top = '0px'; - style.left = '0px'; - style.fontSize = '0px'; - style.overflow = 'hidden'; - style.float = 'left'; //Webkit - style.cssFloat = 'left'; //Firefox - style.styleFloat = 'left'; //IE - style.zIndex = 999999999; - style.cursor = 'default'; - style.width = ( strip.panelWidth - 4 ) + 'px'; - style.height = ( strip.panelHeight - 4 ) + 'px'; - }( miniViewer.displayRegion.style )); + style = miniViewer.displayRegion.style; + style.position = 'relative'; + style.top = '0px'; + style.left = '0px'; + style.fontSize = '0px'; + style.overflow = 'hidden'; + style.float = 'left'; //Webkit + style.cssFloat = 'left'; //Firefox + style.styleFloat = 'left'; //IE + style.zIndex = 999999999; + style.cursor = 'default'; + style.width = ( strip.panelWidth - 4 ) + 'px'; + style.height = ( strip.panelHeight - 4 ) + 'px'; miniViewer.displayRegion.innerTracker = new $.MouseTracker({ element: miniViewer.displayRegion @@ -7859,7 +7869,7 @@ function loadPanels(strip, viewerSize, scroll){ element.activePanel = true; } } -}; +} /** @@ -7885,8 +7895,8 @@ function onStripEnter( tracker ) { tracker.element.style.marginLeft = "0px"; } - return false -}; + return false; +} /** @@ -7915,7 +7925,7 @@ function onStripExit( tracker ) { } return false; -}; +} @@ -7957,7 +7967,7 @@ function onKeyPress( tracker, keyCode, shiftKey ){ //console.log( 'navigator keycode %s', keyCode ); return true; } -}; +} @@ -8507,10 +8517,10 @@ var DEVICE_SCREEN = $.getWindowSize(), ( BROWSER == $.BROWSERS.IE && BROWSER_VERSION >= 9 ) ), - USE_CANVAS = SUBPIXEL_RENDERING - && !( DEVICE_SCREEN.x <= 400 || DEVICE_SCREEN.y <= 400 ) - && !( navigator.appVersion.match( 'Mobile' ) ) - && $.isFunction( document.createElement( "canvas" ).getContext ); + USE_CANVAS = SUBPIXEL_RENDERING && + !( DEVICE_SCREEN.x <= 400 || DEVICE_SCREEN.y <= 400 ) && + !( navigator.appVersion.match( 'Mobile' ) ) && + $.isFunction( document.createElement( "canvas" ).getContext ); //console.error( 'USE_CANVAS ' + USE_CANVAS ); @@ -8604,50 +8614,7 @@ $.Drawer = function( options ) { for( i = 0; i < this.overlays.length; i++ ){ if( $.isPlainObject( this.overlays[ i ] ) ){ - (function( _this, overlay ){ - - var element = null, - rect = ( overlay.height && overlay.width ) ? new $.Rect( - overlay.x || overlay.px, - overlay.y || overlay.py, - overlay.width, - overlay.height - ) : new $.Point( - overlay.x || overlay.px, - overlay.y || overlay.py - ), - id = overlay.id ? - overlay.id : - "openseadragon-overlay-"+Math.floor(Math.random()*10000000); - - element = $.getElement(overlay.id); - if( !element ){ - element = document.createElement("a"); - element.href = "#/overlay/"+id; - } - element.id = id; - element.className = element.className + " " + ( overlay.className ? - overlay.className : - "openseadragon-overlay" - ); - - - if(overlay.px !== undefined){ - //if they specified 'px' so its in pixel coordinates so - //we need to translate to viewport coordinates - rect = _this.viewport.imageToViewportRectangle( rect ); - } - if( overlay.placement ){ - _this.overlays[ i ] = new $.Overlay( - element, - _this.viewport.pointFromPixel(rect), - $.OverlayPlacement[overlay.placement.toUpperCase()] - ); - }else{ - _this.overlays[ i ] = new $.Overlay( element, rect ); - } - - }( this, this.overlays[ i ] )); + addOverlayFromConfiguration( this, this.overlays[ i ]); } else if ( $.isFunction( this.overlays[ i ] ) ){ //TODO @@ -8851,6 +8818,55 @@ $.Drawer.prototype = { } }; +/** + * @private + * @inner + */ + function addOverlayFromConfiguration( drawer, overlay ){ + + var element = null, + rect = ( overlay.height && overlay.width ) ? new $.Rect( + overlay.x || overlay.px, + overlay.y || overlay.py, + overlay.width, + overlay.height + ) : new $.Point( + overlay.x || overlay.px, + overlay.y || overlay.py + ), + id = overlay.id ? + overlay.id : + "openseadragon-overlay-"+Math.floor(Math.random()*10000000); + + element = $.getElement(overlay.id); + if( !element ){ + element = document.createElement("a"); + element.href = "#/overlay/"+id; + } + element.id = id; + element.className = element.className + " " + ( overlay.className ? + overlay.className : + "openseadragon-overlay" + ); + + + if(overlay.px !== undefined){ + //if they specified 'px' so its in pixel coordinates so + //we need to translate to viewport coordinates + rect = drawer.viewport.imageToViewportRectangle( rect ); + } + if( overlay.placement ){ + drawer.overlays[ i ] = new $.Overlay( + element, + drawer.viewport.pointFromPixel(rect), + $.OverlayPlacement[overlay.placement.toUpperCase()] + ); + }else{ + drawer.overlays[ i ] = new $.Overlay( element, rect ); + } + +} + /** * @private * @inner @@ -9514,20 +9530,18 @@ function drawTiles( drawer, lastDrawn ){ ] }); - (function(style){ - //TODO: IE seems to barf on this, not sure if its just the border - // but we probably need to clear this up with a better - // test of support for various css features - if( SUBPIXEL_RENDERING ){ - style['-webkit-box-reflect'] = - 'below 0px -webkit-gradient('+ - 'linear,left '+ - 'top,left '+ - 'bottom,from(transparent),color-stop(62%,transparent),to(rgba(255,255,255,0.62))'+ - ')'; - style['border'] = '1px solid rgba(255,255,255,0.38)'; - } - }(viewer.element.style)); + //TODO: IE seems to barf on this, not sure if its just the border + // but we probably need to clear this up with a better + // test of support for various css features + if( SUBPIXEL_RENDERING ){ + viewer.element.style.border = '1px solid rgba(255,255,255,0.38)'; + viewer.element.style['-webkit-box-reflect'] = + 'below 0px -webkit-gradient('+ + 'linear,left '+ + 'top,left '+ + 'bottom,from(transparent),color-stop(62%,transparent),to(rgba(255,255,255,0.62))'+ + ')'; + } drawer.addOverlay( viewer.element, @@ -9579,7 +9593,7 @@ function drawDebugInfo( drawer, tile, count, i ){ tile.size.x, tile.size.y ); - if( tile.x == 0 && tile.y == 0 ){ + if( tile.x === 0 && tile.y === 0 ){ drawer.context.fillText( "Zoom: " + drawer.viewport.getZoom(), tile.position.x, diff --git a/package.json b/package.json new file mode 100644 index 00000000..7d89b89c --- /dev/null +++ b/package.json @@ -0,0 +1,4 @@ +{ + "name": "openseadragon", + "version": "0.9.113" +} \ No newline at end of file diff --git a/src/drawer.js b/src/drawer.js index 5f39bd0a..c5a86f45 100644 --- a/src/drawer.js +++ b/src/drawer.js @@ -14,10 +14,10 @@ var DEVICE_SCREEN = $.getWindowSize(), ( BROWSER == $.BROWSERS.IE && BROWSER_VERSION >= 9 ) ), - USE_CANVAS = SUBPIXEL_RENDERING - && !( DEVICE_SCREEN.x <= 400 || DEVICE_SCREEN.y <= 400 ) - && !( navigator.appVersion.match( 'Mobile' ) ) - && $.isFunction( document.createElement( "canvas" ).getContext ); + USE_CANVAS = SUBPIXEL_RENDERING && + !( DEVICE_SCREEN.x <= 400 || DEVICE_SCREEN.y <= 400 ) && + !( navigator.appVersion.match( 'Mobile' ) ) && + $.isFunction( document.createElement( "canvas" ).getContext ); //console.error( 'USE_CANVAS ' + USE_CANVAS ); @@ -111,50 +111,7 @@ $.Drawer = function( options ) { for( i = 0; i < this.overlays.length; i++ ){ if( $.isPlainObject( this.overlays[ i ] ) ){ - (function( _this, overlay ){ - - var element = null, - rect = ( overlay.height && overlay.width ) ? new $.Rect( - overlay.x || overlay.px, - overlay.y || overlay.py, - overlay.width, - overlay.height - ) : new $.Point( - overlay.x || overlay.px, - overlay.y || overlay.py - ), - id = overlay.id ? - overlay.id : - "openseadragon-overlay-"+Math.floor(Math.random()*10000000); - - element = $.getElement(overlay.id); - if( !element ){ - element = document.createElement("a"); - element.href = "#/overlay/"+id; - } - element.id = id; - element.className = element.className + " " + ( overlay.className ? - overlay.className : - "openseadragon-overlay" - ); - - - if(overlay.px !== undefined){ - //if they specified 'px' so its in pixel coordinates so - //we need to translate to viewport coordinates - rect = _this.viewport.imageToViewportRectangle( rect ); - } - if( overlay.placement ){ - _this.overlays[ i ] = new $.Overlay( - element, - _this.viewport.pointFromPixel(rect), - $.OverlayPlacement[overlay.placement.toUpperCase()] - ); - }else{ - _this.overlays[ i ] = new $.Overlay( element, rect ); - } - - }( this, this.overlays[ i ] )); + addOverlayFromConfiguration( this, this.overlays[ i ]); } else if ( $.isFunction( this.overlays[ i ] ) ){ //TODO @@ -358,6 +315,55 @@ $.Drawer.prototype = { } }; +/** + * @private + * @inner + */ + function addOverlayFromConfiguration( drawer, overlay ){ + + var element = null, + rect = ( overlay.height && overlay.width ) ? new $.Rect( + overlay.x || overlay.px, + overlay.y || overlay.py, + overlay.width, + overlay.height + ) : new $.Point( + overlay.x || overlay.px, + overlay.y || overlay.py + ), + id = overlay.id ? + overlay.id : + "openseadragon-overlay-"+Math.floor(Math.random()*10000000); + + element = $.getElement(overlay.id); + if( !element ){ + element = document.createElement("a"); + element.href = "#/overlay/"+id; + } + element.id = id; + element.className = element.className + " " + ( overlay.className ? + overlay.className : + "openseadragon-overlay" + ); + + + if(overlay.px !== undefined){ + //if they specified 'px' so its in pixel coordinates so + //we need to translate to viewport coordinates + rect = drawer.viewport.imageToViewportRectangle( rect ); + } + if( overlay.placement ){ + drawer.overlays[ i ] = new $.Overlay( + element, + drawer.viewport.pointFromPixel(rect), + $.OverlayPlacement[overlay.placement.toUpperCase()] + ); + }else{ + drawer.overlays[ i ] = new $.Overlay( element, rect ); + } + +} + /** * @private * @inner @@ -1021,20 +1027,18 @@ function drawTiles( drawer, lastDrawn ){ ] }); - (function(style){ - //TODO: IE seems to barf on this, not sure if its just the border - // but we probably need to clear this up with a better - // test of support for various css features - if( SUBPIXEL_RENDERING ){ - style['-webkit-box-reflect'] = - 'below 0px -webkit-gradient('+ - 'linear,left '+ - 'top,left '+ - 'bottom,from(transparent),color-stop(62%,transparent),to(rgba(255,255,255,0.62))'+ - ')'; - style['border'] = '1px solid rgba(255,255,255,0.38)'; - } - }(viewer.element.style)); + //TODO: IE seems to barf on this, not sure if its just the border + // but we probably need to clear this up with a better + // test of support for various css features + if( SUBPIXEL_RENDERING ){ + viewer.element.style.border = '1px solid rgba(255,255,255,0.38)'; + viewer.element.style['-webkit-box-reflect'] = + 'below 0px -webkit-gradient('+ + 'linear,left '+ + 'top,left '+ + 'bottom,from(transparent),color-stop(62%,transparent),to(rgba(255,255,255,0.62))'+ + ')'; + } drawer.addOverlay( viewer.element, @@ -1086,7 +1090,7 @@ function drawDebugInfo( drawer, tile, count, i ){ tile.size.x, tile.size.y ); - if( tile.x == 0 && tile.y == 0 ){ + if( tile.x === 0 && tile.y === 0 ){ drawer.context.fillText( "Zoom: " + drawer.viewport.getZoom(), tile.position.x, diff --git a/src/dzitilesource.js b/src/dzitilesource.js index 8539284e..d28f8afc 100644 --- a/src/dzitilesource.js +++ b/src/dzitilesource.js @@ -107,7 +107,7 @@ $.extend( $.DziTileSource.prototype, $.TileSource.prototype, { } if( url && !options.tilesUrl ){ - if( !( 'http' == url.substring( 0, 4 ) ) ){ + if( 'http' !== url.substring( 0, 4 ) ){ host = location.protocol + '//' + location.host; } dziPath = url.split('/'); @@ -216,11 +216,11 @@ function configureFromXML( tileSource, xmlDoc ){ xmlns: "http://schemas.microsoft.com/deepzoom/2008", Format: root.getAttribute( "Format" ), DisplayRect: null, - Overlap: parseInt( root.getAttribute( "Overlap" ) ), - TileSize: parseInt( root.getAttribute( "TileSize" ) ), + Overlap: parseInt( root.getAttribute( "Overlap" ), 10 ), + TileSize: parseInt( root.getAttribute( "TileSize" ), 10 ), Size: { - Height: parseInt( sizeNode.getAttribute( "Height" ) ), - Width: parseInt( sizeNode.getAttribute( "Width" ) ) + Height: parseInt( sizeNode.getAttribute( "Height" ), 10 ), + Width: parseInt( sizeNode.getAttribute( "Width" ), 10 ) } } }; @@ -238,12 +238,12 @@ function configureFromXML( tileSource, xmlDoc ){ displayRects.push({ Rect: { - X: parseInt( rectNode.getAttribute( "X" ) ), - Y: parseInt( rectNode.getAttribute( "Y" ) ), - Width: parseInt( rectNode.getAttribute( "Width" ) ), - Height: parseInt( rectNode.getAttribute( "Height" ) ), + X: parseInt( rectNode.getAttribute( "X" ), 10 ), + Y: parseInt( rectNode.getAttribute( "Y" ), 10 ), + Width: parseInt( rectNode.getAttribute( "Width" ), 10 ), + Height: parseInt( rectNode.getAttribute( "Height" ), 10 ), MinLevel: 0, // ignore MinLevel attribute, bug in Deep Zoom Composer - MaxLevel: parseInt( dispRectNode.getAttribute( "MaxLevel" ) ) + MaxLevel: parseInt( dispRectNode.getAttribute( "MaxLevel" ), 10 ) } }); } @@ -266,7 +266,7 @@ function configureFromXML( tileSource, xmlDoc ){ } throw new Error( $.getString( "Errors.Dzi" ) ); -}; +} /** * @private @@ -279,10 +279,10 @@ function configureFromObject( tileSource, configuration ){ fileFormat = imageData.Format, sizeData = imageData.Size, dispRectData = imageData.DisplayRect || [], - width = parseInt( sizeData.Width ), - height = parseInt( sizeData.Height ), - tileSize = parseInt( imageData.TileSize ), - tileOverlap = parseInt( imageData.Overlap ), + width = parseInt( sizeData.Width, 10 ), + height = parseInt( sizeData.Height, 10 ), + tileSize = parseInt( imageData.TileSize, 10 ), + tileOverlap = parseInt( imageData.Overlap, 10 ), displayRects = [], rectData, i; @@ -304,12 +304,12 @@ function configureFromObject( tileSource, configuration ){ rectData = dispRectData[ i ].Rect; displayRects.push( new $.DisplayRect( - parseInt( rectData.X ), - parseInt( rectData.Y ), - parseInt( rectData.Width ), - parseInt( rectData.Height ), + parseInt( rectData.X, 10 ), + parseInt( rectData.Y, 10 ), + parseInt( rectData.Width, 10 ), + parseInt( rectData.Height, 10 ), 0, // ignore MinLevel attribute, bug in Deep Zoom Composer - parseInt( rectData.MaxLevel ) + parseInt( rectData.MaxLevel, 10 ) )); } @@ -326,6 +326,6 @@ function configureFromObject( tileSource, configuration ){ displayRects: displayRects /* displayRects */ }; -}; +} }( OpenSeadragon )); diff --git a/src/iiiftilesource.js b/src/iiiftilesource.js index 4b4b6111..1cf51de5 100644 --- a/src/iiiftilesource.js +++ b/src/iiiftilesource.js @@ -92,7 +92,7 @@ $.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, { service = url.split('/'); service.pop(); //info.json or info.xml service = service.join('/'); - if( !( 'http' == url.substring( 0, 4 ) ) ){ + if( 'http' !== url.substring( 0, 4 ) ){ host = location.protocol + '//' + location.host; service = host + service; } @@ -192,7 +192,6 @@ $.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, { */ function configureFromXml( tileSource, xmlDoc ){ - var configuration = {}; //parse the xml if ( !xmlDoc || !xmlDoc.documentElement ) { @@ -211,14 +210,12 @@ function configureFromXml( tileSource, xmlDoc ){ try { - configuration = { "ns": root.namespaceURI }; parseXML( root, configuration ); - return configureFromObject( tileSource, configuration ); } catch ( e ) { @@ -230,7 +227,7 @@ function configureFromXml( tileSource, xmlDoc ){ throw new Error( $.getString( "Errors.IIIF" ) ); -}; +} /** @@ -287,6 +284,6 @@ function configureFromObject( tileSource, configuration ){ configuration.tilesUrl = configuration.image_host; } return configuration; -}; +} }( OpenSeadragon )); \ No newline at end of file diff --git a/src/mousetracker.js b/src/mousetracker.js index 1e5e8181..6bcb74eb 100644 --- a/src/mousetracker.js +++ b/src/mousetracker.js @@ -108,23 +108,23 @@ * Position of last mouse down */ THIS[ this.hash ] = { - "mouseover": function( event ){ onMouseOver( _this, event ); }, - "mouseout": function( event ){ onMouseOut( _this, event ); }, - "mousedown": function( event ){ onMouseDown( _this, event ); }, - "mouseup": function( event ){ onMouseUp( _this, event ); }, - "click": function( event ){ onMouseClick( _this, event ); }, - "DOMMouseScroll": function( event ){ onMouseWheelSpin( _this, event ); }, - "mousewheel": function( event ){ onMouseWheelSpin( _this, event ); }, - "mouseupie": function( event ){ onMouseUpIE( _this, event ); }, - "mousemoveie": function( event ){ onMouseMoveIE( _this, event ); }, - "mouseupwindow": function( event ){ onMouseUpWindow( _this, event ); }, - "mousemove": function( event ){ onMouseMove( _this, event ); }, - "touchstart": function( event ){ onTouchStart( _this, event ); }, - "touchmove": function( event ){ onTouchMove( _this, event ); }, - "touchend": function( event ){ onTouchEnd( _this, event ); }, - "keypress": function( event ){ onKeyPress( _this, event ); }, - "focus": function( event ){ onFocus( _this, event ); }, - "blur": function( event ){ onBlur( _this, event ); }, + mouseover: function( event ){ onMouseOver( _this, event ); }, + mouseout: function( event ){ onMouseOut( _this, event ); }, + mousedown: function( event ){ onMouseDown( _this, event ); }, + mouseup: function( event ){ onMouseUp( _this, event ); }, + click: function( event ){ onMouseClick( _this, event ); }, + DOMMouseScroll: function( event ){ onMouseWheelSpin( _this, event ); }, + mousewheel: function( event ){ onMouseWheelSpin( _this, event ); }, + mouseupie: function( event ){ onMouseUpIE( _this, event ); }, + mousemoveie: function( event ){ onMouseMoveIE( _this, event ); }, + mouseupwindow: function( event ){ onMouseUpWindow( _this, event ); }, + mousemove: function( event ){ onMouseMove( _this, event ); }, + touchstart: function( event ){ onTouchStart( _this, event ); }, + touchmove: function( event ){ onTouchMove( _this, event ); }, + touchend: function( event ){ onTouchEnd( _this, event ); }, + keypress: function( event ){ onKeyPress( _this, event ); }, + focus: function( event ){ onFocus( _this, event ); }, + blur: function( event ){ onBlur( _this, event ); }, tracking: false, capturing: false, buttonDown: false, @@ -379,32 +379,32 @@ $.removeEvent( tracker.element, "mouseup", - delegate[ "mouseup" ], + delegate.mouseup, false ); $.addEvent( tracker.element, "mouseup", - delegate[ "mouseupie" ], + delegate.mouseupie, true ); $.addEvent( tracker.element, "mousemove", - delegate[ "mousemoveie" ], + delegate.mousemoveie, true ); } else { $.addEvent( window, "mouseup", - delegate[ "mouseupwindow" ], + delegate.mouseupwindow, true ); $.addEvent( window, "mousemove", - delegate[ "mousemove" ], + delegate.mousemove, true ); } @@ -426,32 +426,32 @@ $.removeEvent( tracker.element, "mousemove", - delegate[ "mousemoveie" ], + delegate.mousemoveie, true ); $.removeEvent( tracker.element, "mouseup", - delegate[ "mouseupie" ], + delegate.mouseupie, true ); $.addEvent( tracker.element, "mouseup", - delegate[ "mouseup" ], + delegate.mouseup, false ); } else { $.removeEvent( window, "mousemove", - delegate[ "mousemove" ], + delegate.mousemove, true ); $.removeEvent( window, "mouseup", - delegate[ "mouseupwindow" ], + delegate.mouseupwindow, true ); } @@ -525,7 +525,7 @@ event.keyCode ? event.keyCode : event.charCode, event.shiftKey ); - if( propagate === false ){ + if( !propagate ){ $.cancelEvent( event ); } } @@ -538,17 +538,17 @@ */ function onMouseOver( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], + var delegate = THIS[ tracker.hash ], propagate; + event = $.getEvent( event ); + if ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 9 && delegate.capturing && !isChild( event.srcElement, tracker.element ) ) { triggerOthers( tracker, onMouseOver, event ); - } var to = event.target ? @@ -584,10 +584,11 @@ * @inner */ function onMouseOut( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], + var delegate = THIS[ tracker.hash ], propagate; + event = $.getEvent( event ); + if ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 9 && delegate.capturing && @@ -631,10 +632,11 @@ * @inner */ function onMouseDown( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], + var delegate = THIS[ tracker.hash ], propagate; + event = $.getEvent( event ); + if ( event.button == 2 ) { return; } @@ -707,14 +709,15 @@ * @inner */ function onMouseUp( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], + var delegate = THIS[ tracker.hash ], //were we inside the tracked element when we were pressed insideElementPress = delegate.buttonDown, //are we still inside the tracked element when we released insideElementRelease = delegate.insideElement, propagate; + event = $.getEvent( event ); + if ( event.button == 2 ) { return; } @@ -745,8 +748,8 @@ */ function onTouchEnd( tracker, event ) { - if( event.touches.length == 0 && - event.targetTouches.length == 0 && + if( event.touches.length === 0 && + event.targetTouches.length === 0 && event.changedTouches.length == 1 ){ THIS[ tracker.hash ].lastTouch = null; @@ -772,10 +775,11 @@ * @inner */ function onMouseUpIE( tracker, event ) { - var event = $.getEvent( event ), - othertracker, + var othertracker, i; + event = $.getEvent( event ); + if ( event.button == 2 ) { return; } @@ -870,10 +874,11 @@ * @inner */ function handleMouseClick( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], + var delegate = THIS[ tracker.hash ], propagate; + event = $.getEvent( event ); + if ( event.button == 2 ) { return; } @@ -903,11 +908,14 @@ * @inner */ function onMouseMove( tracker, event ) { - var event = $.getEvent( event ), - delegate = THIS[ tracker.hash ], - point = getMouseAbsolute( event ), - delta = point.minus( delegate.lastPoint ), - propagate; + var delegate = THIS[ tracker.hash ], + delta, + propagate, + point; + + event = $.getEvent( event ); + point = getMouseAbsolute( event ); + delta = point.minus( delegate.lastPoint ); delegate.lastPoint = point; diff --git a/src/openseadragon.js b/src/openseadragon.js index bb938dd9..7fddd839 100644 --- a/src/openseadragon.js +++ b/src/openseadragon.js @@ -1,4 +1,4 @@ -/*globals OpenSeadragon */ +/*globals OpenSeadragon*/ /** * @version OpenSeadragon @VERSION@ @@ -315,7 +315,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ * @see jQuery */ $.type = function( obj ) { - return obj == null ? + return ( obj === null ) || ( obj === undefined ) ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }; @@ -419,7 +419,8 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ for ( ; i < length; i++ ) { // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { + options = arguments[ i ]; + if ( options !== null || options !== undefined ) { // Extend the base object for ( name in options ) { src = target[ name ]; @@ -472,6 +473,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ //PAN AND ZOOM SETTINGS AND CONSTRAINTS panHorizontal: true, panVertical: true, + constrainDuringPan: false, wrapHorizontal: false, wrapVertical: false, visibilityRatio: 0.5, @@ -598,10 +600,12 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ * @param {Function} method */ delegate: function( object, method ) { - return function() { - if ( arguments === undefined ) - arguments = []; - return method.apply( object, arguments ); + return function(){ + var args = arguments; + if ( args === undefined ){ + args = []; + } + return method.apply( object, args ); }; }, @@ -832,21 +836,21 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ window.innerWidth, window.innerHeight ); - } + }; } else if ( docElement.clientWidth || docElement.clientHeight ) { $.getWindowSize = function(){ return new $.Point( document.documentElement.clientWidth, document.documentElement.clientHeight ); - } + }; } else if ( body.clientWidth || body.clientHeight ) { $.getWindowSize = function(){ return new $.Point( document.body.clientWidth, document.body.clientHeight ); - } + }; } else { throw new Error("Unknown window size, no known technique."); } @@ -1113,7 +1117,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ $.cancelEvent = function( event ){ // W3C for preventing default event.preventDefault(); - } + }; } else { $.cancelEvent = function( event ){ event = $.getEvent( event ); @@ -1212,6 +1216,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ // we could determine once at startup which activeX object // was supported. This will have significant impact on // performance for IE Browsers DONE + /*jshint loopfunc:true*/ for ( i = 0; i < ACTIVEX.length; i++ ) { try { request = new ActiveXObject( ACTIVEX[ i ] ); @@ -1268,7 +1273,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ /** @ignore */ request.onreadystatechange = function() { if ( request.readyState == 4) { - request.onreadystatechange = new function() { }; + request.onreadystatechange = function(){}; options.success( request ); } }; @@ -1692,7 +1697,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ } else { return element.offsetParent; } - }; + } /** * @private @@ -1724,7 +1729,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ } return processDZIXml( doc, tilesUrl ); - }; + } /** * @private @@ -1758,7 +1763,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ } throw new Error( $.getString( "Errors.Dzi" ) ); - }; + } /** * @private @@ -1772,10 +1777,10 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ var fileFormat = imageNode.getAttribute( "Format" ), sizeNode = imageNode.getElementsByTagName( "Size" )[ 0 ], dispRectNodes = imageNode.getElementsByTagName( "DisplayRect" ), - width = parseInt( sizeNode.getAttribute( "Width" ) ), - height = parseInt( sizeNode.getAttribute( "Height" ) ), - tileSize = parseInt( imageNode.getAttribute( "TileSize" ) ), - tileOverlap = parseInt( imageNode.getAttribute( "Overlap" ) ), + width = parseInt( sizeNode.getAttribute( "Width" ), 10 ), + height = parseInt( sizeNode.getAttribute( "Height" ), 10 ), + tileSize = parseInt( imageNode.getAttribute( "TileSize" ), 10 ), + tileOverlap = parseInt( imageNode.getAttribute( "Overlap" ), 10 ), dispRects = [], dispRectNode, rectNode, @@ -1792,12 +1797,12 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ rectNode = dispRectNode.getElementsByTagName( "Rect" )[ 0 ]; dispRects.push( new $.DisplayRect( - parseInt( rectNode.getAttribute( "X" ) ), - parseInt( rectNode.getAttribute( "Y" ) ), - parseInt( rectNode.getAttribute( "Width" ) ), - parseInt( rectNode.getAttribute( "Height" ) ), + parseInt( rectNode.getAttribute( "X" ), 10 ), + parseInt( rectNode.getAttribute( "Y" ), 10 ), + parseInt( rectNode.getAttribute( "Width" ), 10 ), + parseInt( rectNode.getAttribute( "Height" ), 10 ), 0, // ignore MinLevel attribute, bug in Deep Zoom Composer - parseInt( dispRectNode.getAttribute( "MaxLevel" ) ) + parseInt( dispRectNode.getAttribute( "MaxLevel" ), 10 ) )); } return new $.DziTileSource( @@ -1809,7 +1814,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ fileFormat, dispRects ); - }; + } /** * @private @@ -1823,10 +1828,10 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ var fileFormat = imageData.Format, sizeData = imageData.Size, dispRectData = imageData.DisplayRect || [], - width = parseInt( sizeData.Width ), - height = parseInt( sizeData.Height ), - tileSize = parseInt( imageData.TileSize ), - tileOverlap = parseInt( imageData.Overlap ), + width = parseInt( sizeData.Width, 10 ), + height = parseInt( sizeData.Height, 10 ), + tileSize = parseInt( imageData.TileSize, 10 ), + tileOverlap = parseInt( imageData.Overlap, 10 ), dispRects = [], rectData, i; @@ -1841,12 +1846,12 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ rectData = dispRectData[ i ].Rect; dispRects.push( new $.DisplayRect( - parseInt( rectData.X ), - parseInt( rectData.Y ), - parseInt( rectData.Width ), - parseInt( rectData.Height ), + parseInt( rectData.X, 10 ), + parseInt( rectData.Y, 10 ), + parseInt( rectData.Width, 10 ), + parseInt( rectData.Height, 10 ), 0, // ignore MinLevel attribute, bug in Deep Zoom Composer - parseInt( rectData.MaxLevel ) + parseInt( rectData.MaxLevel, 10 ) )); } return new $.DziTileSource( @@ -1858,7 +1863,8 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ fileFormat, dispRects ); - }; + } + /** * @private * @inner @@ -1872,8 +1878,6 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ message = messageNode.firstChild.nodeValue; throw new Error(message); - }; + } - - }( OpenSeadragon )); diff --git a/src/osmtilesource.js b/src/osmtilesource.js index 3672231c..4b72276c 100644 --- a/src/osmtilesource.js +++ b/src/osmtilesource.js @@ -73,7 +73,7 @@ $.extend( $.OsmTileSource.prototype, $.TileSource.prototype, { return ( data.type && "openstreetmaps" == data.type - ) + ); }, /** diff --git a/src/referencestrip.js b/src/referencestrip.js index 5caa5f75..bb3051e4 100644 --- a/src/referencestrip.js +++ b/src/referencestrip.js @@ -1,3 +1,4 @@ + (function( $ ){ // dictionary from id to private properties @@ -30,6 +31,7 @@ $.ReferenceStrip = function( options ){ miniViewer, minPixelRatio, element, + style, i; //We may need to create a new element and id if they did not @@ -58,7 +60,6 @@ $.ReferenceStrip = function( options ){ }); $.extend( this, options ); - //Private state properties THIS[ this.id ] = { "animating": false @@ -66,17 +67,16 @@ $.ReferenceStrip = function( options ){ this.minPixelRatio = this.viewer.minPixelRatio; - (function( style ){ - style.marginTop = '0px'; - style.marginRight = '0px'; - style.marginBottom = '0px'; - style.marginLeft = '0px'; - style.left = '0px'; - style.bottom = '0px'; - style.border = '0px'; - style.background = '#000'; - style.position = 'relative'; - }( this.element.style )); + style = thie.element.style; + style.marginTop = '0px'; + style.marginRight = '0px'; + style.marginBottom = '0px'; + style.marginLeft = '0px'; + style.left = '0px'; + style.bottom = '0px'; + style.border = '0px'; + style.background = '#000'; + style.position = 'relative'; $.setElementOpacity( this.element, 0.8 ); @@ -90,8 +90,6 @@ $.ReferenceStrip = function( options ){ keyHandler: $.delegate( this, onKeyPress ) }).setTracking( true ); - - //Controls the position and orientation of the reference strip and sets the //appropriate width and height if( options.width && options.height ){ @@ -142,32 +140,31 @@ $.ReferenceStrip = function( options ){ this.panelHeight = ( viewerSize.y * this.sizeRatio ) + 8; this.panels = []; + /*jshint loopfunc:true*/ for( i = 0; i < viewer.tileSources.length; i++ ){ element = $.makeNeutralElement('div'); element.id = this.element.id + "-" + i; - (function(style){ - style.width = _this.panelWidth + 'px'; - style.height = _this.panelHeight + 'px'; - style.display = 'inline'; - style.float = 'left'; //Webkit - style.cssFloat = 'left'; //Firefox - style.styleFloat = 'left'; //IE - style.padding = '2px'; - }(element.style)); + element.style.width = _this.panelWidth + 'px'; + element.style.height = _this.panelHeight + 'px'; + element.style.display = 'inline'; + element.style.float = 'left'; //Webkit + element.style.cssFloat = 'left'; //Firefox + element.style.styleFloat = 'left'; //IE + element.style.padding = '2px'; element.innerTracker = new $.MouseTracker({ - element: element, + element: element, clickTimeThreshold: this.clickTimeThreshold, clickDistThreshold: this.clickDistThreshold, pressHandler: function( tracker ){ - tracker.dragging = +new Date; + tracker.dragging = +new Date(); }, releaseHandler: function( tracker, position, insideElementPress, insideElementRelease ){ var id = tracker.element.id, page = Number( id.split( '-' )[ 2 ] ), - now = +new Date; + now = +new Date(); if ( insideElementPress && insideElementRelease && @@ -304,7 +301,7 @@ function onStripDrag( tracker, position, delta, shift ) { } return false; -}; +} @@ -352,7 +349,7 @@ function onStripScroll( tracker, position, scroll, shift ) { } //cancels event return false; -}; +} function loadPanels(strip, viewerSize, scroll){ @@ -360,6 +357,7 @@ function loadPanels(strip, viewerSize, scroll){ activePanelsStart, activePanelsEnd, miniViewer, + style, i; if( 'horizontal' == strip.scroll ){ panelSize = strip.panelWidth; @@ -390,20 +388,19 @@ function loadPanels(strip, viewerSize, scroll){ miniViewer.displayRegion.id = element.id + '-displayregion'; miniViewer.displayRegion.className = 'displayregion'; - (function( style ){ - style.position = 'relative'; - style.top = '0px'; - style.left = '0px'; - style.fontSize = '0px'; - style.overflow = 'hidden'; - style.float = 'left'; //Webkit - style.cssFloat = 'left'; //Firefox - style.styleFloat = 'left'; //IE - style.zIndex = 999999999; - style.cursor = 'default'; - style.width = ( strip.panelWidth - 4 ) + 'px'; - style.height = ( strip.panelHeight - 4 ) + 'px'; - }( miniViewer.displayRegion.style )); + style = miniViewer.displayRegion.style; + style.position = 'relative'; + style.top = '0px'; + style.left = '0px'; + style.fontSize = '0px'; + style.overflow = 'hidden'; + style.float = 'left'; //Webkit + style.cssFloat = 'left'; //Firefox + style.styleFloat = 'left'; //IE + style.zIndex = 999999999; + style.cursor = 'default'; + style.width = ( strip.panelWidth - 4 ) + 'px'; + style.height = ( strip.panelHeight - 4 ) + 'px'; miniViewer.displayRegion.innerTracker = new $.MouseTracker({ element: miniViewer.displayRegion @@ -416,7 +413,7 @@ function loadPanels(strip, viewerSize, scroll){ element.activePanel = true; } } -}; +} /** @@ -442,8 +439,8 @@ function onStripEnter( tracker ) { tracker.element.style.marginLeft = "0px"; } - return false -}; + return false; +} /** @@ -472,7 +469,7 @@ function onStripExit( tracker ) { } return false; -}; +} @@ -514,7 +511,7 @@ function onKeyPress( tracker, keyCode, shiftKey ){ //console.log( 'navigator keycode %s', keyCode ); return true; } -}; +} diff --git a/src/strings.js b/src/strings.js index 22e676e6..16f2df8a 100644 --- a/src/strings.js +++ b/src/strings.js @@ -57,7 +57,7 @@ $.extend( $, { } return string.replace(/\{\d+\}/g, function(capture) { - var i = parseInt( capture.match( /\d+/ ) ) + 1; + var i = parseInt( capture.match( /\d+/ ), 10 ) + 1; return i < args.length ? args[ i ] : ""; diff --git a/src/tilesource.js b/src/tilesource.js index 79d134c6..c28fa138 100644 --- a/src/tilesource.js +++ b/src/tilesource.js @@ -83,6 +83,7 @@ $.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLeve $.extend( true, this, options ); //Any functions that are passed as arguments are bound to the ready callback + /*jshint loopfunc:true*/ for( i = 0; i < arguments.length; i++ ){ if( $.isFunction( arguments[i] ) ){ callback = arguments[ i ]; @@ -212,7 +213,6 @@ $.TileSource.prototype = { */ getImageInfo: function( url ) { var _this = this, - url = url, error, callbackName, callback, @@ -372,6 +372,7 @@ function processResponse( xhr ){ data = xhr.responseText; } }else if( responseText.match(/\s*[\{\[].*/) ){ + /*jshint evil:true*/ data = eval( '('+responseText+')' ); }else{ data = responseText; diff --git a/src/tilesourcecollection.js b/src/tilesourcecollection.js index 0102d54a..6de32155 100644 --- a/src/tilesourcecollection.js +++ b/src/tilesourcecollection.js @@ -29,7 +29,7 @@ $.TileSourceCollection = function( tileSize, tileSources, rows, layout ) { tilesPerRow = Math.ceil( options.tileSources.length / options.rows ), longSide = tilesPerRow >= options.rows ? tilesPerRow : - options.rows + options.rows; if( 'horizontal' == options.layout ){ options.width = ( options.tileSize ) * tilesPerRow; @@ -88,7 +88,7 @@ $.extend( $.TileSourceCollection.prototype, $.TileSource.prototype, { * @name OpenSeadragon.TileSourceCollection.prototype.configure */ configure: function( data, url ){ - return + return; }, diff --git a/src/viewer.js b/src/viewer.js index e5e4c575..fa026253 100644 --- a/src/viewer.js +++ b/src/viewer.js @@ -471,7 +471,7 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, overlay = this.overlayControls[ i ]; - if ( overlay.point != null ) { + if ( overlay.point ) { this.drawer.addOverlay( overlay.id, @@ -517,7 +517,7 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, if( this.drawer ){ this.drawer.clearOverlays(); } - + this.source = null; this.drawer = null; @@ -1163,6 +1163,9 @@ function onCanvasDrag( tracker, position, delta, shift ) { delta.negate() ) ); + if( this.constrainDuringPan ){ + this.viewport.applyConstraints(); + } } } diff --git a/www/ui-zoom-and-pan.html b/www/ui-zoom-and-pan.html index 1d5af620..9dff830d 100644 --- a/www/ui-zoom-and-pan.html +++ b/www/ui-zoom-and-pan.html @@ -9,12 +9,19 @@ the minimum and maximum zoom range as well as the range of panning. the options: