leaflet-js 0.6.beta4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (275) hide show
  1. checksums.yaml +15 -0
  2. data/CHANGELOG.rdoc +32 -0
  3. data/LICENSE +21 -0
  4. data/README.rdoc +54 -0
  5. data/Rakefile +15 -0
  6. data/leaflet-js.gemspec +28 -0
  7. data/lib/leaflet-js.rb +10 -0
  8. data/lib/leaflet.draw/BREAKINGCHANGES.md +54 -0
  9. data/lib/leaflet.draw/CHANGELOG.md +73 -0
  10. data/lib/leaflet.draw/Jakefile.js +26 -0
  11. data/lib/leaflet.draw/MIT-LICENCE.txt +20 -0
  12. data/lib/leaflet.draw/README.md +364 -0
  13. data/lib/leaflet.draw/TODO.md +62 -0
  14. data/lib/leaflet.draw/build/build.html +243 -0
  15. data/lib/leaflet.draw/build/build.js +189 -0
  16. data/lib/leaflet.draw/build/deps.js +75 -0
  17. data/lib/leaflet.draw/build/hintrc.js +47 -0
  18. data/lib/leaflet.draw/build/leaflet.draw-include.js +42 -0
  19. data/lib/leaflet.draw/dist/images/spritesheet.png +0 -0
  20. data/lib/leaflet.draw/dist/leaflet.draw-src.js +2429 -0
  21. data/lib/leaflet.draw/dist/leaflet.draw.css +212 -0
  22. data/lib/leaflet.draw/dist/leaflet.draw.ie.css +44 -0
  23. data/lib/leaflet.draw/dist/leaflet.draw.js +10 -0
  24. data/lib/leaflet.draw/examples/basic.html +106 -0
  25. data/lib/leaflet.draw/examples/edithandlers.html +67 -0
  26. data/lib/leaflet.draw/examples/libs/images/layers.png +0 -0
  27. data/lib/leaflet.draw/examples/libs/images/marker-icon.png +0 -0
  28. data/lib/leaflet.draw/examples/libs/images/marker-icon@2x.png +0 -0
  29. data/lib/leaflet.draw/examples/libs/images/marker-shadow.png +0 -0
  30. data/lib/leaflet.draw/examples/libs/leaflet-src.js +8587 -0
  31. data/lib/leaflet.draw/examples/libs/leaflet.css +459 -0
  32. data/lib/leaflet.draw/examples/libs/leaflet.ie.css +51 -0
  33. data/lib/leaflet.draw/package.json +37 -0
  34. data/lib/leaflet.draw/spec/after.js +2 -0
  35. data/lib/leaflet.draw/spec/before.js +3 -0
  36. data/lib/leaflet.draw/spec/expect.js +1253 -0
  37. data/lib/leaflet.draw/spec/happen.js +93 -0
  38. data/lib/leaflet.draw/spec/index.html +36 -0
  39. data/lib/leaflet.draw/spec/karma.conf.js +69 -0
  40. data/lib/leaflet.draw/spec/sinon.js +4223 -0
  41. data/lib/leaflet.draw/spec/suites/DrawControlSpec.js +15 -0
  42. data/lib/leaflet.draw/spec/suites/SpecHelper.js +26 -0
  43. data/lib/leaflet.draw/src/Control.Draw.js +101 -0
  44. data/lib/leaflet.draw/src/Leaflet.draw.js +5 -0
  45. data/lib/leaflet.draw/src/Toolbar.js +187 -0
  46. data/lib/leaflet.draw/src/Tooltip.js +52 -0
  47. data/lib/leaflet.draw/src/copyright.js +8 -0
  48. data/lib/leaflet.draw/src/draw/DrawToolbar.js +107 -0
  49. data/lib/leaflet.draw/src/draw/handler/Draw.Circle.js +59 -0
  50. data/lib/leaflet.draw/src/draw/handler/Draw.Feature.js +74 -0
  51. data/lib/leaflet.draw/src/draw/handler/Draw.Marker.js +97 -0
  52. data/lib/leaflet.draw/src/draw/handler/Draw.Polygon.js +79 -0
  53. data/lib/leaflet.draw/src/draw/handler/Draw.Polyline.js +360 -0
  54. data/lib/leaflet.draw/src/draw/handler/Draw.Rectangle.js +41 -0
  55. data/lib/leaflet.draw/src/draw/handler/Draw.SimpleShape.js +67 -0
  56. data/lib/leaflet.draw/src/edit/EditToolbar.js +93 -0
  57. data/lib/leaflet.draw/src/edit/handler/Edit.Circle.js +63 -0
  58. data/lib/leaflet.draw/src/edit/handler/Edit.Poly.js +267 -0
  59. data/lib/leaflet.draw/src/edit/handler/Edit.Rectangle.js +117 -0
  60. data/lib/leaflet.draw/src/edit/handler/Edit.SimpleShape.js +138 -0
  61. data/lib/leaflet.draw/src/edit/handler/EditToolbar.Delete.js +109 -0
  62. data/lib/leaflet.draw/src/edit/handler/EditToolbar.Edit.js +233 -0
  63. data/lib/leaflet.draw/src/ext/LatLngUtil.js +18 -0
  64. data/lib/leaflet.draw/src/ext/LineUtil.Intersect.js +15 -0
  65. data/lib/leaflet.draw/src/ext/Polygon.Intersect.js +27 -0
  66. data/lib/leaflet.draw/src/ext/Polyline.Intersect.js +85 -0
  67. data/lib/leaflet.label/CHANGELOG.md +35 -0
  68. data/lib/leaflet.label/Jakefile.js +21 -0
  69. data/lib/leaflet.label/MIT-LICENCE.txt +20 -0
  70. data/lib/leaflet.label/README.md +86 -0
  71. data/lib/leaflet.label/build/build.js +155 -0
  72. data/lib/leaflet.label/build/deps.js +24 -0
  73. data/lib/leaflet.label/build/hint.js +30 -0
  74. data/lib/leaflet.label/build/hintrc.js +47 -0
  75. data/lib/leaflet.label/dist/images/death.png +0 -0
  76. data/lib/leaflet.label/dist/leaflet.label-src.js +359 -0
  77. data/lib/leaflet.label/dist/leaflet.label.css +33 -0
  78. data/lib/leaflet.label/dist/leaflet.label.js +9 -0
  79. data/lib/leaflet.label/example/label.html +82 -0
  80. data/lib/leaflet.label/libs/leaflet/images/layers.png +0 -0
  81. data/lib/leaflet.label/libs/leaflet/images/marker-icon.png +0 -0
  82. data/lib/leaflet.label/libs/leaflet/images/marker-icon@2x.png +0 -0
  83. data/lib/leaflet.label/libs/leaflet/images/marker-shadow.png +0 -0
  84. data/lib/leaflet.label/libs/leaflet/leaflet-src.js +8587 -0
  85. data/lib/leaflet.label/libs/leaflet/leaflet.css +459 -0
  86. data/lib/leaflet.label/libs/leaflet/leaflet.ie.css +51 -0
  87. data/lib/leaflet.label/libs/leaflet/leaflet.js +8 -0
  88. data/lib/leaflet.label/src/FeatureGroup.Label.js +20 -0
  89. data/lib/leaflet.label/src/Label.js +123 -0
  90. data/lib/leaflet.label/src/Leaflet.label.js +5 -0
  91. data/lib/leaflet.label/src/Map.Label.js +7 -0
  92. data/lib/leaflet.label/src/Marker.Label.js +160 -0
  93. data/lib/leaflet.label/src/Path.Label.js +55 -0
  94. data/lib/leaflet.label/src/copyright.js +8 -0
  95. data/lib/leaflet/CHANGELOG.md +637 -0
  96. data/lib/leaflet/CONTRIBUTING.md +155 -0
  97. data/lib/leaflet/Jakefile.js +26 -0
  98. data/lib/leaflet/LICENSE +23 -0
  99. data/lib/leaflet/README.md +30 -0
  100. data/lib/leaflet/build/build.html +243 -0
  101. data/lib/leaflet/build/build.js +193 -0
  102. data/lib/leaflet/build/deps.js +256 -0
  103. data/lib/leaflet/build/hintrc.js +37 -0
  104. data/lib/leaflet/debug/css/mobile.css +6 -0
  105. data/lib/leaflet/debug/css/screen.css +5 -0
  106. data/lib/leaflet/debug/hacks/jitter.html +43 -0
  107. data/lib/leaflet/debug/leaflet-include.js +59 -0
  108. data/lib/leaflet/debug/map/canvas.html +47 -0
  109. data/lib/leaflet/debug/map/controls.html +50 -0
  110. data/lib/leaflet/debug/map/geolocation.html +35 -0
  111. data/lib/leaflet/debug/map/image-overlay.html +44 -0
  112. data/lib/leaflet/debug/map/map-mobile.html +35 -0
  113. data/lib/leaflet/debug/map/map.html +60 -0
  114. data/lib/leaflet/debug/map/max-bounds.html +37 -0
  115. data/lib/leaflet/debug/map/scroll.html +36 -0
  116. data/lib/leaflet/debug/map/simple-proj.html +45 -0
  117. data/lib/leaflet/debug/map/wms-marble.html +31 -0
  118. data/lib/leaflet/debug/map/wms.html +41 -0
  119. data/lib/leaflet/debug/map/zoomlevels.html +46 -0
  120. data/lib/leaflet/debug/tests/add_remove_layers.html +88 -0
  121. data/lib/leaflet/debug/tests/bringtoback.html +38 -0
  122. data/lib/leaflet/debug/tests/click_on_canvas.html +59 -0
  123. data/lib/leaflet/debug/tests/click_on_canvas_broken.html +49 -0
  124. data/lib/leaflet/debug/tests/opacity.html +57 -0
  125. data/lib/leaflet/debug/tests/remove_while_dragging.html +29 -0
  126. data/lib/leaflet/debug/tests/removetilewhilepan.html +42 -0
  127. data/lib/leaflet/debug/tests/reuse_popups.html +41 -0
  128. data/lib/leaflet/debug/tests/svg_clicks.html +55 -0
  129. data/lib/leaflet/debug/vector/bounds-extend.html +89 -0
  130. data/lib/leaflet/debug/vector/feature-group-bounds.html +91 -0
  131. data/lib/leaflet/debug/vector/geojson-sample.js +53 -0
  132. data/lib/leaflet/debug/vector/geojson.html +174 -0
  133. data/lib/leaflet/debug/vector/rectangle.html +54 -0
  134. data/lib/leaflet/debug/vector/route.js +1 -0
  135. data/lib/leaflet/debug/vector/touchzoomemu.html +195 -0
  136. data/lib/leaflet/debug/vector/us-states.js +54 -0
  137. data/lib/leaflet/debug/vector/vector-bounds.html +70 -0
  138. data/lib/leaflet/debug/vector/vector-canvas.html +93 -0
  139. data/lib/leaflet/debug/vector/vector-mobile.html +39 -0
  140. data/lib/leaflet/debug/vector/vector-simple.html +49 -0
  141. data/lib/leaflet/debug/vector/vector.html +38 -0
  142. data/lib/leaflet/dist/images/layers.png +0 -0
  143. data/lib/leaflet/dist/images/marker-icon-2x.png +0 -0
  144. data/lib/leaflet/dist/images/marker-icon.png +0 -0
  145. data/lib/leaflet/dist/images/marker-shadow.png +0 -0
  146. data/lib/leaflet/dist/leaflet-src.js +8579 -0
  147. data/lib/leaflet/dist/leaflet.css +459 -0
  148. data/lib/leaflet/dist/leaflet.ie.css +51 -0
  149. data/lib/leaflet/dist/leaflet.js +8 -0
  150. data/lib/leaflet/package.json +22 -0
  151. data/lib/leaflet/spec/after.js +2 -0
  152. data/lib/leaflet/spec/before.js +3 -0
  153. data/lib/leaflet/spec/expect.js +1253 -0
  154. data/lib/leaflet/spec/happen.js +93 -0
  155. data/lib/leaflet/spec/index.html +78 -0
  156. data/lib/leaflet/spec/karma.conf.js +64 -0
  157. data/lib/leaflet/spec/sinon.js +4223 -0
  158. data/lib/leaflet/spec/suites/LeafletSpec.js +13 -0
  159. data/lib/leaflet/spec/suites/SpecHelper.js +26 -0
  160. data/lib/leaflet/spec/suites/control/Control.AttributionSpec.js +68 -0
  161. data/lib/leaflet/spec/suites/control/Control.LayersSpec.js +67 -0
  162. data/lib/leaflet/spec/suites/control/Control.ScaleSpec.js +6 -0
  163. data/lib/leaflet/spec/suites/core/ClassSpec.js +156 -0
  164. data/lib/leaflet/spec/suites/core/EventsSpec.js +336 -0
  165. data/lib/leaflet/spec/suites/core/UtilSpec.js +212 -0
  166. data/lib/leaflet/spec/suites/dom/DomEventSpec.js +102 -0
  167. data/lib/leaflet/spec/suites/dom/DomUtilSpec.js +89 -0
  168. data/lib/leaflet/spec/suites/geo/LatLngBoundsSpec.js +136 -0
  169. data/lib/leaflet/spec/suites/geo/LatLngSpec.js +118 -0
  170. data/lib/leaflet/spec/suites/geo/ProjectionSpec.js +47 -0
  171. data/lib/leaflet/spec/suites/geometry/BoundsSpec.js +87 -0
  172. data/lib/leaflet/spec/suites/geometry/LineUtilSpec.js +75 -0
  173. data/lib/leaflet/spec/suites/geometry/PointSpec.js +104 -0
  174. data/lib/leaflet/spec/suites/geometry/PolyUtilSpec.js +27 -0
  175. data/lib/leaflet/spec/suites/geometry/TransformationSpec.js +31 -0
  176. data/lib/leaflet/spec/suites/layer/FeatureGroupSpec.js +36 -0
  177. data/lib/leaflet/spec/suites/layer/GeoJSONSpec.js +86 -0
  178. data/lib/leaflet/spec/suites/layer/LayerGroupSpec.js +58 -0
  179. data/lib/leaflet/spec/suites/layer/PopupSpec.js +59 -0
  180. data/lib/leaflet/spec/suites/layer/TileLayerSpec.js +87 -0
  181. data/lib/leaflet/spec/suites/layer/vector/CircleMarkerSpec.js +53 -0
  182. data/lib/leaflet/spec/suites/layer/vector/CircleSpec.js +17 -0
  183. data/lib/leaflet/spec/suites/layer/vector/PolygonSpec.js +55 -0
  184. data/lib/leaflet/spec/suites/layer/vector/PolylineGeometrySpec.js +35 -0
  185. data/lib/leaflet/spec/suites/layer/vector/PolylineSpec.js +55 -0
  186. data/lib/leaflet/spec/suites/map/MapSpec.js +244 -0
  187. data/lib/leaflet/src/Leaflet.js +23 -0
  188. data/lib/leaflet/src/control/Control.Attribution.js +115 -0
  189. data/lib/leaflet/src/control/Control.Layers.js +243 -0
  190. data/lib/leaflet/src/control/Control.Scale.js +112 -0
  191. data/lib/leaflet/src/control/Control.Zoom.js +86 -0
  192. data/lib/leaflet/src/control/Control.js +107 -0
  193. data/lib/leaflet/src/copyright.js +4 -0
  194. data/lib/leaflet/src/core/Browser.js +96 -0
  195. data/lib/leaflet/src/core/Class.js +106 -0
  196. data/lib/leaflet/src/core/Events.js +174 -0
  197. data/lib/leaflet/src/core/Handler.js +28 -0
  198. data/lib/leaflet/src/core/Util.js +182 -0
  199. data/lib/leaflet/src/dom/DomEvent.DoubleTap.js +103 -0
  200. data/lib/leaflet/src/dom/DomEvent.MsTouch.js +146 -0
  201. data/lib/leaflet/src/dom/DomEvent.js +211 -0
  202. data/lib/leaflet/src/dom/DomUtil.js +239 -0
  203. data/lib/leaflet/src/dom/Draggable.js +198 -0
  204. data/lib/leaflet/src/dom/PosAnimation.Timer.js +67 -0
  205. data/lib/leaflet/src/dom/PosAnimation.js +83 -0
  206. data/lib/leaflet/src/geo/LatLng.js +88 -0
  207. data/lib/leaflet/src/geo/LatLngBounds.js +153 -0
  208. data/lib/leaflet/src/geo/crs/CRS.EPSG3395.js +14 -0
  209. data/lib/leaflet/src/geo/crs/CRS.EPSG3857.js +21 -0
  210. data/lib/leaflet/src/geo/crs/CRS.EPSG4326.js +10 -0
  211. data/lib/leaflet/src/geo/crs/CRS.Simple.js +12 -0
  212. data/lib/leaflet/src/geo/crs/CRS.js +27 -0
  213. data/lib/leaflet/src/geo/projection/Projection.LonLat.js +13 -0
  214. data/lib/leaflet/src/geo/projection/Projection.Mercator.js +56 -0
  215. data/lib/leaflet/src/geo/projection/Projection.SphericalMercator.js +27 -0
  216. data/lib/leaflet/src/geo/projection/Projection.js +5 -0
  217. data/lib/leaflet/src/geometry/Bounds.js +95 -0
  218. data/lib/leaflet/src/geometry/LineUtil.js +202 -0
  219. data/lib/leaflet/src/geometry/Point.js +119 -0
  220. data/lib/leaflet/src/geometry/PolyUtil.js +55 -0
  221. data/lib/leaflet/src/geometry/Transformation.js +31 -0
  222. data/lib/leaflet/src/images/marker.svg +1 -0
  223. data/lib/leaflet/src/layer/FeatureGroup.js +81 -0
  224. data/lib/leaflet/src/layer/GeoJSON.js +245 -0
  225. data/lib/leaflet/src/layer/ImageOverlay.js +132 -0
  226. data/lib/leaflet/src/layer/LayerGroup.js +110 -0
  227. data/lib/leaflet/src/layer/Popup.js +316 -0
  228. data/lib/leaflet/src/layer/marker/DivIcon.js +43 -0
  229. data/lib/leaflet/src/layer/marker/Icon.Default.js +51 -0
  230. data/lib/leaflet/src/layer/marker/Icon.js +101 -0
  231. data/lib/leaflet/src/layer/marker/Marker.Drag.js +66 -0
  232. data/lib/leaflet/src/layer/marker/Marker.Popup.js +72 -0
  233. data/lib/leaflet/src/layer/marker/Marker.js +275 -0
  234. data/lib/leaflet/src/layer/tile/TileLayer.Anim.js +117 -0
  235. data/lib/leaflet/src/layer/tile/TileLayer.Canvas.js +60 -0
  236. data/lib/leaflet/src/layer/tile/TileLayer.WMS.js +83 -0
  237. data/lib/leaflet/src/layer/tile/TileLayer.js +578 -0
  238. data/lib/leaflet/src/layer/vector/Circle.js +98 -0
  239. data/lib/leaflet/src/layer/vector/CircleMarker.js +33 -0
  240. data/lib/leaflet/src/layer/vector/MultiPoly.js +47 -0
  241. data/lib/leaflet/src/layer/vector/Path.Popup.js +65 -0
  242. data/lib/leaflet/src/layer/vector/Path.SVG.js +219 -0
  243. data/lib/leaflet/src/layer/vector/Path.VML.js +125 -0
  244. data/lib/leaflet/src/layer/vector/Path.js +115 -0
  245. data/lib/leaflet/src/layer/vector/Polygon.js +81 -0
  246. data/lib/leaflet/src/layer/vector/Polyline.js +164 -0
  247. data/lib/leaflet/src/layer/vector/Rectangle.js +27 -0
  248. data/lib/leaflet/src/layer/vector/canvas/Circle.Canvas.js +18 -0
  249. data/lib/leaflet/src/layer/vector/canvas/Path.Canvas.js +196 -0
  250. data/lib/leaflet/src/layer/vector/canvas/Polygon.Canvas.js +37 -0
  251. data/lib/leaflet/src/layer/vector/canvas/Polyline.Canvas.js +30 -0
  252. data/lib/leaflet/src/map/Map.js +743 -0
  253. data/lib/leaflet/src/map/anim/Map.PanAnimation.js +88 -0
  254. data/lib/leaflet/src/map/anim/Map.ZoomAnimation.js +90 -0
  255. data/lib/leaflet/src/map/ext/Map.Geolocation.js +91 -0
  256. data/lib/leaflet/src/map/handler/Map.BoxZoom.js +104 -0
  257. data/lib/leaflet/src/map/handler/Map.DoubleClickZoom.js +23 -0
  258. data/lib/leaflet/src/map/handler/Map.Drag.js +146 -0
  259. data/lib/leaflet/src/map/handler/Map.Keyboard.js +147 -0
  260. data/lib/leaflet/src/map/handler/Map.ScrollWheelZoom.js +56 -0
  261. data/lib/leaflet/src/map/handler/Map.TouchZoom.js +121 -0
  262. data/vendor/assets/images/layers.png +0 -0
  263. data/vendor/assets/images/marker-icon-2x.png +0 -0
  264. data/vendor/assets/images/marker-icon.png +0 -0
  265. data/vendor/assets/images/marker-shadow.png +0 -0
  266. data/vendor/assets/images/spritesheet.png +0 -0
  267. data/vendor/assets/javascripts/leaflet.draw.js +39 -0
  268. data/vendor/assets/javascripts/leaflet.js +145 -0
  269. data/vendor/assets/javascripts/leaflet.label.js +9 -0
  270. data/vendor/assets/stylesheets/leaflet.css.erb +459 -0
  271. data/vendor/assets/stylesheets/leaflet.draw.css.erb +212 -0
  272. data/vendor/assets/stylesheets/leaflet.draw.ie.css +44 -0
  273. data/vendor/assets/stylesheets/leaflet.ie.css +51 -0
  274. data/vendor/assets/stylesheets/leaflet.label.css +33 -0
  275. metadata +317 -0
@@ -0,0 +1,27 @@
1
+ /*
2
+ * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.
3
+ */
4
+
5
+ L.Rectangle = L.Polygon.extend({
6
+ initialize: function (latLngBounds, options) {
7
+ L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);
8
+ },
9
+
10
+ setBounds: function (latLngBounds) {
11
+ this.setLatLngs(this._boundsToLatLngs(latLngBounds));
12
+ },
13
+
14
+ _boundsToLatLngs: function (latLngBounds) {
15
+ latLngBounds = L.latLngBounds(latLngBounds);
16
+ return [
17
+ latLngBounds.getSouthWest(),
18
+ latLngBounds.getNorthWest(),
19
+ latLngBounds.getNorthEast(),
20
+ latLngBounds.getSouthEast()
21
+ ];
22
+ }
23
+ });
24
+
25
+ L.rectangle = function (latLngBounds, options) {
26
+ return new L.Rectangle(latLngBounds, options);
27
+ };
@@ -0,0 +1,18 @@
1
+ /*
2
+ * Extends L.Circle with Canvas-specific code.
3
+ */
4
+
5
+ L.Circle.include(!L.Path.CANVAS ? {} : {
6
+ _drawPath: function () {
7
+ var p = this._point;
8
+ this._ctx.beginPath();
9
+ this._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false);
10
+ },
11
+
12
+ _containsPoint: function (p) {
13
+ var center = this._point,
14
+ w2 = this.options.stroke ? this.options.weight / 2 : 0;
15
+
16
+ return (p.distanceTo(center) <= this._radius + w2);
17
+ }
18
+ });
@@ -0,0 +1,196 @@
1
+ /*
2
+ * Vector rendering for all browsers that support canvas.
3
+ */
4
+
5
+ L.Browser.canvas = (function () {
6
+ return !!document.createElement('canvas').getContext;
7
+ }());
8
+
9
+ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({
10
+ statics: {
11
+ //CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value
12
+ CANVAS: true,
13
+ SVG: false
14
+ },
15
+
16
+ redraw: function () {
17
+ if (this._map) {
18
+ this.projectLatlngs();
19
+ this._requestUpdate();
20
+ }
21
+ return this;
22
+ },
23
+
24
+ setStyle: function (style) {
25
+ L.setOptions(this, style);
26
+
27
+ if (this._map) {
28
+ this._updateStyle();
29
+ this._requestUpdate();
30
+ }
31
+ return this;
32
+ },
33
+
34
+ onRemove: function (map) {
35
+ map
36
+ .off('viewreset', this.projectLatlngs, this)
37
+ .off('moveend', this._updatePath, this);
38
+
39
+ if (this.options.clickable) {
40
+ this._map.off('click', this._onClick, this);
41
+ }
42
+
43
+ this._requestUpdate();
44
+
45
+ this._map = null;
46
+ },
47
+
48
+ _requestUpdate: function () {
49
+ if (this._map && !L.Path._updateRequest) {
50
+ L.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map);
51
+ }
52
+ },
53
+
54
+ _fireMapMoveEnd: function () {
55
+ L.Path._updateRequest = null;
56
+ this.fire('moveend');
57
+ },
58
+
59
+ _initElements: function () {
60
+ this._map._initPathRoot();
61
+ this._ctx = this._map._canvasCtx;
62
+ },
63
+
64
+ _updateStyle: function () {
65
+ var options = this.options;
66
+
67
+ if (options.stroke) {
68
+ this._ctx.lineWidth = options.weight;
69
+ this._ctx.strokeStyle = options.color;
70
+ }
71
+ if (options.fill) {
72
+ this._ctx.fillStyle = options.fillColor || options.color;
73
+ }
74
+ },
75
+
76
+ _drawPath: function () {
77
+ var i, j, len, len2, point, drawMethod;
78
+
79
+ this._ctx.beginPath();
80
+
81
+ for (i = 0, len = this._parts.length; i < len; i++) {
82
+ for (j = 0, len2 = this._parts[i].length; j < len2; j++) {
83
+ point = this._parts[i][j];
84
+ drawMethod = (j === 0 ? 'move' : 'line') + 'To';
85
+
86
+ this._ctx[drawMethod](point.x, point.y);
87
+ }
88
+ // TODO refactor ugly hack
89
+ if (this instanceof L.Polygon) {
90
+ this._ctx.closePath();
91
+ }
92
+ }
93
+ },
94
+
95
+ _checkIfEmpty: function () {
96
+ return !this._parts.length;
97
+ },
98
+
99
+ _updatePath: function () {
100
+ if (this._checkIfEmpty()) { return; }
101
+
102
+ var ctx = this._ctx,
103
+ options = this.options;
104
+
105
+ this._drawPath();
106
+ ctx.save();
107
+ this._updateStyle();
108
+
109
+ if (options.fill) {
110
+ ctx.globalAlpha = options.fillOpacity;
111
+ ctx.fill();
112
+ }
113
+
114
+ if (options.stroke) {
115
+ ctx.globalAlpha = options.opacity;
116
+ ctx.stroke();
117
+ }
118
+
119
+ ctx.restore();
120
+
121
+ // TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature
122
+ },
123
+
124
+ _initEvents: function () {
125
+ if (this.options.clickable) {
126
+ // TODO dblclick
127
+ this._map.on('mousemove', this._onMouseMove, this);
128
+ this._map.on('click', this._onClick, this);
129
+ }
130
+ },
131
+
132
+ _onClick: function (e) {
133
+ if (this._containsPoint(e.layerPoint)) {
134
+ this.fire('click', e);
135
+ }
136
+ },
137
+
138
+ _onMouseMove: function (e) {
139
+ if (!this._map || this._map._animatingZoom) { return; }
140
+
141
+ // TODO don't do on each move
142
+ if (this._containsPoint(e.layerPoint)) {
143
+ this._ctx.canvas.style.cursor = 'pointer';
144
+ this._mouseInside = true;
145
+ this.fire('mouseover', e);
146
+
147
+ } else if (this._mouseInside) {
148
+ this._ctx.canvas.style.cursor = '';
149
+ this._mouseInside = false;
150
+ this.fire('mouseout', e);
151
+ }
152
+ }
153
+ });
154
+
155
+ L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : {
156
+ _initPathRoot: function () {
157
+ var root = this._pathRoot,
158
+ ctx;
159
+
160
+ if (!root) {
161
+ root = this._pathRoot = document.createElement('canvas');
162
+ root.style.position = 'absolute';
163
+ ctx = this._canvasCtx = root.getContext('2d');
164
+
165
+ ctx.lineCap = 'round';
166
+ ctx.lineJoin = 'round';
167
+
168
+ this._panes.overlayPane.appendChild(root);
169
+
170
+ if (this.options.zoomAnimation) {
171
+ this._pathRoot.className = 'leaflet-zoom-animated';
172
+ this.on('zoomanim', this._animatePathZoom);
173
+ this.on('zoomend', this._endPathZoom);
174
+ }
175
+ this.on('moveend', this._updateCanvasViewport);
176
+ this._updateCanvasViewport();
177
+ }
178
+ },
179
+
180
+ _updateCanvasViewport: function () {
181
+ // don't redraw while zooming. See _updateSvgViewport for more details
182
+ if (this._pathZooming) { return; }
183
+ this._updatePathViewport();
184
+
185
+ var vp = this._pathViewport,
186
+ min = vp.min,
187
+ size = vp.max.subtract(min),
188
+ root = this._pathRoot;
189
+
190
+ //TODO check if this works properly on mobile webkit
191
+ L.DomUtil.setPosition(root, min);
192
+ root.width = size.x;
193
+ root.height = size.y;
194
+ root.getContext('2d').translate(-min.x, -min.y);
195
+ }
196
+ });
@@ -0,0 +1,37 @@
1
+ /*
2
+ * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons.
3
+ */
4
+
5
+ L.Polygon.include(!L.Path.CANVAS ? {} : {
6
+ _containsPoint: function (p) {
7
+ var inside = false,
8
+ part, p1, p2,
9
+ i, j, k,
10
+ len, len2;
11
+
12
+ // TODO optimization: check if within bounds first
13
+
14
+ if (L.Polyline.prototype._containsPoint.call(this, p, true)) {
15
+ // click on polygon border
16
+ return true;
17
+ }
18
+
19
+ // ray casting algorithm for detecting if point is in polygon
20
+
21
+ for (i = 0, len = this._parts.length; i < len; i++) {
22
+ part = this._parts[i];
23
+
24
+ for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
25
+ p1 = part[j];
26
+ p2 = part[k];
27
+
28
+ if (((p1.y > p.y) !== (p2.y > p.y)) &&
29
+ (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
30
+ inside = !inside;
31
+ }
32
+ }
33
+ }
34
+
35
+ return inside;
36
+ }
37
+ });
@@ -0,0 +1,30 @@
1
+ /*
2
+ * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines.
3
+ */
4
+
5
+ L.Polyline.include(!L.Path.CANVAS ? {} : {
6
+ _containsPoint: function (p, closed) {
7
+ var i, j, k, len, len2, dist, part,
8
+ w = this.options.weight / 2;
9
+
10
+ if (L.Browser.touch) {
11
+ w += 10; // polyline click tolerance on touch devices
12
+ }
13
+
14
+ for (i = 0, len = this._parts.length; i < len; i++) {
15
+ part = this._parts[i];
16
+ for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
17
+ if (!closed && (j === 0)) {
18
+ continue;
19
+ }
20
+
21
+ dist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]);
22
+
23
+ if (dist <= w) {
24
+ return true;
25
+ }
26
+ }
27
+ }
28
+ return false;
29
+ }
30
+ });
@@ -0,0 +1,743 @@
1
+ /*
2
+ * L.Map is the central class of the API - it is used to create a map.
3
+ */
4
+
5
+ L.Map = L.Class.extend({
6
+
7
+ includes: L.Mixin.Events,
8
+
9
+ options: {
10
+ crs: L.CRS.EPSG3857,
11
+
12
+ /*
13
+ center: LatLng,
14
+ zoom: Number,
15
+ layers: Array,
16
+ */
17
+
18
+ fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23,
19
+ trackResize: true,
20
+ markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d
21
+ },
22
+
23
+ initialize: function (id, options) { // (HTMLElement or String, Object)
24
+ options = L.setOptions(this, options);
25
+
26
+ this._initContainer(id);
27
+ this._initLayout();
28
+ this.callInitHooks();
29
+ this._initEvents();
30
+
31
+ if (options.maxBounds) {
32
+ this.setMaxBounds(options.maxBounds);
33
+ }
34
+
35
+ if (options.center && options.zoom !== undefined) {
36
+ this.setView(L.latLng(options.center), options.zoom, true);
37
+ }
38
+
39
+ this._initLayers(options.layers);
40
+ },
41
+
42
+
43
+ // public methods that modify map state
44
+
45
+ // replaced by animation-powered implementation in Map.PanAnimation.js
46
+ setView: function (center, zoom) {
47
+ this._resetView(L.latLng(center), this._limitZoom(zoom));
48
+ return this;
49
+ },
50
+
51
+ setZoom: function (zoom) { // (Number)
52
+ return this.setView(this.getCenter(), zoom);
53
+ },
54
+
55
+ zoomIn: function (delta) {
56
+ return this.setZoom(this._zoom + (delta || 1));
57
+ },
58
+
59
+ zoomOut: function (delta) {
60
+ return this.setZoom(this._zoom - (delta || 1));
61
+ },
62
+
63
+ setZoomAround: function (latlng, zoom) {
64
+ var scale = this.getZoomScale(zoom),
65
+ viewHalf = this.getSize().divideBy(2),
66
+ containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),
67
+
68
+ centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),
69
+ newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));
70
+
71
+ return this.setView(newCenter, zoom);
72
+ },
73
+
74
+ fitBounds: function (bounds, paddingTopLeft, paddingBottomRight) { // (LatLngBounds || ILayer[, Point, Point])
75
+
76
+ bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);
77
+
78
+ paddingTopLeft = L.point(paddingTopLeft || [0, 0]);
79
+ paddingBottomRight = L.point(paddingBottomRight || paddingTopLeft);
80
+
81
+ var zoom = this.getBoundsZoom(bounds, false, paddingTopLeft.add(paddingBottomRight)),
82
+ paddingOffset = paddingBottomRight.subtract(paddingTopLeft).divideBy(2),
83
+ swPoint = this.project(bounds.getSouthWest(), zoom),
84
+ nePoint = this.project(bounds.getNorthEast(), zoom),
85
+ center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);
86
+
87
+ return this.setView(center, zoom);
88
+ },
89
+
90
+ fitWorld: function () {
91
+ return this.fitBounds([[-90, -180], [90, 180]]);
92
+ },
93
+
94
+ panTo: function (center) { // (LatLng)
95
+ return this.setView(center, this._zoom);
96
+ },
97
+
98
+ panBy: function (offset) { // (Point)
99
+ // replaced with animated panBy in Map.Animation.js
100
+ this.fire('movestart');
101
+
102
+ this._rawPanBy(L.point(offset));
103
+
104
+ this.fire('move');
105
+ return this.fire('moveend');
106
+ },
107
+
108
+ setMaxBounds: function (bounds) {
109
+ bounds = L.latLngBounds(bounds);
110
+
111
+ this.options.maxBounds = bounds;
112
+
113
+ if (!bounds) {
114
+ this._boundsMinZoom = null;
115
+ return this;
116
+ }
117
+
118
+ var minZoom = this.getBoundsZoom(bounds, true);
119
+
120
+ this._boundsMinZoom = minZoom;
121
+
122
+ if (this._loaded) {
123
+ if (this._zoom < minZoom) {
124
+ this.setView(bounds.getCenter(), minZoom);
125
+ } else {
126
+ this.panInsideBounds(bounds);
127
+ }
128
+ }
129
+
130
+ this.on('moveend', this._panInsideMaxBounds, this);
131
+
132
+ return this;
133
+ },
134
+
135
+ panInsideBounds: function (bounds) {
136
+ bounds = L.latLngBounds(bounds);
137
+
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;
145
+
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;
164
+ },
165
+
166
+ addLayer: function (layer) {
167
+ // TODO method is too big, refactor
168
+
169
+ var id = L.stamp(layer);
170
+
171
+ if (this._layers[id]) { return this; }
172
+
173
+ this._layers[id] = layer;
174
+
175
+ // TODO getMaxZoom, getMinZoom in ILayer (instead of options)
176
+ if (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) {
177
+ this._zoomBoundLayers[id] = layer;
178
+ this._updateZoomLevels();
179
+ }
180
+
181
+ // TODO looks ugly, refactor!!!
182
+ if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {
183
+ this._tileLayersNum++;
184
+ this._tileLayersToLoad++;
185
+ layer.on('load', this._onTileLayerLoad, this);
186
+ }
187
+
188
+ this.whenReady(function () {
189
+ layer.onAdd(this);
190
+ this.fire('layeradd', {layer: layer});
191
+ }, this);
192
+
193
+ return this;
194
+ },
195
+
196
+ removeLayer: function (layer) {
197
+ var id = L.stamp(layer);
198
+
199
+ if (!this._layers[id]) { return; }
200
+
201
+ layer.onRemove(this);
202
+
203
+ delete this._layers[id];
204
+ if (this._zoomBoundLayers[id]) {
205
+ delete this._zoomBoundLayers[id];
206
+ this._updateZoomLevels();
207
+ }
208
+
209
+ // TODO looks ugly, refactor
210
+ if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {
211
+ this._tileLayersNum--;
212
+ this._tileLayersToLoad--;
213
+ layer.off('load', this._onTileLayerLoad, this);
214
+ }
215
+
216
+ return this.fire('layerremove', {layer: layer});
217
+ },
218
+
219
+ hasLayer: function (layer) {
220
+ if (!layer) { return false; }
221
+
222
+ return (L.stamp(layer) in this._layers);
223
+ },
224
+
225
+ eachLayer: function (method, context) {
226
+ for (var i in this._layers) {
227
+ method.call(context, this._layers[i]);
228
+ }
229
+ return this;
230
+ },
231
+
232
+ invalidateSize: function (animate) {
233
+ var oldSize = this.getSize();
234
+
235
+ this._sizeChanged = true;
236
+
237
+ if (this.options.maxBounds) {
238
+ this.setMaxBounds(this.options.maxBounds);
239
+ }
240
+
241
+ if (!this._loaded) { return this; }
242
+
243
+ var newSize = this.getSize(),
244
+ offset = oldSize.subtract(newSize).divideBy(2).round();
245
+
246
+ if ((offset.x !== 0) || (offset.y !== 0)) {
247
+ if (animate === true) {
248
+ this.panBy(offset);
249
+ } else {
250
+ this._rawPanBy(offset);
251
+
252
+ this.fire('move');
253
+
254
+ clearTimeout(this._sizeTimer);
255
+ this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);
256
+ }
257
+ this.fire('resize', {
258
+ oldSize: oldSize,
259
+ newSize: newSize
260
+ });
261
+ }
262
+ return this;
263
+ },
264
+
265
+ // TODO handler.addTo
266
+ addHandler: function (name, HandlerClass) {
267
+ if (!HandlerClass) { return; }
268
+
269
+ this[name] = new HandlerClass(this);
270
+
271
+ if (this.options[name]) {
272
+ this[name].enable();
273
+ }
274
+
275
+ return this;
276
+ },
277
+
278
+ remove: function () {
279
+ if (this._loaded) {
280
+ this.fire('unload');
281
+ }
282
+ this._initEvents('off');
283
+ delete this._container._leaflet;
284
+ return this;
285
+ },
286
+
287
+
288
+ // public methods for getting map state
289
+
290
+ getCenter: function () { // (Boolean) -> LatLng
291
+ this._checkIfLoaded();
292
+
293
+ if (!this._moved()) {
294
+ return this._initialCenter;
295
+ }
296
+ return this.layerPointToLatLng(this._getCenterLayerPoint());
297
+ },
298
+
299
+ getZoom: function () {
300
+ return this._zoom;
301
+ },
302
+
303
+ getBounds: function () {
304
+ var bounds = this.getPixelBounds(),
305
+ sw = this.unproject(bounds.getBottomLeft()),
306
+ ne = this.unproject(bounds.getTopRight());
307
+
308
+ return new L.LatLngBounds(sw, ne);
309
+ },
310
+
311
+ 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);
317
+ },
318
+
319
+ 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);
324
+ },
325
+
326
+ getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number
327
+ bounds = L.latLngBounds(bounds);
328
+
329
+ var zoom = this.getMinZoom() - (inside ? 1 : 0),
330
+ maxZoom = this.getMaxZoom(),
331
+ size = this.getSize(),
332
+
333
+ nw = bounds.getNorthWest(),
334
+ se = bounds.getSouthEast(),
335
+
336
+ zoomNotFound = true,
337
+ boundsSize;
338
+
339
+ padding = L.point(padding || [0, 0]);
340
+
341
+ do {
342
+ zoom++;
343
+ boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding);
344
+ zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y;
345
+
346
+ } while (zoomNotFound && zoom <= maxZoom);
347
+
348
+ if (zoomNotFound && inside) {
349
+ return null;
350
+ }
351
+
352
+ return inside ? zoom : zoom - 1;
353
+ },
354
+
355
+ getSize: function () {
356
+ if (!this._size || this._sizeChanged) {
357
+ this._size = new L.Point(
358
+ this._container.clientWidth,
359
+ this._container.clientHeight);
360
+
361
+ this._sizeChanged = false;
362
+ }
363
+ return this._size.clone();
364
+ },
365
+
366
+ getPixelBounds: function () {
367
+ var topLeftPoint = this._getTopLeftPoint();
368
+ return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));
369
+ },
370
+
371
+ getPixelOrigin: function () {
372
+ this._checkIfLoaded();
373
+ return this._initialTopLeftPoint;
374
+ },
375
+
376
+ getPanes: function () {
377
+ return this._panes;
378
+ },
379
+
380
+ getContainer: function () {
381
+ return this._container;
382
+ },
383
+
384
+
385
+ // TODO replace with universal implementation after refactoring projections
386
+
387
+ getZoomScale: function (toZoom) {
388
+ var crs = this.options.crs;
389
+ return crs.scale(toZoom) / crs.scale(this._zoom);
390
+ },
391
+
392
+ getScaleZoom: function (scale) {
393
+ return this._zoom + (Math.log(scale) / Math.LN2);
394
+ },
395
+
396
+
397
+ // conversion methods
398
+
399
+ project: function (latlng, zoom) { // (LatLng[, Number]) -> Point
400
+ zoom = zoom === undefined ? this._zoom : zoom;
401
+ return this.options.crs.latLngToPoint(L.latLng(latlng), zoom);
402
+ },
403
+
404
+ unproject: function (point, zoom) { // (Point[, Number]) -> LatLng
405
+ zoom = zoom === undefined ? this._zoom : zoom;
406
+ return this.options.crs.pointToLatLng(L.point(point), zoom);
407
+ },
408
+
409
+ layerPointToLatLng: function (point) { // (Point)
410
+ var projectedPoint = L.point(point).add(this.getPixelOrigin());
411
+ return this.unproject(projectedPoint);
412
+ },
413
+
414
+ latLngToLayerPoint: function (latlng) { // (LatLng)
415
+ var projectedPoint = this.project(L.latLng(latlng))._round();
416
+ return projectedPoint._subtract(this.getPixelOrigin());
417
+ },
418
+
419
+ containerPointToLayerPoint: function (point) { // (Point)
420
+ return L.point(point).subtract(this._getMapPanePos());
421
+ },
422
+
423
+ layerPointToContainerPoint: function (point) { // (Point)
424
+ return L.point(point).add(this._getMapPanePos());
425
+ },
426
+
427
+ containerPointToLatLng: function (point) {
428
+ var layerPoint = this.containerPointToLayerPoint(L.point(point));
429
+ return this.layerPointToLatLng(layerPoint);
430
+ },
431
+
432
+ latLngToContainerPoint: function (latlng) {
433
+ return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));
434
+ },
435
+
436
+ mouseEventToContainerPoint: function (e) { // (MouseEvent)
437
+ return L.DomEvent.getMousePosition(e, this._container);
438
+ },
439
+
440
+ mouseEventToLayerPoint: function (e) { // (MouseEvent)
441
+ return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));
442
+ },
443
+
444
+ mouseEventToLatLng: function (e) { // (MouseEvent)
445
+ return this.layerPointToLatLng(this.mouseEventToLayerPoint(e));
446
+ },
447
+
448
+
449
+ // map initialization methods
450
+
451
+ _initContainer: function (id) {
452
+ var container = this._container = L.DomUtil.get(id);
453
+
454
+ if (!container) {
455
+ throw new Error('Map container not found.');
456
+ } else if (container._leaflet) {
457
+ throw new Error('Map container is already initialized.');
458
+ }
459
+
460
+ container._leaflet = true;
461
+ },
462
+
463
+ _initLayout: function () {
464
+ var container = this._container;
465
+
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
+ }
475
+
476
+ var position = L.DomUtil.getStyle(container, 'position');
477
+
478
+ if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {
479
+ container.style.position = 'relative';
480
+ }
481
+
482
+ this._initPanes();
483
+
484
+ if (this._initControlPos) {
485
+ this._initControlPos();
486
+ }
487
+ },
488
+
489
+ _initPanes: function () {
490
+ var panes = this._panes = {};
491
+
492
+ this._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container);
493
+
494
+ this._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane);
495
+ panes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane);
496
+ panes.shadowPane = this._createPane('leaflet-shadow-pane');
497
+ panes.overlayPane = this._createPane('leaflet-overlay-pane');
498
+ panes.markerPane = this._createPane('leaflet-marker-pane');
499
+ panes.popupPane = this._createPane('leaflet-popup-pane');
500
+
501
+ var zoomHide = ' leaflet-zoom-hide';
502
+
503
+ if (!this.options.markerZoomAnimation) {
504
+ L.DomUtil.addClass(panes.markerPane, zoomHide);
505
+ L.DomUtil.addClass(panes.shadowPane, zoomHide);
506
+ L.DomUtil.addClass(panes.popupPane, zoomHide);
507
+ }
508
+ },
509
+
510
+ _createPane: function (className, container) {
511
+ return L.DomUtil.create('div', className, container || this._panes.objectsPane);
512
+ },
513
+
514
+ _initLayers: function (layers) {
515
+ layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];
516
+
517
+ this._layers = {};
518
+ this._zoomBoundLayers = {};
519
+ this._tileLayersNum = 0;
520
+
521
+ var i, len;
522
+
523
+ for (i = 0, len = layers.length; i < len; i++) {
524
+ this.addLayer(layers[i]);
525
+ }
526
+ },
527
+
528
+
529
+ // private methods that modify map state
530
+
531
+ _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {
532
+
533
+ var zoomChanged = (this._zoom !== zoom);
534
+
535
+ if (!afterZoomAnim) {
536
+ this.fire('movestart');
537
+
538
+ if (zoomChanged) {
539
+ this.fire('zoomstart');
540
+ }
541
+ }
542
+
543
+ this._zoom = zoom;
544
+ this._initialCenter = center;
545
+
546
+ this._initialTopLeftPoint = this._getNewTopLeftPoint(center);
547
+
548
+ if (!preserveMapOffset) {
549
+ L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
550
+ } else {
551
+ this._initialTopLeftPoint._add(this._getMapPanePos());
552
+ }
553
+
554
+ this._tileLayersToLoad = this._tileLayersNum;
555
+
556
+ var loading = !this._loaded;
557
+ this._loaded = true;
558
+
559
+ if (loading) {
560
+ this.fire('load');
561
+ }
562
+
563
+ this.fire('viewreset', {hard: !preserveMapOffset});
564
+
565
+ this.fire('move');
566
+
567
+ if (zoomChanged || afterZoomAnim) {
568
+ this.fire('zoomend');
569
+ }
570
+
571
+ this.fire('moveend', {hard: !preserveMapOffset});
572
+ },
573
+
574
+ _rawPanBy: function (offset) {
575
+ L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));
576
+ },
577
+
578
+ _getZoomSpan: function () {
579
+ return this.getMaxZoom() - this.getMinZoom();
580
+ },
581
+
582
+ _updateZoomLevels: function () {
583
+ var i,
584
+ minZoom = Infinity,
585
+ maxZoom = -Infinity,
586
+ oldZoomSpan = this._getZoomSpan();
587
+
588
+ for (i in this._zoomBoundLayers) {
589
+ var layer = this._zoomBoundLayers[i];
590
+ if (!isNaN(layer.options.minZoom)) {
591
+ minZoom = Math.min(minZoom, layer.options.minZoom);
592
+ }
593
+ if (!isNaN(layer.options.maxZoom)) {
594
+ maxZoom = Math.max(maxZoom, layer.options.maxZoom);
595
+ }
596
+ }
597
+
598
+ if (i === undefined) { // we have no tilelayers
599
+ this._layersMaxZoom = this._layersMinZoom = undefined;
600
+ } else {
601
+ this._layersMaxZoom = maxZoom;
602
+ this._layersMinZoom = minZoom;
603
+ }
604
+
605
+ if (oldZoomSpan !== this._getZoomSpan()) {
606
+ this.fire('zoomlevelschange');
607
+ }
608
+ },
609
+
610
+ _panInsideMaxBounds: function () {
611
+ this.panInsideBounds(this.options.maxBounds);
612
+ },
613
+
614
+ _checkIfLoaded: function () {
615
+ if (!this._loaded) {
616
+ throw new Error('Set map center and zoom first.');
617
+ }
618
+ },
619
+
620
+ // map events
621
+
622
+ _initEvents: function (onOff) {
623
+ if (!L.DomEvent) { return; }
624
+
625
+ onOff = onOff || 'on';
626
+
627
+ L.DomEvent[onOff](this._container, 'click', this._onMouseClick, this);
628
+
629
+ var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter',
630
+ 'mouseleave', 'mousemove', 'contextmenu'],
631
+ i, len;
632
+
633
+ for (i = 0, len = events.length; i < len; i++) {
634
+ L.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this);
635
+ }
636
+
637
+ if (this.options.trackResize) {
638
+ L.DomEvent[onOff](window, 'resize', this._onResize, this);
639
+ }
640
+ },
641
+
642
+ _onResize: function () {
643
+ L.Util.cancelAnimFrame(this._resizeRequest);
644
+ this._resizeRequest = L.Util.requestAnimFrame(
645
+ this.invalidateSize, this, false, this._container);
646
+ },
647
+
648
+ _onMouseClick: function (e) {
649
+ if (!this._loaded || (this.dragging && this.dragging.moved())) { return; }
650
+
651
+ this.fire('preclick');
652
+ this._fireMouseEvent(e);
653
+ },
654
+
655
+ _fireMouseEvent: function (e) {
656
+ if (!this._loaded) { return; }
657
+
658
+ var type = e.type;
659
+
660
+ type = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type));
661
+
662
+ if (!this.hasEventListeners(type)) { return; }
663
+
664
+ if (type === 'contextmenu') {
665
+ L.DomEvent.preventDefault(e);
666
+ }
667
+
668
+ var containerPoint = this.mouseEventToContainerPoint(e),
669
+ layerPoint = this.containerPointToLayerPoint(containerPoint),
670
+ latlng = this.layerPointToLatLng(layerPoint);
671
+
672
+ this.fire(type, {
673
+ latlng: latlng,
674
+ layerPoint: layerPoint,
675
+ containerPoint: containerPoint,
676
+ originalEvent: e
677
+ });
678
+ },
679
+
680
+ _onTileLayerLoad: function () {
681
+ this._tileLayersToLoad--;
682
+ if (this._tileLayersNum && !this._tileLayersToLoad) {
683
+ this.fire('tilelayersload');
684
+ }
685
+ },
686
+
687
+ whenReady: function (callback, context) {
688
+ if (this._loaded) {
689
+ callback.call(context || this, this);
690
+ } else {
691
+ this.on('load', callback, context);
692
+ }
693
+ return this;
694
+ },
695
+
696
+
697
+ // private methods for getting map state
698
+
699
+ _getMapPanePos: function () {
700
+ return L.DomUtil.getPosition(this._mapPane);
701
+ },
702
+
703
+ _moved: function () {
704
+ var pos = this._getMapPanePos();
705
+ return pos && !pos.equals([0, 0]);
706
+ },
707
+
708
+ _getTopLeftPoint: function () {
709
+ return this.getPixelOrigin().subtract(this._getMapPanePos());
710
+ },
711
+
712
+ _getNewTopLeftPoint: function (center, zoom) {
713
+ var viewHalf = this.getSize()._divideBy(2);
714
+ // TODO round on display, not calculation to increase precision?
715
+ return this.project(center, zoom)._subtract(viewHalf)._round();
716
+ },
717
+
718
+ _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {
719
+ var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());
720
+ return this.project(latlng, newZoom)._subtract(topLeft);
721
+ },
722
+
723
+ // layer point of the current center
724
+ _getCenterLayerPoint: function () {
725
+ return this.containerPointToLayerPoint(this.getSize()._divideBy(2));
726
+ },
727
+
728
+ // offset of the specified place to the current center in pixels
729
+ _getCenterOffset: function (latlng) {
730
+ return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());
731
+ },
732
+
733
+ _limitZoom: function (zoom) {
734
+ var min = this.getMinZoom(),
735
+ max = this.getMaxZoom();
736
+
737
+ return Math.max(min, Math.min(max, zoom));
738
+ }
739
+ });
740
+
741
+ L.map = function (id, options) {
742
+ return new L.Map(id, options);
743
+ };