From a0fd2b33241023f7a35cd82e65205e27d068345f Mon Sep 17 00:00:00 2001 From: thatcher Date: Tue, 12 Feb 2013 22:40:08 -0500 Subject: [PATCH] added inital support for moving to a nodejs build with grunt. build only includes concant and lint. fixed all lint warning where appropriate and added lint inline ignores where appropriate. when build script is complete we will start transition to new repo. also currently researching how to prune unfriendly portion of history that make repo large due to large binary files in web app. I like git well enough but using branches for web apps unrelated to code base has made me weary once again of social web fads that force convention without long term consideration of cost. --- build.properties | 2 +- grunt.js | 71 ++++++ openseadragon.js | 476 +++++++++++++++++++----------------- package.json | 4 + src/drawer.js | 130 +++++----- src/dzitilesource.js | 42 ++-- src/iiiftilesource.js | 9 +- src/mousetracker.js | 104 ++++---- src/openseadragon.js | 80 +++--- src/osmtilesource.js | 2 +- src/referencestrip.js | 91 ++++--- src/strings.js | 2 +- src/tilesource.js | 3 +- src/tilesourcecollection.js | 4 +- src/viewer.js | 7 +- www/ui-zoom-and-pan.html | 20 +- 16 files changed, 581 insertions(+), 466 deletions(-) create mode 100644 grunt.js create mode 100644 package.json 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: