2010-09-23 20:56:29 +08:00
/ *
2012-12-18 01:15:51 +08:00
Leaflet , a JavaScript library for mobile - friendly interactive maps . http : //leafletjs.com
2013-01-15 18:16:15 +08:00
( c ) 2010 - 2013 , Vladimir Agafonkin , CloudMade
2010-09-23 20:56:29 +08:00
* /
2013-02-14 19:42:52 +08:00
( function ( t , e , i ) { var n , o ; typeof exports != i + "" ? n = exports : ( o = t . L , n = { } , n . noConflict = function ( ) { return t . L = o , this } , t . L = n ) , n . version = "0.5.1" , n . 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 ] } } ( ) , limitExecByInterval : function ( t , e , n ) { var o , s ; return function a ( ) { var r = arguments ; return o ? ( s = ! 0 , i ) : ( o = ! 0 , setTimeout ( function ( ) { o = ! 1 , s && ( a . apply ( n , r ) , s = ! 1 ) } , e ) , t . apply ( n , r ) , i ) } } , falseFn : function ( ) { return ! 1 } , formatNum : function ( t , e ) { var i = Math . pow ( 10 , e || 5 ) ; return Math . round ( t * i ) / i } , splitWords : function ( t ) { return t . replace ( /^\s+|\s+$/g , "" ) . split ( /\s+/ ) } , setOptions : function ( t , e ) { return t . options = n . extend ( { } , t . options , e ) , t . options } , getParamString : function ( t , e ) { var i = [ ] ; for ( var n in t ) t . hasOwnProperty ( n ) && i . push ( n + "=" + t [ n ] ) ; return ( e && - 1 !== e . indexOf ( "?" ) ? "&" : "?" ) + i . join ( "&" ) } , template : function ( t , e ) { return t . replace ( /\{ *([\w_]+) *\}/g , function ( t , i ) { var n = e [ i ] ; if ( ! e . hasOwnProperty ( i ) ) throw Error ( "No value provided for variable " + t ) ; return n } ) } , 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 ; o . length > i && ! n ; i ++ ) n = t [ o [ i ] + e ] ; return n } function o ( e ) { var i = + new Date , n = Math . max ( 0 , 16 - ( i - s ) ) ; return s = i + n , t . setTimeout ( e , n ) } var s = 0 , a = t . requestAnimationFrame || e ( "RequestAnimationFrame" ) || o , r = t . cancelAnimationFrame || e ( "CancelAnimationFrame" ) || e ( "CancelRequestAnimationFrame" ) || function ( e ) { t . clearTimeout ( e ) } ; n . Util . requestAnimFrame = function ( e , s , r , h ) { return e = n . bind ( e , s ) , r && a === o ? ( e ( ) , i ) : a . call ( t , e , h ) } , n . Util . cancelAnimFrame = function ( e ) { e && r . call ( t , e ) } } ( ) , n . extend = n . Util . extend , n . bind = n . Util . bind , n . stamp = n . Util . stamp , n . setOptions = n . Util . setOptions , n . Class = function ( ) { } , n . 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 o = new i ; o . constructor = e , e . prototype = o ; for ( var s in this ) this . hasOwnProperty ( s ) && "prototype" !== s && ( e [ s ] = this [ s ] ) ; t . statics && ( n . extend ( e , t . statics ) , delete t . statics ) , t . includes && ( n . Util . extend . apply ( null , [ o ] . concat ( t . includes ) ) , delete t . includes ) , t . options && o . options && ( t . options = n . extend ( { } , o . options , t . options ) ) , n . extend ( o , t ) , o . _initHooks = [ ] ; var a = this ; return o . callInitHooks = function ( ) { if ( ! this . _initHooksCalled ) { a . prototype . callInitHooks && a . prototype . callInitHooks . call ( this ) , this . _initHooksCalled = ! 0 ; for ( var t = 0 , e = o . _initHooks . length ; e > t ; t ++ ) o . _initHooks [ t ] . call ( this ) } } , e } , n . Class . include = function ( t ) { n . extend ( this . prototype , t ) } , n . Class . mergeOptions = function ( t ) { n . extend ( this . prototype . options , t ) } , n . 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" ; n . Mixin = { } , n . Mixin . Events = { addEventListener : function ( t , e , i ) { var o , a , r , h = this [ s ] = this [ s ] || { } ; if ( "object" == typeof t ) { for ( o in t ) t . hasOwnProperty ( o ) && this . addEventListener ( o , t [ o ] , e ) ; return this } for ( t = n . Util . splitWords ( t ) , a = 0 , r = t . length ; r > a ; a ++ ) h [ t [ a ] ] = h [ t [ a ] ] || [ ] , h [ t [ a ] ] . push ( { action : e , context : i || this } ) ; return this } , hasEventListeners : function ( t ) { return s in this && t in this [ s ] && this [ s ] [ t ] . length > 0 } , removeEventListener : function ( t , e , i ) { var o , a , r , h , l , u = this [ s ] ; if ( "object" == typeof t ) { for ( o in t ) t . hasOwnProperty ( o ) && this . removeEventListener ( o , t [ o ] , e ) ; return this } for ( t = n . Util . splitWords ( t ) , a = 0 , r = t . length ; r > a ; a ++ ) if ( this . hasEventListeners ( t [ a ] ) ) for ( h = u [ t [ a ] ] , l = h . length - 1 ; l >= 0 ; l -- ) e && h [ l ] . action !== e || i && h [ l ] . context !== i || h . splice ( l , 1 ) ; return this } , fireEvent : function ( t , e ) { if ( ! this . hasEventListeners ( t ) ) return this ; for ( var i = n . extend ( { type : t , target : this } , e ) , o = this [ s ] [ t ] . slice ( ) , a
} , _getZoomForUrl : function ( ) { var t = this . options , e = this . _map . getZoom ( ) ; return t . zoomReverse && ( e = t . maxZoom - e ) , e + t . zoomOffset } , _getTilePos : function ( t ) { var e = this . _map . getPixelOrigin ( ) , i = this . options . tileSize ; return t . multiplyBy ( i ) . subtract ( e ) } , getTileUrl : function ( t ) { return this . _adjustTilePoint ( t ) , n . Util . template ( this . _url , n . extend ( { s : this . _getSubdomain ( t ) , z : this . _getZoomForUrl ( ) , x : t . x , y : t . y } , this . options ) ) } , _getWrapTileNum : function ( ) { return Math . pow ( 2 , this . _getZoomForUrl ( ) ) } , _adjustTilePoint : function ( t ) { var e = this . _getWrapTileNum ( ) ; this . options . continuousWorld || this . options . noWrap || ( t . x = ( t . x % e + e ) % e ) , this . options . tms && ( t . y = e - t . y - 1 ) } , _getSubdomain : function ( t ) { var e = ( t . x + t . y ) % this . options . subdomains . length ; return this . options . subdomains [ e ] } , _createTileProto : function ( ) { var t = this . _tileImg = n . DomUtil . create ( "img" , "leaflet-tile" ) ; t . style . width = t . style . height = this . options . tileSize + "px" , t . galleryimg = "no" } , _getTile : function ( ) { if ( this . options . reuseTiles && this . _unusedTiles . length > 0 ) { var t = this . _unusedTiles . pop ( ) ; return this . _resetTile ( t ) , t } return this . _createTile ( ) } , _resetTile : function ( ) { } , _createTile : function ( ) { var t = this . _tileImg . cloneNode ( ! 1 ) ; return t . onselectstart = t . onmousemove = n . Util . falseFn , ( n . Browser . ie7 || n . Browser . ie8 ) && this . options . opacity !== i && n . DomUtil . setOpacity ( t , this . options . opacity ) , t } , _loadTile : function ( t , e ) { t . _layer = this , t . onload = this . _tileOnLoad , t . onerror = this . _tileOnError , t . src = this . getTileUrl ( e ) } , _tileLoaded : function ( ) { this . _tilesToLoad -- , this . _tilesToLoad || this . fire ( "load" ) } , _tileOnLoad : function ( ) { var t = this . _layer ; this . src !== n . Util . emptyImageUrl && ( n . DomUtil . addClass ( this , "leaflet-tile-loaded" ) , t . fire ( "tileload" , { tile : this , url : this . src } ) ) , t . _tileLoaded ( ) } , _tileOnError : function ( ) { var t = this . _layer ; t . fire ( "tileerror" , { tile : this , url : this . src } ) ; var e = t . options . errorTileUrl ; e && ( this . src = e ) , t . _tileLoaded ( ) } } ) , n . tileLayer = function ( t , e ) { return new n . TileLayer ( t , e ) } , n . TileLayer . WMS = n . TileLayer . extend ( { defaultWmsParams : { service : "WMS" , request : "GetMap" , version : "1.1.1" , layers : "" , styles : "" , format : "image/jpeg" , transparent : ! 1 } , initialize : function ( t , e ) { this . _url = t ; var i = n . extend ( { } , this . defaultWmsParams ) ; i . width = i . height = e . detectRetina && n . Browser . retina ? 2 * this . options . tileSize : this . options . tileSize ; for ( var o in e ) this . options . hasOwnProperty ( o ) || ( i [ o ] = e [ o ] ) ; this . wmsParams = i , n . setOptions ( this , e ) } , onAdd : function ( t ) { var e = parseFloat ( this . wmsParams . version ) >= 1.3 ? "crs" : "srs" ; this . wmsParams [ e ] = t . options . crs . code , n . TileLayer . prototype . onAdd . call ( this , t ) } , getTileUrl : function ( t , e ) { this . _adjustTilePoint ( t ) ; var i = this . _map , o = i . options . crs , s = this . options . tileSize , a = t . multiplyBy ( s ) , r = a . add ( new n . Point ( s , s ) ) , h = o . project ( i . unproject ( a , e ) ) , l = o . project ( i . unproject ( r , e ) ) , u = [ h . x , l . y , l . x , h . y ] . join ( "," ) , c = n . Util . template ( this . _url , { s : this . _getSubdomain ( t ) } ) ; return c + n . Util . getParamString ( this . wmsParams , c ) + "&bbox=" + u } , setParams : function ( t , e ) { return n . extend ( this . wmsParams , t ) , e || this . redraw ( ) , this } } ) , n . tileLayer . wms = function ( t , e ) { return new n . TileLayer . WMS ( t , e ) } , n . TileLayer . Canvas = n . TileLayer . extend ( { options : { async : ! 1 } , initialize : function ( t ) { n . setOptions ( this , t ) } , redraw : function ( ) { var t = this . _tiles ; for ( var e in t ) t . hasOwnProperty ( e ) && this . _redrawTile ( t [ e ] ) } , _redrawTile : function ( t ) { this . drawTile ( t , t . _tilePoint , this . _map . _zoom ) } , _createTileProto : function ( ) { var t = this . _canvasProto = n . DomUtil . create ( "canvas" , "leaflet-tile" ) ; t . width = t . height = this . options . tileSize } , _createTile : function ( ) { var t = this . _canvasProto . cloneNode ( ! 1 ) ; return t . onselectstart = t . onmousemove = n . Util . falseFn , t } , _loadTile : function ( t , e ) { t . _layer = this , t . _tilePoint = e , this . _redrawTile ( t ) , this . options . async || this . tileDrawn ( t ) } , drawTile : function ( ) { } , tileDrawn : function ( t ) { this . _tileOnLoad . call ( t ) } } ) , n . tileLayer . canvas = function ( t ) { return new n . TileLayer . Canvas ( t ) } , n . ImageOverlay = n . Class . extend ( { includes : n . Mixin . Events , options : { opacity : 1 } , initialize : function ( t , e , i ) { this . _url = t , this . _bounds = n . latLngBounds ( e ) , n . setOptions ( this , i ) } , onAdd : function ( t ) { this . _map = t , this . _image || this . _initImage ( ) , t . _panes . overlayPane . appendChild ( this . _image ) , t . on ( "viewreset" , this . _reset , this ) , t . options . zoomAnimation && n . Browser .
return this . _convertLatLngs ( this . _latlngs ) , this . redraw ( ) , t } , closestLayerPoint : function ( t ) { for ( var e , i , o = 1 / 0 , s = this . _parts , a = null , r = 0 , h = s . length ; h > r ; r ++ ) for ( var l = s [ r ] , u = 1 , c = l . length ; c > u ; u ++ ) { e = l [ u - 1 ] , i = l [ u ] ; var _ = n . LineUtil . _sqClosestPointOnSegment ( t , e , i , ! 0 ) ; o > _ && ( o = _ , a = n . LineUtil . _sqClosestPointOnSegment ( t , e , i ) ) } return a && ( a . distance = Math . sqrt ( o ) ) , a } , getBounds : function ( ) { var t , e , i = new n . LatLngBounds , o = this . getLatLngs ( ) ; for ( t = 0 , e = o . length ; e > t ; t ++ ) i . extend ( o [ t ] ) ; return i } , _convertLatLngs : function ( t ) { var e , i ; for ( e = 0 , i = t . length ; i > e ; e ++ ) { if ( n . Util . isArray ( t [ e ] ) && "number" != typeof t [ e ] [ 0 ] ) return ; t [ e ] = n . latLng ( t [ e ] ) } return t } , _initEvents : function ( ) { n . Path . prototype . _initEvents . call ( this ) } , _getPathPartStr : function ( t ) { for ( var e , i = n . Path . VML , o = 0 , s = t . length , a = "" ; s > o ; o ++ ) e = t [ o ] , i && e . _round ( ) , a += ( o ? "L" : "M" ) + e . x + " " + e . y ; return a } , _clipPoints : function ( ) { var t , e , o , s = this . _originalPoints , a = s . length ; if ( this . options . noClip ) return this . _parts = [ s ] , i ; this . _parts = [ ] ; var r = this . _parts , h = this . _map . _pathViewport , l = n . LineUtil ; for ( t = 0 , e = 0 ; a - 1 > t ; t ++ ) o = l . clipSegment ( s [ t ] , s [ t + 1 ] , h , t ) , o && ( r [ e ] = r [ e ] || [ ] , r [ e ] . push ( o [ 0 ] ) , ( o [ 1 ] !== s [ t + 1 ] || t === a - 2 ) && ( r [ e ] . push ( o [ 1 ] ) , e ++ ) ) } , _simplifyPoints : function ( ) { for ( var t = this . _parts , e = n . LineUtil , i = 0 , o = t . length ; o > i ; i ++ ) t [ i ] = e . simplify ( t [ i ] , this . options . smoothFactor ) } , _updatePath : function ( ) { this . _map && ( this . _clipPoints ( ) , this . _simplifyPoints ( ) , n . Path . prototype . _updatePath . call ( this ) ) } } ) , n . polyline = function ( t , e ) { return new n . Polyline ( t , e ) } , n . PolyUtil = { } , n . PolyUtil . clipPolygon = function ( t , e ) { var i , o , s , a , r , h , l , u , c , _ = [ 1 , 4 , 2 , 8 ] , d = n . LineUtil ; for ( o = 0 , l = t . length ; l > o ; o ++ ) t [ o ] . _code = d . _getBitCode ( t [ o ] , e ) ; for ( a = 0 ; 4 > a ; a ++ ) { for ( u = _ [ a ] , i = [ ] , o = 0 , l = t . length , s = l - 1 ; l > o ; s = o ++ ) r = t [ o ] , h = t [ s ] , r . _code & u ? h . _code & u || ( c = d . _getEdgeIntersection ( h , r , u , e ) , c . _code = d . _getBitCode ( c , e ) , i . push ( c ) ) : ( h . _code & u && ( c = d . _getEdgeIntersection ( h , r , u , e ) , c . _code = d . _getBitCode ( c , e ) , i . push ( c ) ) , i . push ( r ) ) ; t = i } return t } , n . Polygon = n . Polyline . extend ( { options : { fill : ! 0 } , initialize : function ( t , e ) { n . Polyline . prototype . initialize . call ( this , t , e ) , t && n . Util . isArray ( t [ 0 ] ) && "number" != typeof t [ 0 ] [ 0 ] && ( this . _latlngs = this . _convertLatLngs ( t [ 0 ] ) , this . _holes = t . slice ( 1 ) ) } , projectLatlngs : function ( ) { if ( n . Polyline . prototype . projectLatlngs . call ( this ) , this . _holePoints = [ ] , this . _holes ) { var t , e , i , o ; for ( t = 0 , i = this . _holes . length ; i > t ; t ++ ) for ( this . _holePoints [ t ] = [ ] , e = 0 , o = this . _holes [ t ] . length ; o > e ; e ++ ) this . _holePoints [ t ] [ e ] = this . _map . latLngToLayerPoint ( this . _holes [ t ] [ e ] ) } } , _clipPoints : function ( ) { var t = this . _originalPoints , e = [ ] ; if ( this . _parts = [ t ] . concat ( this . _holePoints ) , ! this . options . noClip ) { for ( var i = 0 , o = this . _parts . length ; o > i ; i ++ ) { var s = n . PolyUtil . clipPolygon ( this . _parts [ i ] , this . _map . _pathViewport ) ; s . length && e . push ( s ) } this . _parts = e } } , _getPathPartStr : function ( t ) { var e = n . Polyline . prototype . _getPathPartStr . call ( this , t ) ; return e + ( n . Browser . svg ? "z" : "x" ) } } ) , n . polygon = function ( t , e ) { return new n . Polygon ( t , e ) } , function ( ) { function t ( t ) { return n . FeatureGroup . extend ( { initialize : function ( t , e ) { this . _layers = { } , this . _options = e , this . setLatLngs ( t ) } , setLatLngs : function ( e ) { var i = 0 , n = e . length ; for ( this . eachLayer ( function ( t ) { n > i ? t . setLatLngs ( e [ i ++ ] ) : this . removeLayer ( t ) } , this ) ; n > i ; ) this . addLayer ( new t ( e [ i ++ ] , this . _options ) ) ; return this } } ) } n . MultiPolyline = t ( n . Polyline ) , n . MultiPolygon = t ( n . Polygon ) , n . multiPolyline = function ( t , e ) { return new n . MultiPolyline ( t , e ) } , n . multiPolygon = function ( t , e ) { return new n . MultiPolygon ( t , e ) } } ( ) , n . Rectangle = n . Polygon . extend ( { initialize : function ( t , e ) { n . Polygon . prototype . initialize . call ( this , this . _boundsToLatLngs ( t ) , e ) } , setBounds : function ( t ) { this . setLatLngs ( this . _boundsToLatLngs ( t ) ) } , _boundsToLatLngs : function ( t ) { return t = n . latLngBounds ( t ) , [ t . getSouthWest ( ) , t . getNorthWest ( ) , t . getNorthEast ( ) , t . getSouthEast ( ) ] } } ) , n . rectangle = function ( t , e ) { return new n . Rectangle ( t , e ) } , n . Circle = n . Path . extend ( { initialize : function ( t , e , i ) { n . Path . prototype . initialize . call ( this , i ) , this . _latlng = n . latLng ( t ) , this . _mRadius = e } , options : { fill : ! 0 } , setLatLng : function ( t ) { return this . _latlng = n . latLng ( t ) , this . redraw ( ) } , setRadius : function ( t ) { return this . _mRadius = t , this . redraw ( ) } , projectLatlngs : function ( ) { var t = this . _getLngRadius ( ) , e = new n . La
} , getPosition : function ( ) { return this . options . position } , setPosition : function ( t ) { var e = this . _map ; return e && e . removeControl ( this ) , this . options . position = t , e && e . addControl ( this ) , this } , addTo : function ( t ) { this . _map = t ; var e = this . _container = this . onAdd ( t ) , i = this . getPosition ( ) , o = t . _controlCorners [ i ] ; return n . DomUtil . addClass ( e , "leaflet-control" ) , - 1 !== i . indexOf ( "bottom" ) ? o . insertBefore ( e , o . firstChild ) : o . appendChild ( e ) , this } , removeFrom : function ( t ) { var e = this . getPosition ( ) , i = t . _controlCorners [ e ] ; return i . removeChild ( this . _container ) , this . _map = null , this . onRemove && this . onRemove ( t ) , this } } ) , n . control = function ( t ) { return new n . Control ( t ) } , n . Map . include ( { addControl : function ( t ) { return t . addTo ( this ) , this } , removeControl : function ( t ) { return t . removeFrom ( this ) , this } , _initControlPos : function ( ) { function t ( t , s ) { var a = i + t + " " + i + s ; e [ t + s ] = n . DomUtil . create ( "div" , a , o ) } var e = this . _controlCorners = { } , i = "leaflet-" , o = this . _controlContainer = n . DomUtil . create ( "div" , i + "control-container" , this . _container ) ; t ( "top" , "left" ) , t ( "top" , "right" ) , t ( "bottom" , "left" ) , t ( "bottom" , "right" ) } } ) , n . Control . Zoom = n . Control . extend ( { options : { position : "topleft" } , onAdd : function ( t ) { var e = "leaflet-control-zoom" , i = "leaflet-bar" , o = i + "-part" , s = n . DomUtil . create ( "div" , e + " " + i ) ; return this . _map = t , this . _zoomInButton = this . _createButton ( "+" , "Zoom in" , e + "-in " + o + " " + o + "-top" , s , this . _zoomIn , this ) , this . _zoomOutButton = this . _createButton ( "-" , "Zoom out" , e + "-out " + o + " " + o + "-bottom" , s , this . _zoomOut , this ) , t . on ( "zoomend" , this . _updateDisabled , this ) , s } , onRemove : function ( t ) { t . off ( "zoomend" , this . _updateDisabled , this ) } , _zoomIn : function ( t ) { this . _map . zoomIn ( t . shiftKey ? 3 : 1 ) } , _zoomOut : function ( t ) { this . _map . zoomOut ( t . shiftKey ? 3 : 1 ) } , _createButton : function ( t , e , i , o , s , a ) { var r = n . DomUtil . create ( "a" , i , o ) ; r . innerHTML = t , r . href = "#" , r . title = e ; var h = n . DomEvent . stopPropagation ; return n . DomEvent . on ( r , "click" , h ) . on ( r , "mousedown" , h ) . on ( r , "dblclick" , h ) . on ( r , "click" , n . DomEvent . preventDefault ) . on ( r , "click" , s , a ) , r } , _updateDisabled : function ( ) { var t = this . _map , e = "leaflet-control-zoom-disabled" ; n . DomUtil . removeClass ( this . _zoomInButton , e ) , n . DomUtil . removeClass ( this . _zoomOutButton , e ) , t . _zoom === t . getMinZoom ( ) && n . DomUtil . addClass ( this . _zoomOutButton , e ) , t . _zoom === t . getMaxZoom ( ) && n . DomUtil . addClass ( this . _zoomInButton , e ) } } ) , n . Map . mergeOptions ( { zoomControl : ! 0 } ) , n . Map . addInitHook ( function ( ) { this . options . zoomControl && ( this . zoomControl = new n . Control . Zoom , this . addControl ( this . zoomControl ) ) } ) , n . control . zoom = function ( t ) { return new n . Control . Zoom ( t ) } , n . Control . Attribution = n . Control . extend ( { options : { position : "bottomright" , prefix : 'Powered by <a href="http://leafletjs.com">Leaflet</a>' } , initialize : function ( t ) { n . setOptions ( this , t ) , this . _attributions = { } } , onAdd : function ( t ) { return this . _container = n . DomUtil . create ( "div" , "leaflet-control-attribution" ) , n . DomEvent . disableClickPropagation ( this . _container ) , t . on ( "layeradd" , this . _onLayerAdd , this ) . on ( "layerremove" , this . _onLayerRemove , this ) , this . _update ( ) , this . _container } , onRemove : function ( t ) { t . off ( "layeradd" , this . _onLayerAdd ) . off ( "layerremove" , this . _onLayerRemove ) } , setPrefix : function ( t ) { return this . options . prefix = t , this . _update ( ) , this } , addAttribution : function ( t ) { return t ? ( this . _attributions [ t ] || ( this . _attributions [ t ] = 0 ) , this . _attributions [ t ] ++ , this . _update ( ) , this ) : i } , removeAttribution : function ( t ) { return t ? ( this . _attributions [ t ] -- , this . _update ( ) , this ) : i } , _update : function ( ) { if ( this . _map ) { var t = [ ] ; for ( var e in this . _attributions ) this . _attributions . hasOwnProperty ( e ) && this . _attributions [ e ] && t . push ( e ) ; var i = [ ] ; this . options . prefix && i . push ( this . options . prefix ) , t . length && i . push ( t . join ( ", " ) ) , this . _container . innerHTML = i . join ( " — " ) } } , _onLayerAdd : function ( t ) { t . layer . getAttribution && this . addAttribution ( t . layer . getAttribution ( ) ) } , _onLayerRemove : function ( t ) { t . layer . getAttribution && this . removeAttribution ( t . layer . getAttribution ( ) ) } } ) , n . Map . mergeOptions ( { attributionControl : ! 0 } ) , n . Map . addInitHook ( function ( ) { this . options . attributionControl && ( this . attributionControl = ( new n . Control . Attribution ) . addTo ( this ) ) } ) , n . control . attribution = function ( t ) { return new n . Control . Attribution ( t ) } , n . Control . Scale = n . Control . extend ( { options : { position : " botto