2013-07-18 00:50:04 +08:00
/ *
Leaflet , a JavaScript library for mobile - friendly interactive maps . http : //leafletjs.com
( c ) 2010 - 2013 , Vladimir Agafonkin
( c ) 2010 - 2011 , CloudMade
* /
2015-09-02 16:24:15 +08:00
! function ( t , e , i ) { var n = t . L , o = { } ; o . version = "0.7.5" , "object" == typeof module && "object" == typeof module . exports ? module . exports = o : "function" == typeof define && define . amd && define ( o ) , o . noConflict = function ( ) { return t . L = n , this } , t . L = o , o . Util = { extend : function ( t ) { var e , i , n , o , s = Array . prototype . slice . call ( arguments , 1 ) ; for ( i = 0 , n = s . length ; n > i ; i ++ ) { o = s [ i ] || { } ; for ( e in o ) o . hasOwnProperty ( e ) && ( t [ e ] = o [ e ] ) } return t } , bind : function ( t , e ) { var i = arguments . length > 2 ? Array . prototype . slice . call ( arguments , 2 ) : null ; return function ( ) { return t . apply ( e , i || arguments ) } } , stamp : function ( ) { var t = 0 , e = "_leaflet_id" ; return function ( i ) { return i [ e ] = i [ e ] || ++ t , i [ e ] } } ( ) , invokeEach : function ( t , e , i ) { var n , o ; if ( "object" == typeof t ) { o = Array . prototype . slice . call ( arguments , 3 ) ; for ( n in t ) e . apply ( i , [ n , t [ n ] ] . concat ( o ) ) ; return ! 0 } return ! 1 } , limitExecByInterval : function ( t , e , i ) { var n , o ; return function s ( ) { var a = arguments ; return n ? void ( o = ! 0 ) : ( n = ! 0 , setTimeout ( function ( ) { n = ! 1 , o && ( s . apply ( i , a ) , o = ! 1 ) } , e ) , void t . apply ( i , a ) ) } } , falseFn : function ( ) { return ! 1 } , formatNum : function ( t , e ) { var i = Math . pow ( 10 , e || 5 ) ; return Math . round ( t * i ) / i } , trim : function ( t ) { return t . trim ? t . trim ( ) : t . replace ( /^\s+|\s+$/g , "" ) } , splitWords : function ( t ) { return o . Util . trim ( t ) . split ( /\s+/ ) } , setOptions : function ( t , e ) { return t . options = o . extend ( { } , t . options , e ) , t . options } , getParamString : function ( t , e , i ) { var n = [ ] ; for ( var o in t ) n . push ( encodeURIComponent ( i ? o . toUpperCase ( ) : o ) + "=" + encodeURIComponent ( t [ o ] ) ) ; return ( e && - 1 !== e . indexOf ( "?" ) ? "&" : "?" ) + n . join ( "&" ) } , template : function ( t , e ) { return t . replace ( /\{ *([\w_]+) *\}/g , function ( t , n ) { var o = e [ n ] ; if ( o === i ) throw new Error ( "No value provided for variable " + t ) ; return "function" == typeof o && ( o = o ( e ) ) , o } ) } , isArray : Array . isArray || function ( t ) { return "[object Array]" === Object . prototype . toString . call ( t ) } , emptyImageUrl : "data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" } , function ( ) { function e ( e ) { var i , n , o = [ "webkit" , "moz" , "o" , "ms" ] ; for ( i = 0 ; i < o . length && ! n ; i ++ ) n = t [ o [ i ] + e ] ; return n } function i ( e ) { var i = + new Date , o = Math . max ( 0 , 16 - ( i - n ) ) ; return n = i + o , t . setTimeout ( e , o ) } var n = 0 , s = t . requestAnimationFrame || e ( "RequestAnimationFrame" ) || i , a = t . cancelAnimationFrame || e ( "CancelAnimationFrame" ) || e ( "CancelRequestAnimationFrame" ) || function ( e ) { t . clearTimeout ( e ) } ; o . Util . requestAnimFrame = function ( e , n , a , r ) { return e = o . bind ( e , n ) , a && s === i ? void e ( ) : s . call ( t , e , r ) } , o . Util . cancelAnimFrame = function ( e ) { e && a . call ( t , e ) } } ( ) , o . extend = o . Util . extend , o . bind = o . Util . bind , o . stamp = o . Util . stamp , o . setOptions = o . Util . setOptions , o . Class = function ( ) { } , o . Class . extend = function ( t ) { var e = function ( ) { this . initialize && this . initialize . apply ( this , arguments ) , this . _initHooks && this . callInitHooks ( ) } , i = function ( ) { } ; i . prototype = this . prototype ; var n = new i ; n . constructor = e , e . prototype = n ; for ( var s in this ) this . hasOwnProperty ( s ) && "prototype" !== s && ( e [ s ] = this [ s ] ) ; t . statics && ( o . extend ( e , t . statics ) , delete t . statics ) , t . includes && ( o . Util . extend . apply ( null , [ n ] . concat ( t . includes ) ) , delete t . includes ) , t . options && n . options && ( t . options = o . extend ( { } , n . options , t . options ) ) , o . extend ( n , t ) , n . _initHooks = [ ] ; var a = this ; return e . _ _super _ _ = a . prototype , n . callInitHooks = function ( ) { if ( ! this . _initHooksCalled ) { a . prototype . callInitHooks && a . prototype . callInitHooks . call ( this ) , this . _initHooksCalled = ! 0 ; for ( var t = 0 , e = n . _initHooks . length ; e > t ; t ++ ) n . _initHooks [ t ] . call ( this ) } } , e } , o . Class . include = function ( t ) { o . extend ( this . prototype , t ) } , o . Class . mergeOptions = function ( t ) { o . extend ( this . prototype . options , t ) } , o . Class . addInitHook = function ( t ) { var e = Array . prototype . slice . call ( arguments , 1 ) , i = "function" == typeof t ? t : function ( ) { this [ t ] . apply ( this , e ) } ; this . prototype . _initHooks = this . prototype . _initHooks || [ ] , this . prototype . _initHooks . push ( i ) } ; var s = "_leaflet_events" ; o . Mixin = { } , o . Mixin . Events = { addEventListener : function ( t , e , i ) { if ( o . Util . invokeEach ( t , this . addEventListener , this , e , i ) ) return this ; var n , a , r , h , l , u , c , d = this [ s ] = this [ s ] || { } , p = i && i !== this && o . stamp ( i ) ; for ( t = o . Util . splitWords ( t ) , n = 0 , a = t . length ; a > n ; n ++ ) r = { action : e , context : i || this } , h = t [ n ] , p ? ( l = h + "_idx" , u = l + "_len" , c = d [ l ] = d [ l ] || { } , c [ p ] || ( c [ p ] = [ ] , d [ u ] = ( d [ u ] || 0 ) + 1 ) , c [ p ] . push ( r ) ) : ( d [ h ] = d [ h ] || [ ] , d [ h ] . push ( r ) ) ; return this } , hasEventListeners : function ( t ) { var e = this [ s ] ; return ! ! e && ( t in e &
projection : o . Projection . Mercator , transformation : function ( ) { var t = o . Projection . Mercator , e = t . R _MAJOR , i = . 5 / ( Math . PI * e ) ; return new o . Transformation ( i , . 5 , - i , . 5 ) } ( ) } ) , o . TileLayer = o . Class . extend ( { includes : o . Mixin . Events , options : { minZoom : 0 , maxZoom : 18 , tileSize : 256 , subdomains : "abc" , errorTileUrl : "" , attribution : "" , zoomOffset : 0 , opacity : 1 , unloadInvisibleTiles : o . Browser . mobile , updateWhenIdle : o . Browser . mobile } , initialize : function ( t , e ) { e = o . setOptions ( this , e ) , e . detectRetina && o . Browser . retina && e . maxZoom > 0 && ( e . tileSize = Math . floor ( e . tileSize / 2 ) , e . zoomOffset ++ , e . minZoom > 0 && e . minZoom -- , this . options . maxZoom -- ) , e . bounds && ( e . bounds = o . latLngBounds ( e . bounds ) ) , this . _url = t ; var i = this . options . subdomains ; "string" == typeof i && ( this . options . subdomains = i . split ( "" ) ) } , onAdd : function ( t ) { this . _map = t , this . _animated = t . _zoomAnimated , this . _initContainer ( ) , t . on ( { viewreset : this . _reset , moveend : this . _update } , this ) , this . _animated && t . on ( { zoomanim : this . _animateZoom , zoomend : this . _endZoomAnim } , this ) , this . options . updateWhenIdle || ( this . _limitedUpdate = o . Util . limitExecByInterval ( this . _update , 150 , this ) , t . on ( "move" , this . _limitedUpdate , this ) ) , this . _reset ( ) , this . _update ( ) } , addTo : function ( t ) { return t . addLayer ( this ) , this } , onRemove : function ( t ) { this . _container . parentNode . removeChild ( this . _container ) , t . off ( { viewreset : this . _reset , moveend : this . _update } , this ) , this . _animated && t . off ( { zoomanim : this . _animateZoom , zoomend : this . _endZoomAnim } , this ) , this . options . updateWhenIdle || t . off ( "move" , this . _limitedUpdate , this ) , this . _container = null , this . _map = null } , bringToFront : function ( ) { var t = this . _map . _panes . tilePane ; return this . _container && ( t . appendChild ( this . _container ) , this . _setAutoZIndex ( t , Math . max ) ) , this } , bringToBack : function ( ) { var t = this . _map . _panes . tilePane ; return this . _container && ( t . insertBefore ( this . _container , t . firstChild ) , this . _setAutoZIndex ( t , Math . min ) ) , this } , getAttribution : function ( ) { return this . options . attribution } , getContainer : function ( ) { return this . _container } , setOpacity : function ( t ) { return this . options . opacity = t , this . _map && this . _updateOpacity ( ) , this } , setZIndex : function ( t ) { return this . options . zIndex = t , this . _updateZIndex ( ) , this } , setUrl : function ( t , e ) { return this . _url = t , e || this . redraw ( ) , this } , redraw : function ( ) { return this . _map && ( this . _reset ( { hard : ! 0 } ) , this . _update ( ) ) , this } , _updateZIndex : function ( ) { this . _container && this . options . zIndex !== i && ( this . _container . style . zIndex = this . options . zIndex ) } , _setAutoZIndex : function ( t , e ) { var i , n , o , s = t . children , a = - e ( 1 / 0 , - ( 1 / 0 ) ) ; for ( n = 0 , o = s . length ; o > n ; n ++ ) s [ n ] !== this . _container && ( i = parseInt ( s [ n ] . style . zIndex , 10 ) , isNaN ( i ) || ( a = e ( a , i ) ) ) ; this . options . zIndex = this . _container . style . zIndex = ( isFinite ( a ) ? a : 0 ) + e ( 1 , - 1 ) } , _updateOpacity : function ( ) { var t , e = this . _tiles ; if ( o . Browser . ielt9 ) for ( t in e ) o . DomUtil . setOpacity ( e [ t ] , this . options . opacity ) ; else o . DomUtil . setOpacity ( this . _container , this . options . opacity ) } , _initContainer : function ( ) { var t = this . _map . _panes . tilePane ; if ( ! this . _container ) { if ( this . _container = o . DomUtil . create ( "div" , "leaflet-layer" ) , this . _updateZIndex ( ) , this . _animated ) { var e = "leaflet-tile-container" ; this . _bgBuffer = o . DomUtil . create ( "div" , e , this . _container ) , this . _tileContainer = o . DomUtil . create ( "div" , e , this . _container ) } else this . _tileContainer = this . _container ; t . appendChild ( this . _container ) , this . options . opacity < 1 && this . _updateOpacity ( ) } } , _reset : function ( t ) { for ( var e in this . _tiles ) this . fire ( "tileunload" , { tile : this . _tiles [ e ] } ) ; this . _tiles = { } , this . _tilesToLoad = 0 , this . options . reuseTiles && ( this . _unusedTiles = [ ] ) , this . _tileContainer . innerHTML = "" , this . _animated && t && t . hard && this . _clearBgBuffer ( ) , this . _initContainer ( ) } , _getTileSize : function ( ) { var t = this . _map , e = t . getZoom ( ) + this . options . zoomOffset , i = this . options . maxNativeZoom , n = this . options . tileSize ; return i && e > i && ( n = Math . round ( t . getZoomScale ( e ) / t . getZoomScale ( i ) * n ) ) , n } , _update : function ( ) { if ( this . _map ) { var t = this . _map , e = t . getPixelBounds ( ) , i = t . getZoom ( ) , n = this . _getTileSize ( ) ; if ( ! ( i > this . options . maxZoom || i < this . options . minZoom ) ) { var s = o . bounds ( e . min . divideBy ( n ) . _floor ( ) , e . max . divideBy ( n ) . _floor ( ) ) ; this . _addTilesFromCenterOut ( s ) , ( this . options . unloadInvisibleTiles || this . options . reuseTiles ) && this . _removeOtherTiles ( s ) } } } , _addTilesFromCenter
2015-09-01 18:50:05 +08:00
this . on ( { zoomanim : this . _animatePathZoom , zoomend : this . _endPathZoom } ) ) : o . DomUtil . addClass ( this . _pathRoot , "leaflet-zoom-hide" ) , this . on ( "moveend" , this . _updateSvgViewport ) , this . _updateSvgViewport ( ) ) } , _animatePathZoom : function ( t ) { var e = this . getZoomScale ( t . zoom ) , i = this . _getCenterOffset ( t . center ) . _multiplyBy ( - e ) . _add ( this . _pathViewport . min ) ; this . _pathRoot . style [ o . DomUtil . TRANSFORM ] = o . DomUtil . getTranslateString ( i ) + " scale(" + e + ") " , this . _pathZooming = ! 0 } , _endPathZoom : function ( ) { this . _pathZooming = ! 1 } , _updateSvgViewport : function ( ) { if ( ! this . _pathZooming ) { this . _updatePathViewport ( ) ; var t = this . _pathViewport , e = t . min , i = t . max , n = i . x - e . x , s = i . y - e . y , a = this . _pathRoot , r = this . _panes . overlayPane ; o . Browser . mobileWebkit && r . removeChild ( a ) , o . DomUtil . setPosition ( a , e ) , a . setAttribute ( "width" , n ) , a . setAttribute ( "height" , s ) , a . setAttribute ( "viewBox" , [ e . x , e . y , n , s ] . join ( " " ) ) , o . Browser . mobileWebkit && r . appendChild ( a ) } } } ) , o . Path . include ( { bindPopup : function ( t , e ) { return t instanceof o . Popup ? this . _popup = t : ( ( ! this . _popup || e ) && ( this . _popup = new o . Popup ( e , this ) ) , this . _popup . setContent ( t ) ) , this . _popupHandlersAdded || ( this . on ( "click" , this . _openPopup , this ) . on ( "remove" , this . closePopup , this ) , this . _popupHandlersAdded = ! 0 ) , this } , unbindPopup : function ( ) { return this . _popup && ( this . _popup = null , this . off ( "click" , this . _openPopup ) . off ( "remove" , this . closePopup ) , this . _popupHandlersAdded = ! 1 ) , this } , openPopup : function ( t ) { return this . _popup && ( t = t || this . _latlng || this . _latlngs [ Math . floor ( this . _latlngs . length / 2 ) ] , this . _openPopup ( { latlng : t } ) ) , this } , closePopup : function ( ) { return this . _popup && this . _popup . _close ( ) , this } , _openPopup : function ( t ) { this . _popup . setLatLng ( t . latlng ) , this . _map . openPopup ( this . _popup ) } } ) , o . Browser . vml = ! o . Browser . svg && function ( ) { try { var t = e . createElement ( "div" ) ; t . innerHTML = '<v:shape adj="1"/>' ; var i = t . firstChild ; return i . style . behavior = "url(#default#VML)" , i && "object" == typeof i . adj } catch ( n ) { return ! 1 } } ( ) , o . Path = o . Browser . svg || ! o . Browser . vml ? o . Path : o . Path . extend ( { statics : { VML : ! 0 , CLIP _PADDING : . 02 } , _createElement : function ( ) { try { return e . namespaces . add ( "lvml" , "urn:schemas-microsoft-com:vml" ) , function ( t ) { return e . createElement ( "<lvml:" + t + ' class="lvml">' ) } } catch ( t ) { return function ( t ) { return e . createElement ( "<" + t + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">' ) } } } ( ) , _initPath : function ( ) { var t = this . _container = this . _createElement ( "shape" ) ; o . DomUtil . addClass ( t , "leaflet-vml-shape" + ( this . options . className ? " " + this . options . className : "" ) ) , this . options . clickable && o . DomUtil . addClass ( t , "leaflet-clickable" ) , t . coordsize = "1 1" , this . _path = this . _createElement ( "path" ) , t . appendChild ( this . _path ) , this . _map . _pathRoot . appendChild ( t ) } , _initStyle : function ( ) { this . _updateStyle ( ) } , _updateStyle : function ( ) { var t = this . _stroke , e = this . _fill , i = this . options , n = this . _container ; n . stroked = i . stroke , n . filled = i . fill , i . stroke ? ( t || ( t = this . _stroke = this . _createElement ( "stroke" ) , t . endcap = "round" , n . appendChild ( t ) ) , t . weight = i . weight + "px" , t . color = i . color , t . opacity = i . opacity , i . dashArray ? t . dashStyle = o . Util . isArray ( i . dashArray ) ? i . dashArray . join ( " " ) : i . dashArray . replace ( /( *, *)/g , " " ) : t . dashStyle = "" , i . lineCap && ( t . endcap = i . lineCap . replace ( "butt" , "flat" ) ) , i . lineJoin && ( t . joinstyle = i . lineJoin ) ) : t && ( n . removeChild ( t ) , this . _stroke = null ) , i . fill ? ( e || ( e = this . _fill = this . _createElement ( "fill" ) , n . appendChild ( e ) ) , e . color = i . fillColor || i . color , e . opacity = i . fillOpacity ) : e && ( n . removeChild ( e ) , this . _fill = null ) } , _updatePath : function ( ) { var t = this . _container . style ; t . display = "none" , this . _path . v = this . getPathString ( ) + " " , t . display = "" } } ) , o . Map . include ( o . Browser . svg || ! o . Browser . vml ? { } : { _initPathRoot : function ( ) { if ( ! this . _pathRoot ) { var t = this . _pathRoot = e . createElement ( "div" ) ; t . className = "leaflet-vml-container" , this . _panes . overlayPane . appendChild ( t ) , this . on ( "moveend" , this . _updatePathViewport ) , this . _updatePathViewport ( ) } } } ) , o . Browser . canvas = function ( ) { return ! ! e . createElement ( "canvas" ) . getContext } ( ) , o . Path = o . Path . SVG && ! t . L _PREFER _CANVAS || ! o . Browser . canvas ? o . Path : o . Path . extend ( { statics : { CANVAS : ! 0 , SVG : ! 1 } , redraw : function ( ) { return this . _map && ( this . projectLatlngs ( ) , this . _requestUpdate ( ) ) , this } , setStyle : function ( t ) { return o . setOptions ( this , t ) , this . _map && ( this . _updateS
case "touchend" : return this . addPointerListenerEnd ( t , e , i , n ) ; case "touchmove" : return this . addPointerListenerMove ( t , e , i , n ) ; default : throw "Unknown touch event type" } } , addPointerListenerStart : function ( t , i , n , s ) { var a = "_leaflet_" , r = this . _pointers , h = function ( t ) { o . DomEvent . preventDefault ( t ) ; for ( var e = ! 1 , i = 0 ; i < r . length ; i ++ ) if ( r [ i ] . pointerId === t . pointerId ) { e = ! 0 ; break } e || r . push ( t ) , t . touches = r . slice ( ) , t . changedTouches = [ t ] , n ( t ) } ; if ( t [ a + "touchstart" + s ] = h , t . addEventListener ( this . POINTER _DOWN , h , ! 1 ) , ! this . _pointerDocumentListener ) { var l = function ( t ) { for ( var e = 0 ; e < r . length ; e ++ ) if ( r [ e ] . pointerId === t . pointerId ) { r . splice ( e , 1 ) ; break } } ; e . documentElement . addEventListener ( this . POINTER _UP , l , ! 1 ) , e . documentElement . addEventListener ( this . POINTER _CANCEL , l , ! 1 ) , this . _pointerDocumentListener = ! 0 } return this } , addPointerListenerMove : function ( t , e , i , n ) { function o ( t ) { if ( t . pointerType !== t . MSPOINTER _TYPE _MOUSE && "mouse" !== t . pointerType || 0 !== t . buttons ) { for ( var e = 0 ; e < a . length ; e ++ ) if ( a [ e ] . pointerId === t . pointerId ) { a [ e ] = t ; break } t . touches = a . slice ( ) , t . changedTouches = [ t ] , i ( t ) } } var s = "_leaflet_" , a = this . _pointers ; return t [ s + "touchmove" + n ] = o , t . addEventListener ( this . POINTER _MOVE , o , ! 1 ) , this } , addPointerListenerEnd : function ( t , e , i , n ) { var o = "_leaflet_" , s = this . _pointers , a = function ( t ) { for ( var e = 0 ; e < s . length ; e ++ ) if ( s [ e ] . pointerId === t . pointerId ) { s . splice ( e , 1 ) ; break } t . touches = s . slice ( ) , t . changedTouches = [ t ] , i ( t ) } ; return t [ o + "touchend" + n ] = a , t . addEventListener ( this . POINTER _UP , a , ! 1 ) , t . addEventListener ( this . POINTER _CANCEL , a , ! 1 ) , this } , removePointerListener : function ( t , e , i ) { var n = "_leaflet_" , o = t [ n + e + i ] ; switch ( e ) { case "touchstart" : t . removeEventListener ( this . POINTER _DOWN , o , ! 1 ) ; break ; case "touchmove" : t . removeEventListener ( this . POINTER _MOVE , o , ! 1 ) ; break ; case "touchend" : t . removeEventListener ( this . POINTER _UP , o , ! 1 ) , t . removeEventListener ( this . POINTER _CANCEL , o , ! 1 ) } return this } } ) , o . Map . mergeOptions ( { touchZoom : o . Browser . touch && ! o . Browser . android23 , bounceAtZoomLimits : ! 0 } ) , o . Map . TouchZoom = o . Handler . extend ( { addHooks : function ( ) { o . DomEvent . on ( this . _map . _container , "touchstart" , this . _onTouchStart , this ) } , removeHooks : function ( ) { o . DomEvent . off ( this . _map . _container , "touchstart" , this . _onTouchStart , this ) } , _onTouchStart : function ( t ) { var i = this . _map ; if ( t . touches && 2 === t . touches . length && ! i . _animatingZoom && ! this . _zooming ) { var n = i . mouseEventToLayerPoint ( t . touches [ 0 ] ) , s = i . mouseEventToLayerPoint ( t . touches [ 1 ] ) , a = i . _getCenterLayerPoint ( ) ; this . _startCenter = n . add ( s ) . _divideBy ( 2 ) , this . _startDist = n . distanceTo ( s ) , this . _moved = ! 1 , this . _zooming = ! 0 , this . _centerOffset = a . subtract ( this . _startCenter ) , i . _panAnim && i . _panAnim . stop ( ) , o . DomEvent . on ( e , "touchmove" , this . _onTouchMove , this ) . on ( e , "touchend" , this . _onTouchEnd , this ) , o . DomEvent . preventDefault ( t ) } } , _onTouchMove : function ( t ) { var e = this . _map ; if ( t . touches && 2 === t . touches . length && this . _zooming ) { var i = e . mouseEventToLayerPoint ( t . touches [ 0 ] ) , n = e . mouseEventToLayerPoint ( t . touches [ 1 ] ) ; this . _scale = i . distanceTo ( n ) / this . _startDist , this . _delta = i . _add ( n ) . _divideBy ( 2 ) . _subtract ( this . _startCenter ) , 1 !== this . _scale && ( e . options . bounceAtZoomLimits || ! ( e . getZoom ( ) === e . getMinZoom ( ) && this . _scale < 1 || e . getZoom ( ) === e . getMaxZoom ( ) && this . _scale > 1 ) ) && ( this . _moved || ( o . DomUtil . addClass ( e . _mapPane , "leaflet-touching" ) , e . fire ( "movestart" ) . fire ( "zoomstart" ) , this . _moved = ! 0 ) , o . Util . cancelAnimFrame ( this . _animRequest ) , this . _animRequest = o . Util . requestAnimFrame ( this . _updateOnMove , this , ! 0 , this . _map . _container ) , o . DomEvent . preventDefault ( t ) ) } } , _updateOnMove : function ( ) { var t = this . _map , e = this . _getScaleOrigin ( ) , i = t . layerPointToLatLng ( e ) , n = t . getScaleZoom ( this . _scale ) ; t . _animateZoom ( i , n , this . _startCenter , this . _scale , this . _delta , ! 1 , ! 0 ) } , _onTouchEnd : function ( ) { if ( ! this . _moved || ! this . _zooming ) return void ( this . _zooming = ! 1 ) ; var t = this . _map ; this . _zooming = ! 1 , o . DomUtil . removeClass ( t . _mapPane , "leaflet-touching" ) , o . Util . cancelAnimFrame ( this . _animRequest ) , o . DomEvent . off ( e , "touchmove" , this . _onTouchMove ) . off ( e , "touchend" , this . _onTouchEnd ) ; var i = this . _getScaleOrigin ( ) , n = t . layerPointToLatLng ( i ) , s = t . getZoom ( ) , a = t . getScaleZoom ( this . _scale ) - s , r = a > 0 ? Math . ceil ( a ) : Math . floor ( a ) , h = t . _limitZoom ( s + r ) , l = t . getZoomScale ( h ) / this . _scale ; t . _animateZoom ( n , h , i , l ) } , _getScaleOrigin