leaflet-js 0.6.beta4 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. checksums.yaml +6 -14
  2. data/CHANGELOG.rdoc +3 -0
  3. data/leaflet-js.gemspec +2 -2
  4. data/lib/leaflet.draw/CHANGELOG.md +45 -0
  5. data/lib/leaflet.draw/README.md +70 -23
  6. data/lib/leaflet.draw/build/deps.js +1 -0
  7. data/lib/leaflet.draw/dist/images/spritesheet-2x.png +0 -0
  8. data/lib/leaflet.draw/dist/images/spritesheet.png +0 -0
  9. data/lib/leaflet.draw/dist/leaflet.draw-src.js +489 -136
  10. data/lib/leaflet.draw/dist/leaflet.draw.css +34 -2
  11. data/lib/leaflet.draw/dist/leaflet.draw.ie.css +5 -0
  12. data/lib/leaflet.draw/dist/leaflet.draw.js +2 -2
  13. data/lib/leaflet.draw/examples/basic.html +14 -7
  14. data/lib/leaflet.draw/examples/libs/images/layers-2x.png +0 -0
  15. data/lib/leaflet.draw/examples/libs/images/layers.png +0 -0
  16. data/lib/leaflet.draw/examples/libs/images/marker-icon-2x.png +0 -0
  17. data/lib/leaflet.draw/examples/libs/leaflet-src.js +1129 -608
  18. data/lib/leaflet.draw/examples/libs/leaflet.css +85 -66
  19. data/lib/leaflet.draw/package.json +2 -2
  20. data/lib/leaflet.draw/spec/suites/DrawControlSpec.js +1 -1
  21. data/lib/leaflet.draw/spec/suites/GeometryUtilSpec.js +25 -0
  22. data/lib/leaflet.draw/spec/suites/LatLngUtilSpec.js +9 -0
  23. data/lib/leaflet.draw/src/Control.Draw.js +1 -0
  24. data/lib/leaflet.draw/src/Leaflet.draw.js +89 -1
  25. data/lib/leaflet.draw/src/Toolbar.js +2 -6
  26. data/lib/leaflet.draw/src/Tooltip.js +20 -7
  27. data/lib/leaflet.draw/src/draw/DrawToolbar.js +26 -22
  28. data/lib/leaflet.draw/src/draw/handler/Draw.Circle.js +11 -6
  29. data/lib/leaflet.draw/src/draw/handler/Draw.Feature.js +6 -2
  30. data/lib/leaflet.draw/src/draw/handler/Draw.Marker.js +7 -2
  31. data/lib/leaflet.draw/src/draw/handler/Draw.Polygon.js +29 -7
  32. data/lib/leaflet.draw/src/draw/handler/Draw.Polyline.js +44 -21
  33. data/lib/leaflet.draw/src/draw/handler/Draw.Rectangle.js +3 -3
  34. data/lib/leaflet.draw/src/draw/handler/Draw.SimpleShape.js +14 -1
  35. data/lib/leaflet.draw/src/edit/EditToolbar.js +86 -16
  36. data/lib/leaflet.draw/src/edit/handler/Edit.Poly.js +10 -7
  37. data/lib/leaflet.draw/src/edit/handler/Edit.SimpleShape.js +1 -2
  38. data/lib/leaflet.draw/src/edit/handler/EditToolbar.Delete.js +15 -3
  39. data/lib/leaflet.draw/src/edit/handler/EditToolbar.Edit.js +56 -38
  40. data/lib/leaflet.draw/src/ext/GeometryUtil.js +68 -0
  41. data/lib/leaflet.draw/src/images/spritesheet.svg +41 -0
  42. data/lib/leaflet.label/CHANGELOG.md +32 -0
  43. data/lib/leaflet.label/README.md +21 -4
  44. data/lib/leaflet.label/build/build.js +2 -2
  45. data/lib/leaflet.label/build/deps.js +2 -0
  46. data/lib/leaflet.label/build/hintrc.js +4 -0
  47. data/lib/leaflet.label/dist/leaflet.label-src.js +266 -83
  48. data/lib/leaflet.label/dist/leaflet.label.css +23 -4
  49. data/lib/leaflet.label/dist/leaflet.label.js +1 -1
  50. data/lib/leaflet.label/example/label.html +6 -3
  51. data/lib/leaflet.label/libs/leaflet/images/layers-2x.png +0 -0
  52. data/lib/leaflet.label/libs/leaflet/images/layers.png +0 -0
  53. data/lib/leaflet.label/libs/leaflet/images/marker-icon-2x.png +0 -0
  54. data/lib/leaflet.label/libs/leaflet/leaflet-src.js +1129 -608
  55. data/lib/leaflet.label/libs/leaflet/leaflet.css +85 -66
  56. data/lib/leaflet.label/libs/leaflet/leaflet.js +6 -5
  57. data/lib/leaflet.label/package.json +19 -0
  58. data/lib/leaflet.label/src/BaseMarkerMethods.js +129 -0
  59. data/lib/leaflet.label/src/CircleMarker.Label.js +7 -0
  60. data/lib/leaflet.label/src/Label.js +161 -37
  61. data/lib/leaflet.label/src/Leaflet.label.js +1 -1
  62. data/lib/leaflet.label/src/Map.Label.js +0 -2
  63. data/lib/leaflet.label/src/Marker.Label.js +15 -120
  64. data/lib/leaflet.label/src/Path.Label.js +11 -11
  65. data/lib/leaflet/CHANGELOG.md +299 -31
  66. data/lib/leaflet/CONTRIBUTING.md +3 -3
  67. data/lib/leaflet/FAQ.md +138 -0
  68. data/lib/leaflet/Jakefile.js +24 -4
  69. data/lib/leaflet/PLUGIN-GUIDE.md +127 -0
  70. data/lib/leaflet/README.md +10 -6
  71. data/lib/leaflet/build/build.html +3 -19
  72. data/lib/leaflet/build/build.js +21 -51
  73. data/lib/leaflet/build/deps.js +10 -7
  74. data/lib/leaflet/build/hintrc.js +6 -4
  75. data/lib/leaflet/debug/hacks/jitter.html +0 -1
  76. data/lib/leaflet/debug/map/canvas.html +11 -12
  77. data/lib/leaflet/debug/map/controls.html +3 -4
  78. data/lib/leaflet/debug/map/geolocation.html +0 -1
  79. data/lib/leaflet/debug/map/iframe.html +11 -0
  80. data/lib/leaflet/debug/map/image-overlay.html +0 -1
  81. data/lib/leaflet/debug/map/map-mobile.html +0 -1
  82. data/lib/leaflet/debug/map/map.html +1 -2
  83. data/lib/leaflet/debug/map/max-bounds.html +2 -1
  84. data/lib/leaflet/debug/map/opacity.html +223 -0
  85. data/lib/leaflet/debug/map/scroll.html +6 -1
  86. data/lib/leaflet/debug/map/simple-proj.html +0 -1
  87. data/lib/leaflet/debug/map/wms-marble.html +4 -5
  88. data/lib/leaflet/debug/map/wms.html +0 -1
  89. data/lib/leaflet/debug/map/zoomlevels.html +0 -1
  90. data/lib/leaflet/debug/tests/add_remove_layers.html +5 -6
  91. data/lib/leaflet/debug/tests/bringtoback.html +0 -1
  92. data/lib/leaflet/debug/tests/canvasloop.html +47 -0
  93. data/lib/leaflet/debug/tests/click_on_canvas.html +0 -1
  94. data/lib/leaflet/debug/tests/dragging_and_copyworldjump.html +61 -0
  95. data/lib/leaflet/debug/tests/opacity.html +0 -1
  96. data/lib/leaflet/debug/tests/popupcontextmenuclicks.html +59 -0
  97. data/lib/leaflet/debug/tests/remove_while_dragging.html +4 -5
  98. data/lib/leaflet/debug/tests/removetilewhilepan.html +0 -1
  99. data/lib/leaflet/debug/tests/reuse_popups.html +0 -1
  100. data/lib/leaflet/debug/tests/rtl.html +42 -0
  101. data/lib/leaflet/debug/tests/rtl2.html +27 -0
  102. data/lib/leaflet/debug/tests/set_icon_reuse_dom.html +43 -0
  103. data/lib/leaflet/debug/tests/svg_clicks.html +3 -4
  104. data/lib/leaflet/debug/vector/bounds-extend.html +0 -1
  105. data/lib/leaflet/debug/vector/feature-group-bounds.html +0 -1
  106. data/lib/leaflet/debug/vector/geojson.html +0 -1
  107. data/lib/leaflet/debug/vector/rectangle.html +0 -1
  108. data/lib/leaflet/debug/vector/touchzoomemu.html +2 -3
  109. data/lib/leaflet/debug/vector/vector-bounds.html +0 -1
  110. data/lib/leaflet/debug/vector/vector-canvas.html +0 -1
  111. data/lib/leaflet/debug/vector/vector-mobile.html +0 -1
  112. data/lib/leaflet/debug/vector/vector-simple.html +0 -1
  113. data/lib/leaflet/debug/vector/vector.html +0 -1
  114. data/lib/leaflet/dist/images/layers-2x.png +0 -0
  115. data/lib/leaflet/dist/images/layers.png +0 -0
  116. data/lib/leaflet/dist/leaflet.css +85 -66
  117. data/lib/leaflet/package.json +25 -20
  118. data/lib/leaflet/spec/after.js +1 -1
  119. data/lib/leaflet/spec/index.html +21 -13
  120. data/lib/leaflet/spec/karma.conf.js +51 -50
  121. data/lib/leaflet/spec/spec.hintrc.js +25 -0
  122. data/lib/leaflet/spec/suites/LeafletSpec.js +2 -2
  123. data/lib/leaflet/spec/suites/SpecHelper.js +37 -21
  124. data/lib/leaflet/spec/suites/control/Control.LayersSpec.js +1 -1
  125. data/lib/leaflet/spec/suites/core/ClassSpec.js +12 -12
  126. data/lib/leaflet/spec/suites/core/EventsSpec.js +74 -18
  127. data/lib/leaflet/spec/suites/core/UtilSpec.js +69 -25
  128. data/lib/leaflet/spec/suites/dom/DomEventSpec.js +16 -16
  129. data/lib/leaflet/spec/suites/dom/DomUtilSpec.js +9 -16
  130. data/lib/leaflet/spec/suites/dom/PosAnimationSpec.js +27 -0
  131. data/lib/leaflet/spec/suites/geo/CRSSpec.js +47 -0
  132. data/lib/leaflet/spec/suites/geo/LatLngBoundsSpec.js +22 -14
  133. data/lib/leaflet/spec/suites/geo/LatLngSpec.js +22 -8
  134. data/lib/leaflet/spec/suites/geo/ProjectionSpec.js +21 -20
  135. data/lib/leaflet/spec/suites/geometry/BoundsSpec.js +15 -15
  136. data/lib/leaflet/spec/suites/geometry/PointSpec.js +12 -12
  137. data/lib/leaflet/spec/suites/geometry/TransformationSpec.js +4 -4
  138. data/lib/leaflet/spec/suites/layer/FeatureGroupSpec.js +59 -9
  139. data/lib/leaflet/spec/suites/layer/GeoJSONSpec.js +213 -17
  140. data/lib/leaflet/spec/suites/layer/LayerGroupSpec.js +6 -6
  141. data/lib/leaflet/spec/suites/layer/PopupSpec.js +65 -5
  142. data/lib/leaflet/spec/suites/layer/TileLayerSpec.js +16 -15
  143. data/lib/leaflet/spec/suites/layer/marker/MarkerSpec.js +94 -0
  144. data/lib/leaflet/spec/suites/layer/vector/CircleMarkerSpec.js +7 -7
  145. data/lib/leaflet/spec/suites/layer/vector/PolygonSpec.js +38 -2
  146. data/lib/leaflet/spec/suites/layer/vector/PolylineGeometrySpec.js +4 -4
  147. data/lib/leaflet/spec/suites/layer/vector/PolylineSpec.js +2 -2
  148. data/lib/leaflet/spec/suites/map/MapSpec.js +318 -26
  149. data/lib/leaflet/spec/suites/map/handler/Map.DragSpec.js +38 -0
  150. data/lib/leaflet/src/Leaflet.js +2 -2
  151. data/lib/leaflet/src/control/Control.Attribution.js +6 -0
  152. data/lib/leaflet/src/control/Control.Layers.js +33 -24
  153. data/lib/leaflet/src/control/Control.Zoom.js +12 -4
  154. data/lib/leaflet/src/control/Control.js +10 -0
  155. data/lib/leaflet/src/copyright.js +2 -1
  156. data/lib/leaflet/src/core/Browser.js +11 -10
  157. data/lib/leaflet/src/core/Events.js +15 -11
  158. data/lib/leaflet/src/core/Util.js +19 -14
  159. data/lib/leaflet/src/dom/DomEvent.DoubleTap.js +13 -12
  160. data/lib/leaflet/src/dom/DomEvent.Pointer.js +155 -0
  161. data/lib/leaflet/src/dom/DomEvent.js +57 -19
  162. data/lib/leaflet/src/dom/DomUtil.js +89 -34
  163. data/lib/leaflet/src/dom/Draggable.js +26 -89
  164. data/lib/leaflet/src/dom/PosAnimation.js +13 -2
  165. data/lib/leaflet/src/geo/LatLng.js +16 -5
  166. data/lib/leaflet/src/geo/LatLngBounds.js +5 -2
  167. data/lib/leaflet/src/geo/crs/CRS.EPSG3395.js +2 -2
  168. data/lib/leaflet/src/geo/crs/CRS.js +5 -0
  169. data/lib/leaflet/src/geo/projection/Projection.Mercator.js +3 -3
  170. data/lib/leaflet/src/geometry/LineUtil.js +2 -2
  171. data/lib/leaflet/src/images/layers.svg +8 -0
  172. data/lib/leaflet/src/images/marker.svg +61 -1
  173. data/lib/leaflet/src/layer/FeatureGroup.js +24 -7
  174. data/lib/leaflet/src/layer/GeoJSON.js +97 -56
  175. data/lib/leaflet/src/layer/ImageOverlay.js +9 -0
  176. data/lib/leaflet/src/layer/LayerGroup.js +8 -3
  177. data/lib/leaflet/src/layer/Popup.js +56 -34
  178. data/lib/leaflet/src/layer/marker/DivIcon.js +4 -2
  179. data/lib/leaflet/src/layer/marker/Icon.Default.js +1 -1
  180. data/lib/leaflet/src/layer/marker/Icon.js +15 -18
  181. data/lib/leaflet/src/layer/marker/Marker.Drag.js +7 -5
  182. data/lib/leaflet/src/layer/marker/Marker.Popup.js +22 -5
  183. data/lib/leaflet/src/layer/marker/Marker.js +75 -32
  184. data/lib/leaflet/src/layer/tile/TileLayer.Anim.js +14 -26
  185. data/lib/leaflet/src/layer/tile/TileLayer.Canvas.js +7 -6
  186. data/lib/leaflet/src/layer/tile/TileLayer.WMS.js +14 -10
  187. data/lib/leaflet/src/layer/tile/TileLayer.js +53 -32
  188. data/lib/leaflet/src/layer/vector/CircleMarker.js +11 -0
  189. data/lib/leaflet/src/layer/vector/MultiPoly.js +10 -0
  190. data/lib/leaflet/src/layer/vector/Path.SVG.js +14 -3
  191. data/lib/leaflet/src/layer/vector/Path.VML.js +12 -2
  192. data/lib/leaflet/src/layer/vector/Path.js +7 -3
  193. data/lib/leaflet/src/layer/vector/Polygon.js +14 -3
  194. data/lib/leaflet/src/layer/vector/canvas/CircleMarker.Canvas.js +9 -0
  195. data/lib/leaflet/src/layer/vector/canvas/Path.Canvas.js +1 -0
  196. data/lib/leaflet/src/map/Map.js +192 -125
  197. data/lib/leaflet/src/map/anim/Map.PanAnimation.js +29 -19
  198. data/lib/leaflet/src/map/anim/Map.ZoomAnimation.js +21 -9
  199. data/lib/leaflet/src/map/ext/Map.Geolocation.js +11 -4
  200. data/lib/leaflet/src/map/handler/Map.BoxZoom.js +26 -12
  201. data/lib/leaflet/src/map/handler/Map.DoubleClickZoom.js +10 -3
  202. data/lib/leaflet/src/map/handler/Map.Drag.js +12 -6
  203. data/lib/leaflet/src/map/handler/Map.Keyboard.js +5 -2
  204. data/lib/leaflet/src/map/handler/Map.ScrollWheelZoom.js +7 -1
  205. data/lib/leaflet/src/map/handler/Map.Tap.js +107 -0
  206. data/lib/leaflet/src/map/handler/Map.TouchZoom.js +9 -3
  207. data/vendor/assets/images/layers-2x.png +0 -0
  208. data/vendor/assets/images/layers.png +0 -0
  209. data/vendor/assets/images/spritesheet-2x.png +0 -0
  210. data/vendor/assets/images/spritesheet.png +0 -0
  211. data/vendor/assets/javascripts/leaflet.draw.js +2 -4
  212. data/vendor/assets/javascripts/leaflet.js +3 -1
  213. data/vendor/assets/javascripts/leaflet.label.js +2 -0
  214. data/vendor/assets/stylesheets/leaflet.css.erb +337 -318
  215. data/vendor/assets/stylesheets/leaflet.draw.css.erb +35 -3
  216. data/vendor/assets/stylesheets/leaflet.draw.ie.css +5 -0
  217. data/vendor/assets/stylesheets/leaflet.label.css +23 -4
  218. metadata +40 -14
  219. data/lib/leaflet.draw/examples/libs/leaflet.ie.css +0 -51
  220. data/lib/leaflet.label/libs/leaflet/leaflet.ie.css +0 -51
  221. data/lib/leaflet/dist/leaflet-src.js +0 -8579
  222. data/lib/leaflet/dist/leaflet.ie.css +0 -51
  223. data/lib/leaflet/dist/leaflet.js +0 -8
  224. data/lib/leaflet/spec/happen.js +0 -93
  225. data/lib/leaflet/src/dom/DomEvent.MsTouch.js +0 -146
  226. data/vendor/assets/stylesheets/leaflet.ie.css +0 -51
@@ -0,0 +1,9 @@
1
+ /*
2
+ * CircleMarker canvas specific drawing parts.
3
+ */
4
+
5
+ L.CircleMarker.include(!L.Path.CANVAS ? {} : {
6
+ _updateStyle: function () {
7
+ L.Path.prototype._updateStyle.call(this);
8
+ }
9
+ });
@@ -38,6 +38,7 @@ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path :
38
38
 
39
39
  if (this.options.clickable) {
40
40
  this._map.off('click', this._onClick, this);
41
+ this._map.off('mousemove', this._onMouseMove, this);
41
42
  }
42
43
 
43
44
  this._requestUpdate();
@@ -23,9 +23,13 @@ L.Map = L.Class.extend({
23
23
  initialize: function (id, options) { // (HTMLElement or String, Object)
24
24
  options = L.setOptions(this, options);
25
25
 
26
+
26
27
  this._initContainer(id);
27
28
  this._initLayout();
28
- this.callInitHooks();
29
+
30
+ // hack for https://github.com/Leaflet/Leaflet/issues/1980
31
+ this._onResize = L.bind(this._onResize, this);
32
+
29
33
  this._initEvents();
30
34
 
31
35
  if (options.maxBounds) {
@@ -33,10 +37,18 @@ L.Map = L.Class.extend({
33
37
  }
34
38
 
35
39
  if (options.center && options.zoom !== undefined) {
36
- this.setView(L.latLng(options.center), options.zoom, true);
40
+ this.setView(L.latLng(options.center), options.zoom, {reset: true});
37
41
  }
38
42
 
39
- this._initLayers(options.layers);
43
+ this._handlers = [];
44
+
45
+ this._layers = {};
46
+ this._zoomBoundLayers = {};
47
+ this._tileLayersNum = 0;
48
+
49
+ this.callInitHooks();
50
+
51
+ this._addLayers(options.layers);
40
52
  },
41
53
 
42
54
 
@@ -44,23 +56,28 @@ L.Map = L.Class.extend({
44
56
 
45
57
  // replaced by animation-powered implementation in Map.PanAnimation.js
46
58
  setView: function (center, zoom) {
59
+ zoom = zoom === undefined ? this.getZoom() : zoom;
47
60
  this._resetView(L.latLng(center), this._limitZoom(zoom));
48
61
  return this;
49
62
  },
50
63
 
51
- setZoom: function (zoom) { // (Number)
52
- return this.setView(this.getCenter(), zoom);
64
+ setZoom: function (zoom, options) {
65
+ if (!this._loaded) {
66
+ this._zoom = this._limitZoom(zoom);
67
+ return this;
68
+ }
69
+ return this.setView(this.getCenter(), zoom, {zoom: options});
53
70
  },
54
71
 
55
- zoomIn: function (delta) {
56
- return this.setZoom(this._zoom + (delta || 1));
72
+ zoomIn: function (delta, options) {
73
+ return this.setZoom(this._zoom + (delta || 1), options);
57
74
  },
58
75
 
59
- zoomOut: function (delta) {
60
- return this.setZoom(this._zoom - (delta || 1));
76
+ zoomOut: function (delta, options) {
77
+ return this.setZoom(this._zoom - (delta || 1), options);
61
78
  },
62
79
 
63
- setZoomAround: function (latlng, zoom) {
80
+ setZoomAround: function (latlng, zoom, options) {
64
81
  var scale = this.getZoomScale(zoom),
65
82
  viewHalf = this.getSize().divideBy(2),
66
83
  containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),
@@ -68,35 +85,39 @@ L.Map = L.Class.extend({
68
85
  centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),
69
86
  newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));
70
87
 
71
- return this.setView(newCenter, zoom);
88
+ return this.setView(newCenter, zoom, {zoom: options});
72
89
  },
73
90
 
74
- fitBounds: function (bounds, paddingTopLeft, paddingBottomRight) { // (LatLngBounds || ILayer[, Point, Point])
91
+ fitBounds: function (bounds, options) {
75
92
 
93
+ options = options || {};
76
94
  bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);
77
95
 
78
- paddingTopLeft = L.point(paddingTopLeft || [0, 0]);
79
- paddingBottomRight = L.point(paddingBottomRight || paddingTopLeft);
96
+ var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),
97
+ paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),
98
+
99
+ zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)),
100
+ paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),
80
101
 
81
- var zoom = this.getBoundsZoom(bounds, false, paddingTopLeft.add(paddingBottomRight)),
82
- paddingOffset = paddingBottomRight.subtract(paddingTopLeft).divideBy(2),
83
102
  swPoint = this.project(bounds.getSouthWest(), zoom),
84
103
  nePoint = this.project(bounds.getNorthEast(), zoom),
85
104
  center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);
86
105
 
87
- return this.setView(center, zoom);
106
+ zoom = options && options.maxZoom ? Math.min(options.maxZoom, zoom) : zoom;
107
+
108
+ return this.setView(center, zoom, options);
88
109
  },
89
110
 
90
- fitWorld: function () {
91
- return this.fitBounds([[-90, -180], [90, 180]]);
111
+ fitWorld: function (options) {
112
+ return this.fitBounds([[-90, -180], [90, 180]], options);
92
113
  },
93
114
 
94
- panTo: function (center) { // (LatLng)
95
- return this.setView(center, this._zoom);
115
+ panTo: function (center, options) { // (LatLng)
116
+ return this.setView(center, this._zoom, {pan: options});
96
117
  },
97
118
 
98
119
  panBy: function (offset) { // (Point)
99
- // replaced with animated panBy in Map.Animation.js
120
+ // replaced with animated panBy in Map.PanAnimation.js
100
121
  this.fire('movestart');
101
122
 
102
123
  this._rawPanBy(L.point(offset));
@@ -111,56 +132,23 @@ L.Map = L.Class.extend({
111
132
  this.options.maxBounds = bounds;
112
133
 
113
134
  if (!bounds) {
114
- this._boundsMinZoom = null;
115
- return this;
135
+ return this.off('moveend', this._panInsideMaxBounds, this);
116
136
  }
117
137
 
118
- var minZoom = this.getBoundsZoom(bounds, true);
119
-
120
- this._boundsMinZoom = minZoom;
121
-
122
138
  if (this._loaded) {
123
- if (this._zoom < minZoom) {
124
- this.setView(bounds.getCenter(), minZoom);
125
- } else {
126
- this.panInsideBounds(bounds);
127
- }
139
+ this._panInsideMaxBounds();
128
140
  }
129
141
 
130
- this.on('moveend', this._panInsideMaxBounds, this);
131
-
132
- return this;
142
+ return this.on('moveend', this._panInsideMaxBounds, this);
133
143
  },
134
144
 
135
- panInsideBounds: function (bounds) {
136
- bounds = L.latLngBounds(bounds);
145
+ panInsideBounds: function (bounds, options) {
146
+ var center = this.getCenter(),
147
+ newCenter = this._limitCenter(center, this._zoom, bounds);
137
148
 
138
- var viewBounds = this.getPixelBounds(),
139
- viewSw = viewBounds.getBottomLeft(),
140
- viewNe = viewBounds.getTopRight(),
141
- sw = this.project(bounds.getSouthWest()),
142
- ne = this.project(bounds.getNorthEast()),
143
- dx = 0,
144
- dy = 0;
149
+ if (center.equals(newCenter)) { return this; }
145
150
 
146
- if (viewNe.y < ne.y) { // north
147
- dy = Math.ceil(ne.y - viewNe.y);
148
- }
149
- if (viewNe.x > ne.x) { // east
150
- dx = Math.floor(ne.x - viewNe.x);
151
- }
152
- if (viewSw.y > sw.y) { // south
153
- dy = Math.floor(sw.y - viewSw.y);
154
- }
155
- if (viewSw.x < sw.x) { // west
156
- dx = Math.ceil(sw.x - viewSw.x);
157
- }
158
-
159
- if (dx || dy) {
160
- return this.panBy([dx, dy]);
161
- }
162
-
163
- return this;
151
+ return this.panTo(newCenter, options);
164
152
  },
165
153
 
166
154
  addLayer: function (layer) {
@@ -181,14 +169,13 @@ L.Map = L.Class.extend({
181
169
  // TODO looks ugly, refactor!!!
182
170
  if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {
183
171
  this._tileLayersNum++;
184
- this._tileLayersToLoad++;
185
- layer.on('load', this._onTileLayerLoad, this);
172
+ this._tileLayersToLoad++;
173
+ layer.on('load', this._onTileLayerLoad, this);
186
174
  }
187
175
 
188
- this.whenReady(function () {
189
- layer.onAdd(this);
190
- this.fire('layeradd', {layer: layer});
191
- }, this);
176
+ if (this._loaded) {
177
+ this._layerAdd(layer);
178
+ }
192
179
 
193
180
  return this;
194
181
  },
@@ -196,11 +183,18 @@ L.Map = L.Class.extend({
196
183
  removeLayer: function (layer) {
197
184
  var id = L.stamp(layer);
198
185
 
199
- if (!this._layers[id]) { return; }
186
+ if (!this._layers[id]) { return this; }
200
187
 
201
- layer.onRemove(this);
188
+ if (this._loaded) {
189
+ layer.onRemove(this);
190
+ }
202
191
 
203
192
  delete this._layers[id];
193
+
194
+ if (this._loaded) {
195
+ this.fire('layerremove', {layer: layer});
196
+ }
197
+
204
198
  if (this._zoomBoundLayers[id]) {
205
199
  delete this._zoomBoundLayers[id];
206
200
  this._updateZoomLevels();
@@ -209,11 +203,11 @@ L.Map = L.Class.extend({
209
203
  // TODO looks ugly, refactor
210
204
  if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {
211
205
  this._tileLayersNum--;
212
- this._tileLayersToLoad--;
213
- layer.off('load', this._onTileLayerLoad, this);
206
+ this._tileLayersToLoad--;
207
+ layer.off('load', this._onTileLayerLoad, this);
214
208
  }
215
209
 
216
- return this.fire('layerremove', {layer: layer});
210
+ return this;
217
211
  },
218
212
 
219
213
  hasLayer: function (layer) {
@@ -229,47 +223,59 @@ L.Map = L.Class.extend({
229
223
  return this;
230
224
  },
231
225
 
232
- invalidateSize: function (animate) {
233
- var oldSize = this.getSize();
226
+ invalidateSize: function (options) {
227
+ options = L.extend({
228
+ animate: false,
229
+ pan: true
230
+ }, options === true ? {animate: true} : options);
234
231
 
232
+ var oldSize = this.getSize();
235
233
  this._sizeChanged = true;
236
-
237
- if (this.options.maxBounds) {
238
- this.setMaxBounds(this.options.maxBounds);
239
- }
234
+ this._initialCenter = null;
240
235
 
241
236
  if (!this._loaded) { return this; }
242
237
 
243
238
  var newSize = this.getSize(),
244
- offset = oldSize.subtract(newSize).divideBy(2).round();
239
+ oldCenter = oldSize.divideBy(2).round(),
240
+ newCenter = newSize.divideBy(2).round(),
241
+ offset = oldCenter.subtract(newCenter);
245
242
 
246
- if ((offset.x !== 0) || (offset.y !== 0)) {
247
- if (animate === true) {
248
- this.panBy(offset);
249
- } else {
243
+ if (!offset.x && !offset.y) { return this; }
244
+
245
+ if (options.animate && options.pan) {
246
+ this.panBy(offset);
247
+
248
+ } else {
249
+ if (options.pan) {
250
250
  this._rawPanBy(offset);
251
+ }
251
252
 
252
- this.fire('move');
253
+ this.fire('move');
253
254
 
255
+ if (options.debounceMoveend) {
254
256
  clearTimeout(this._sizeTimer);
255
257
  this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);
258
+ } else {
259
+ this.fire('moveend');
256
260
  }
257
- this.fire('resize', {
258
- oldSize: oldSize,
259
- newSize: newSize
260
- });
261
261
  }
262
- return this;
262
+
263
+ return this.fire('resize', {
264
+ oldSize: oldSize,
265
+ newSize: newSize
266
+ });
263
267
  },
264
268
 
265
269
  // TODO handler.addTo
266
270
  addHandler: function (name, HandlerClass) {
267
- if (!HandlerClass) { return; }
271
+ if (!HandlerClass) { return this; }
272
+
273
+ var handler = this[name] = new HandlerClass(this);
268
274
 
269
- this[name] = new HandlerClass(this);
275
+ this._handlers.push(handler);
270
276
 
271
277
  if (this.options[name]) {
272
- this[name].enable();
278
+ handler.enable();
273
279
  }
274
280
 
275
281
  return this;
@@ -279,8 +285,23 @@ L.Map = L.Class.extend({
279
285
  if (this._loaded) {
280
286
  this.fire('unload');
281
287
  }
288
+
282
289
  this._initEvents('off');
283
- delete this._container._leaflet;
290
+
291
+ try {
292
+ // throws error in IE6-8
293
+ delete this._container._leaflet;
294
+ } catch (e) {
295
+ this._container._leaflet = undefined;
296
+ }
297
+
298
+ this._clearPanes();
299
+ if (this._clearControlPos) {
300
+ this._clearControlPos();
301
+ }
302
+
303
+ this._clearHandlers();
304
+
284
305
  return this;
285
306
  },
286
307
 
@@ -290,7 +311,7 @@ L.Map = L.Class.extend({
290
311
  getCenter: function () { // (Boolean) -> LatLng
291
312
  this._checkIfLoaded();
292
313
 
293
- if (!this._moved()) {
314
+ if (this._initialCenter && !this._moved()) {
294
315
  return this._initialCenter;
295
316
  }
296
317
  return this.layerPointToLatLng(this._getCenterLayerPoint());
@@ -309,18 +330,15 @@ L.Map = L.Class.extend({
309
330
  },
310
331
 
311
332
  getMinZoom: function () {
312
- var z1 = this.options.minZoom || 0,
313
- z2 = this._layersMinZoom || 0,
314
- z3 = this._boundsMinZoom || 0;
315
-
316
- return Math.max(z1, z2, z3);
333
+ return this.options.minZoom === undefined ?
334
+ (this._layersMinZoom === undefined ? 0 : this._layersMinZoom) :
335
+ this.options.minZoom;
317
336
  },
318
337
 
319
338
  getMaxZoom: function () {
320
- var z1 = this.options.maxZoom === undefined ? Infinity : this.options.maxZoom,
321
- z2 = this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom;
322
-
323
- return Math.min(z1, z2);
339
+ return this.options.maxZoom === undefined ?
340
+ (this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :
341
+ this.options.maxZoom;
324
342
  },
325
343
 
326
344
  getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number
@@ -463,15 +481,11 @@ L.Map = L.Class.extend({
463
481
  _initLayout: function () {
464
482
  var container = this._container;
465
483
 
466
- L.DomUtil.addClass(container, 'leaflet-container');
467
-
468
- if (L.Browser.touch) {
469
- L.DomUtil.addClass(container, 'leaflet-touch');
470
- }
471
-
472
- if (this.options.fadeAnimation) {
473
- L.DomUtil.addClass(container, 'leaflet-fade-anim');
474
- }
484
+ L.DomUtil.addClass(container, 'leaflet-container' +
485
+ (L.Browser.touch ? ' leaflet-touch' : '') +
486
+ (L.Browser.retina ? ' leaflet-retina' : '') +
487
+ (L.Browser.ielt9 ? ' leaflet-oldie' : '') +
488
+ (this.options.fadeAnimation ? ' leaflet-fade-anim' : ''));
475
489
 
476
490
  var position = L.DomUtil.getStyle(container, 'position');
477
491
 
@@ -511,16 +525,14 @@ L.Map = L.Class.extend({
511
525
  return L.DomUtil.create('div', className, container || this._panes.objectsPane);
512
526
  },
513
527
 
514
- _initLayers: function (layers) {
515
- layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];
516
-
517
- this._layers = {};
518
- this._zoomBoundLayers = {};
519
- this._tileLayersNum = 0;
528
+ _clearPanes: function () {
529
+ this._container.removeChild(this._mapPane);
530
+ },
520
531
 
521
- var i, len;
532
+ _addLayers: function (layers) {
533
+ layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];
522
534
 
523
- for (i = 0, len = layers.length; i < len; i++) {
535
+ for (var i = 0, len = layers.length; i < len; i++) {
524
536
  this.addLayer(layers[i]);
525
537
  }
526
538
  },
@@ -558,6 +570,7 @@ L.Map = L.Class.extend({
558
570
 
559
571
  if (loading) {
560
572
  this.fire('load');
573
+ this.eachLayer(this._layerAdd, this);
561
574
  }
562
575
 
563
576
  this.fire('viewreset', {hard: !preserveMapOffset});
@@ -642,18 +655,21 @@ L.Map = L.Class.extend({
642
655
  _onResize: function () {
643
656
  L.Util.cancelAnimFrame(this._resizeRequest);
644
657
  this._resizeRequest = L.Util.requestAnimFrame(
645
- this.invalidateSize, this, false, this._container);
658
+ function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container);
646
659
  },
647
660
 
648
661
  _onMouseClick: function (e) {
649
- if (!this._loaded || (this.dragging && this.dragging.moved())) { return; }
662
+ if (!this._loaded || (!e._simulated &&
663
+ ((this.dragging && this.dragging.moved()) ||
664
+ (this.boxZoom && this.boxZoom.moved()))) ||
665
+ L.DomEvent._skipped(e)) { return; }
650
666
 
651
667
  this.fire('preclick');
652
668
  this._fireMouseEvent(e);
653
669
  },
654
670
 
655
671
  _fireMouseEvent: function (e) {
656
- if (!this._loaded) { return; }
672
+ if (!this._loaded || L.DomEvent._skipped(e)) { return; }
657
673
 
658
674
  var type = e.type;
659
675
 
@@ -684,6 +700,12 @@ L.Map = L.Class.extend({
684
700
  }
685
701
  },
686
702
 
703
+ _clearHandlers: function () {
704
+ for (var i = 0, len = this._handlers.length; i < len; i++) {
705
+ this._handlers[i].disable();
706
+ }
707
+ },
708
+
687
709
  whenReady: function (callback, context) {
688
710
  if (this._loaded) {
689
711
  callback.call(context || this, this);
@@ -693,6 +715,11 @@ L.Map = L.Class.extend({
693
715
  return this;
694
716
  },
695
717
 
718
+ _layerAdd: function (layer) {
719
+ layer.onAdd(this);
720
+ this.fire('layeradd', {layer: layer});
721
+ },
722
+
696
723
 
697
724
  // private methods for getting map state
698
725
 
@@ -730,6 +757,46 @@ L.Map = L.Class.extend({
730
757
  return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());
731
758
  },
732
759
 
760
+ // adjust center for view to get inside bounds
761
+ _limitCenter: function (center, zoom, bounds) {
762
+
763
+ if (!bounds) { return center; }
764
+
765
+ var centerPoint = this.project(center, zoom),
766
+ viewHalf = this.getSize().divideBy(2),
767
+ viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),
768
+ offset = this._getBoundsOffset(viewBounds, bounds, zoom);
769
+
770
+ return this.unproject(centerPoint.add(offset), zoom);
771
+ },
772
+
773
+ // adjust offset for view to get inside bounds
774
+ _limitOffset: function (offset, bounds) {
775
+ if (!bounds) { return offset; }
776
+
777
+ var viewBounds = this.getPixelBounds(),
778
+ newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));
779
+
780
+ return offset.add(this._getBoundsOffset(newBounds, bounds));
781
+ },
782
+
783
+ // returns offset needed for pxBounds to get inside maxBounds at a specified zoom
784
+ _getBoundsOffset: function (pxBounds, maxBounds, zoom) {
785
+ var nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min),
786
+ seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max),
787
+
788
+ dx = this._rebound(nwOffset.x, -seOffset.x),
789
+ dy = this._rebound(nwOffset.y, -seOffset.y);
790
+
791
+ return new L.Point(dx, dy);
792
+ },
793
+
794
+ _rebound: function (left, right) {
795
+ return left + right > 0 ?
796
+ Math.round(left - right) / 2 :
797
+ Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));
798
+ },
799
+
733
800
  _limitZoom: function (zoom) {
734
801
  var min = this.getMinZoom(),
735
802
  max = this.getMaxZoom();