{"version":3,"sources":["webpack:///./src/components/maps/leaflet-maps/LeafletMap.vue?a151","webpack:///./node_modules/leaflet-map/index.js","webpack:///./src/components/maps/leaflet-maps/LeafletMap.vue","webpack:///src/components/maps/leaflet-maps/LeafletMap.vue","webpack:///./src/components/maps/leaflet-maps/LeafletMap.vue?5b31","webpack:///./src/components/maps/leaflet-maps/LeafletMap.vue?e87c","webpack:///./node_modules/leaflet/dist/leaflet-src.js"],"names":["L","leafletMap","opt","defaultStyle","Icon","Default","imagePath","ensureStyle","mapEl","document","createElement","setAttribute","body","appendChild","map","documentElement","style","height","margin","mapStyle","module","exports","render","_vm","this","_c","_self","staticClass","staticRenderFns","name","mounted","attribution","bindPopup","openPopup","component","window","undefined","oldL","noConflict","Util","extend","dest","i","j","len","src","sources","Array","prototype","slice","call","arguments","length","hasOwnProperty","bind","fn","obj","args","apply","stamp","lastId","key","invokeEach","method","context","concat","limitExecByInterval","time","lock","execOnUnlock","wrapperFn","setTimeout","falseFn","formatNum","num","digits","pow","Math","round","trim","str","replace","splitWords","split","setOptions","options","getParamString","existingUrl","uppercase","params","push","encodeURIComponent","toUpperCase","indexOf","join","template","data","value","Error","isArray","Object","toString","emptyImageUrl","getPrefixed","prefixes","lastTime","timeoutDefer","Date","timeToCall","max","requestFn","requestAnimationFrame","cancelFn","cancelAnimationFrame","id","clearTimeout","requestAnimFrame","immediate","element","cancelAnimFrame","Class","props","NewClass","initialize","_initHooks","callInitHooks","F","proto","constructor","statics","includes","parent","__super__","_initHooksCalled","include","mergeOptions","addInitHook","init","eventsKey","Mixin","Events","addEventListener","types","event","type","indexKey","indexLenKey","typeIndex","events","contextId","action","hasEventListeners","removeEventListener","clearAllEventListeners","listeners","removed","splice","fireEvent","target","addOneTimeEventListener","handler","on","off","once","fire","ie","ielt9","ua","navigator","userAgent","toLowerCase","webkit","chrome","phantomjs","android","android23","search","gecko","mobile","orientation","msPointer","PointerEvent","MSPointerEvent","pointer","pointerEnabled","retina","devicePixelRatio","matchMedia","matches","doc","ie3d","webkit3d","WebKitCSSMatrix","gecko3d","opera3d","any3d","L_DISABLE_3D","touch","L_NO_TOUCH","DocumentTouch","Browser","opera","mobileWebkit","mobileWebkit3d","mobileOpera","Point","x","y","clone","add","point","_add","subtract","_subtract","divideBy","_divideBy","multiplyBy","_multiplyBy","_round","floor","_floor","distanceTo","sqrt","equals","contains","abs","Bounds","a","b","points","min","getCenter","getBottomLeft","getTopRight","getSize","bounds","intersects","min2","max2","xIntersects","yIntersects","isValid","Transformation","c","d","_a","_b","_d","transform","scale","_transform","untransform","DomUtil","get","getElementById","getStyle","el","currentStyle","defaultView","css","getComputedStyle","getViewportOffset","pos","top","left","docBody","docEl","offsetTop","offsetLeft","parseInt","offsetParent","scrollTop","scrollLeft","width","maxWidth","r","getBoundingClientRect","clientLeft","parentNode","documentIsLtr","_docIsLtrCached","_docIsLtr","create","tagName","className","container","hasClass","classList","_getClass","RegExp","test","addClass","classes","_setClass","removeClass","remove","baseVal","setOpacity","opacity","filter","filterName","filters","item","e","Enabled","Opacity","testProp","getTranslateString","is3d","open","close","getScaleString","origin","preTranslateStr","scaleStr","setPosition","disable3D","_leaflet_pos","TRANSFORM","getPosition","TRANSITION","TRANSITION_END","disableTextSelection","DomEvent","preventDefault","enableTextSelection","userSelectProperty","_userSelect","disableImageDrag","enableImageDrag","LatLng","lat","lng","alt","parseFloat","isNaN","DEG_TO_RAD","PI","RAD_TO_DEG","MAX_MARGIN","latLng","precision","other","R","d2r","dLat","dLon","lat1","lat2","sin1","sin","sin2","cos","atan2","wrap","lon","LatLngBounds","southWest","northEast","latlngs","latLngBounds","_southWest","_northEast","pad","bufferRatio","sw","ne","heightBuffer","widthBuffer","getSouthWest","getNorthEast","getNorthWest","getNorth","getWest","getSouthEast","getSouth","getEast","sw2","ne2","latIntersects","lngIntersects","toBBoxString","Projection","SphericalMercator","MAX_LATITUDE","project","latlng","log","tan","unproject","atan","exp","LonLat","CRS","latLngToPoint","zoom","projectedPoint","projection","transformation","pointToLatLng","untransformedPoint","s","Simple","EPSG3857","code","earthRadius","EPSG900913","EPSG4326","Map","crs","fadeAnimation","trackResize","markerZoomAnimation","_initContainer","_initLayout","_onResize","_initEvents","maxBounds","setMaxBounds","center","setView","reset","_handlers","_layers","_zoomBoundLayers","_tileLayersNum","_addLayers","layers","getZoom","_resetView","_limitZoom","setZoom","_loaded","_zoom","zoomIn","delta","zoomOut","setZoomAround","getZoomScale","viewHalf","containerPoint","latLngToContainerPoint","centerOffset","newCenter","containerPointToLatLng","fitBounds","getBounds","paddingTL","paddingTopLeft","padding","paddingBR","paddingBottomRight","getBoundsZoom","maxZoom","paddingOffset","swPoint","nePoint","fitWorld","panTo","pan","panBy","offset","_rawPanBy","_panInsideMaxBounds","panInsideBounds","_limitCenter","addLayer","layer","minZoom","_updateZoomLevels","zoomAnimation","TileLayer","_tileLayersToLoad","_onTileLayerLoad","_layerAdd","removeLayer","onRemove","hasLayer","eachLayer","invalidateSize","animate","oldSize","_sizeChanged","_initialCenter","newSize","oldCenter","debounceMoveend","_sizeTimer","addHandler","HandlerClass","enable","_container","_leaflet","_clearPanes","_clearControlPos","_clearHandlers","_checkIfLoaded","_moved","layerPointToLatLng","_getCenterLayerPoint","getPixelBounds","getMinZoom","_layersMinZoom","getMaxZoom","_layersMaxZoom","Infinity","inside","boundsSize","size","nw","se","zoomNotFound","_size","clientWidth","clientHeight","topLeftPoint","_getTopLeftPoint","getPixelOrigin","_initialTopLeftPoint","getPanes","_panes","getContainer","toZoom","getScaleZoom","LN2","latLngToLayerPoint","containerPointToLayerPoint","_getMapPanePos","layerPointToContainerPoint","layerPoint","mouseEventToContainerPoint","getMousePosition","mouseEventToLayerPoint","mouseEventToLatLng","position","_initPanes","_initControlPos","panes","_mapPane","mapPane","_createPane","_tilePane","tilePane","objectsPane","shadowPane","overlayPane","markerPane","popupPane","zoomHide","removeChild","preserveMapOffset","afterZoomAnim","zoomChanged","_getNewTopLeftPoint","loading","hard","_getZoomSpan","oldZoomSpan","onOff","_onMouseClick","_fireMouseEvent","_resizeRequest","_simulated","dragging","moved","boxZoom","_skipped","originalEvent","disable","whenReady","callback","onAdd","_latLngToNewLayerPoint","newZoom","topLeft","_getCenterOffset","centerPoint","viewBounds","_getBoundsOffset","_limitOffset","newBounds","pxBounds","nwOffset","seOffset","dx","_rebound","dy","right","ceil","Mercator","R_MINOR","R_MAJOR","r2","tmp","eccent","con","ts","phi","numIter","tol","dphi","EPSG3395","m","tileSize","subdomains","errorTileUrl","zoomOffset","unloadInvisibleTiles","updateWhenIdle","url","detectRetina","_url","_map","_animated","_zoomAnimated","_reset","_update","_animateZoom","_endZoomAnim","_limitedUpdate","addTo","bringToFront","pane","_setAutoZIndex","bringToBack","insertBefore","firstChild","getAttribution","_updateOpacity","setZIndex","zIndex","_updateZIndex","setUrl","noRedraw","redraw","compare","children","edgeZIndex","isFinite","tiles","_tiles","_bgBuffer","_tileContainer","tile","_tilesToLoad","reuseTiles","_unusedTiles","innerHTML","_clearBgBuffer","_getTileSize","zoomN","maxNativeZoom","tileBounds","_addTilesFromCenterOut","_removeOtherTiles","queue","_tileShouldBeLoaded","tilesToLoad","sort","fragment","createDocumentFragment","_addTile","tilePoint","continuousWorld","limit","_getWrapTileNum","noWrap","nwPoint","sePoint","kArr","_removeTile","onload","tilePos","_getTilePos","_getTile","_loadTile","_getZoomForUrl","zoomReverse","getTileUrl","_getSubdomain","z","_adjustTilePoint","tms","index","pop","_resetTile","_createTile","galleryimg","onselectstart","onmousemove","WebkitBackfaceVisibility","_layer","_tileOnLoad","onerror","_tileOnError","_tileLoaded","_clearBgBufferTimer","newUrl","tileLayer","WMS","defaultWmsParams","service","request","version","styles","format","transparent","wmsParams","_crs","_wmsVersion","projectionKey","bbox","setParams","wms","Canvas","async","_redrawTile","drawTile","_tilePoint","tileDrawn","canvas","ImageOverlay","_bounds","_image","_initImage","_onImageLoad","image","imageOverlay","createIcon","oldIcon","_createIcon","createShadow","img","_getIconUrl","_createImg","_setIconStyles","anchor","shadowAnchor","iconAnchor","marginLeft","marginTop","icon","iconSize","popupAnchor","shadowSize","path","scripts","getElementsByTagName","leafletRe","match","Marker","title","clickable","draggable","keyboard","zIndexOffset","riseOnHover","riseOffset","_latlng","update","_initIcon","_removeIcon","_removeShadow","getLatLng","setLatLng","setZIndexOffset","setIcon","_popup","_icon","_setPos","animation","classToAdd","addIcon","tabIndex","_initInteraction","_bringToFront","_resetZIndex","newShadow","_shadow","addShadow","_zIndex","_onKeyPress","Handler","MarkerDrag","wasDragged","stopPropagation","_enabled","keyCode","marker","DivIcon","html","div","bgPos","backgroundPosition","divIcon","closePopupOnClick","Popup","minWidth","autoPan","closeButton","autoPanPadding","keepInView","source","_source","_isOpen","animFade","_getEvents","popup","openOn","offsetWidth","_updatePosition","_adjustPan","getContent","_content","setContent","content","visibility","_updateContent","_updateLayout","viewreset","zoomanim","_zoomAnimation","closeOnClick","preclick","_close","moveend","closePopup","prefix","containerClass","_closeButton","href","disableClickPropagation","_onCloseButtonClick","wrapper","_wrapper","_contentNode","disableScrollPropagation","_tipContainer","_tip","hasChildNodes","whiteSpace","offsetHeight","maxHeight","scrolledClass","_containerWidth","animated","_containerBottom","_containerLeft","bottom","containerHeight","containerWidth","layerPos","containerPos","autoPanPaddingTopLeft","autoPanPaddingBottomRight","stop","togglePopup","_popupHandlersAdded","_movePopup","setPopupContent","unbindPopup","getPopup","LayerGroup","getLayerId","clearLayers","invoke","methodName","getLayer","getLayers","layerGroup","FeatureGroup","EVENTS","_propagateEvent","_popupContent","_popupOptions","setStyle","featureGroup","Path","CLIP_PADDING","outerWidth","outerHeight","stroke","color","dashArray","lineCap","lineJoin","weight","fill","fillColor","fillOpacity","_initElements","projectLatlngs","_updatePath","_pathRoot","vml","_stroke","_fill","_updateStyle","_updatePathViewport","p","panePos","_pathViewport","SVG_NS","svg","createElementNS","createSVGRect","SVG","root","lastChild","first","getPathString","_createElement","_initPathRoot","_initPath","_initStyle","_path","pointerEvents","removeAttribute","_animatePathZoom","_endPathZoom","_updateSvgViewport","_pathZooming","vp","_openPopup","_latlngs","shape","behavior","adj","VML","namespaces","coordsize","stroked","filled","endcap","dashStyle","joinstyle","display","v","getContext","L_PREFER_CANVAS","CANVAS","_requestUpdate","_onClick","_onMouseMove","_updateRequest","_fireMapMoveEnd","_ctx","_canvasCtx","lineWidth","strokeStyle","fillStyle","_drawPath","len2","drawMethod","beginPath","_parts","Polygon","closePath","_checkIfEmpty","ctx","save","globalAlpha","fillRule","restore","_containsPoint","_animatingZoom","cursor","_mouseInside","_updateCanvasViewport","translate","LineUtil","simplify","tolerance","sqTolerance","_reducePoints","_simplifyDP","pointToSegmentDistance","p1","p2","_sqClosestPointOnSegment","closestPointOnSegment","ArrayConstructor","Uint8Array","markers","_simplifyDPStep","newPoints","last","sqDist","maxSqDist","reducedPoints","prev","_sqDist","clipSegment","useLastCode","codeOut","newCode","codeA","_lastCode","_getBitCode","codeB","_getEdgeIntersection","t","dot","Polyline","_convertLatLngs","smoothFactor","noClip","_originalPoints","_getPathPartStr","getLatLngs","setLatLngs","addLatLng","spliceLatLngs","closestLayerPoint","minDistance","parts","minPoint","jLen","distance","overwrite","_clipPoints","k","segment","lu","_simplifyPoints","polyline","PolyUtil","clipPolygon","clippedPoints","edge","edges","_code","_initWithHoles","hole","_holes","_holePoints","newParts","clipped","polygon","createMulti","Klass","_options","MultiPolyline","MultiPolygon","multiPolyline","multiPolygon","Rectangle","_boundsToLatLngs","setBounds","rectangle","Circle","radius","_mRadius","setRadius","lngRadius","_getLngRadius","pointLeft","_point","_radius","latRadius","getRadius","_getLatRadius","circle","CircleMarker","circleMarker","closed","dist","part","w","arc","w2","GeoJSON","geojson","addData","feature","features","geometries","geometry","coordinates","geometryToLayer","pointToLayer","coordsToLatLng","asFeature","defaultOptions","resetStyle","onEachFeature","_setLayerStyle","vectorOptions","coords","coordsToLatLngs","properties","levelsDeep","latLngToCoords","latLngsToCoords","latLngs","getFeature","newGeometry","geoJSON","PointToGeoJSON","toGeoJSON","multiToGeoJSON","json","jsons","isGeometryCollection","geoJson","addListener","originalHandler","newType","_getEvent","addPointerListener","addDoubleTapListener","_checkMouse","_filterClick","attachEvent","removeListener","removePointerListener","removeDoubleTapListener","detachEvent","cancelBubble","Draggable","START","_fakeStop","returnValue","clientX","clientY","rect","clientTop","getWheelDelta","wheelDelta","detail","_skipEvents","skipped","related","relatedTarget","err","caller","callee","Event","timeStamp","elapsed","_lastClick","_simulatedClick","END","mousedown","touchstart","pointerdown","MSPointerDown","MOVE","dragStartTarget","_element","_dragStartTarget","_onDown","shiftKey","which","button","touches","_disabled","_moving","_startPoint","_startPos","_newPos","_onMove","_onUp","newPoint","_lastTarget","srcElement","_animRequest","addHooks","removeHooks","enabled","inertia","inertiaDeceleration","inertiaMaxSpeed","inertiaThreshold","easeLinearity","worldCopyJump","Drag","_draggable","_onDragStart","_onDrag","_onDragEnd","_onPreDrag","_onViewReset","_panAnim","_positions","_times","_lastTime","_lastPos","shift","pxCenter","pxWorldCenter","_initialWorldOffset","_worldWidth","worldWidth","halfWidth","newX1","newX2","newX","delay","noInertia","direction","duration","ease","speedVector","speed","limitedSpeed","limitedSpeedVector","decelerationDuration","noMoveStart","doubleClickZoom","DoubleClickZoom","_onDoubleClick","scrollWheelZoom","ScrollWheelZoom","_onWheelScroll","_delta","_lastMousePos","_startTime","_timer","_performZoom","_touchstart","_touchend","doubleTap","pre","touchend","trackedTouches","onTouchStart","count","pointerId","now","onTouchEnd","idx","prop","newTouch","endElement","POINTER_CANCEL","POINTER_DOWN","POINTER_MOVE","POINTER_UP","_pointers","_pointerDocumentListener","addPointerListenerStart","addPointerListenerEnd","addPointerListenerMove","pointers","cb","pointerType","MSPOINTER_TYPE_MOUSE","alreadyInArray","changedTouches","internalCb","buttons","touchZoom","bounceAtZoomLimits","TouchZoom","_onTouchStart","_zooming","viewCenter","_startCenter","_startDist","_centerOffset","_onTouchMove","_onTouchEnd","_scale","_updateOnMove","_getScaleOrigin","oldZoom","floatZoomDelta","roundZoomDelta","tap","tapTolerance","Tap","_fireClick","_holdTimeout","_isTapValid","_simulateEvent","simulatedEvent","createEvent","initMouseEvent","screenX","screenY","dispatchEvent","BoxZoom","_pane","_onMouseDown","_startLayerPoint","_onMouseUp","_onKeyDown","_box","startPoint","box","newPos","_finish","boxZoomBounds","keyboardPanOffset","keyboardZoomOffset","Keyboard","keyCodes","down","up","_setPanOffset","_setZoomOffset","_onFocus","_onBlur","_addHooks","_removeHooks","_focused","focus","scrollTo","keys","_panKeys","codes","_zoomKeys","_inProgress","_marker","shadow","iconPos","Control","removeControl","addControl","corner","_controlCorners","removeFrom","_refocusOnMap","control","corners","l","_controlContainer","createCorner","vSide","hSide","Zoom","zoomInText","zoomInTitle","zoomOutText","zoomOutTitle","zoomName","_zoomInButton","_createButton","_zoomIn","_zoomOutButton","_zoomOut","_updateDisabled","link","zoomControl","Attribution","_attributions","addAttribution","_onLayerAdd","_onLayerRemove","setPrefix","text","removeAttribution","attribs","prefixAndAttribs","attributionControl","Scale","metric","imperial","_addScales","_mScale","_iScale","centerLat","halfWorldMeters","maxMeters","_updateScales","_updateMetric","_updateImperial","meters","_getRoundNum","_getScaleWidth","maxMiles","miles","feet","maxFeet","ratio","pow10","Layers","collapsed","autoZIndex","baseLayers","overlays","_lastZIndex","_handlingClick","_addLayer","_onLayerChange","addBaseLayer","addOverlay","form","_form","_expand","_collapse","_layersLink","_onInputClick","_baseLayersList","_separator","_overlaysList","overlay","baseLayersPresent","overlaysPresent","_addItem","_createRadioElement","checked","radioHtml","radioFragment","input","label","defaultChecked","layerId","inputs","inputsLen","PosAnimation","run","_el","_onTransitionEnd","_stepTimer","setInterval","_onStep","_getPos","stepPos","_transformRe","clearInterval","_tryAnimatedZoom","_tryAnimatedPan","_onPanTransitionStep","_onPanTransitionEnd","_duration","_easeOutPower","_offset","_animate","_step","_complete","_animId","_runFrame","_easeOut","progress","zoomAnimationThreshold","_catchTransitionEnd","propertyName","_onZoomTransitionEnd","_nothingToAnimate","getElementsByClassName","backwards","forTouchZoom","_animateToCenter","_animateToZoom","_animating","_prepareBgBuffer","bg","initialTransform","front","bgLoaded","_getLoadedTilesPercentage","frontLoaded","_stopLoadingImages","complete","_defaultLocateOptions","watch","timeout","maximumAge","enableHighAccuracy","locate","_locateOptions","geolocation","_handleGeolocationError","message","onResponse","_handleGeolocationResponse","onError","_locationWatchId","watchPosition","getCurrentPosition","stopLocate","clearWatch","error","latitude","longitude","latAccuracy","accuracy","lngAccuracy","timestamp"],"mappings":"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","file":"js/chunk-364deb43.84db6008.js","sourcesContent":["export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/index.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-2!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LeafletMap.vue?vue&type=style&index=0&id=0e0590b8&prod&lang=scss&\"","var L = require('leaflet')\n\nfunction leafletMap (opt) {\n opt = opt || {\n defaultStyle: true\n }\n if (opt.defaultStyle) {\n L.Icon.Default.imagePath = '//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/images'\n ensureStyle()\n }\n\n var mapEl = document.createElement('div')\n mapEl.setAttribute('style','width:100%;height:100%;position:inherit;')\n document.body.appendChild(mapEl)\n\n return L.map(mapEl)\n}\n\nfunction ensureStyle() {\n document.documentElement.style.height = '100%'\n document.body.style.height = '100%'\n document.body.style.margin = '0'\n\n var mapStyle = document.createElement('link')\n mapStyle.setAttribute('rel','stylesheet')\n mapStyle.setAttribute('href','//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.css')\n document.body.appendChild(mapStyle)\n}\n\nmodule.exports = leafletMap","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"leaflet-map\"})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n
\n\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LeafletMap.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LeafletMap.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./LeafletMap.vue?vue&type=template&id=0e0590b8&\"\nimport script from \"./LeafletMap.vue?vue&type=script&lang=js&\"\nexport * from \"./LeafletMap.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LeafletMap.vue?vue&type=style&index=0&id=0e0590b8&prod&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/*\n Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com\n (c) 2010-2013, Vladimir Agafonkin\n (c) 2010-2011, CloudMade\n*/\n(function (window, document, undefined) {\r\nvar oldL = window.L,\r\n L = {};\r\n\r\nL.version = '0.7.7';\r\n\r\n// define Leaflet for Node module pattern loaders, including Browserify\r\nif (typeof module === 'object' && typeof module.exports === 'object') {\r\n\tmodule.exports = L;\r\n\r\n// define Leaflet as an AMD module\r\n} else if (typeof define === 'function' && define.amd) {\r\n\tdefine(L);\r\n}\r\n\r\n// define Leaflet as a global L variable, saving the original L to restore later if needed\r\n\r\nL.noConflict = function () {\r\n\twindow.L = oldL;\r\n\treturn this;\r\n};\r\n\r\nwindow.L = L;\r\n\n\n/*\r\n * L.Util contains various utility functions used throughout Leaflet code.\r\n */\r\n\r\nL.Util = {\r\n\textend: function (dest) { // (Object[, Object, ...]) ->\r\n\t\tvar sources = Array.prototype.slice.call(arguments, 1),\r\n\t\t i, j, len, src;\r\n\r\n\t\tfor (j = 0, len = sources.length; j < len; j++) {\r\n\t\t\tsrc = sources[j] || {};\r\n\t\t\tfor (i in src) {\r\n\t\t\t\tif (src.hasOwnProperty(i)) {\r\n\t\t\t\t\tdest[i] = src[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn dest;\r\n\t},\r\n\r\n\tbind: function (fn, obj) { // (Function, Object) -> Function\r\n\t\tvar args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null;\r\n\t\treturn function () {\r\n\t\t\treturn fn.apply(obj, args || arguments);\r\n\t\t};\r\n\t},\r\n\r\n\tstamp: (function () {\r\n\t\tvar lastId = 0,\r\n\t\t key = '_leaflet_id';\r\n\t\treturn function (obj) {\r\n\t\t\tobj[key] = obj[key] || ++lastId;\r\n\t\t\treturn obj[key];\r\n\t\t};\r\n\t}()),\r\n\r\n\tinvokeEach: function (obj, method, context) {\r\n\t\tvar i, args;\r\n\r\n\t\tif (typeof obj === 'object') {\r\n\t\t\targs = Array.prototype.slice.call(arguments, 3);\r\n\r\n\t\t\tfor (i in obj) {\r\n\t\t\t\tmethod.apply(context, [i, obj[i]].concat(args));\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\tlimitExecByInterval: function (fn, time, context) {\r\n\t\tvar lock, execOnUnlock;\r\n\r\n\t\treturn function wrapperFn() {\r\n\t\t\tvar args = arguments;\r\n\r\n\t\t\tif (lock) {\r\n\t\t\t\texecOnUnlock = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tlock = true;\r\n\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tlock = false;\r\n\r\n\t\t\t\tif (execOnUnlock) {\r\n\t\t\t\t\twrapperFn.apply(context, args);\r\n\t\t\t\t\texecOnUnlock = false;\r\n\t\t\t\t}\r\n\t\t\t}, time);\r\n\r\n\t\t\tfn.apply(context, args);\r\n\t\t};\r\n\t},\r\n\r\n\tfalseFn: function () {\r\n\t\treturn false;\r\n\t},\r\n\r\n\tformatNum: function (num, digits) {\r\n\t\tvar pow = Math.pow(10, digits || 5);\r\n\t\treturn Math.round(num * pow) / pow;\r\n\t},\r\n\r\n\ttrim: function (str) {\r\n\t\treturn str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\r\n\t},\r\n\r\n\tsplitWords: function (str) {\r\n\t\treturn L.Util.trim(str).split(/\\s+/);\r\n\t},\r\n\r\n\tsetOptions: function (obj, options) {\r\n\t\tobj.options = L.extend({}, obj.options, options);\r\n\t\treturn obj.options;\r\n\t},\r\n\r\n\tgetParamString: function (obj, existingUrl, uppercase) {\r\n\t\tvar params = [];\r\n\t\tfor (var i in obj) {\r\n\t\t\tparams.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));\r\n\t\t}\r\n\t\treturn ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');\r\n\t},\r\n\ttemplate: function (str, data) {\r\n\t\treturn str.replace(/\\{ *([\\w_]+) *\\}/g, function (str, key) {\r\n\t\t\tvar value = data[key];\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\tthrow new Error('No value provided for variable ' + str);\r\n\t\t\t} else if (typeof value === 'function') {\r\n\t\t\t\tvalue = value(data);\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t});\r\n\t},\r\n\r\n\tisArray: Array.isArray || function (obj) {\r\n\t\treturn (Object.prototype.toString.call(obj) === '[object Array]');\r\n\t},\r\n\r\n\temptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='\r\n};\r\n\r\n(function () {\r\n\r\n\t// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n\r\n\tfunction getPrefixed(name) {\r\n\t\tvar i, fn,\r\n\t\t prefixes = ['webkit', 'moz', 'o', 'ms'];\r\n\r\n\t\tfor (i = 0; i < prefixes.length && !fn; i++) {\r\n\t\t\tfn = window[prefixes[i] + name];\r\n\t\t}\r\n\r\n\t\treturn fn;\r\n\t}\r\n\r\n\tvar lastTime = 0;\r\n\r\n\tfunction timeoutDefer(fn) {\r\n\t\tvar time = +new Date(),\r\n\t\t timeToCall = Math.max(0, 16 - (time - lastTime));\r\n\r\n\t\tlastTime = time + timeToCall;\r\n\t\treturn window.setTimeout(fn, timeToCall);\r\n\t}\r\n\r\n\tvar requestFn = window.requestAnimationFrame ||\r\n\t getPrefixed('RequestAnimationFrame') || timeoutDefer;\r\n\r\n\tvar cancelFn = window.cancelAnimationFrame ||\r\n\t getPrefixed('CancelAnimationFrame') ||\r\n\t getPrefixed('CancelRequestAnimationFrame') ||\r\n\t function (id) { window.clearTimeout(id); };\r\n\r\n\r\n\tL.Util.requestAnimFrame = function (fn, context, immediate, element) {\r\n\t\tfn = L.bind(fn, context);\r\n\r\n\t\tif (immediate && requestFn === timeoutDefer) {\r\n\t\t\tfn();\r\n\t\t} else {\r\n\t\t\treturn requestFn.call(window, fn, element);\r\n\t\t}\r\n\t};\r\n\r\n\tL.Util.cancelAnimFrame = function (id) {\r\n\t\tif (id) {\r\n\t\t\tcancelFn.call(window, id);\r\n\t\t}\r\n\t};\r\n\r\n}());\r\n\r\n// shortcuts for most used utility functions\r\nL.extend = L.Util.extend;\r\nL.bind = L.Util.bind;\r\nL.stamp = L.Util.stamp;\r\nL.setOptions = L.Util.setOptions;\r\n\n\n/*\r\n * L.Class powers the OOP facilities of the library.\r\n * Thanks to John Resig and Dean Edwards for inspiration!\r\n */\r\n\r\nL.Class = function () {};\r\n\r\nL.Class.extend = function (props) {\r\n\r\n\t// extended class with the new prototype\r\n\tvar NewClass = function () {\r\n\r\n\t\t// call the constructor\r\n\t\tif (this.initialize) {\r\n\t\t\tthis.initialize.apply(this, arguments);\r\n\t\t}\r\n\r\n\t\t// call all constructor hooks\r\n\t\tif (this._initHooks) {\r\n\t\t\tthis.callInitHooks();\r\n\t\t}\r\n\t};\r\n\r\n\t// instantiate class without calling constructor\r\n\tvar F = function () {};\r\n\tF.prototype = this.prototype;\r\n\r\n\tvar proto = new F();\r\n\tproto.constructor = NewClass;\r\n\r\n\tNewClass.prototype = proto;\r\n\r\n\t//inherit parent's statics\r\n\tfor (var i in this) {\r\n\t\tif (this.hasOwnProperty(i) && i !== 'prototype') {\r\n\t\t\tNewClass[i] = this[i];\r\n\t\t}\r\n\t}\r\n\r\n\t// mix static properties into the class\r\n\tif (props.statics) {\r\n\t\tL.extend(NewClass, props.statics);\r\n\t\tdelete props.statics;\r\n\t}\r\n\r\n\t// mix includes into the prototype\r\n\tif (props.includes) {\r\n\t\tL.Util.extend.apply(null, [proto].concat(props.includes));\r\n\t\tdelete props.includes;\r\n\t}\r\n\r\n\t// merge options\r\n\tif (props.options && proto.options) {\r\n\t\tprops.options = L.extend({}, proto.options, props.options);\r\n\t}\r\n\r\n\t// mix given properties into the prototype\r\n\tL.extend(proto, props);\r\n\r\n\tproto._initHooks = [];\r\n\r\n\tvar parent = this;\r\n\t// jshint camelcase: false\r\n\tNewClass.__super__ = parent.prototype;\r\n\r\n\t// add method for calling all hooks\r\n\tproto.callInitHooks = function () {\r\n\r\n\t\tif (this._initHooksCalled) { return; }\r\n\r\n\t\tif (parent.prototype.callInitHooks) {\r\n\t\t\tparent.prototype.callInitHooks.call(this);\r\n\t\t}\r\n\r\n\t\tthis._initHooksCalled = true;\r\n\r\n\t\tfor (var i = 0, len = proto._initHooks.length; i < len; i++) {\r\n\t\t\tproto._initHooks[i].call(this);\r\n\t\t}\r\n\t};\r\n\r\n\treturn NewClass;\r\n};\r\n\r\n\r\n// method for adding properties to prototype\r\nL.Class.include = function (props) {\r\n\tL.extend(this.prototype, props);\r\n};\r\n\r\n// merge new default options to the Class\r\nL.Class.mergeOptions = function (options) {\r\n\tL.extend(this.prototype.options, options);\r\n};\r\n\r\n// add a constructor hook\r\nL.Class.addInitHook = function (fn) { // (Function) || (String, args...)\r\n\tvar args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\tvar init = typeof fn === 'function' ? fn : function () {\r\n\t\tthis[fn].apply(this, args);\r\n\t};\r\n\r\n\tthis.prototype._initHooks = this.prototype._initHooks || [];\r\n\tthis.prototype._initHooks.push(init);\r\n};\r\n\n\n/*\r\n * L.Mixin.Events is used to add custom events functionality to Leaflet classes.\r\n */\r\n\r\nvar eventsKey = '_leaflet_events';\r\n\r\nL.Mixin = {};\r\n\r\nL.Mixin.Events = {\r\n\r\n\taddEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object])\r\n\r\n\t\t// types can be a map of types/handlers\r\n\t\tif (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar events = this[eventsKey] = this[eventsKey] || {},\r\n\t\t contextId = context && context !== this && L.stamp(context),\r\n\t\t i, len, event, type, indexKey, indexLenKey, typeIndex;\r\n\r\n\t\t// types can be a string of space-separated words\r\n\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\tfor (i = 0, len = types.length; i < len; i++) {\r\n\t\t\tevent = {\r\n\t\t\t\taction: fn,\r\n\t\t\t\tcontext: context || this\r\n\t\t\t};\r\n\t\t\ttype = types[i];\r\n\r\n\t\t\tif (contextId) {\r\n\t\t\t\t// store listeners of a particular context in a separate hash (if it has an id)\r\n\t\t\t\t// gives a major performance boost when removing thousands of map layers\r\n\r\n\t\t\t\tindexKey = type + '_idx';\r\n\t\t\t\tindexLenKey = indexKey + '_len';\r\n\r\n\t\t\t\ttypeIndex = events[indexKey] = events[indexKey] || {};\r\n\r\n\t\t\t\tif (!typeIndex[contextId]) {\r\n\t\t\t\t\ttypeIndex[contextId] = [];\r\n\r\n\t\t\t\t\t// keep track of the number of keys in the index to quickly check if it's empty\r\n\t\t\t\t\tevents[indexLenKey] = (events[indexLenKey] || 0) + 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttypeIndex[contextId].push(event);\r\n\r\n\r\n\t\t\t} else {\r\n\t\t\t\tevents[type] = events[type] || [];\r\n\t\t\t\tevents[type].push(event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasEventListeners: function (type) { // (String) -> Boolean\r\n\t\tvar events = this[eventsKey];\r\n\t\treturn !!events && ((type in events && events[type].length > 0) ||\r\n\t\t (type + '_idx' in events && events[type + '_idx_len'] > 0));\r\n\t},\r\n\r\n\tremoveEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object])\r\n\r\n\t\tif (!this[eventsKey]) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (!types) {\r\n\t\t\treturn this.clearAllEventListeners();\r\n\t\t}\r\n\r\n\t\tif (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar events = this[eventsKey],\r\n\t\t contextId = context && context !== this && L.stamp(context),\r\n\t\t i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed;\r\n\r\n\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\tfor (i = 0, len = types.length; i < len; i++) {\r\n\t\t\ttype = types[i];\r\n\t\t\tindexKey = type + '_idx';\r\n\t\t\tindexLenKey = indexKey + '_len';\r\n\r\n\t\t\ttypeIndex = events[indexKey];\r\n\r\n\t\t\tif (!fn) {\r\n\t\t\t\t// clear all listeners for a type if function isn't specified\r\n\t\t\t\tdelete events[type];\r\n\t\t\t\tdelete events[indexKey];\r\n\t\t\t\tdelete events[indexLenKey];\r\n\r\n\t\t\t} else {\r\n\t\t\t\tlisteners = contextId && typeIndex ? typeIndex[contextId] : events[type];\r\n\r\n\t\t\t\tif (listeners) {\r\n\t\t\t\t\tfor (j = listeners.length - 1; j >= 0; j--) {\r\n\t\t\t\t\t\tif ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) {\r\n\t\t\t\t\t\t\tremoved = listeners.splice(j, 1);\r\n\t\t\t\t\t\t\t// set the old action to a no-op, because it is possible\r\n\t\t\t\t\t\t\t// that the listener is being iterated over as part of a dispatch\r\n\t\t\t\t\t\t\tremoved[0].action = L.Util.falseFn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (context && typeIndex && (listeners.length === 0)) {\r\n\t\t\t\t\t\tdelete typeIndex[contextId];\r\n\t\t\t\t\t\tevents[indexLenKey]--;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclearAllEventListeners: function () {\r\n\t\tdelete this[eventsKey];\r\n\t\treturn this;\r\n\t},\r\n\r\n\tfireEvent: function (type, data) { // (String[, Object])\r\n\t\tif (!this.hasEventListeners(type)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar event = L.Util.extend({}, data, { type: type, target: this });\r\n\r\n\t\tvar events = this[eventsKey],\r\n\t\t listeners, i, len, typeIndex, contextId;\r\n\r\n\t\tif (events[type]) {\r\n\t\t\t// make sure adding/removing listeners inside other listeners won't cause infinite loop\r\n\t\t\tlisteners = events[type].slice();\r\n\r\n\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\tlisteners[i].action.call(listeners[i].context, event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// fire event for the context-indexed listeners as well\r\n\t\ttypeIndex = events[type + '_idx'];\r\n\r\n\t\tfor (contextId in typeIndex) {\r\n\t\t\tlisteners = typeIndex[contextId].slice();\r\n\r\n\t\t\tif (listeners) {\r\n\t\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\t\tlisteners[i].action.call(listeners[i].context, event);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddOneTimeEventListener: function (types, fn, context) {\r\n\r\n\t\tif (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar handler = L.bind(function () {\r\n\t\t\tthis\r\n\t\t\t .removeEventListener(types, fn, context)\r\n\t\t\t .removeEventListener(types, handler, context);\r\n\t\t}, this);\r\n\r\n\t\treturn this\r\n\t\t .addEventListener(types, fn, context)\r\n\t\t .addEventListener(types, handler, context);\r\n\t}\r\n};\r\n\r\nL.Mixin.Events.on = L.Mixin.Events.addEventListener;\r\nL.Mixin.Events.off = L.Mixin.Events.removeEventListener;\r\nL.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener;\r\nL.Mixin.Events.fire = L.Mixin.Events.fireEvent;\r\n\n\n/*\r\n * L.Browser handles different browser and feature detections for internal Leaflet use.\r\n */\r\n\r\n(function () {\r\n\r\n\tvar ie = 'ActiveXObject' in window,\r\n\t\tielt9 = ie && !document.addEventListener,\r\n\r\n\t // terrible browser detection to work around Safari / iOS / Android browser bugs\r\n\t ua = navigator.userAgent.toLowerCase(),\r\n\t webkit = ua.indexOf('webkit') !== -1,\r\n\t chrome = ua.indexOf('chrome') !== -1,\r\n\t phantomjs = ua.indexOf('phantom') !== -1,\r\n\t android = ua.indexOf('android') !== -1,\r\n\t android23 = ua.search('android [23]') !== -1,\r\n\t\tgecko = ua.indexOf('gecko') !== -1,\r\n\r\n\t mobile = typeof orientation !== undefined + '',\r\n\t msPointer = !window.PointerEvent && window.MSPointerEvent,\r\n\t\tpointer = (window.PointerEvent && window.navigator.pointerEnabled) ||\r\n\t\t\t\t msPointer,\r\n\t retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) ||\r\n\t ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') &&\r\n\t window.matchMedia('(min-resolution:144dpi)').matches),\r\n\r\n\t doc = document.documentElement,\r\n\t ie3d = ie && ('transition' in doc.style),\r\n\t webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,\r\n\t gecko3d = 'MozPerspective' in doc.style,\r\n\t opera3d = 'OTransition' in doc.style,\r\n\t any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs;\r\n\r\n\tvar touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in window ||\r\n\t\t(window.DocumentTouch && document instanceof window.DocumentTouch));\r\n\r\n\tL.Browser = {\r\n\t\tie: ie,\r\n\t\tielt9: ielt9,\r\n\t\twebkit: webkit,\r\n\t\tgecko: gecko && !webkit && !window.opera && !ie,\r\n\r\n\t\tandroid: android,\r\n\t\tandroid23: android23,\r\n\r\n\t\tchrome: chrome,\r\n\r\n\t\tie3d: ie3d,\r\n\t\twebkit3d: webkit3d,\r\n\t\tgecko3d: gecko3d,\r\n\t\topera3d: opera3d,\r\n\t\tany3d: any3d,\r\n\r\n\t\tmobile: mobile,\r\n\t\tmobileWebkit: mobile && webkit,\r\n\t\tmobileWebkit3d: mobile && webkit3d,\r\n\t\tmobileOpera: mobile && window.opera,\r\n\r\n\t\ttouch: touch,\r\n\t\tmsPointer: msPointer,\r\n\t\tpointer: pointer,\r\n\r\n\t\tretina: retina\r\n\t};\r\n\r\n}());\r\n\n\n/*\r\n * L.Point represents a point with x and y coordinates.\r\n */\r\n\r\nL.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) {\r\n\tthis.x = (round ? Math.round(x) : x);\r\n\tthis.y = (round ? Math.round(y) : y);\r\n};\r\n\r\nL.Point.prototype = {\r\n\r\n\tclone: function () {\r\n\t\treturn new L.Point(this.x, this.y);\r\n\t},\r\n\r\n\t// non-destructive, returns a new point\r\n\tadd: function (point) {\r\n\t\treturn this.clone()._add(L.point(point));\r\n\t},\r\n\r\n\t// destructive, used directly for performance in situations where it's safe to modify existing point\r\n\t_add: function (point) {\r\n\t\tthis.x += point.x;\r\n\t\tthis.y += point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsubtract: function (point) {\r\n\t\treturn this.clone()._subtract(L.point(point));\r\n\t},\r\n\r\n\t_subtract: function (point) {\r\n\t\tthis.x -= point.x;\r\n\t\tthis.y -= point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdivideBy: function (num) {\r\n\t\treturn this.clone()._divideBy(num);\r\n\t},\r\n\r\n\t_divideBy: function (num) {\r\n\t\tthis.x /= num;\r\n\t\tthis.y /= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tmultiplyBy: function (num) {\r\n\t\treturn this.clone()._multiplyBy(num);\r\n\t},\r\n\r\n\t_multiplyBy: function (num) {\r\n\t\tthis.x *= num;\r\n\t\tthis.y *= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tround: function () {\r\n\t\treturn this.clone()._round();\r\n\t},\r\n\r\n\t_round: function () {\r\n\t\tthis.x = Math.round(this.x);\r\n\t\tthis.y = Math.round(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tfloor: function () {\r\n\t\treturn this.clone()._floor();\r\n\t},\r\n\r\n\t_floor: function () {\r\n\t\tthis.x = Math.floor(this.x);\r\n\t\tthis.y = Math.floor(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdistanceTo: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\tvar x = point.x - this.x,\r\n\t\t y = point.y - this.y;\r\n\r\n\t\treturn Math.sqrt(x * x + y * y);\r\n\t},\r\n\r\n\tequals: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn point.x === this.x &&\r\n\t\t point.y === this.y;\r\n\t},\r\n\r\n\tcontains: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn Math.abs(point.x) <= Math.abs(this.x) &&\r\n\t\t Math.abs(point.y) <= Math.abs(this.y);\r\n\t},\r\n\r\n\ttoString: function () {\r\n\t\treturn 'Point(' +\r\n\t\t L.Util.formatNum(this.x) + ', ' +\r\n\t\t L.Util.formatNum(this.y) + ')';\r\n\t}\r\n};\r\n\r\nL.point = function (x, y, round) {\r\n\tif (x instanceof L.Point) {\r\n\t\treturn x;\r\n\t}\r\n\tif (L.Util.isArray(x)) {\r\n\t\treturn new L.Point(x[0], x[1]);\r\n\t}\r\n\tif (x === undefined || x === null) {\r\n\t\treturn x;\r\n\t}\r\n\treturn new L.Point(x, y, round);\r\n};\r\n\n\n/*\r\n * L.Bounds represents a rectangular area on the screen in pixel coordinates.\r\n */\r\n\r\nL.Bounds = function (a, b) { //(Point, Point) or Point[]\r\n\tif (!a) { return; }\r\n\r\n\tvar points = b ? [a, b] : a;\r\n\r\n\tfor (var i = 0, len = points.length; i < len; i++) {\r\n\t\tthis.extend(points[i]);\r\n\t}\r\n};\r\n\r\nL.Bounds.prototype = {\r\n\t// extend the bounds to contain the given point\r\n\textend: function (point) { // (Point)\r\n\t\tpoint = L.point(point);\r\n\r\n\t\tif (!this.min && !this.max) {\r\n\t\t\tthis.min = point.clone();\r\n\t\t\tthis.max = point.clone();\r\n\t\t} else {\r\n\t\t\tthis.min.x = Math.min(point.x, this.min.x);\r\n\t\t\tthis.max.x = Math.max(point.x, this.max.x);\r\n\t\t\tthis.min.y = Math.min(point.y, this.min.y);\r\n\t\t\tthis.max.y = Math.max(point.y, this.max.y);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetCenter: function (round) { // (Boolean) -> Point\r\n\t\treturn new L.Point(\r\n\t\t (this.min.x + this.max.x) / 2,\r\n\t\t (this.min.y + this.max.y) / 2, round);\r\n\t},\r\n\r\n\tgetBottomLeft: function () { // -> Point\r\n\t\treturn new L.Point(this.min.x, this.max.y);\r\n\t},\r\n\r\n\tgetTopRight: function () { // -> Point\r\n\t\treturn new L.Point(this.max.x, this.min.y);\r\n\t},\r\n\r\n\tgetSize: function () {\r\n\t\treturn this.max.subtract(this.min);\r\n\t},\r\n\r\n\tcontains: function (obj) { // (Bounds) or (Point) -> Boolean\r\n\t\tvar min, max;\r\n\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.Point) {\r\n\t\t\tobj = L.point(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.bounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof L.Bounds) {\r\n\t\t\tmin = obj.min;\r\n\t\t\tmax = obj.max;\r\n\t\t} else {\r\n\t\t\tmin = max = obj;\r\n\t\t}\r\n\r\n\t\treturn (min.x >= this.min.x) &&\r\n\t\t (max.x <= this.max.x) &&\r\n\t\t (min.y >= this.min.y) &&\r\n\t\t (max.y <= this.max.y);\r\n\t},\r\n\r\n\tintersects: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = L.bounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t max = this.max,\r\n\t\t min2 = bounds.min,\r\n\t\t max2 = bounds.max,\r\n\t\t xIntersects = (max2.x >= min.x) && (min2.x <= max.x),\r\n\t\t yIntersects = (max2.y >= min.y) && (min2.y <= max.y);\r\n\r\n\t\treturn xIntersects && yIntersects;\r\n\t},\r\n\r\n\tisValid: function () {\r\n\t\treturn !!(this.min && this.max);\r\n\t}\r\n};\r\n\r\nL.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[])\r\n\tif (!a || a instanceof L.Bounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.Bounds(a, b);\r\n};\r\n\n\n/*\r\n * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix.\r\n */\r\n\r\nL.Transformation = function (a, b, c, d) {\r\n\tthis._a = a;\r\n\tthis._b = b;\r\n\tthis._c = c;\r\n\tthis._d = d;\r\n};\r\n\r\nL.Transformation.prototype = {\r\n\ttransform: function (point, scale) { // (Point, Number) -> Point\r\n\t\treturn this._transform(point.clone(), scale);\r\n\t},\r\n\r\n\t// destructive transform (faster)\r\n\t_transform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\tpoint.x = scale * (this._a * point.x + this._b);\r\n\t\tpoint.y = scale * (this._c * point.y + this._d);\r\n\t\treturn point;\r\n\t},\r\n\r\n\tuntransform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\treturn new L.Point(\r\n\t\t (point.x / scale - this._b) / this._a,\r\n\t\t (point.y / scale - this._d) / this._c);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.DomUtil contains various utility functions for working with DOM.\r\n */\r\n\r\nL.DomUtil = {\r\n\tget: function (id) {\r\n\t\treturn (typeof id === 'string' ? document.getElementById(id) : id);\r\n\t},\r\n\r\n\tgetStyle: function (el, style) {\r\n\r\n\t\tvar value = el.style[style];\r\n\r\n\t\tif (!value && el.currentStyle) {\r\n\t\t\tvalue = el.currentStyle[style];\r\n\t\t}\r\n\r\n\t\tif ((!value || value === 'auto') && document.defaultView) {\r\n\t\t\tvar css = document.defaultView.getComputedStyle(el, null);\r\n\t\t\tvalue = css ? css[style] : null;\r\n\t\t}\r\n\r\n\t\treturn value === 'auto' ? null : value;\r\n\t},\r\n\r\n\tgetViewportOffset: function (element) {\r\n\r\n\t\tvar top = 0,\r\n\t\t left = 0,\r\n\t\t el = element,\r\n\t\t docBody = document.body,\r\n\t\t docEl = document.documentElement,\r\n\t\t pos;\r\n\r\n\t\tdo {\r\n\t\t\ttop += el.offsetTop || 0;\r\n\t\t\tleft += el.offsetLeft || 0;\r\n\r\n\t\t\t//add borders\r\n\t\t\ttop += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0;\r\n\t\t\tleft += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0;\r\n\r\n\t\t\tpos = L.DomUtil.getStyle(el, 'position');\r\n\r\n\t\t\tif (el.offsetParent === docBody && pos === 'absolute') { break; }\r\n\r\n\t\t\tif (pos === 'fixed') {\r\n\t\t\t\ttop += docBody.scrollTop || docEl.scrollTop || 0;\r\n\t\t\t\tleft += docBody.scrollLeft || docEl.scrollLeft || 0;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif (pos === 'relative' && !el.offsetLeft) {\r\n\t\t\t\tvar width = L.DomUtil.getStyle(el, 'width'),\r\n\t\t\t\t maxWidth = L.DomUtil.getStyle(el, 'max-width'),\r\n\t\t\t\t r = el.getBoundingClientRect();\r\n\r\n\t\t\t\tif (width !== 'none' || maxWidth !== 'none') {\r\n\t\t\t\t\tleft += r.left + el.clientLeft;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//calculate full y offset since we're breaking out of the loop\r\n\t\t\t\ttop += r.top + (docBody.scrollTop || docEl.scrollTop || 0);\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tel = el.offsetParent;\r\n\r\n\t\t} while (el);\r\n\r\n\t\tel = element;\r\n\r\n\t\tdo {\r\n\t\t\tif (el === docBody) { break; }\r\n\r\n\t\t\ttop -= el.scrollTop || 0;\r\n\t\t\tleft -= el.scrollLeft || 0;\r\n\r\n\t\t\tel = el.parentNode;\r\n\t\t} while (el);\r\n\r\n\t\treturn new L.Point(left, top);\r\n\t},\r\n\r\n\tdocumentIsLtr: function () {\r\n\t\tif (!L.DomUtil._docIsLtrCached) {\r\n\t\t\tL.DomUtil._docIsLtrCached = true;\r\n\t\t\tL.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr';\r\n\t\t}\r\n\t\treturn L.DomUtil._docIsLtr;\r\n\t},\r\n\r\n\tcreate: function (tagName, className, container) {\r\n\r\n\t\tvar el = document.createElement(tagName);\r\n\t\tel.className = className;\r\n\r\n\t\tif (container) {\r\n\t\t\tcontainer.appendChild(el);\r\n\t\t}\r\n\r\n\t\treturn el;\r\n\t},\r\n\r\n\thasClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\treturn el.classList.contains(name);\r\n\t\t}\r\n\t\tvar className = L.DomUtil._getClass(el);\r\n\t\treturn className.length > 0 && new RegExp('(^|\\\\s)' + name + '(\\\\s|$)').test(className);\r\n\t},\r\n\r\n\taddClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tvar classes = L.Util.splitWords(name);\r\n\t\t\tfor (var i = 0, len = classes.length; i < len; i++) {\r\n\t\t\t\tel.classList.add(classes[i]);\r\n\t\t\t}\r\n\t\t} else if (!L.DomUtil.hasClass(el, name)) {\r\n\t\t\tvar className = L.DomUtil._getClass(el);\r\n\t\t\tL.DomUtil._setClass(el, (className ? className + ' ' : '') + name);\r\n\t\t}\r\n\t},\r\n\r\n\tremoveClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tel.classList.remove(name);\r\n\t\t} else {\r\n\t\t\tL.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' ')));\r\n\t\t}\r\n\t},\r\n\r\n\t_setClass: function (el, name) {\r\n\t\tif (el.className.baseVal === undefined) {\r\n\t\t\tel.className = name;\r\n\t\t} else {\r\n\t\t\t// in case of SVG element\r\n\t\t\tel.className.baseVal = name;\r\n\t\t}\r\n\t},\r\n\r\n\t_getClass: function (el) {\r\n\t\treturn el.className.baseVal === undefined ? el.className : el.className.baseVal;\r\n\t},\r\n\r\n\tsetOpacity: function (el, value) {\r\n\r\n\t\tif ('opacity' in el.style) {\r\n\t\t\tel.style.opacity = value;\r\n\r\n\t\t} else if ('filter' in el.style) {\r\n\r\n\t\t\tvar filter = false,\r\n\t\t\t filterName = 'DXImageTransform.Microsoft.Alpha';\r\n\r\n\t\t\t// filters collection throws an error if we try to retrieve a filter that doesn't exist\r\n\t\t\ttry {\r\n\t\t\t\tfilter = el.filters.item(filterName);\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// don't set opacity to 1 if we haven't already set an opacity,\r\n\t\t\t\t// it isn't needed and breaks transparent pngs.\r\n\t\t\t\tif (value === 1) { return; }\r\n\t\t\t}\r\n\r\n\t\t\tvalue = Math.round(value * 100);\r\n\r\n\t\t\tif (filter) {\r\n\t\t\t\tfilter.Enabled = (value !== 100);\r\n\t\t\t\tfilter.Opacity = value;\r\n\t\t\t} else {\r\n\t\t\t\tel.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\ttestProp: function (props) {\r\n\r\n\t\tvar style = document.documentElement.style;\r\n\r\n\t\tfor (var i = 0; i < props.length; i++) {\r\n\t\t\tif (props[i] in style) {\r\n\t\t\t\treturn props[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\tgetTranslateString: function (point) {\r\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\r\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\r\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\r\n\r\n\t\tvar is3d = L.Browser.webkit3d,\r\n\t\t open = 'translate' + (is3d ? '3d' : '') + '(',\r\n\t\t close = (is3d ? ',0' : '') + ')';\r\n\r\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\r\n\t},\r\n\r\n\tgetScaleString: function (scale, origin) {\r\n\r\n\t\tvar preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))),\r\n\t\t scaleStr = ' scale(' + scale + ') ';\r\n\r\n\t\treturn preTranslateStr + scaleStr;\r\n\t},\r\n\r\n\tsetPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean])\r\n\r\n\t\t// jshint camelcase: false\r\n\t\tel._leaflet_pos = point;\r\n\r\n\t\tif (!disable3D && L.Browser.any3d) {\r\n\t\t\tel.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point);\r\n\t\t} else {\r\n\t\t\tel.style.left = point.x + 'px';\r\n\t\t\tel.style.top = point.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\tgetPosition: function (el) {\r\n\t\t// this method is only used for elements previously positioned using setPosition,\r\n\t\t// so it's safe to cache the position for performance\r\n\r\n\t\t// jshint camelcase: false\r\n\t\treturn el._leaflet_pos;\r\n\t}\r\n};\r\n\r\n\r\n// prefix style property names\r\n\r\nL.DomUtil.TRANSFORM = L.DomUtil.testProp(\r\n ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\r\n\r\n// webkitTransition comes first because some browser versions that drop vendor prefix don't do\r\n// the same for the transitionend event, in particular the Android 4.1 stock browser\r\n\r\nL.DomUtil.TRANSITION = L.DomUtil.testProp(\r\n ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\r\n\r\nL.DomUtil.TRANSITION_END =\r\n L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ?\r\n L.DomUtil.TRANSITION + 'End' : 'transitionend';\r\n\r\n(function () {\r\n if ('onselectstart' in document) {\r\n L.extend(L.DomUtil, {\r\n disableTextSelection: function () {\r\n L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);\r\n },\r\n\r\n enableTextSelection: function () {\r\n L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);\r\n }\r\n });\r\n } else {\r\n var userSelectProperty = L.DomUtil.testProp(\r\n ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);\r\n\r\n L.extend(L.DomUtil, {\r\n disableTextSelection: function () {\r\n if (userSelectProperty) {\r\n var style = document.documentElement.style;\r\n this._userSelect = style[userSelectProperty];\r\n style[userSelectProperty] = 'none';\r\n }\r\n },\r\n\r\n enableTextSelection: function () {\r\n if (userSelectProperty) {\r\n document.documentElement.style[userSelectProperty] = this._userSelect;\r\n delete this._userSelect;\r\n }\r\n }\r\n });\r\n }\r\n\r\n\tL.extend(L.DomUtil, {\r\n\t\tdisableImageDrag: function () {\r\n\t\t\tL.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t\t},\r\n\r\n\t\tenableImageDrag: function () {\r\n\t\t\tL.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t\t}\r\n\t});\r\n})();\r\n\n\n/*\r\n * L.LatLng represents a geographical point with latitude and longitude coordinates.\r\n */\r\n\r\nL.LatLng = function (lat, lng, alt) { // (Number, Number, Number)\r\n\tlat = parseFloat(lat);\r\n\tlng = parseFloat(lng);\r\n\r\n\tif (isNaN(lat) || isNaN(lng)) {\r\n\t\tthrow new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\r\n\t}\r\n\r\n\tthis.lat = lat;\r\n\tthis.lng = lng;\r\n\r\n\tif (alt !== undefined) {\r\n\t\tthis.alt = parseFloat(alt);\r\n\t}\r\n};\r\n\r\nL.extend(L.LatLng, {\r\n\tDEG_TO_RAD: Math.PI / 180,\r\n\tRAD_TO_DEG: 180 / Math.PI,\r\n\tMAX_MARGIN: 1.0E-9 // max margin of error for the \"equals\" check\r\n});\r\n\r\nL.LatLng.prototype = {\r\n\tequals: function (obj) { // (LatLng) -> Boolean\r\n\t\tif (!obj) { return false; }\r\n\r\n\t\tobj = L.latLng(obj);\r\n\r\n\t\tvar margin = Math.max(\r\n\t\t Math.abs(this.lat - obj.lat),\r\n\t\t Math.abs(this.lng - obj.lng));\r\n\r\n\t\treturn margin <= L.LatLng.MAX_MARGIN;\r\n\t},\r\n\r\n\ttoString: function (precision) { // (Number) -> String\r\n\t\treturn 'LatLng(' +\r\n\t\t L.Util.formatNum(this.lat, precision) + ', ' +\r\n\t\t L.Util.formatNum(this.lng, precision) + ')';\r\n\t},\r\n\r\n\t// Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula\r\n\t// TODO move to projection code, LatLng shouldn't know about Earth\r\n\tdistanceTo: function (other) { // (LatLng) -> Number\r\n\t\tother = L.latLng(other);\r\n\r\n\t\tvar R = 6378137, // earth radius in meters\r\n\t\t d2r = L.LatLng.DEG_TO_RAD,\r\n\t\t dLat = (other.lat - this.lat) * d2r,\r\n\t\t dLon = (other.lng - this.lng) * d2r,\r\n\t\t lat1 = this.lat * d2r,\r\n\t\t lat2 = other.lat * d2r,\r\n\t\t sin1 = Math.sin(dLat / 2),\r\n\t\t sin2 = Math.sin(dLon / 2);\r\n\r\n\t\tvar a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2);\r\n\r\n\t\treturn R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n\t},\r\n\r\n\twrap: function (a, b) { // (Number, Number) -> LatLng\r\n\t\tvar lng = this.lng;\r\n\r\n\t\ta = a || -180;\r\n\t\tb = b || 180;\r\n\r\n\t\tlng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a);\r\n\r\n\t\treturn new L.LatLng(this.lat, lng);\r\n\t}\r\n};\r\n\r\nL.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number)\r\n\tif (a instanceof L.LatLng) {\r\n\t\treturn a;\r\n\t}\r\n\tif (L.Util.isArray(a)) {\r\n\t\tif (typeof a[0] === 'number' || typeof a[0] === 'string') {\r\n\t\t\treturn new L.LatLng(a[0], a[1], a[2]);\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\tif (a === undefined || a === null) {\r\n\t\treturn a;\r\n\t}\r\n\tif (typeof a === 'object' && 'lat' in a) {\r\n\t\treturn new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon);\r\n\t}\r\n\tif (b === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\treturn new L.LatLng(a, b);\r\n};\r\n\r\n\n\n/*\r\n * L.LatLngBounds represents a rectangular area on the map in geographical coordinates.\r\n */\r\n\r\nL.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[])\r\n\tif (!southWest) { return; }\r\n\r\n\tvar latlngs = northEast ? [southWest, northEast] : southWest;\r\n\r\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\tthis.extend(latlngs[i]);\r\n\t}\r\n};\r\n\r\nL.LatLngBounds.prototype = {\r\n\t// extend the bounds to contain the given point or bounds\r\n\textend: function (obj) { // (LatLng) or (LatLngBounds)\r\n\t\tif (!obj) { return this; }\r\n\r\n\t\tvar latLng = L.latLng(obj);\r\n\t\tif (latLng !== null) {\r\n\t\t\tobj = latLng;\r\n\t\t} else {\r\n\t\t\tobj = L.latLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof L.LatLng) {\r\n\t\t\tif (!this._southWest && !this._northEast) {\r\n\t\t\t\tthis._southWest = new L.LatLng(obj.lat, obj.lng);\r\n\t\t\t\tthis._northEast = new L.LatLng(obj.lat, obj.lng);\r\n\t\t\t} else {\r\n\t\t\t\tthis._southWest.lat = Math.min(obj.lat, this._southWest.lat);\r\n\t\t\t\tthis._southWest.lng = Math.min(obj.lng, this._southWest.lng);\r\n\r\n\t\t\t\tthis._northEast.lat = Math.max(obj.lat, this._northEast.lat);\r\n\t\t\t\tthis._northEast.lng = Math.max(obj.lng, this._northEast.lng);\r\n\t\t\t}\r\n\t\t} else if (obj instanceof L.LatLngBounds) {\r\n\t\t\tthis.extend(obj._southWest);\r\n\t\t\tthis.extend(obj._northEast);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// extend the bounds by a percentage\r\n\tpad: function (bufferRatio) { // (Number) -> LatLngBounds\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,\r\n\t\t widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\r\n\r\n\t\treturn new L.LatLngBounds(\r\n\t\t new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),\r\n\t\t new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));\r\n\t},\r\n\r\n\tgetCenter: function () { // -> LatLng\r\n\t\treturn new L.LatLng(\r\n\t\t (this._southWest.lat + this._northEast.lat) / 2,\r\n\t\t (this._southWest.lng + this._northEast.lng) / 2);\r\n\t},\r\n\r\n\tgetSouthWest: function () {\r\n\t\treturn this._southWest;\r\n\t},\r\n\r\n\tgetNorthEast: function () {\r\n\t\treturn this._northEast;\r\n\t},\r\n\r\n\tgetNorthWest: function () {\r\n\t\treturn new L.LatLng(this.getNorth(), this.getWest());\r\n\t},\r\n\r\n\tgetSouthEast: function () {\r\n\t\treturn new L.LatLng(this.getSouth(), this.getEast());\r\n\t},\r\n\r\n\tgetWest: function () {\r\n\t\treturn this._southWest.lng;\r\n\t},\r\n\r\n\tgetSouth: function () {\r\n\t\treturn this._southWest.lat;\r\n\t},\r\n\r\n\tgetEast: function () {\r\n\t\treturn this._northEast.lng;\r\n\t},\r\n\r\n\tgetNorth: function () {\r\n\t\treturn this._northEast.lat;\r\n\t},\r\n\r\n\tcontains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.LatLng) {\r\n\t\t\tobj = L.latLng(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.latLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t sw2, ne2;\r\n\r\n\t\tif (obj instanceof L.LatLngBounds) {\r\n\t\t\tsw2 = obj.getSouthWest();\r\n\t\t\tne2 = obj.getNorthEast();\r\n\t\t} else {\r\n\t\t\tsw2 = ne2 = obj;\r\n\t\t}\r\n\r\n\t\treturn (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&\r\n\t\t (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);\r\n\t},\r\n\r\n\tintersects: function (bounds) { // (LatLngBounds)\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t ne = this._northEast,\r\n\t\t sw2 = bounds.getSouthWest(),\r\n\t\t ne2 = bounds.getNorthEast(),\r\n\r\n\t\t latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),\r\n\t\t lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);\r\n\r\n\t\treturn latIntersects && lngIntersects;\r\n\t},\r\n\r\n\ttoBBoxString: function () {\r\n\t\treturn [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');\r\n\t},\r\n\r\n\tequals: function (bounds) { // (LatLngBounds)\r\n\t\tif (!bounds) { return false; }\r\n\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\treturn this._southWest.equals(bounds.getSouthWest()) &&\r\n\t\t this._northEast.equals(bounds.getNorthEast());\r\n\t},\r\n\r\n\tisValid: function () {\r\n\t\treturn !!(this._southWest && this._northEast);\r\n\t}\r\n};\r\n\r\n//TODO International date line?\r\n\r\nL.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng)\r\n\tif (!a || a instanceof L.LatLngBounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.LatLngBounds(a, b);\r\n};\r\n\n\n/*\r\n * L.Projection contains various geographical projections used by CRS classes.\r\n */\r\n\r\nL.Projection = {};\r\n\n\n/*\r\n * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default.\r\n */\r\n\r\nL.Projection.SphericalMercator = {\r\n\tMAX_LATITUDE: 85.0511287798,\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar d = L.LatLng.DEG_TO_RAD,\r\n\t\t max = this.MAX_LATITUDE,\r\n\t\t lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t x = latlng.lng * d,\r\n\t\t y = lat * d;\r\n\r\n\t\ty = Math.log(Math.tan((Math.PI / 4) + (y / 2)));\r\n\r\n\t\treturn new L.Point(x, y);\r\n\t},\r\n\r\n\tunproject: function (point) { // (Point, Boolean) -> LatLng\r\n\t\tvar d = L.LatLng.RAD_TO_DEG,\r\n\t\t lng = point.x * d,\r\n\t\t lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d;\r\n\r\n\t\treturn new L.LatLng(lat, lng);\r\n\t}\r\n};\r\n\n\n/*\r\n * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple.\r\n */\r\n\r\nL.Projection.LonLat = {\r\n\tproject: function (latlng) {\r\n\t\treturn new L.Point(latlng.lng, latlng.lat);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\treturn new L.LatLng(point.y, point.x);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet.\r\n */\r\n\r\nL.CRS = {\r\n\tlatLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t scale = this.scale(zoom);\r\n\r\n\t\treturn this.transformation._transform(projectedPoint, scale);\r\n\t},\r\n\r\n\tpointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng\r\n\t\tvar scale = this.scale(zoom),\r\n\t\t untransformedPoint = this.transformation.untransform(point, scale);\r\n\r\n\t\treturn this.projection.unproject(untransformedPoint);\r\n\t},\r\n\r\n\tproject: function (latlng) {\r\n\t\treturn this.projection.project(latlng);\r\n\t},\r\n\r\n\tscale: function (zoom) {\r\n\t\treturn 256 * Math.pow(2, zoom);\r\n\t},\r\n\r\n\tgetSize: function (zoom) {\r\n\t\tvar s = this.scale(zoom);\r\n\t\treturn L.point(s, s);\r\n\t}\r\n};\r\n\n\n/*\n * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps.\n */\n\nL.CRS.Simple = L.extend({}, L.CRS, {\n\tprojection: L.Projection.LonLat,\n\ttransformation: new L.Transformation(1, 0, -1, 0),\n\n\tscale: function (zoom) {\n\t\treturn Math.pow(2, zoom);\n\t}\n});\n\n\n/*\r\n * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping\r\n * and is used by Leaflet by default.\r\n */\r\n\r\nL.CRS.EPSG3857 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:3857',\r\n\r\n\tprojection: L.Projection.SphericalMercator,\r\n\ttransformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5),\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t earthRadius = 6378137;\r\n\t\treturn projectedPoint.multiplyBy(earthRadius);\r\n\t}\r\n});\r\n\r\nL.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {\r\n\tcode: 'EPSG:900913'\r\n});\r\n\n\n/*\r\n * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\r\n */\r\n\r\nL.CRS.EPSG4326 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:4326',\r\n\r\n\tprojection: L.Projection.LonLat,\r\n\ttransformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5)\r\n});\r\n\n\n/*\r\n * L.Map is the central class of the API - it is used to create a map.\r\n */\r\n\r\nL.Map = L.Class.extend({\r\n\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tcrs: L.CRS.EPSG3857,\r\n\r\n\t\t/*\r\n\t\tcenter: LatLng,\r\n\t\tzoom: Number,\r\n\t\tlayers: Array,\r\n\t\t*/\r\n\r\n\t\tfadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23,\r\n\t\ttrackResize: true,\r\n\t\tmarkerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d\r\n\t},\r\n\r\n\tinitialize: function (id, options) { // (HTMLElement or String, Object)\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\r\n\t\tthis._initContainer(id);\r\n\t\tthis._initLayout();\r\n\r\n\t\t// hack for https://github.com/Leaflet/Leaflet/issues/1980\r\n\t\tthis._onResize = L.bind(this._onResize, this);\r\n\r\n\t\tthis._initEvents();\r\n\r\n\t\tif (options.maxBounds) {\r\n\t\t\tthis.setMaxBounds(options.maxBounds);\r\n\t\t}\r\n\r\n\t\tif (options.center && options.zoom !== undefined) {\r\n\t\t\tthis.setView(L.latLng(options.center), options.zoom, {reset: true});\r\n\t\t}\r\n\r\n\t\tthis._handlers = [];\r\n\r\n\t\tthis._layers = {};\r\n\t\tthis._zoomBoundLayers = {};\r\n\t\tthis._tileLayersNum = 0;\r\n\r\n\t\tthis.callInitHooks();\r\n\r\n\t\tthis._addLayers(options.layers);\r\n\t},\r\n\r\n\r\n\t// public methods that modify map state\r\n\r\n\t// replaced by animation-powered implementation in Map.PanAnimation.js\r\n\tsetView: function (center, zoom) {\r\n\t\tzoom = zoom === undefined ? this.getZoom() : zoom;\r\n\t\tthis._resetView(L.latLng(center), this._limitZoom(zoom));\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetZoom: function (zoom, options) {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthis._zoom = this._limitZoom(zoom);\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\treturn this.setView(this.getCenter(), zoom, {zoom: options});\r\n\t},\r\n\r\n\tzoomIn: function (delta, options) {\r\n\t\treturn this.setZoom(this._zoom + (delta || 1), options);\r\n\t},\r\n\r\n\tzoomOut: function (delta, options) {\r\n\t\treturn this.setZoom(this._zoom - (delta || 1), options);\r\n\t},\r\n\r\n\tsetZoomAround: function (latlng, zoom, options) {\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t viewHalf = this.getSize().divideBy(2),\r\n\t\t containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),\r\n\r\n\t\t centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),\r\n\t\t newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));\r\n\r\n\t\treturn this.setView(newCenter, zoom, {zoom: options});\r\n\t},\r\n\r\n\tfitBounds: function (bounds, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tbounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);\r\n\r\n\t\tvar paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),\r\n\t\t paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),\r\n\r\n\t\t zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));\r\n\r\n\t\tzoom = (options.maxZoom) ? Math.min(options.maxZoom, zoom) : zoom;\r\n\r\n\t\tvar paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),\r\n\r\n\t\t swPoint = this.project(bounds.getSouthWest(), zoom),\r\n\t\t nePoint = this.project(bounds.getNorthEast(), zoom),\r\n\t\t center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);\r\n\r\n\t\treturn this.setView(center, zoom, options);\r\n\t},\r\n\r\n\tfitWorld: function (options) {\r\n\t\treturn this.fitBounds([[-90, -180], [90, 180]], options);\r\n\t},\r\n\r\n\tpanTo: function (center, options) { // (LatLng)\r\n\t\treturn this.setView(center, this._zoom, {pan: options});\r\n\t},\r\n\r\n\tpanBy: function (offset) { // (Point)\r\n\t\t// replaced with animated panBy in Map.PanAnimation.js\r\n\t\tthis.fire('movestart');\r\n\r\n\t\tthis._rawPanBy(L.point(offset));\r\n\r\n\t\tthis.fire('move');\r\n\t\treturn this.fire('moveend');\r\n\t},\r\n\r\n\tsetMaxBounds: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tthis.options.maxBounds = bounds;\r\n\r\n\t\tif (!bounds) {\r\n\t\t\treturn this.off('moveend', this._panInsideMaxBounds, this);\r\n\t\t}\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._panInsideMaxBounds();\r\n\t\t}\r\n\r\n\t\treturn this.on('moveend', this._panInsideMaxBounds, this);\r\n\t},\r\n\r\n\tpanInsideBounds: function (bounds, options) {\r\n\t\tvar center = this.getCenter(),\r\n\t\t\tnewCenter = this._limitCenter(center, this._zoom, bounds);\r\n\r\n\t\tif (center.equals(newCenter)) { return this; }\r\n\r\n\t\treturn this.panTo(newCenter, options);\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\t// TODO method is too big, refactor\r\n\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tif (this._layers[id]) { return this; }\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\t// TODO getMaxZoom, getMinZoom in ILayer (instead of options)\r\n\t\tif (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) {\r\n\t\t\tthis._zoomBoundLayers[id] = layer;\r\n\t\t\tthis._updateZoomLevels();\r\n\t\t}\r\n\r\n\t\t// TODO looks ugly, refactor!!!\r\n\t\tif (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {\r\n\t\t\tthis._tileLayersNum++;\r\n\t\t\tthis._tileLayersToLoad++;\r\n\t\t\tlayer.on('load', this._onTileLayerLoad, this);\r\n\t\t}\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._layerAdd(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tif (!this._layers[id]) { return this; }\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tlayer.onRemove(this);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis.fire('layerremove', {layer: layer});\r\n\t\t}\r\n\r\n\t\tif (this._zoomBoundLayers[id]) {\r\n\t\t\tdelete this._zoomBoundLayers[id];\r\n\t\t\tthis._updateZoomLevels();\r\n\t\t}\r\n\r\n\t\t// TODO looks ugly, refactor\r\n\t\tif (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {\r\n\t\t\tthis._tileLayersNum--;\r\n\t\t\tthis._tileLayersToLoad--;\r\n\t\t\tlayer.off('load', this._onTileLayerLoad, this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasLayer: function (layer) {\r\n\t\tif (!layer) { return false; }\r\n\r\n\t\treturn (L.stamp(layer) in this._layers);\r\n\t},\r\n\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tinvalidateSize: function (options) {\r\n\t\tif (!this._loaded) { return this; }\r\n\r\n\t\toptions = L.extend({\r\n\t\t\tanimate: false,\r\n\t\t\tpan: true\r\n\t\t}, options === true ? {animate: true} : options);\r\n\r\n\t\tvar oldSize = this.getSize();\r\n\t\tthis._sizeChanged = true;\r\n\t\tthis._initialCenter = null;\r\n\r\n\t\tvar newSize = this.getSize(),\r\n\t\t oldCenter = oldSize.divideBy(2).round(),\r\n\t\t newCenter = newSize.divideBy(2).round(),\r\n\t\t offset = oldCenter.subtract(newCenter);\r\n\r\n\t\tif (!offset.x && !offset.y) { return this; }\r\n\r\n\t\tif (options.animate && options.pan) {\r\n\t\t\tthis.panBy(offset);\r\n\r\n\t\t} else {\r\n\t\t\tif (options.pan) {\r\n\t\t\t\tthis._rawPanBy(offset);\r\n\t\t\t}\r\n\r\n\t\t\tthis.fire('move');\r\n\r\n\t\t\tif (options.debounceMoveend) {\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\tthis._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);\r\n\t\t\t} else {\r\n\t\t\t\tthis.fire('moveend');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.fire('resize', {\r\n\t\t\toldSize: oldSize,\r\n\t\t\tnewSize: newSize\r\n\t\t});\r\n\t},\r\n\r\n\t// TODO handler.addTo\r\n\taddHandler: function (name, HandlerClass) {\r\n\t\tif (!HandlerClass) { return this; }\r\n\r\n\t\tvar handler = this[name] = new HandlerClass(this);\r\n\r\n\t\tthis._handlers.push(handler);\r\n\r\n\t\tif (this.options[name]) {\r\n\t\t\thandler.enable();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremove: function () {\r\n\t\tif (this._loaded) {\r\n\t\t\tthis.fire('unload');\r\n\t\t}\r\n\r\n\t\tthis._initEvents('off');\r\n\r\n\t\ttry {\r\n\t\t\t// throws error in IE6-8\r\n\t\t\tdelete this._container._leaflet;\r\n\t\t} catch (e) {\r\n\t\t\tthis._container._leaflet = undefined;\r\n\t\t}\r\n\r\n\t\tthis._clearPanes();\r\n\t\tif (this._clearControlPos) {\r\n\t\t\tthis._clearControlPos();\r\n\t\t}\r\n\r\n\t\tthis._clearHandlers();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\r\n\t// public methods for getting map state\r\n\r\n\tgetCenter: function () { // (Boolean) -> LatLng\r\n\t\tthis._checkIfLoaded();\r\n\r\n\t\tif (this._initialCenter && !this._moved()) {\r\n\t\t\treturn this._initialCenter;\r\n\t\t}\r\n\t\treturn this.layerPointToLatLng(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\tgetZoom: function () {\r\n\t\treturn this._zoom;\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar bounds = this.getPixelBounds(),\r\n\t\t sw = this.unproject(bounds.getBottomLeft()),\r\n\t\t ne = this.unproject(bounds.getTopRight());\r\n\r\n\t\treturn new L.LatLngBounds(sw, ne);\r\n\t},\r\n\r\n\tgetMinZoom: function () {\r\n\t\treturn this.options.minZoom === undefined ?\r\n\t\t\t(this._layersMinZoom === undefined ? 0 : this._layersMinZoom) :\r\n\t\t\tthis.options.minZoom;\r\n\t},\r\n\r\n\tgetMaxZoom: function () {\r\n\t\treturn this.options.maxZoom === undefined ?\r\n\t\t\t(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :\r\n\t\t\tthis.options.maxZoom;\r\n\t},\r\n\r\n\tgetBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar zoom = this.getMinZoom() - (inside ? 1 : 0),\r\n\t\t maxZoom = this.getMaxZoom(),\r\n\t\t size = this.getSize(),\r\n\r\n\t\t nw = bounds.getNorthWest(),\r\n\t\t se = bounds.getSouthEast(),\r\n\r\n\t\t zoomNotFound = true,\r\n\t\t boundsSize;\r\n\r\n\t\tpadding = L.point(padding || [0, 0]);\r\n\r\n\t\tdo {\r\n\t\t\tzoom++;\r\n\t\t\tboundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding);\r\n\t\t\tzoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y;\r\n\r\n\t\t} while (zoomNotFound && zoom <= maxZoom);\r\n\r\n\t\tif (zoomNotFound && inside) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn inside ? zoom : zoom - 1;\r\n\t},\r\n\r\n\tgetSize: function () {\r\n\t\tif (!this._size || this._sizeChanged) {\r\n\t\t\tthis._size = new L.Point(\r\n\t\t\t\tthis._container.clientWidth,\r\n\t\t\t\tthis._container.clientHeight);\r\n\r\n\t\t\tthis._sizeChanged = false;\r\n\t\t}\r\n\t\treturn this._size.clone();\r\n\t},\r\n\r\n\tgetPixelBounds: function () {\r\n\t\tvar topLeftPoint = this._getTopLeftPoint();\r\n\t\treturn new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));\r\n\t},\r\n\r\n\tgetPixelOrigin: function () {\r\n\t\tthis._checkIfLoaded();\r\n\t\treturn this._initialTopLeftPoint;\r\n\t},\r\n\r\n\tgetPanes: function () {\r\n\t\treturn this._panes;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\r\n\t// TODO replace with universal implementation after refactoring projections\r\n\r\n\tgetZoomScale: function (toZoom) {\r\n\t\tvar crs = this.options.crs;\r\n\t\treturn crs.scale(toZoom) / crs.scale(this._zoom);\r\n\t},\r\n\r\n\tgetScaleZoom: function (scale) {\r\n\t\treturn this._zoom + (Math.log(scale) / Math.LN2);\r\n\t},\r\n\r\n\r\n\t// conversion methods\r\n\r\n\tproject: function (latlng, zoom) { // (LatLng[, Number]) -> Point\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.latLngToPoint(L.latLng(latlng), zoom);\r\n\t},\r\n\r\n\tunproject: function (point, zoom) { // (Point[, Number]) -> LatLng\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.pointToLatLng(L.point(point), zoom);\r\n\t},\r\n\r\n\tlayerPointToLatLng: function (point) { // (Point)\r\n\t\tvar projectedPoint = L.point(point).add(this.getPixelOrigin());\r\n\t\treturn this.unproject(projectedPoint);\r\n\t},\r\n\r\n\tlatLngToLayerPoint: function (latlng) { // (LatLng)\r\n\t\tvar projectedPoint = this.project(L.latLng(latlng))._round();\r\n\t\treturn projectedPoint._subtract(this.getPixelOrigin());\r\n\t},\r\n\r\n\tcontainerPointToLayerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\tlayerPointToContainerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).add(this._getMapPanePos());\r\n\t},\r\n\r\n\tcontainerPointToLatLng: function (point) {\r\n\t\tvar layerPoint = this.containerPointToLayerPoint(L.point(point));\r\n\t\treturn this.layerPointToLatLng(layerPoint);\r\n\t},\r\n\r\n\tlatLngToContainerPoint: function (latlng) {\r\n\t\treturn this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));\r\n\t},\r\n\r\n\tmouseEventToContainerPoint: function (e) { // (MouseEvent)\r\n\t\treturn L.DomEvent.getMousePosition(e, this._container);\r\n\t},\r\n\r\n\tmouseEventToLayerPoint: function (e) { // (MouseEvent)\r\n\t\treturn this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));\r\n\t},\r\n\r\n\tmouseEventToLatLng: function (e) { // (MouseEvent)\r\n\t\treturn this.layerPointToLatLng(this.mouseEventToLayerPoint(e));\r\n\t},\r\n\r\n\r\n\t// map initialization methods\r\n\r\n\t_initContainer: function (id) {\r\n\t\tvar container = this._container = L.DomUtil.get(id);\r\n\r\n\t\tif (!container) {\r\n\t\t\tthrow new Error('Map container not found.');\r\n\t\t} else if (container._leaflet) {\r\n\t\t\tthrow new Error('Map container is already initialized.');\r\n\t\t}\r\n\r\n\t\tcontainer._leaflet = true;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar container = this._container;\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-container' +\r\n\t\t\t(L.Browser.touch ? ' leaflet-touch' : '') +\r\n\t\t\t(L.Browser.retina ? ' leaflet-retina' : '') +\r\n\t\t\t(L.Browser.ielt9 ? ' leaflet-oldie' : '') +\r\n\t\t\t(this.options.fadeAnimation ? ' leaflet-fade-anim' : ''));\r\n\r\n\t\tvar position = L.DomUtil.getStyle(container, 'position');\r\n\r\n\t\tif (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {\r\n\t\t\tcontainer.style.position = 'relative';\r\n\t\t}\r\n\r\n\t\tthis._initPanes();\r\n\r\n\t\tif (this._initControlPos) {\r\n\t\t\tthis._initControlPos();\r\n\t\t}\r\n\t},\r\n\r\n\t_initPanes: function () {\r\n\t\tvar panes = this._panes = {};\r\n\r\n\t\tthis._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container);\r\n\r\n\t\tthis._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane);\r\n\t\tpanes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane);\r\n\t\tpanes.shadowPane = this._createPane('leaflet-shadow-pane');\r\n\t\tpanes.overlayPane = this._createPane('leaflet-overlay-pane');\r\n\t\tpanes.markerPane = this._createPane('leaflet-marker-pane');\r\n\t\tpanes.popupPane = this._createPane('leaflet-popup-pane');\r\n\r\n\t\tvar zoomHide = ' leaflet-zoom-hide';\r\n\r\n\t\tif (!this.options.markerZoomAnimation) {\r\n\t\t\tL.DomUtil.addClass(panes.markerPane, zoomHide);\r\n\t\t\tL.DomUtil.addClass(panes.shadowPane, zoomHide);\r\n\t\t\tL.DomUtil.addClass(panes.popupPane, zoomHide);\r\n\t\t}\r\n\t},\r\n\r\n\t_createPane: function (className, container) {\r\n\t\treturn L.DomUtil.create('div', className, container || this._panes.objectsPane);\r\n\t},\r\n\r\n\t_clearPanes: function () {\r\n\t\tthis._container.removeChild(this._mapPane);\r\n\t},\r\n\r\n\t_addLayers: function (layers) {\r\n\t\tlayers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];\r\n\r\n\t\tfor (var i = 0, len = layers.length; i < len; i++) {\r\n\t\t\tthis.addLayer(layers[i]);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// private methods that modify map state\r\n\r\n\t_resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {\r\n\r\n\t\tvar zoomChanged = (this._zoom !== zoom);\r\n\r\n\t\tif (!afterZoomAnim) {\r\n\t\t\tthis.fire('movestart');\r\n\r\n\t\t\tif (zoomChanged) {\r\n\t\t\t\tthis.fire('zoomstart');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._zoom = zoom;\r\n\t\tthis._initialCenter = center;\r\n\r\n\t\tthis._initialTopLeftPoint = this._getNewTopLeftPoint(center);\r\n\r\n\t\tif (!preserveMapOffset) {\r\n\t\t\tL.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));\r\n\t\t} else {\r\n\t\t\tthis._initialTopLeftPoint._add(this._getMapPanePos());\r\n\t\t}\r\n\r\n\t\tthis._tileLayersToLoad = this._tileLayersNum;\r\n\r\n\t\tvar loading = !this._loaded;\r\n\t\tthis._loaded = true;\r\n\r\n\t\tthis.fire('viewreset', {hard: !preserveMapOffset});\r\n\r\n\t\tif (loading) {\r\n\t\t\tthis.fire('load');\r\n\t\t\tthis.eachLayer(this._layerAdd, this);\r\n\t\t}\r\n\r\n\t\tthis.fire('move');\r\n\r\n\t\tif (zoomChanged || afterZoomAnim) {\r\n\t\t\tthis.fire('zoomend');\r\n\t\t}\r\n\r\n\t\tthis.fire('moveend', {hard: !preserveMapOffset});\r\n\t},\r\n\r\n\t_rawPanBy: function (offset) {\r\n\t\tL.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));\r\n\t},\r\n\r\n\t_getZoomSpan: function () {\r\n\t\treturn this.getMaxZoom() - this.getMinZoom();\r\n\t},\r\n\r\n\t_updateZoomLevels: function () {\r\n\t\tvar i,\r\n\t\t\tminZoom = Infinity,\r\n\t\t\tmaxZoom = -Infinity,\r\n\t\t\toldZoomSpan = this._getZoomSpan();\r\n\r\n\t\tfor (i in this._zoomBoundLayers) {\r\n\t\t\tvar layer = this._zoomBoundLayers[i];\r\n\t\t\tif (!isNaN(layer.options.minZoom)) {\r\n\t\t\t\tminZoom = Math.min(minZoom, layer.options.minZoom);\r\n\t\t\t}\r\n\t\t\tif (!isNaN(layer.options.maxZoom)) {\r\n\t\t\t\tmaxZoom = Math.max(maxZoom, layer.options.maxZoom);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (i === undefined) { // we have no tilelayers\r\n\t\t\tthis._layersMaxZoom = this._layersMinZoom = undefined;\r\n\t\t} else {\r\n\t\t\tthis._layersMaxZoom = maxZoom;\r\n\t\t\tthis._layersMinZoom = minZoom;\r\n\t\t}\r\n\r\n\t\tif (oldZoomSpan !== this._getZoomSpan()) {\r\n\t\t\tthis.fire('zoomlevelschange');\r\n\t\t}\r\n\t},\r\n\r\n\t_panInsideMaxBounds: function () {\r\n\t\tthis.panInsideBounds(this.options.maxBounds);\r\n\t},\r\n\r\n\t_checkIfLoaded: function () {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthrow new Error('Set map center and zoom first.');\r\n\t\t}\r\n\t},\r\n\r\n\t// map events\r\n\r\n\t_initEvents: function (onOff) {\r\n\t\tif (!L.DomEvent) { return; }\r\n\r\n\t\tonOff = onOff || 'on';\r\n\r\n\t\tL.DomEvent[onOff](this._container, 'click', this._onMouseClick, this);\r\n\r\n\t\tvar events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter',\r\n\t\t 'mouseleave', 'mousemove', 'contextmenu'],\r\n\t\t i, len;\r\n\r\n\t\tfor (i = 0, len = events.length; i < len; i++) {\r\n\t\t\tL.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this);\r\n\t\t}\r\n\r\n\t\tif (this.options.trackResize) {\r\n\t\t\tL.DomEvent[onOff](window, 'resize', this._onResize, this);\r\n\t\t}\r\n\t},\r\n\r\n\t_onResize: function () {\r\n\t\tL.Util.cancelAnimFrame(this._resizeRequest);\r\n\t\tthis._resizeRequest = L.Util.requestAnimFrame(\r\n\t\t function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container);\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tif (!this._loaded || (!e._simulated &&\r\n\t\t ((this.dragging && this.dragging.moved()) ||\r\n\t\t (this.boxZoom && this.boxZoom.moved()))) ||\r\n\t\t L.DomEvent._skipped(e)) { return; }\r\n\r\n\t\tthis.fire('preclick');\r\n\t\tthis._fireMouseEvent(e);\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\t\tif (!this._loaded || L.DomEvent._skipped(e)) { return; }\r\n\r\n\t\tvar type = e.type;\r\n\r\n\t\ttype = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type));\r\n\r\n\t\tif (!this.hasEventListeners(type)) { return; }\r\n\r\n\t\tif (type === 'contextmenu') {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\r\n\t\tvar containerPoint = this.mouseEventToContainerPoint(e),\r\n\t\t layerPoint = this.containerPointToLayerPoint(containerPoint),\r\n\t\t latlng = this.layerPointToLatLng(layerPoint);\r\n\r\n\t\tthis.fire(type, {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tlayerPoint: layerPoint,\r\n\t\t\tcontainerPoint: containerPoint,\r\n\t\t\toriginalEvent: e\r\n\t\t});\r\n\t},\r\n\r\n\t_onTileLayerLoad: function () {\r\n\t\tthis._tileLayersToLoad--;\r\n\t\tif (this._tileLayersNum && !this._tileLayersToLoad) {\r\n\t\t\tthis.fire('tilelayersload');\r\n\t\t}\r\n\t},\r\n\r\n\t_clearHandlers: function () {\r\n\t\tfor (var i = 0, len = this._handlers.length; i < len; i++) {\r\n\t\t\tthis._handlers[i].disable();\r\n\t\t}\r\n\t},\r\n\r\n\twhenReady: function (callback, context) {\r\n\t\tif (this._loaded) {\r\n\t\t\tcallback.call(context || this, this);\r\n\t\t} else {\r\n\t\t\tthis.on('load', callback, context);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_layerAdd: function (layer) {\r\n\t\tlayer.onAdd(this);\r\n\t\tthis.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\r\n\t// private methods for getting map state\r\n\r\n\t_getMapPanePos: function () {\r\n\t\treturn L.DomUtil.getPosition(this._mapPane);\r\n\t},\r\n\r\n\t_moved: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\treturn pos && !pos.equals([0, 0]);\r\n\t},\r\n\r\n\t_getTopLeftPoint: function () {\r\n\t\treturn this.getPixelOrigin().subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t_getNewTopLeftPoint: function (center, zoom) {\r\n\t\tvar viewHalf = this.getSize()._divideBy(2);\r\n\t\t// TODO round on display, not calculation to increase precision?\r\n\t\treturn this.project(center, zoom)._subtract(viewHalf)._round();\r\n\t},\r\n\r\n\t_latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {\r\n\t\tvar topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());\r\n\t\treturn this.project(latlng, newZoom)._subtract(topLeft);\r\n\t},\r\n\r\n\t// layer point of the current center\r\n\t_getCenterLayerPoint: function () {\r\n\t\treturn this.containerPointToLayerPoint(this.getSize()._divideBy(2));\r\n\t},\r\n\r\n\t// offset of the specified place to the current center in pixels\r\n\t_getCenterOffset: function (latlng) {\r\n\t\treturn this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// adjust center for view to get inside bounds\r\n\t_limitCenter: function (center, zoom, bounds) {\r\n\r\n\t\tif (!bounds) { return center; }\r\n\r\n\t\tvar centerPoint = this.project(center, zoom),\r\n\t\t viewHalf = this.getSize().divideBy(2),\r\n\t\t viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),\r\n\t\t offset = this._getBoundsOffset(viewBounds, bounds, zoom);\r\n\r\n\t\treturn this.unproject(centerPoint.add(offset), zoom);\r\n\t},\r\n\r\n\t// adjust offset for view to get inside bounds\r\n\t_limitOffset: function (offset, bounds) {\r\n\t\tif (!bounds) { return offset; }\r\n\r\n\t\tvar viewBounds = this.getPixelBounds(),\r\n\t\t newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));\r\n\r\n\t\treturn offset.add(this._getBoundsOffset(newBounds, bounds));\r\n\t},\r\n\r\n\t// returns offset needed for pxBounds to get inside maxBounds at a specified zoom\r\n\t_getBoundsOffset: function (pxBounds, maxBounds, zoom) {\r\n\t\tvar nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min),\r\n\t\t seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max),\r\n\r\n\t\t dx = this._rebound(nwOffset.x, -seOffset.x),\r\n\t\t dy = this._rebound(nwOffset.y, -seOffset.y);\r\n\r\n\t\treturn new L.Point(dx, dy);\r\n\t},\r\n\r\n\t_rebound: function (left, right) {\r\n\t\treturn left + right > 0 ?\r\n\t\t\tMath.round(left - right) / 2 :\r\n\t\t\tMath.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));\r\n\t},\r\n\r\n\t_limitZoom: function (zoom) {\r\n\t\tvar min = this.getMinZoom(),\r\n\t\t max = this.getMaxZoom();\r\n\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t}\r\n});\r\n\r\nL.map = function (id, options) {\r\n\treturn new L.Map(id, options);\r\n};\r\n\n\n/*\r\n * Mercator projection that takes into account that the Earth is not a perfect sphere.\r\n * Less popular than spherical mercator; used by projections like EPSG:3395.\r\n */\r\n\r\nL.Projection.Mercator = {\r\n\tMAX_LATITUDE: 85.0840591556,\r\n\r\n\tR_MINOR: 6356752.314245179,\r\n\tR_MAJOR: 6378137,\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar d = L.LatLng.DEG_TO_RAD,\r\n\t\t max = this.MAX_LATITUDE,\r\n\t\t lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t r = this.R_MAJOR,\r\n\t\t r2 = this.R_MINOR,\r\n\t\t x = latlng.lng * d * r,\r\n\t\t y = lat * d,\r\n\t\t tmp = r2 / r,\r\n\t\t eccent = Math.sqrt(1.0 - tmp * tmp),\r\n\t\t con = eccent * Math.sin(y);\r\n\r\n\t\tcon = Math.pow((1 - con) / (1 + con), eccent * 0.5);\r\n\r\n\t\tvar ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;\r\n\t\ty = -r * Math.log(ts);\r\n\r\n\t\treturn new L.Point(x, y);\r\n\t},\r\n\r\n\tunproject: function (point) { // (Point, Boolean) -> LatLng\r\n\t\tvar d = L.LatLng.RAD_TO_DEG,\r\n\t\t r = this.R_MAJOR,\r\n\t\t r2 = this.R_MINOR,\r\n\t\t lng = point.x * d / r,\r\n\t\t tmp = r2 / r,\r\n\t\t eccent = Math.sqrt(1 - (tmp * tmp)),\r\n\t\t ts = Math.exp(- point.y / r),\r\n\t\t phi = (Math.PI / 2) - 2 * Math.atan(ts),\r\n\t\t numIter = 15,\r\n\t\t tol = 1e-7,\r\n\t\t i = numIter,\r\n\t\t dphi = 0.1,\r\n\t\t con;\r\n\r\n\t\twhile ((Math.abs(dphi) > tol) && (--i > 0)) {\r\n\t\t\tcon = eccent * Math.sin(phi);\r\n\t\t\tdphi = (Math.PI / 2) - 2 * Math.atan(ts *\r\n\t\t\t Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi;\r\n\t\t\tphi += dphi;\r\n\t\t}\r\n\r\n\t\treturn new L.LatLng(phi * d, lng);\r\n\t}\r\n};\r\n\n\n\r\nL.CRS.EPSG3395 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:3395',\r\n\r\n\tprojection: L.Projection.Mercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar m = L.Projection.Mercator,\r\n\t\t r = m.R_MAJOR,\r\n\t\t scale = 0.5 / (Math.PI * r);\r\n\r\n\t\treturn new L.Transformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\n\n/*\r\n * L.TileLayer is used for standard xyz-numbered tile layers.\r\n */\r\n\r\nL.TileLayer = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tminZoom: 0,\r\n\t\tmaxZoom: 18,\r\n\t\ttileSize: 256,\r\n\t\tsubdomains: 'abc',\r\n\t\terrorTileUrl: '',\r\n\t\tattribution: '',\r\n\t\tzoomOffset: 0,\r\n\t\topacity: 1,\r\n\t\t/*\r\n\t\tmaxNativeZoom: null,\r\n\t\tzIndex: null,\r\n\t\ttms: false,\r\n\t\tcontinuousWorld: false,\r\n\t\tnoWrap: false,\r\n\t\tzoomReverse: false,\r\n\t\tdetectRetina: false,\r\n\t\treuseTiles: false,\r\n\t\tbounds: false,\r\n\t\t*/\r\n\t\tunloadInvisibleTiles: L.Browser.mobile,\r\n\t\tupdateWhenIdle: L.Browser.mobile\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\t// detecting retina displays, adjusting tileSize and zoom levels\r\n\t\tif (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {\r\n\r\n\t\t\toptions.tileSize = Math.floor(options.tileSize / 2);\r\n\t\t\toptions.zoomOffset++;\r\n\r\n\t\t\tif (options.minZoom > 0) {\r\n\t\t\t\toptions.minZoom--;\r\n\t\t\t}\r\n\t\t\tthis.options.maxZoom--;\r\n\t\t}\r\n\r\n\t\tif (options.bounds) {\r\n\t\t\toptions.bounds = L.latLngBounds(options.bounds);\r\n\t\t}\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar subdomains = this.options.subdomains;\r\n\r\n\t\tif (typeof subdomains === 'string') {\r\n\t\t\tthis.options.subdomains = subdomains.split('');\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\t\tthis._animated = map._zoomAnimated;\r\n\r\n\t\t// create a container div for tiles\r\n\t\tthis._initContainer();\r\n\r\n\t\t// set up events\r\n\t\tmap.on({\r\n\t\t\t'viewreset': this._reset,\r\n\t\t\t'moveend': this._update\r\n\t\t}, this);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tmap.on({\r\n\t\t\t\t'zoomanim': this._animateZoom,\r\n\t\t\t\t'zoomend': this._endZoomAnim\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\tif (!this.options.updateWhenIdle) {\r\n\t\t\tthis._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this);\r\n\t\t\tmap.on('move', this._limitedUpdate, this);\r\n\t\t}\r\n\r\n\t\tthis._reset();\r\n\t\tthis._update();\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tthis._container.parentNode.removeChild(this._container);\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this._reset,\r\n\t\t\t'moveend': this._update\r\n\t\t}, this);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tmap.off({\r\n\t\t\t\t'zoomanim': this._animateZoom,\r\n\t\t\t\t'zoomend': this._endZoomAnim\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\tif (!this.options.updateWhenIdle) {\r\n\t\t\tmap.off('move', this._limitedUpdate, this);\r\n\t\t}\r\n\r\n\t\tthis._container = null;\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\tvar pane = this._map._panes.tilePane;\r\n\r\n\t\tif (this._container) {\r\n\t\t\tpane.appendChild(this._container);\r\n\t\t\tthis._setAutoZIndex(pane, Math.max);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar pane = this._map._panes.tilePane;\r\n\r\n\t\tif (this._container) {\r\n\t\t\tpane.insertBefore(this._container, pane.firstChild);\r\n\t\t\tthis._setAutoZIndex(pane, Math.min);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetAttribution: function () {\r\n\t\treturn this.options.attribution;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetZIndex: function (zIndex) {\r\n\t\tthis.options.zIndex = zIndex;\r\n\t\tthis._updateZIndex();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetUrl: function (url, noRedraw) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset({hard: true});\r\n\t\t\tthis._update();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateZIndex: function () {\r\n\t\tif (this._container && this.options.zIndex !== undefined) {\r\n\t\t\tthis._container.style.zIndex = this.options.zIndex;\r\n\t\t}\r\n\t},\r\n\r\n\t_setAutoZIndex: function (pane, compare) {\r\n\r\n\t\tvar layers = pane.children,\r\n\t\t edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min\r\n\t\t zIndex, i, len;\r\n\r\n\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\r\n\t\t\tif (layers[i] !== this._container) {\r\n\t\t\t\tzIndex = parseInt(layers[i].style.zIndex, 10);\r\n\r\n\t\t\t\tif (!isNaN(zIndex)) {\r\n\t\t\t\t\tedgeZIndex = compare(edgeZIndex, zIndex);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.options.zIndex = this._container.style.zIndex =\r\n\t\t (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1);\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tvar i,\r\n\t\t tiles = this._tiles;\r\n\r\n\t\tif (L.Browser.ielt9) {\r\n\t\t\tfor (i in tiles) {\r\n\t\t\t\tL.DomUtil.setOpacity(tiles[i], this.options.opacity);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tL.DomUtil.setOpacity(this._container, this.options.opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_initContainer: function () {\r\n\t\tvar tilePane = this._map._panes.tilePane;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._container = L.DomUtil.create('div', 'leaflet-layer');\r\n\r\n\t\t\tthis._updateZIndex();\r\n\r\n\t\t\tif (this._animated) {\r\n\t\t\t\tvar className = 'leaflet-tile-container';\r\n\r\n\t\t\t\tthis._bgBuffer = L.DomUtil.create('div', className, this._container);\r\n\t\t\t\tthis._tileContainer = L.DomUtil.create('div', className, this._container);\r\n\r\n\t\t\t} else {\r\n\t\t\t\tthis._tileContainer = this._container;\r\n\t\t\t}\r\n\r\n\t\t\ttilePane.appendChild(this._container);\r\n\r\n\t\t\tif (this.options.opacity < 1) {\r\n\t\t\t\tthis._updateOpacity();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_reset: function (e) {\r\n\t\tfor (var key in this._tiles) {\r\n\t\t\tthis.fire('tileunload', {tile: this._tiles[key]});\r\n\t\t}\r\n\r\n\t\tthis._tiles = {};\r\n\t\tthis._tilesToLoad = 0;\r\n\r\n\t\tif (this.options.reuseTiles) {\r\n\t\t\tthis._unusedTiles = [];\r\n\t\t}\r\n\r\n\t\tthis._tileContainer.innerHTML = '';\r\n\r\n\t\tif (this._animated && e && e.hard) {\r\n\t\t\tthis._clearBgBuffer();\r\n\t\t}\r\n\r\n\t\tthis._initContainer();\r\n\t},\r\n\r\n\t_getTileSize: function () {\r\n\t\tvar map = this._map,\r\n\t\t zoom = map.getZoom() + this.options.zoomOffset,\r\n\t\t zoomN = this.options.maxNativeZoom,\r\n\t\t tileSize = this.options.tileSize;\r\n\r\n\t\tif (zoomN && zoom > zoomN) {\r\n\t\t\ttileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize);\r\n\t\t}\r\n\r\n\t\treturn tileSize;\r\n\t},\r\n\r\n\t_update: function () {\r\n\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t bounds = map.getPixelBounds(),\r\n\t\t zoom = map.getZoom(),\r\n\t\t tileSize = this._getTileSize();\r\n\r\n\t\tif (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar tileBounds = L.bounds(\r\n\t\t bounds.min.divideBy(tileSize)._floor(),\r\n\t\t bounds.max.divideBy(tileSize)._floor());\r\n\r\n\t\tthis._addTilesFromCenterOut(tileBounds);\r\n\r\n\t\tif (this.options.unloadInvisibleTiles || this.options.reuseTiles) {\r\n\t\t\tthis._removeOtherTiles(tileBounds);\r\n\t\t}\r\n\t},\r\n\r\n\t_addTilesFromCenterOut: function (bounds) {\r\n\t\tvar queue = [],\r\n\t\t center = bounds.getCenter();\r\n\r\n\t\tvar j, i, point;\r\n\r\n\t\tfor (j = bounds.min.y; j <= bounds.max.y; j++) {\r\n\t\t\tfor (i = bounds.min.x; i <= bounds.max.x; i++) {\r\n\t\t\t\tpoint = new L.Point(i, j);\r\n\r\n\t\t\t\tif (this._tileShouldBeLoaded(point)) {\r\n\t\t\t\t\tqueue.push(point);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar tilesToLoad = queue.length;\r\n\r\n\t\tif (tilesToLoad === 0) { return; }\r\n\r\n\t\t// load tiles in order of their distance to center\r\n\t\tqueue.sort(function (a, b) {\r\n\t\t\treturn a.distanceTo(center) - b.distanceTo(center);\r\n\t\t});\r\n\r\n\t\tvar fragment = document.createDocumentFragment();\r\n\r\n\t\t// if its the first batch of tiles to load\r\n\t\tif (!this._tilesToLoad) {\r\n\t\t\tthis.fire('loading');\r\n\t\t}\r\n\r\n\t\tthis._tilesToLoad += tilesToLoad;\r\n\r\n\t\tfor (i = 0; i < tilesToLoad; i++) {\r\n\t\t\tthis._addTile(queue[i], fragment);\r\n\t\t}\r\n\r\n\t\tthis._tileContainer.appendChild(fragment);\r\n\t},\r\n\r\n\t_tileShouldBeLoaded: function (tilePoint) {\r\n\t\tif ((tilePoint.x + ':' + tilePoint.y) in this._tiles) {\r\n\t\t\treturn false; // already loaded\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (!options.continuousWorld) {\r\n\t\t\tvar limit = this._getWrapTileNum();\r\n\r\n\t\t\t// don't load if exceeds world bounds\r\n\t\t\tif ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) ||\r\n\t\t\t\ttilePoint.y < 0 || tilePoint.y >= limit.y) { return false; }\r\n\t\t}\r\n\r\n\t\tif (options.bounds) {\r\n\t\t\tvar tileSize = this._getTileSize(),\r\n\t\t\t nwPoint = tilePoint.multiplyBy(tileSize),\r\n\t\t\t sePoint = nwPoint.add([tileSize, tileSize]),\r\n\t\t\t nw = this._map.unproject(nwPoint),\r\n\t\t\t se = this._map.unproject(sePoint);\r\n\r\n\t\t\t// TODO temporary hack, will be removed after refactoring projections\r\n\t\t\t// https://github.com/Leaflet/Leaflet/issues/1618\r\n\t\t\tif (!options.continuousWorld && !options.noWrap) {\r\n\t\t\t\tnw = nw.wrap();\r\n\t\t\t\tse = se.wrap();\r\n\t\t\t}\r\n\r\n\t\t\tif (!options.bounds.intersects([nw, se])) { return false; }\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_removeOtherTiles: function (bounds) {\r\n\t\tvar kArr, x, y, key;\r\n\r\n\t\tfor (key in this._tiles) {\r\n\t\t\tkArr = key.split(':');\r\n\t\t\tx = parseInt(kArr[0], 10);\r\n\t\t\ty = parseInt(kArr[1], 10);\r\n\r\n\t\t\t// remove tile if it's out of bounds\r\n\t\t\tif (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) {\r\n\t\t\t\tthis._removeTile(key);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_removeTile: function (key) {\r\n\t\tvar tile = this._tiles[key];\r\n\r\n\t\tthis.fire('tileunload', {tile: tile, url: tile.src});\r\n\r\n\t\tif (this.options.reuseTiles) {\r\n\t\t\tL.DomUtil.removeClass(tile, 'leaflet-tile-loaded');\r\n\t\t\tthis._unusedTiles.push(tile);\r\n\r\n\t\t} else if (tile.parentNode === this._tileContainer) {\r\n\t\t\tthis._tileContainer.removeChild(tile);\r\n\t\t}\r\n\r\n\t\t// for https://github.com/CloudMade/Leaflet/issues/137\r\n\t\tif (!L.Browser.android) {\r\n\t\t\ttile.onload = null;\r\n\t\t\ttile.src = L.Util.emptyImageUrl;\r\n\t\t}\r\n\r\n\t\tdelete this._tiles[key];\r\n\t},\r\n\r\n\t_addTile: function (tilePoint, container) {\r\n\t\tvar tilePos = this._getTilePos(tilePoint);\r\n\r\n\t\t// get unused tile - or create a new tile\r\n\t\tvar tile = this._getTile();\r\n\r\n\t\t/*\r\n\t\tChrome 20 layouts much faster with top/left (verify with timeline, frames)\r\n\t\tAndroid 4 browser has display issues with top/left and requires transform instead\r\n\t\t(other browsers don't currently care) - see debug/hacks/jitter.html for an example\r\n\t\t*/\r\n\t\tL.DomUtil.setPosition(tile, tilePos, L.Browser.chrome);\r\n\r\n\t\tthis._tiles[tilePoint.x + ':' + tilePoint.y] = tile;\r\n\r\n\t\tthis._loadTile(tile, tilePoint);\r\n\r\n\t\tif (tile.parentNode !== this._tileContainer) {\r\n\t\t\tcontainer.appendChild(tile);\r\n\t\t}\r\n\t},\r\n\r\n\t_getZoomForUrl: function () {\r\n\r\n\t\tvar options = this.options,\r\n\t\t zoom = this._map.getZoom();\r\n\r\n\t\tif (options.zoomReverse) {\r\n\t\t\tzoom = options.maxZoom - zoom;\r\n\t\t}\r\n\r\n\t\tzoom += options.zoomOffset;\r\n\r\n\t\treturn options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom;\r\n\t},\r\n\r\n\t_getTilePos: function (tilePoint) {\r\n\t\tvar origin = this._map.getPixelOrigin(),\r\n\t\t tileSize = this._getTileSize();\r\n\r\n\t\treturn tilePoint.multiplyBy(tileSize).subtract(origin);\r\n\t},\r\n\r\n\t// image-specific code (override to implement e.g. Canvas or SVG tile layer)\r\n\r\n\tgetTileUrl: function (tilePoint) {\r\n\t\treturn L.Util.template(this._url, L.extend({\r\n\t\t\ts: this._getSubdomain(tilePoint),\r\n\t\t\tz: tilePoint.z,\r\n\t\t\tx: tilePoint.x,\r\n\t\t\ty: tilePoint.y\r\n\t\t}, this.options));\r\n\t},\r\n\r\n\t_getWrapTileNum: function () {\r\n\t\tvar crs = this._map.options.crs,\r\n\t\t size = crs.getSize(this._map.getZoom());\r\n\t\treturn size.divideBy(this._getTileSize())._floor();\r\n\t},\r\n\r\n\t_adjustTilePoint: function (tilePoint) {\r\n\r\n\t\tvar limit = this._getWrapTileNum();\r\n\r\n\t\t// wrap tile coordinates\r\n\t\tif (!this.options.continuousWorld && !this.options.noWrap) {\r\n\t\t\ttilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x;\r\n\t\t}\r\n\r\n\t\tif (this.options.tms) {\r\n\t\t\ttilePoint.y = limit.y - tilePoint.y - 1;\r\n\t\t}\r\n\r\n\t\ttilePoint.z = this._getZoomForUrl();\r\n\t},\r\n\r\n\t_getSubdomain: function (tilePoint) {\r\n\t\tvar index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;\r\n\t\treturn this.options.subdomains[index];\r\n\t},\r\n\r\n\t_getTile: function () {\r\n\t\tif (this.options.reuseTiles && this._unusedTiles.length > 0) {\r\n\t\t\tvar tile = this._unusedTiles.pop();\r\n\t\t\tthis._resetTile(tile);\r\n\t\t\treturn tile;\r\n\t\t}\r\n\t\treturn this._createTile();\r\n\t},\r\n\r\n\t// Override if data stored on a tile needs to be cleaned up before reuse\r\n\t_resetTile: function (/*tile*/) {},\r\n\r\n\t_createTile: function () {\r\n\t\tvar tile = L.DomUtil.create('img', 'leaflet-tile');\r\n\t\ttile.style.width = tile.style.height = this._getTileSize() + 'px';\r\n\t\ttile.galleryimg = 'no';\r\n\r\n\t\ttile.onselectstart = tile.onmousemove = L.Util.falseFn;\r\n\r\n\t\tif (L.Browser.ielt9 && this.options.opacity !== undefined) {\r\n\t\t\tL.DomUtil.setOpacity(tile, this.options.opacity);\r\n\t\t}\r\n\t\t// without this hack, tiles disappear after zoom on Chrome for Android\r\n\t\t// https://github.com/Leaflet/Leaflet/issues/2078\r\n\t\tif (L.Browser.mobileWebkit3d) {\r\n\t\t\ttile.style.WebkitBackfaceVisibility = 'hidden';\r\n\t\t}\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t_loadTile: function (tile, tilePoint) {\r\n\t\ttile._layer = this;\r\n\t\ttile.onload = this._tileOnLoad;\r\n\t\ttile.onerror = this._tileOnError;\r\n\r\n\t\tthis._adjustTilePoint(tilePoint);\r\n\t\ttile.src = this.getTileUrl(tilePoint);\r\n\r\n\t\tthis.fire('tileloadstart', {\r\n\t\t\ttile: tile,\r\n\t\t\turl: tile.src\r\n\t\t});\r\n\t},\r\n\r\n\t_tileLoaded: function () {\r\n\t\tthis._tilesToLoad--;\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tL.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated');\r\n\t\t}\r\n\r\n\t\tif (!this._tilesToLoad) {\r\n\t\t\tthis.fire('load');\r\n\r\n\t\t\tif (this._animated) {\r\n\t\t\t\t// clear scaled tiles after all new tiles are loaded (for performance)\r\n\t\t\t\tclearTimeout(this._clearBgBufferTimer);\r\n\t\t\t\tthis._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_tileOnLoad: function () {\r\n\t\tvar layer = this._layer;\r\n\r\n\t\t//Only if we are loading an actual image\r\n\t\tif (this.src !== L.Util.emptyImageUrl) {\r\n\t\t\tL.DomUtil.addClass(this, 'leaflet-tile-loaded');\r\n\r\n\t\t\tlayer.fire('tileload', {\r\n\t\t\t\ttile: this,\r\n\t\t\t\turl: this.src\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tlayer._tileLoaded();\r\n\t},\r\n\r\n\t_tileOnError: function () {\r\n\t\tvar layer = this._layer;\r\n\r\n\t\tlayer.fire('tileerror', {\r\n\t\t\ttile: this,\r\n\t\t\turl: this.src\r\n\t\t});\r\n\r\n\t\tvar newUrl = layer.options.errorTileUrl;\r\n\t\tif (newUrl) {\r\n\t\t\tthis.src = newUrl;\r\n\t\t}\r\n\r\n\t\tlayer._tileLoaded();\r\n\t}\r\n});\r\n\r\nL.tileLayer = function (url, options) {\r\n\treturn new L.TileLayer(url, options);\r\n};\r\n\n\n/*\r\n * L.TileLayer.WMS is used for putting WMS tile layers on the map.\r\n */\r\n\r\nL.TileLayer.WMS = L.TileLayer.extend({\r\n\r\n\tdefaultWmsParams: {\r\n\t\tservice: 'WMS',\r\n\t\trequest: 'GetMap',\r\n\t\tversion: '1.1.1',\r\n\t\tlayers: '',\r\n\t\tstyles: '',\r\n\t\tformat: 'image/jpeg',\r\n\t\ttransparent: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) { // (String, Object)\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar wmsParams = L.extend({}, this.defaultWmsParams),\r\n\t\t tileSize = options.tileSize || this.options.tileSize;\r\n\r\n\t\tif (options.detectRetina && L.Browser.retina) {\r\n\t\t\twmsParams.width = wmsParams.height = tileSize * 2;\r\n\t\t} else {\r\n\t\t\twmsParams.width = wmsParams.height = tileSize;\r\n\t\t}\r\n\r\n\t\tfor (var i in options) {\r\n\t\t\t// all keys that are not TileLayer options go to WMS params\r\n\t\t\tif (!this.options.hasOwnProperty(i) && i !== 'crs') {\r\n\t\t\t\twmsParams[i] = options[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.wmsParams = wmsParams;\r\n\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\r\n\t\tthis._crs = this.options.crs || map.options.crs;\r\n\r\n\t\tthis._wmsVersion = parseFloat(this.wmsParams.version);\r\n\r\n\t\tvar projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';\r\n\t\tthis.wmsParams[projectionKey] = this._crs.code;\r\n\r\n\t\tL.TileLayer.prototype.onAdd.call(this, map);\r\n\t},\r\n\r\n\tgetTileUrl: function (tilePoint) { // (Point, Number) -> String\r\n\r\n\t\tvar map = this._map,\r\n\t\t tileSize = this.options.tileSize,\r\n\r\n\t\t nwPoint = tilePoint.multiplyBy(tileSize),\r\n\t\t sePoint = nwPoint.add([tileSize, tileSize]),\r\n\r\n\t\t nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)),\r\n\t\t se = this._crs.project(map.unproject(sePoint, tilePoint.z)),\r\n\t\t bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?\r\n\t\t [se.y, nw.x, nw.y, se.x].join(',') :\r\n\t\t [nw.x, se.y, se.x, nw.y].join(','),\r\n\r\n\t\t url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)});\r\n\r\n\t\treturn url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox;\r\n\t},\r\n\r\n\tsetParams: function (params, noRedraw) {\r\n\r\n\t\tL.extend(this.wmsParams, params);\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\nL.tileLayer.wms = function (url, options) {\r\n\treturn new L.TileLayer.WMS(url, options);\r\n};\r\n\n\n/*\r\n * L.TileLayer.Canvas is a class that you can use as a base for creating\r\n * dynamically drawn Canvas-based tile layers.\r\n */\r\n\r\nL.TileLayer.Canvas = L.TileLayer.extend({\r\n\toptions: {\r\n\t\tasync: false\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset({hard: true});\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tfor (var i in this._tiles) {\r\n\t\t\tthis._redrawTile(this._tiles[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_redrawTile: function (tile) {\r\n\t\tthis.drawTile(tile, tile._tilePoint, this._map._zoom);\r\n\t},\r\n\r\n\t_createTile: function () {\r\n\t\tvar tile = L.DomUtil.create('canvas', 'leaflet-tile');\r\n\t\ttile.width = tile.height = this.options.tileSize;\r\n\t\ttile.onselectstart = tile.onmousemove = L.Util.falseFn;\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t_loadTile: function (tile, tilePoint) {\r\n\t\ttile._layer = this;\r\n\t\ttile._tilePoint = tilePoint;\r\n\r\n\t\tthis._redrawTile(tile);\r\n\r\n\t\tif (!this.options.async) {\r\n\t\t\tthis.tileDrawn(tile);\r\n\t\t}\r\n\t},\r\n\r\n\tdrawTile: function (/*tile, tilePoint*/) {\r\n\t\t// override with rendering code\r\n\t},\r\n\r\n\ttileDrawn: function (tile) {\r\n\t\tthis._tileOnLoad.call(tile);\r\n\t}\r\n});\r\n\r\n\r\nL.tileLayer.canvas = function (options) {\r\n\treturn new L.TileLayer.Canvas(options);\r\n};\r\n\n\n/*\r\n * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds).\r\n */\r\n\r\nL.ImageOverlay = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\topacity: 1\r\n\t},\r\n\r\n\tinitialize: function (url, bounds, options) { // (String, LatLngBounds, Object)\r\n\t\tthis._url = url;\r\n\t\tthis._bounds = L.latLngBounds(bounds);\r\n\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._image) {\r\n\t\t\tthis._initImage();\r\n\t\t}\r\n\r\n\t\tmap._panes.overlayPane.appendChild(this._image);\r\n\r\n\t\tmap.on('viewreset', this._reset, this);\r\n\r\n\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._reset();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.getPanes().overlayPane.removeChild(this._image);\r\n\r\n\t\tmap.off('viewreset', this._reset, this);\r\n\r\n\t\tif (map.options.zoomAnimation) {\r\n\t\t\tmap.off('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tthis._updateOpacity();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// TODO remove bringToFront/bringToBack duplication from TileLayer/Path\r\n\tbringToFront: function () {\r\n\t\tif (this._image) {\r\n\t\t\tthis._map._panes.overlayPane.appendChild(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar pane = this._map._panes.overlayPane;\r\n\t\tif (this._image) {\r\n\t\t\tpane.insertBefore(this._image, pane.firstChild);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetUrl: function (url) {\r\n\t\tthis._url = url;\r\n\t\tthis._image.src = this._url;\r\n\t},\r\n\r\n\tgetAttribution: function () {\r\n\t\treturn this.options.attribution;\r\n\t},\r\n\r\n\t_initImage: function () {\r\n\t\tthis._image = L.DomUtil.create('img', 'leaflet-image-layer');\r\n\r\n\t\tif (this._map.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-zoom-animated');\r\n\t\t} else {\r\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-zoom-hide');\r\n\t\t}\r\n\r\n\t\tthis._updateOpacity();\r\n\r\n\t\t//TODO createImage util method to remove duplication\r\n\t\tL.extend(this._image, {\r\n\t\t\tgalleryimg: 'no',\r\n\t\t\tonselectstart: L.Util.falseFn,\r\n\t\t\tonmousemove: L.Util.falseFn,\r\n\t\t\tonload: L.bind(this._onImageLoad, this),\r\n\t\t\tsrc: this._url\r\n\t\t});\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar map = this._map,\r\n\t\t image = this._image,\r\n\t\t scale = map.getZoomScale(e.zoom),\r\n\t\t nw = this._bounds.getNorthWest(),\r\n\t\t se = this._bounds.getSouthEast(),\r\n\r\n\t\t topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center),\r\n\t\t size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft),\r\n\t\t origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale)));\r\n\r\n\t\timage.style[L.DomUtil.TRANSFORM] =\r\n\t\t L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') ';\r\n\t},\r\n\r\n\t_reset: function () {\r\n\t\tvar image = this._image,\r\n\t\t topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()),\r\n\t\t size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft);\r\n\r\n\t\tL.DomUtil.setPosition(image, topLeft);\r\n\r\n\t\timage.style.width = size.x + 'px';\r\n\t\timage.style.height = size.y + 'px';\r\n\t},\r\n\r\n\t_onImageLoad: function () {\r\n\t\tthis.fire('load');\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tL.DomUtil.setOpacity(this._image, this.options.opacity);\r\n\t}\r\n});\r\n\r\nL.imageOverlay = function (url, bounds, options) {\r\n\treturn new L.ImageOverlay(url, bounds, options);\r\n};\r\n\n\n/*\r\n * L.Icon is an image-based icon class that you can use with L.Marker for custom markers.\r\n */\r\n\r\nL.Icon = L.Class.extend({\r\n\toptions: {\r\n\t\t/*\r\n\t\ticonUrl: (String) (required)\r\n\t\ticonRetinaUrl: (String) (optional, used for retina devices if detected)\r\n\t\ticonSize: (Point) (can be set through CSS)\r\n\t\ticonAnchor: (Point) (centered by default, can be set in CSS with negative margins)\r\n\t\tpopupAnchor: (Point) (if not specified, popup opens in the anchor point)\r\n\t\tshadowUrl: (String) (no shadow by default)\r\n\t\tshadowRetinaUrl: (String) (optional, used for retina devices if detected)\r\n\t\tshadowSize: (Point)\r\n\t\tshadowAnchor: (Point)\r\n\t\t*/\r\n\t\tclassName: ''\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tcreateIcon: function (oldIcon) {\r\n\t\treturn this._createIcon('icon', oldIcon);\r\n\t},\r\n\r\n\tcreateShadow: function (oldIcon) {\r\n\t\treturn this._createIcon('shadow', oldIcon);\r\n\t},\r\n\r\n\t_createIcon: function (name, oldIcon) {\r\n\t\tvar src = this._getIconUrl(name);\r\n\r\n\t\tif (!src) {\r\n\t\t\tif (name === 'icon') {\r\n\t\t\t\tthrow new Error('iconUrl not set in Icon options (see the docs).');\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar img;\r\n\t\tif (!oldIcon || oldIcon.tagName !== 'IMG') {\r\n\t\t\timg = this._createImg(src);\r\n\t\t} else {\r\n\t\t\timg = this._createImg(src, oldIcon);\r\n\t\t}\r\n\t\tthis._setIconStyles(img, name);\r\n\r\n\t\treturn img;\r\n\t},\r\n\r\n\t_setIconStyles: function (img, name) {\r\n\t\tvar options = this.options,\r\n\t\t size = L.point(options[name + 'Size']),\r\n\t\t anchor;\r\n\r\n\t\tif (name === 'shadow') {\r\n\t\t\tanchor = L.point(options.shadowAnchor || options.iconAnchor);\r\n\t\t} else {\r\n\t\t\tanchor = L.point(options.iconAnchor);\r\n\t\t}\r\n\r\n\t\tif (!anchor && size) {\r\n\t\t\tanchor = size.divideBy(2, true);\r\n\t\t}\r\n\r\n\t\timg.className = 'leaflet-marker-' + name + ' ' + options.className;\r\n\r\n\t\tif (anchor) {\r\n\t\t\timg.style.marginLeft = (-anchor.x) + 'px';\r\n\t\t\timg.style.marginTop = (-anchor.y) + 'px';\r\n\t\t}\r\n\r\n\t\tif (size) {\r\n\t\t\timg.style.width = size.x + 'px';\r\n\t\t\timg.style.height = size.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t_createImg: function (src, el) {\r\n\t\tel = el || document.createElement('img');\r\n\t\tel.src = src;\r\n\t\treturn el;\r\n\t},\r\n\r\n\t_getIconUrl: function (name) {\r\n\t\tif (L.Browser.retina && this.options[name + 'RetinaUrl']) {\r\n\t\t\treturn this.options[name + 'RetinaUrl'];\r\n\t\t}\r\n\t\treturn this.options[name + 'Url'];\r\n\t}\r\n});\r\n\r\nL.icon = function (options) {\r\n\treturn new L.Icon(options);\r\n};\r\n\n\n/*\n * L.Icon.Default is the blue marker icon used by default in Leaflet.\n */\n\nL.Icon.Default = L.Icon.extend({\n\n\toptions: {\n\t\ticonSize: [25, 41],\n\t\ticonAnchor: [12, 41],\n\t\tpopupAnchor: [1, -34],\n\n\t\tshadowSize: [41, 41]\n\t},\n\n\t_getIconUrl: function (name) {\n\t\tvar key = name + 'Url';\n\n\t\tif (this.options[key]) {\n\t\t\treturn this.options[key];\n\t\t}\n\n\t\tif (L.Browser.retina && name === 'icon') {\n\t\t\tname += '-2x';\n\t\t}\n\n\t\tvar path = L.Icon.Default.imagePath;\n\n\t\tif (!path) {\n\t\t\tthrow new Error('Couldn\\'t autodetect L.Icon.Default.imagePath, set it manually.');\n\t\t}\n\n\t\treturn path + '/marker-' + name + '.png';\n\t}\n});\n\nL.Icon.Default.imagePath = (function () {\n\tvar scripts = document.getElementsByTagName('script'),\n\t leafletRe = /[\\/^]leaflet[\\-\\._]?([\\w\\-\\._]*)\\.js\\??/;\n\n\tvar i, len, src, matches, path;\n\n\tfor (i = 0, len = scripts.length; i < len; i++) {\n\t\tsrc = scripts[i].src;\n\t\tmatches = src.match(leafletRe);\n\n\t\tif (matches) {\n\t\t\tpath = src.split(leafletRe)[0];\n\t\t\treturn (path ? path + '/' : '') + 'images';\n\t\t}\n\t}\n}());\n\n\n/*\r\n * L.Marker is used to display clickable/draggable icons on the map.\r\n */\r\n\r\nL.Marker = L.Class.extend({\r\n\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\ticon: new L.Icon.Default(),\r\n\t\ttitle: '',\r\n\t\talt: '',\r\n\t\tclickable: true,\r\n\t\tdraggable: false,\r\n\t\tkeyboard: true,\r\n\t\tzIndexOffset: 0,\r\n\t\topacity: 1,\r\n\t\triseOnHover: false,\r\n\t\triseOffset: 250\r\n\t},\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tL.setOptions(this, options);\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tmap.on('viewreset', this.update, this);\r\n\r\n\t\tthis._initIcon();\r\n\t\tthis.update();\r\n\t\tthis.fire('add');\r\n\r\n\t\tif (map.options.zoomAnimation && map.options.markerZoomAnimation) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (this.dragging) {\r\n\t\t\tthis.dragging.disable();\r\n\t\t}\r\n\r\n\t\tthis._removeIcon();\r\n\t\tthis._removeShadow();\r\n\r\n\t\tthis.fire('remove');\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this.update,\r\n\t\t\t'zoomanim': this._animateZoom\r\n\t\t}, this);\r\n\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\r\n\t\tthis.update();\r\n\r\n\t\treturn this.fire('move', { latlng: this._latlng });\r\n\t},\r\n\r\n\tsetZIndexOffset: function (offset) {\r\n\t\tthis.options.zIndexOffset = offset;\r\n\t\tthis.update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetIcon: function (icon) {\r\n\r\n\t\tthis.options.icon = icon;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._initIcon();\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\tif (this._popup) {\r\n\t\t\tthis.bindPopup(this._popup);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\t\tif (this._icon) {\r\n\t\t\tthis._setPos(this._map.latLngToLayerPoint(this._latlng).round());\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initIcon: function () {\r\n\t\tvar options = this.options,\r\n\t\t map = this._map,\r\n\t\t animation = (map.options.zoomAnimation && map.options.markerZoomAnimation),\r\n\t\t classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide';\r\n\r\n\t\tvar icon = options.icon.createIcon(this._icon),\r\n\t\t\taddIcon = false;\r\n\r\n\t\t// if we're not reusing the icon, remove the old one and init new one\r\n\t\tif (icon !== this._icon) {\r\n\t\t\tif (this._icon) {\r\n\t\t\t\tthis._removeIcon();\r\n\t\t\t}\r\n\t\t\taddIcon = true;\r\n\r\n\t\t\tif (options.title) {\r\n\t\t\t\ticon.title = options.title;\r\n\t\t\t}\r\n\r\n\t\t\tif (options.alt) {\r\n\t\t\t\ticon.alt = options.alt;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tL.DomUtil.addClass(icon, classToAdd);\r\n\r\n\t\tif (options.keyboard) {\r\n\t\t\ticon.tabIndex = '0';\r\n\t\t}\r\n\r\n\t\tthis._icon = icon;\r\n\r\n\t\tthis._initInteraction();\r\n\r\n\t\tif (options.riseOnHover) {\r\n\t\t\tL.DomEvent\r\n\t\t\t\t.on(icon, 'mouseover', this._bringToFront, this)\r\n\t\t\t\t.on(icon, 'mouseout', this._resetZIndex, this);\r\n\t\t}\r\n\r\n\t\tvar newShadow = options.icon.createShadow(this._shadow),\r\n\t\t\taddShadow = false;\r\n\r\n\t\tif (newShadow !== this._shadow) {\r\n\t\t\tthis._removeShadow();\r\n\t\t\taddShadow = true;\r\n\t\t}\r\n\r\n\t\tif (newShadow) {\r\n\t\t\tL.DomUtil.addClass(newShadow, classToAdd);\r\n\t\t}\r\n\t\tthis._shadow = newShadow;\r\n\r\n\r\n\t\tif (options.opacity < 1) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\r\n\t\tvar panes = this._map._panes;\r\n\r\n\t\tif (addIcon) {\r\n\t\t\tpanes.markerPane.appendChild(this._icon);\r\n\t\t}\r\n\r\n\t\tif (newShadow && addShadow) {\r\n\t\t\tpanes.shadowPane.appendChild(this._shadow);\r\n\t\t}\r\n\t},\r\n\r\n\t_removeIcon: function () {\r\n\t\tif (this.options.riseOnHover) {\r\n\t\t\tL.DomEvent\r\n\t\t\t .off(this._icon, 'mouseover', this._bringToFront)\r\n\t\t\t .off(this._icon, 'mouseout', this._resetZIndex);\r\n\t\t}\r\n\r\n\t\tthis._map._panes.markerPane.removeChild(this._icon);\r\n\r\n\t\tthis._icon = null;\r\n\t},\r\n\r\n\t_removeShadow: function () {\r\n\t\tif (this._shadow) {\r\n\t\t\tthis._map._panes.shadowPane.removeChild(this._shadow);\r\n\t\t}\r\n\t\tthis._shadow = null;\r\n\t},\r\n\r\n\t_setPos: function (pos) {\r\n\t\tL.DomUtil.setPosition(this._icon, pos);\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setPosition(this._shadow, pos);\r\n\t\t}\r\n\r\n\t\tthis._zIndex = pos.y + this.options.zIndexOffset;\r\n\r\n\t\tthis._resetZIndex();\r\n\t},\r\n\r\n\t_updateZIndex: function (offset) {\r\n\t\tthis._icon.style.zIndex = this._zIndex + offset;\r\n\t},\r\n\r\n\t_animateZoom: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();\r\n\r\n\t\tthis._setPos(pos);\r\n\t},\r\n\r\n\t_initInteraction: function () {\r\n\r\n\t\tif (!this.options.clickable) { return; }\r\n\r\n\t\t// TODO refactor into something shared with Map/Path/etc. to DRY it up\r\n\r\n\t\tvar icon = this._icon,\r\n\t\t events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu'];\r\n\r\n\t\tL.DomUtil.addClass(icon, 'leaflet-clickable');\r\n\t\tL.DomEvent.on(icon, 'click', this._onMouseClick, this);\r\n\t\tL.DomEvent.on(icon, 'keypress', this._onKeyPress, this);\r\n\r\n\t\tfor (var i = 0; i < events.length; i++) {\r\n\t\t\tL.DomEvent.on(icon, events[i], this._fireMouseEvent, this);\r\n\t\t}\r\n\r\n\t\tif (L.Handler.MarkerDrag) {\r\n\t\t\tthis.dragging = new L.Handler.MarkerDrag(this);\r\n\r\n\t\t\tif (this.options.draggable) {\r\n\t\t\t\tthis.dragging.enable();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tvar wasDragged = this.dragging && this.dragging.moved();\r\n\r\n\t\tif (this.hasEventListeners(e.type) || wasDragged) {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t}\r\n\r\n\t\tif (wasDragged) { return; }\r\n\r\n\t\tif ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; }\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\toriginalEvent: e,\r\n\t\t\tlatlng: this._latlng\r\n\t\t});\r\n\t},\r\n\r\n\t_onKeyPress: function (e) {\r\n\t\tif (e.keyCode === 13) {\r\n\t\t\tthis.fire('click', {\r\n\t\t\t\toriginalEvent: e,\r\n\t\t\t\tlatlng: this._latlng\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\toriginalEvent: e,\r\n\t\t\tlatlng: this._latlng\r\n\t\t});\r\n\r\n\t\t// TODO proper custom event propagation\r\n\t\t// this line will always be called if marker is in a FeatureGroup\r\n\t\tif (e.type === 'contextmenu' && this.hasEventListeners(e.type)) {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t\tif (e.type !== 'mousedown') {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t} else {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tL.DomUtil.setOpacity(this._icon, this.options.opacity);\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setOpacity(this._shadow, this.options.opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_bringToFront: function () {\r\n\t\tthis._updateZIndex(this.options.riseOffset);\r\n\t},\r\n\r\n\t_resetZIndex: function () {\r\n\t\tthis._updateZIndex(0);\r\n\t}\r\n});\r\n\r\nL.marker = function (latlng, options) {\r\n\treturn new L.Marker(latlng, options);\r\n};\r\n\n\n/*\n * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon)\n * to use with L.Marker.\n */\n\nL.DivIcon = L.Icon.extend({\n\toptions: {\n\t\ticonSize: [12, 12], // also can be set through CSS\n\t\t/*\n\t\ticonAnchor: (Point)\n\t\tpopupAnchor: (Point)\n\t\thtml: (String)\n\t\tbgPos: (Point)\n\t\t*/\n\t\tclassName: 'leaflet-div-icon',\n\t\thtml: false\n\t},\n\n\tcreateIcon: function (oldIcon) {\n\t\tvar div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),\n\t\t options = this.options;\n\n\t\tif (options.html !== false) {\n\t\t\tdiv.innerHTML = options.html;\n\t\t} else {\n\t\t\tdiv.innerHTML = '';\n\t\t}\n\n\t\tif (options.bgPos) {\n\t\t\tdiv.style.backgroundPosition =\n\t\t\t (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px';\n\t\t}\n\n\t\tthis._setIconStyles(div, 'icon');\n\t\treturn div;\n\t},\n\n\tcreateShadow: function () {\n\t\treturn null;\n\t}\n});\n\nL.divIcon = function (options) {\n\treturn new L.DivIcon(options);\n};\n\n\n/*\r\n * L.Popup is used for displaying popups on the map.\r\n */\r\n\r\nL.Map.mergeOptions({\r\n\tclosePopupOnClick: true\r\n});\r\n\r\nL.Popup = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tminWidth: 50,\r\n\t\tmaxWidth: 300,\r\n\t\t// maxHeight: null,\r\n\t\tautoPan: true,\r\n\t\tcloseButton: true,\r\n\t\toffset: [0, 7],\r\n\t\tautoPanPadding: [5, 5],\r\n\t\t// autoPanPaddingTopLeft: null,\r\n\t\t// autoPanPaddingBottomRight: null,\r\n\t\tkeepInView: false,\r\n\t\tclassName: '',\r\n\t\tzoomAnimation: true\r\n\t},\r\n\r\n\tinitialize: function (options, source) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._source = source;\r\n\t\tthis._animated = L.Browser.any3d && this.options.zoomAnimation;\r\n\t\tthis._isOpen = false;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initLayout();\r\n\t\t}\r\n\r\n\t\tvar animFade = map.options.fadeAnimation;\r\n\r\n\t\tif (animFade) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\t\tmap._panes.popupPane.appendChild(this._container);\r\n\r\n\t\tmap.on(this._getEvents(), this);\r\n\r\n\t\tthis.update();\r\n\r\n\t\tif (animFade) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 1);\r\n\t\t}\r\n\r\n\t\tthis.fire('open');\r\n\r\n\t\tmap.fire('popupopen', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\tthis._source.fire('popupopen', {popup: this});\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\topenOn: function (map) {\r\n\t\tmap.openPopup(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap._panes.popupPane.removeChild(this._container);\r\n\r\n\t\tL.Util.falseFn(this._container.offsetWidth); // force reflow\r\n\r\n\t\tmap.off(this._getEvents(), this);\r\n\r\n\t\tif (map.options.fadeAnimation) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\r\n\t\tthis._map = null;\r\n\r\n\t\tthis.fire('close');\r\n\r\n\t\tmap.fire('popupclose', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\tthis._source.fire('popupclose', {popup: this});\r\n\t\t}\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tif (this._map) {\r\n\t\t\tthis._updatePosition();\r\n\t\t\tthis._adjustPan();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetContent: function () {\r\n\t\treturn this._content;\r\n\t},\r\n\r\n\tsetContent: function (content) {\r\n\t\tthis._content = content;\r\n\t\tthis.update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._container.style.visibility = 'hidden';\r\n\r\n\t\tthis._updateContent();\r\n\t\tthis._updateLayout();\r\n\t\tthis._updatePosition();\r\n\r\n\t\tthis._container.style.visibility = '';\r\n\r\n\t\tthis._adjustPan();\r\n\t},\r\n\r\n\t_getEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tviewreset: this._updatePosition\r\n\t\t};\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tevents.zoomanim = this._zoomAnimation;\r\n\t\t}\r\n\t\tif ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {\r\n\t\t\tevents.preclick = this._close;\r\n\t\t}\r\n\t\tif (this.options.keepInView) {\r\n\t\t\tevents.moveend = this._adjustPan;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t_close: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.closePopup(this);\r\n\t\t}\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar prefix = 'leaflet-popup',\r\n\t\t\tcontainerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' +\r\n\t\t\t (this._animated ? 'animated' : 'hide'),\r\n\t\t\tcontainer = this._container = L.DomUtil.create('div', containerClass),\r\n\t\t\tcloseButton;\r\n\r\n\t\tif (this.options.closeButton) {\r\n\t\t\tcloseButton = this._closeButton =\r\n\t\t\t L.DomUtil.create('a', prefix + '-close-button', container);\r\n\t\t\tcloseButton.href = '#close';\r\n\t\t\tcloseButton.innerHTML = '×';\r\n\t\t\tL.DomEvent.disableClickPropagation(closeButton);\r\n\r\n\t\t\tL.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);\r\n\t\t}\r\n\r\n\t\tvar wrapper = this._wrapper =\r\n\t\t L.DomUtil.create('div', prefix + '-content-wrapper', container);\r\n\t\tL.DomEvent.disableClickPropagation(wrapper);\r\n\r\n\t\tthis._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);\r\n\r\n\t\tL.DomEvent.disableScrollPropagation(this._contentNode);\r\n\t\tL.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);\r\n\r\n\t\tthis._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);\r\n\t\tthis._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);\r\n\t},\r\n\r\n\t_updateContent: function () {\r\n\t\tif (!this._content) { return; }\r\n\r\n\t\tif (typeof this._content === 'string') {\r\n\t\t\tthis._contentNode.innerHTML = this._content;\r\n\t\t} else {\r\n\t\t\twhile (this._contentNode.hasChildNodes()) {\r\n\t\t\t\tthis._contentNode.removeChild(this._contentNode.firstChild);\r\n\t\t\t}\r\n\t\t\tthis._contentNode.appendChild(this._content);\r\n\t\t}\r\n\t\tthis.fire('contentupdate');\r\n\t},\r\n\r\n\t_updateLayout: function () {\r\n\t\tvar container = this._contentNode,\r\n\t\t style = container.style;\r\n\r\n\t\tstyle.width = '';\r\n\t\tstyle.whiteSpace = 'nowrap';\r\n\r\n\t\tvar width = container.offsetWidth;\r\n\t\twidth = Math.min(width, this.options.maxWidth);\r\n\t\twidth = Math.max(width, this.options.minWidth);\r\n\r\n\t\tstyle.width = (width + 1) + 'px';\r\n\t\tstyle.whiteSpace = '';\r\n\r\n\t\tstyle.height = '';\r\n\r\n\t\tvar height = container.offsetHeight,\r\n\t\t maxHeight = this.options.maxHeight,\r\n\t\t scrolledClass = 'leaflet-popup-scrolled';\r\n\r\n\t\tif (maxHeight && height > maxHeight) {\r\n\t\t\tstyle.height = maxHeight + 'px';\r\n\t\t\tL.DomUtil.addClass(container, scrolledClass);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.removeClass(container, scrolledClass);\r\n\t\t}\r\n\r\n\t\tthis._containerWidth = this._container.offsetWidth;\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng),\r\n\t\t animated = this._animated,\r\n\t\t offset = L.point(this.options.offset);\r\n\r\n\t\tif (animated) {\r\n\t\t\tL.DomUtil.setPosition(this._container, pos);\r\n\t\t}\r\n\r\n\t\tthis._containerBottom = -offset.y - (animated ? 0 : pos.y);\r\n\t\tthis._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x);\r\n\r\n\t\t// bottom position the popup in case the height of the popup changes (images loading etc)\r\n\t\tthis._container.style.bottom = this._containerBottom + 'px';\r\n\t\tthis._container.style.left = this._containerLeft + 'px';\r\n\t},\r\n\r\n\t_zoomAnimation: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center);\r\n\r\n\t\tL.DomUtil.setPosition(this._container, pos);\r\n\t},\r\n\r\n\t_adjustPan: function () {\r\n\t\tif (!this.options.autoPan) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t containerHeight = this._container.offsetHeight,\r\n\t\t containerWidth = this._containerWidth,\r\n\r\n\t\t layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tlayerPos._add(L.DomUtil.getPosition(this._container));\r\n\t\t}\r\n\r\n\t\tvar containerPos = map.layerPointToContainerPoint(layerPos),\r\n\t\t padding = L.point(this.options.autoPanPadding),\r\n\t\t paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),\r\n\t\t paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),\r\n\t\t size = map.getSize(),\r\n\t\t dx = 0,\r\n\t\t dy = 0;\r\n\r\n\t\tif (containerPos.x + containerWidth + paddingBR.x > size.x) { // right\r\n\t\t\tdx = containerPos.x + containerWidth - size.x + paddingBR.x;\r\n\t\t}\r\n\t\tif (containerPos.x - dx - paddingTL.x < 0) { // left\r\n\t\t\tdx = containerPos.x - paddingTL.x;\r\n\t\t}\r\n\t\tif (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom\r\n\t\t\tdy = containerPos.y + containerHeight - size.y + paddingBR.y;\r\n\t\t}\r\n\t\tif (containerPos.y - dy - paddingTL.y < 0) { // top\r\n\t\t\tdy = containerPos.y - paddingTL.y;\r\n\t\t}\r\n\r\n\t\tif (dx || dy) {\r\n\t\t\tmap\r\n\t\t\t .fire('autopanstart')\r\n\t\t\t .panBy([dx, dy]);\r\n\t\t}\r\n\t},\r\n\r\n\t_onCloseButtonClick: function (e) {\r\n\t\tthis._close();\r\n\t\tL.DomEvent.stop(e);\r\n\t}\r\n});\r\n\r\nL.popup = function (options, source) {\r\n\treturn new L.Popup(options, source);\r\n};\r\n\r\n\r\nL.Map.include({\r\n\topenPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object])\r\n\t\tthis.closePopup();\r\n\r\n\t\tif (!(popup instanceof L.Popup)) {\r\n\t\t\tvar content = popup;\r\n\r\n\t\t\tpopup = new L.Popup(options)\r\n\t\t\t .setLatLng(latlng)\r\n\t\t\t .setContent(content);\r\n\t\t}\r\n\t\tpopup._isOpen = true;\r\n\r\n\t\tthis._popup = popup;\r\n\t\treturn this.addLayer(popup);\r\n\t},\r\n\r\n\tclosePopup: function (popup) {\r\n\t\tif (!popup || popup === this._popup) {\r\n\t\t\tpopup = this._popup;\r\n\t\t\tthis._popup = null;\r\n\t\t}\r\n\t\tif (popup) {\r\n\t\t\tthis.removeLayer(popup);\r\n\t\t\tpopup._isOpen = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n\n/*\r\n * Popup extension to L.Marker, adding popup-related methods.\r\n */\r\n\r\nL.Marker.include({\r\n\topenPopup: function () {\r\n\t\tif (this._popup && this._map && !this._map.hasLayer(this._popup)) {\r\n\t\t\tthis._popup.setLatLng(this._latlng);\r\n\t\t\tthis._map.openPopup(this._popup);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup._close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\ttogglePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tif (this._popup._isOpen) {\r\n\t\t\t\tthis.closePopup();\r\n\t\t\t} else {\r\n\t\t\t\tthis.openPopup();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbindPopup: function (content, options) {\r\n\t\tvar anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]);\r\n\r\n\t\tanchor = anchor.add(L.Popup.prototype.options.offset);\r\n\r\n\t\tif (options && options.offset) {\r\n\t\t\tanchor = anchor.add(options.offset);\r\n\t\t}\r\n\r\n\t\toptions = L.extend({offset: anchor}, options);\r\n\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis\r\n\t\t\t .on('click', this.togglePopup, this)\r\n\t\t\t .on('remove', this.closePopup, this)\r\n\t\t\t .on('move', this._movePopup, this);\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\tif (content instanceof L.Popup) {\r\n\t\t\tL.setOptions(content, options);\r\n\t\t\tthis._popup = content;\r\n\t\t\tcontent._source = this;\r\n\t\t} else {\r\n\t\t\tthis._popup = new L.Popup(options, this)\r\n\t\t\t\t.setContent(content);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetPopupContent: function (content) {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup = null;\r\n\t\t\tthis\r\n\t\t\t .off('click', this.togglePopup, this)\r\n\t\t\t .off('remove', this.closePopup, this)\r\n\t\t\t .off('move', this._movePopup, this);\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetPopup: function () {\r\n\t\treturn this._popup;\r\n\t},\r\n\r\n\t_movePopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.LayerGroup is a class to combine several layers into one so that\r\n * you can manipulate the group (e.g. add/remove it) as one layer.\r\n */\r\n\r\nL.LayerGroup = L.Class.extend({\r\n\tinitialize: function (layers) {\r\n\t\tthis._layers = {};\r\n\r\n\t\tvar i, len;\r\n\r\n\t\tif (layers) {\r\n\t\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\t\t\t\tthis.addLayer(layers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\tvar id = this.getLayerId(layer);\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.addLayer(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = layer in this._layers ? layer : this.getLayerId(layer);\r\n\r\n\t\tif (this._map && this._layers[id]) {\r\n\t\t\tthis._map.removeLayer(this._layers[id]);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasLayer: function (layer) {\r\n\t\tif (!layer) { return false; }\r\n\r\n\t\treturn (layer in this._layers || this.getLayerId(layer) in this._layers);\r\n\t},\r\n\r\n\tclearLayers: function () {\r\n\t\tthis.eachLayer(this.removeLayer, this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tinvoke: function (methodName) {\r\n\t\tvar args = Array.prototype.slice.call(arguments, 1),\r\n\t\t i, layer;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tlayer = this._layers[i];\r\n\r\n\t\t\tif (layer[methodName]) {\r\n\t\t\t\tlayer[methodName].apply(layer, args);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\t\tthis.eachLayer(map.addLayer, map);\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tthis.eachLayer(map.removeLayer, map);\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetLayer: function (id) {\r\n\t\treturn this._layers[id];\r\n\t},\r\n\r\n\tgetLayers: function () {\r\n\t\tvar layers = [];\r\n\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tlayers.push(this._layers[i]);\r\n\t\t}\r\n\t\treturn layers;\r\n\t},\r\n\r\n\tsetZIndex: function (zIndex) {\r\n\t\treturn this.invoke('setZIndex', zIndex);\r\n\t},\r\n\r\n\tgetLayerId: function (layer) {\r\n\t\treturn L.stamp(layer);\r\n\t}\r\n});\r\n\r\nL.layerGroup = function (layers) {\r\n\treturn new L.LayerGroup(layers);\r\n};\r\n\n\n/*\r\n * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods\r\n * shared between a group of interactive layers (like vectors or markers).\r\n */\r\n\r\nL.FeatureGroup = L.LayerGroup.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\tstatics: {\r\n\t\tEVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose'\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\tif (this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif ('on' in layer) {\r\n\t\t\tlayer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);\r\n\t\t}\r\n\r\n\t\tL.LayerGroup.prototype.addLayer.call(this, layer);\r\n\r\n\t\tif (this._popupContent && layer.bindPopup) {\r\n\t\t\tlayer.bindPopup(this._popupContent, this._popupOptions);\r\n\t\t}\r\n\r\n\t\treturn this.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tif (!this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif (layer in this._layers) {\r\n\t\t\tlayer = this._layers[layer];\r\n\t\t}\r\n\r\n\t\tif ('off' in layer) {\r\n\t\t\tlayer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this);\r\n\t\t}\r\n\r\n\t\tL.LayerGroup.prototype.removeLayer.call(this, layer);\r\n\r\n\t\tif (this._popupContent) {\r\n\t\t\tthis.invoke('unbindPopup');\r\n\t\t}\r\n\r\n\t\treturn this.fire('layerremove', {layer: layer});\r\n\t},\r\n\r\n\tbindPopup: function (content, options) {\r\n\t\tthis._popupContent = content;\r\n\t\tthis._popupOptions = options;\r\n\t\treturn this.invoke('bindPopup', content, options);\r\n\t},\r\n\r\n\topenPopup: function (latlng) {\r\n\t\t// open popup on the first layer\r\n\t\tfor (var id in this._layers) {\r\n\t\t\tthis._layers[id].openPopup(latlng);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\treturn this.invoke('setStyle', style);\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\treturn this.invoke('bringToFront');\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\treturn this.invoke('bringToBack');\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar bounds = new L.LatLngBounds();\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tbounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds());\r\n\t\t});\r\n\r\n\t\treturn bounds;\r\n\t},\r\n\r\n\t_propagateEvent: function (e) {\r\n\t\te = L.extend({\r\n\t\t\tlayer: e.target,\r\n\t\t\ttarget: this\r\n\t\t}, e);\r\n\t\tthis.fire(e.type, e);\r\n\t}\r\n});\r\n\r\nL.featureGroup = function (layers) {\r\n\treturn new L.FeatureGroup(layers);\r\n};\r\n\n\n/*\r\n * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc.\r\n */\r\n\r\nL.Path = L.Class.extend({\r\n\tincludes: [L.Mixin.Events],\r\n\r\n\tstatics: {\r\n\t\t// how much to extend the clip area around the map view\r\n\t\t// (relative to its size, e.g. 0.5 is half the screen in each direction)\r\n\t\t// set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is)\r\n\t\tCLIP_PADDING: (function () {\r\n\t\t\tvar max = L.Browser.mobile ? 1280 : 2000,\r\n\t\t\t target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2;\r\n\t\t\treturn Math.max(0, Math.min(0.5, target));\r\n\t\t})()\r\n\t},\r\n\r\n\toptions: {\r\n\t\tstroke: true,\r\n\t\tcolor: '#0033ff',\r\n\t\tdashArray: null,\r\n\t\tlineCap: null,\r\n\t\tlineJoin: null,\r\n\t\tweight: 5,\r\n\t\topacity: 0.5,\r\n\r\n\t\tfill: false,\r\n\t\tfillColor: null, //same as color by default\r\n\t\tfillOpacity: 0.2,\r\n\r\n\t\tclickable: true\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initElements();\r\n\t\t\tthis._initEvents();\r\n\t\t}\r\n\r\n\t\tthis.projectLatlngs();\r\n\t\tthis._updatePath();\r\n\r\n\t\tif (this._container) {\r\n\t\t\tthis._map._pathRoot.appendChild(this._container);\r\n\t\t}\r\n\r\n\t\tthis.fire('add');\r\n\r\n\t\tmap.on({\r\n\t\t\t'viewreset': this.projectLatlngs,\r\n\t\t\t'moveend': this._updatePath\r\n\t\t}, this);\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap._pathRoot.removeChild(this._container);\r\n\r\n\t\t// Need to fire remove event before we set _map to null as the event hooks might need the object\r\n\t\tthis.fire('remove');\r\n\t\tthis._map = null;\r\n\r\n\t\tif (L.Browser.vml) {\r\n\t\t\tthis._container = null;\r\n\t\t\tthis._stroke = null;\r\n\t\t\tthis._fill = null;\r\n\t\t}\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this.projectLatlngs,\r\n\t\t\t'moveend': this._updatePath\r\n\t\t}, this);\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\t// do all projection stuff here\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tL.setOptions(this, style);\r\n\r\n\t\tif (this._container) {\r\n\t\t\tthis._updateStyle();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis.projectLatlngs();\r\n\t\t\tthis._updatePath();\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\nL.Map.include({\r\n\t_updatePathViewport: function () {\r\n\t\tvar p = L.Path.CLIP_PADDING,\r\n\t\t size = this.getSize(),\r\n\t\t panePos = L.DomUtil.getPosition(this._mapPane),\r\n\t\t min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()),\r\n\t\t max = min.add(size.multiplyBy(1 + p * 2)._round());\r\n\r\n\t\tthis._pathViewport = new L.Bounds(min, max);\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Path with SVG-specific rendering code.\r\n */\r\n\r\nL.Path.SVG_NS = 'http://www.w3.org/2000/svg';\r\n\r\nL.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect);\r\n\r\nL.Path = L.Path.extend({\r\n\tstatics: {\r\n\t\tSVG: L.Browser.svg\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\tvar root = this._map._pathRoot,\r\n\t\t path = this._container;\r\n\r\n\t\tif (path && root.lastChild !== path) {\r\n\t\t\troot.appendChild(path);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar root = this._map._pathRoot,\r\n\t\t path = this._container,\r\n\t\t first = root.firstChild;\r\n\r\n\t\tif (path && first !== path) {\r\n\t\t\troot.insertBefore(path, first);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\t// form path string here\r\n\t},\r\n\r\n\t_createElement: function (name) {\r\n\t\treturn document.createElementNS(L.Path.SVG_NS, name);\r\n\t},\r\n\r\n\t_initElements: function () {\r\n\t\tthis._map._initPathRoot();\r\n\t\tthis._initPath();\r\n\t\tthis._initStyle();\r\n\t},\r\n\r\n\t_initPath: function () {\r\n\t\tthis._container = this._createElement('g');\r\n\r\n\t\tthis._path = this._createElement('path');\r\n\r\n\t\tif (this.options.className) {\r\n\t\t\tL.DomUtil.addClass(this._path, this.options.className);\r\n\t\t}\r\n\r\n\t\tthis._container.appendChild(this._path);\r\n\t},\r\n\r\n\t_initStyle: function () {\r\n\t\tif (this.options.stroke) {\r\n\t\t\tthis._path.setAttribute('stroke-linejoin', 'round');\r\n\t\t\tthis._path.setAttribute('stroke-linecap', 'round');\r\n\t\t}\r\n\t\tif (this.options.fill) {\r\n\t\t\tthis._path.setAttribute('fill-rule', 'evenodd');\r\n\t\t}\r\n\t\tif (this.options.pointerEvents) {\r\n\t\t\tthis._path.setAttribute('pointer-events', this.options.pointerEvents);\r\n\t\t}\r\n\t\tif (!this.options.clickable && !this.options.pointerEvents) {\r\n\t\t\tthis._path.setAttribute('pointer-events', 'none');\r\n\t\t}\r\n\t\tthis._updateStyle();\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tif (this.options.stroke) {\r\n\t\t\tthis._path.setAttribute('stroke', this.options.color);\r\n\t\t\tthis._path.setAttribute('stroke-opacity', this.options.opacity);\r\n\t\t\tthis._path.setAttribute('stroke-width', this.options.weight);\r\n\t\t\tif (this.options.dashArray) {\r\n\t\t\t\tthis._path.setAttribute('stroke-dasharray', this.options.dashArray);\r\n\t\t\t} else {\r\n\t\t\t\tthis._path.removeAttribute('stroke-dasharray');\r\n\t\t\t}\r\n\t\t\tif (this.options.lineCap) {\r\n\t\t\t\tthis._path.setAttribute('stroke-linecap', this.options.lineCap);\r\n\t\t\t}\r\n\t\t\tif (this.options.lineJoin) {\r\n\t\t\t\tthis._path.setAttribute('stroke-linejoin', this.options.lineJoin);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis._path.setAttribute('stroke', 'none');\r\n\t\t}\r\n\t\tif (this.options.fill) {\r\n\t\t\tthis._path.setAttribute('fill', this.options.fillColor || this.options.color);\r\n\t\t\tthis._path.setAttribute('fill-opacity', this.options.fillOpacity);\r\n\t\t} else {\r\n\t\t\tthis._path.setAttribute('fill', 'none');\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tvar str = this.getPathString();\r\n\t\tif (!str) {\r\n\t\t\t// fix webkit empty string parsing bug\r\n\t\t\tstr = 'M0 0';\r\n\t\t}\r\n\t\tthis._path.setAttribute('d', str);\r\n\t},\r\n\r\n\t// TODO remove duplication with L.Map\r\n\t_initEvents: function () {\r\n\t\tif (this.options.clickable) {\r\n\t\t\tif (L.Browser.svg || !L.Browser.vml) {\r\n\t\t\t\tL.DomUtil.addClass(this._path, 'leaflet-clickable');\r\n\t\t\t}\r\n\r\n\t\t\tL.DomEvent.on(this._container, 'click', this._onMouseClick, this);\r\n\r\n\t\t\tvar events = ['dblclick', 'mousedown', 'mouseover',\r\n\t\t\t 'mouseout', 'mousemove', 'contextmenu'];\r\n\t\t\tfor (var i = 0; i < events.length; i++) {\r\n\t\t\t\tL.DomEvent.on(this._container, events[i], this._fireMouseEvent, this);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tif (this._map.dragging && this._map.dragging.moved()) { return; }\r\n\r\n\t\tthis._fireMouseEvent(e);\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\t\tif (!this._map || !this.hasEventListeners(e.type)) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t containerPoint = map.mouseEventToContainerPoint(e),\r\n\t\t layerPoint = map.containerPointToLayerPoint(containerPoint),\r\n\t\t latlng = map.layerPointToLatLng(layerPoint);\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tlayerPoint: layerPoint,\r\n\t\t\tcontainerPoint: containerPoint,\r\n\t\t\toriginalEvent: e\r\n\t\t});\r\n\r\n\t\tif (e.type === 'contextmenu') {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t\tif (e.type !== 'mousemove') {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.include({\r\n\t_initPathRoot: function () {\r\n\t\tif (!this._pathRoot) {\r\n\t\t\tthis._pathRoot = L.Path.prototype._createElement('svg');\r\n\t\t\tthis._panes.overlayPane.appendChild(this._pathRoot);\r\n\r\n\t\t\tif (this.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\t\tL.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated');\r\n\r\n\t\t\t\tthis.on({\r\n\t\t\t\t\t'zoomanim': this._animatePathZoom,\r\n\t\t\t\t\t'zoomend': this._endPathZoom\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tL.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide');\r\n\t\t\t}\r\n\r\n\t\t\tthis.on('moveend', this._updateSvgViewport);\r\n\t\t\tthis._updateSvgViewport();\r\n\t\t}\r\n\t},\r\n\r\n\t_animatePathZoom: function (e) {\r\n\t\tvar scale = this.getZoomScale(e.zoom),\r\n\t\t offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min);\r\n\r\n\t\tthis._pathRoot.style[L.DomUtil.TRANSFORM] =\r\n\t\t L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') ';\r\n\r\n\t\tthis._pathZooming = true;\r\n\t},\r\n\r\n\t_endPathZoom: function () {\r\n\t\tthis._pathZooming = false;\r\n\t},\r\n\r\n\t_updateSvgViewport: function () {\r\n\r\n\t\tif (this._pathZooming) {\r\n\t\t\t// Do not update SVGs while a zoom animation is going on otherwise the animation will break.\r\n\t\t\t// When the zoom animation ends we will be updated again anyway\r\n\t\t\t// This fixes the case where you do a momentum move and zoom while the move is still ongoing.\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._updatePathViewport();\r\n\r\n\t\tvar vp = this._pathViewport,\r\n\t\t min = vp.min,\r\n\t\t max = vp.max,\r\n\t\t width = max.x - min.x,\r\n\t\t height = max.y - min.y,\r\n\t\t root = this._pathRoot,\r\n\t\t pane = this._panes.overlayPane;\r\n\r\n\t\t// Hack to make flicker on drag end on mobile webkit less irritating\r\n\t\tif (L.Browser.mobileWebkit) {\r\n\t\t\tpane.removeChild(root);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.setPosition(root, min);\r\n\t\troot.setAttribute('width', width);\r\n\t\troot.setAttribute('height', height);\r\n\t\troot.setAttribute('viewBox', [min.x, min.y, width, height].join(' '));\r\n\r\n\t\tif (L.Browser.mobileWebkit) {\r\n\t\t\tpane.appendChild(root);\r\n\t\t}\r\n\t}\r\n});\r\n\n\n/*\r\n * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods.\r\n */\r\n\r\nL.Path.include({\r\n\r\n\tbindPopup: function (content, options) {\r\n\r\n\t\tif (content instanceof L.Popup) {\r\n\t\t\tthis._popup = content;\r\n\t\t} else {\r\n\t\t\tif (!this._popup || options) {\r\n\t\t\t\tthis._popup = new L.Popup(options, this);\r\n\t\t\t}\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis\r\n\t\t\t .on('click', this._openPopup, this)\r\n\t\t\t .on('remove', this.closePopup, this);\r\n\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup = null;\r\n\t\t\tthis\r\n\t\t\t .off('click', this._openPopup)\r\n\t\t\t .off('remove', this.closePopup);\r\n\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\topenPopup: function (latlng) {\r\n\r\n\t\tif (this._popup) {\r\n\t\t\t// open the popup from one of the path's points if not specified\r\n\t\t\tlatlng = latlng || this._latlng ||\r\n\t\t\t this._latlngs[Math.floor(this._latlngs.length / 2)];\r\n\r\n\t\t\tthis._openPopup({latlng: latlng});\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup._close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_openPopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t\tthis._map.openPopup(this._popup);\r\n\t}\r\n});\r\n\n\n/*\r\n * Vector rendering for IE6-8 through VML.\r\n * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!\r\n */\r\n\r\nL.Browser.vml = !L.Browser.svg && (function () {\r\n\ttry {\r\n\t\tvar div = document.createElement('div');\r\n\t\tdiv.innerHTML = '';\r\n\r\n\t\tvar shape = div.firstChild;\r\n\t\tshape.style.behavior = 'url(#default#VML)';\r\n\r\n\t\treturn shape && (typeof shape.adj === 'object');\r\n\r\n\t} catch (e) {\r\n\t\treturn false;\r\n\t}\r\n}());\r\n\r\nL.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({\r\n\tstatics: {\r\n\t\tVML: true,\r\n\t\tCLIP_PADDING: 0.02\r\n\t},\r\n\r\n\t_createElement: (function () {\r\n\t\ttry {\r\n\t\t\tdocument.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');\r\n\t\t\treturn function (name) {\r\n\t\t\t\treturn document.createElement('');\r\n\t\t\t};\r\n\t\t} catch (e) {\r\n\t\t\treturn function (name) {\r\n\t\t\t\treturn document.createElement(\r\n\t\t\t\t '<' + name + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"lvml\">');\r\n\t\t\t};\r\n\t\t}\r\n\t}()),\r\n\r\n\t_initPath: function () {\r\n\t\tvar container = this._container = this._createElement('shape');\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-vml-shape' +\r\n\t\t\t(this.options.className ? ' ' + this.options.className : ''));\r\n\r\n\t\tif (this.options.clickable) {\r\n\t\t\tL.DomUtil.addClass(container, 'leaflet-clickable');\r\n\t\t}\r\n\r\n\t\tcontainer.coordsize = '1 1';\r\n\r\n\t\tthis._path = this._createElement('path');\r\n\t\tcontainer.appendChild(this._path);\r\n\r\n\t\tthis._map._pathRoot.appendChild(container);\r\n\t},\r\n\r\n\t_initStyle: function () {\r\n\t\tthis._updateStyle();\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tvar stroke = this._stroke,\r\n\t\t fill = this._fill,\r\n\t\t options = this.options,\r\n\t\t container = this._container;\r\n\r\n\t\tcontainer.stroked = options.stroke;\r\n\t\tcontainer.filled = options.fill;\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tif (!stroke) {\r\n\t\t\t\tstroke = this._stroke = this._createElement('stroke');\r\n\t\t\t\tstroke.endcap = 'round';\r\n\t\t\t\tcontainer.appendChild(stroke);\r\n\t\t\t}\r\n\t\t\tstroke.weight = options.weight + 'px';\r\n\t\t\tstroke.color = options.color;\r\n\t\t\tstroke.opacity = options.opacity;\r\n\r\n\t\t\tif (options.dashArray) {\r\n\t\t\t\tstroke.dashStyle = L.Util.isArray(options.dashArray) ?\r\n\t\t\t\t options.dashArray.join(' ') :\r\n\t\t\t\t options.dashArray.replace(/( *, *)/g, ' ');\r\n\t\t\t} else {\r\n\t\t\t\tstroke.dashStyle = '';\r\n\t\t\t}\r\n\t\t\tif (options.lineCap) {\r\n\t\t\t\tstroke.endcap = options.lineCap.replace('butt', 'flat');\r\n\t\t\t}\r\n\t\t\tif (options.lineJoin) {\r\n\t\t\t\tstroke.joinstyle = options.lineJoin;\r\n\t\t\t}\r\n\r\n\t\t} else if (stroke) {\r\n\t\t\tcontainer.removeChild(stroke);\r\n\t\t\tthis._stroke = null;\r\n\t\t}\r\n\r\n\t\tif (options.fill) {\r\n\t\t\tif (!fill) {\r\n\t\t\t\tfill = this._fill = this._createElement('fill');\r\n\t\t\t\tcontainer.appendChild(fill);\r\n\t\t\t}\r\n\t\t\tfill.color = options.fillColor || options.color;\r\n\t\t\tfill.opacity = options.fillOpacity;\r\n\r\n\t\t} else if (fill) {\r\n\t\t\tcontainer.removeChild(fill);\r\n\t\t\tthis._fill = null;\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tvar style = this._container.style;\r\n\r\n\t\tstyle.display = 'none';\r\n\t\tthis._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug\r\n\t\tstyle.display = '';\r\n\t}\r\n});\r\n\r\nL.Map.include(L.Browser.svg || !L.Browser.vml ? {} : {\r\n\t_initPathRoot: function () {\r\n\t\tif (this._pathRoot) { return; }\r\n\r\n\t\tvar root = this._pathRoot = document.createElement('div');\r\n\t\troot.className = 'leaflet-vml-container';\r\n\t\tthis._panes.overlayPane.appendChild(root);\r\n\r\n\t\tthis.on('moveend', this._updatePathViewport);\r\n\t\tthis._updatePathViewport();\r\n\t}\r\n});\r\n\n\n/*\r\n * Vector rendering for all browsers that support canvas.\r\n */\r\n\r\nL.Browser.canvas = (function () {\r\n\treturn !!document.createElement('canvas').getContext;\r\n}());\r\n\r\nL.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({\r\n\tstatics: {\r\n\t\t//CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value\r\n\t\tCANVAS: true,\r\n\t\tSVG: false\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis.projectLatlngs();\r\n\t\t\tthis._requestUpdate();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tL.setOptions(this, style);\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateStyle();\r\n\t\t\tthis._requestUpdate();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t .off('viewreset', this.projectLatlngs, this)\r\n\t\t .off('moveend', this._updatePath, this);\r\n\r\n\t\tif (this.options.clickable) {\r\n\t\t\tthis._map.off('click', this._onClick, this);\r\n\t\t\tthis._map.off('mousemove', this._onMouseMove, this);\r\n\t\t}\r\n\r\n\t\tthis._requestUpdate();\r\n\t\t\r\n\t\tthis.fire('remove');\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\t_requestUpdate: function () {\r\n\t\tif (this._map && !L.Path._updateRequest) {\r\n\t\t\tL.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map);\r\n\t\t}\r\n\t},\r\n\r\n\t_fireMapMoveEnd: function () {\r\n\t\tL.Path._updateRequest = null;\r\n\t\tthis.fire('moveend');\r\n\t},\r\n\r\n\t_initElements: function () {\r\n\t\tthis._map._initPathRoot();\r\n\t\tthis._ctx = this._map._canvasCtx;\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tthis._ctx.lineWidth = options.weight;\r\n\t\t\tthis._ctx.strokeStyle = options.color;\r\n\t\t}\r\n\t\tif (options.fill) {\r\n\t\t\tthis._ctx.fillStyle = options.fillColor || options.color;\r\n\t\t}\r\n\r\n\t\tif (options.lineCap) {\r\n\t\t\tthis._ctx.lineCap = options.lineCap;\r\n\t\t}\r\n\t\tif (options.lineJoin) {\r\n\t\t\tthis._ctx.lineJoin = options.lineJoin;\r\n\t\t}\r\n\t},\r\n\r\n\t_drawPath: function () {\r\n\t\tvar i, j, len, len2, point, drawMethod;\r\n\r\n\t\tthis._ctx.beginPath();\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tfor (j = 0, len2 = this._parts[i].length; j < len2; j++) {\r\n\t\t\t\tpoint = this._parts[i][j];\r\n\t\t\t\tdrawMethod = (j === 0 ? 'move' : 'line') + 'To';\r\n\r\n\t\t\t\tthis._ctx[drawMethod](point.x, point.y);\r\n\t\t\t}\r\n\t\t\t// TODO refactor ugly hack\r\n\t\t\tif (this instanceof L.Polygon) {\r\n\t\t\t\tthis._ctx.closePath();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_checkIfEmpty: function () {\r\n\t\treturn !this._parts.length;\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tif (this._checkIfEmpty()) { return; }\r\n\r\n\t\tvar ctx = this._ctx,\r\n\t\t options = this.options;\r\n\r\n\t\tthis._drawPath();\r\n\t\tctx.save();\r\n\t\tthis._updateStyle();\r\n\r\n\t\tif (options.fill) {\r\n\t\t\tctx.globalAlpha = options.fillOpacity;\r\n\t\t\tctx.fill(options.fillRule || 'evenodd');\r\n\t\t}\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tctx.globalAlpha = options.opacity;\r\n\t\t\tctx.stroke();\r\n\t\t}\r\n\r\n\t\tctx.restore();\r\n\r\n\t\t// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature\r\n\t},\r\n\r\n\t_initEvents: function () {\r\n\t\tif (this.options.clickable) {\r\n\t\t\tthis._map.on('mousemove', this._onMouseMove, this);\r\n\t\t\tthis._map.on('click dblclick contextmenu', this._fireMouseEvent, this);\r\n\t\t}\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\t\tif (this._containsPoint(e.layerPoint)) {\r\n\t\t\tthis.fire(e.type, e);\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseMove: function (e) {\r\n\t\tif (!this._map || this._map._animatingZoom) { return; }\r\n\r\n\t\t// TODO don't do on each move\r\n\t\tif (this._containsPoint(e.layerPoint)) {\r\n\t\t\tthis._ctx.canvas.style.cursor = 'pointer';\r\n\t\t\tthis._mouseInside = true;\r\n\t\t\tthis.fire('mouseover', e);\r\n\r\n\t\t} else if (this._mouseInside) {\r\n\t\t\tthis._ctx.canvas.style.cursor = '';\r\n\t\t\tthis._mouseInside = false;\r\n\t\t\tthis.fire('mouseout', e);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : {\r\n\t_initPathRoot: function () {\r\n\t\tvar root = this._pathRoot,\r\n\t\t ctx;\r\n\r\n\t\tif (!root) {\r\n\t\t\troot = this._pathRoot = document.createElement('canvas');\r\n\t\t\troot.style.position = 'absolute';\r\n\t\t\tctx = this._canvasCtx = root.getContext('2d');\r\n\r\n\t\t\tctx.lineCap = 'round';\r\n\t\t\tctx.lineJoin = 'round';\r\n\r\n\t\t\tthis._panes.overlayPane.appendChild(root);\r\n\r\n\t\t\tif (this.options.zoomAnimation) {\r\n\t\t\t\tthis._pathRoot.className = 'leaflet-zoom-animated';\r\n\t\t\t\tthis.on('zoomanim', this._animatePathZoom);\r\n\t\t\t\tthis.on('zoomend', this._endPathZoom);\r\n\t\t\t}\r\n\t\t\tthis.on('moveend', this._updateCanvasViewport);\r\n\t\t\tthis._updateCanvasViewport();\r\n\t\t}\r\n\t},\r\n\r\n\t_updateCanvasViewport: function () {\r\n\t\t// don't redraw while zooming. See _updateSvgViewport for more details\r\n\t\tif (this._pathZooming) { return; }\r\n\t\tthis._updatePathViewport();\r\n\r\n\t\tvar vp = this._pathViewport,\r\n\t\t min = vp.min,\r\n\t\t size = vp.max.subtract(min),\r\n\t\t root = this._pathRoot;\r\n\r\n\t\t//TODO check if this works properly on mobile webkit\r\n\t\tL.DomUtil.setPosition(root, min);\r\n\t\troot.width = size.x;\r\n\t\troot.height = size.y;\r\n\t\troot.getContext('2d').translate(-min.x, -min.y);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.LineUtil contains different utility functions for line segments\r\n * and polylines (clipping, simplification, distances, etc.)\r\n */\r\n\r\n/*jshint bitwise:false */ // allow bitwise operations for this file\r\n\r\nL.LineUtil = {\r\n\r\n\t// Simplify polyline with vertex reduction and Douglas-Peucker simplification.\r\n\t// Improves rendering performance dramatically by lessening the number of points to draw.\r\n\r\n\tsimplify: function (/*Point[]*/ points, /*Number*/ tolerance) {\r\n\t\tif (!tolerance || !points.length) {\r\n\t\t\treturn points.slice();\r\n\t\t}\r\n\r\n\t\tvar sqTolerance = tolerance * tolerance;\r\n\r\n\t\t// stage 1: vertex reduction\r\n\t\tpoints = this._reducePoints(points, sqTolerance);\r\n\r\n\t\t// stage 2: Douglas-Peucker simplification\r\n\t\tpoints = this._simplifyDP(points, sqTolerance);\r\n\r\n\t\treturn points;\r\n\t},\r\n\r\n\t// distance from a point to a segment between two points\r\n\tpointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {\r\n\t\treturn Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));\r\n\t},\r\n\r\n\tclosestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {\r\n\t\treturn this._sqClosestPointOnSegment(p, p1, p2);\r\n\t},\r\n\r\n\t// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm\r\n\t_simplifyDP: function (points, sqTolerance) {\r\n\r\n\t\tvar len = points.length,\r\n\t\t ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,\r\n\t\t markers = new ArrayConstructor(len);\r\n\r\n\t\tmarkers[0] = markers[len - 1] = 1;\r\n\r\n\t\tthis._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);\r\n\r\n\t\tvar i,\r\n\t\t newPoints = [];\r\n\r\n\t\tfor (i = 0; i < len; i++) {\r\n\t\t\tif (markers[i]) {\r\n\t\t\t\tnewPoints.push(points[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn newPoints;\r\n\t},\r\n\r\n\t_simplifyDPStep: function (points, markers, sqTolerance, first, last) {\r\n\r\n\t\tvar maxSqDist = 0,\r\n\t\t index, i, sqDist;\r\n\r\n\t\tfor (i = first + 1; i <= last - 1; i++) {\r\n\t\t\tsqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);\r\n\r\n\t\t\tif (sqDist > maxSqDist) {\r\n\t\t\t\tindex = i;\r\n\t\t\t\tmaxSqDist = sqDist;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (maxSqDist > sqTolerance) {\r\n\t\t\tmarkers[index] = 1;\r\n\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, first, index);\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, index, last);\r\n\t\t}\r\n\t},\r\n\r\n\t// reduce points that are too close to each other to a single point\r\n\t_reducePoints: function (points, sqTolerance) {\r\n\t\tvar reducedPoints = [points[0]];\r\n\r\n\t\tfor (var i = 1, prev = 0, len = points.length; i < len; i++) {\r\n\t\t\tif (this._sqDist(points[i], points[prev]) > sqTolerance) {\r\n\t\t\t\treducedPoints.push(points[i]);\r\n\t\t\t\tprev = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (prev < len - 1) {\r\n\t\t\treducedPoints.push(points[len - 1]);\r\n\t\t}\r\n\t\treturn reducedPoints;\r\n\t},\r\n\r\n\t// Cohen-Sutherland line clipping algorithm.\r\n\t// Used to avoid rendering parts of a polyline that are not currently visible.\r\n\r\n\tclipSegment: function (a, b, bounds, useLastCode) {\r\n\t\tvar codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),\r\n\t\t codeB = this._getBitCode(b, bounds),\r\n\r\n\t\t codeOut, p, newCode;\r\n\r\n\t\t// save 2nd code to avoid calculating it on the next segment\r\n\t\tthis._lastCode = codeB;\r\n\r\n\t\twhile (true) {\r\n\t\t\t// if a,b is inside the clip window (trivial accept)\r\n\t\t\tif (!(codeA | codeB)) {\r\n\t\t\t\treturn [a, b];\r\n\t\t\t// if a,b is outside the clip window (trivial reject)\r\n\t\t\t} else if (codeA & codeB) {\r\n\t\t\t\treturn false;\r\n\t\t\t// other cases\r\n\t\t\t} else {\r\n\t\t\t\tcodeOut = codeA || codeB;\r\n\t\t\t\tp = this._getEdgeIntersection(a, b, codeOut, bounds);\r\n\t\t\t\tnewCode = this._getBitCode(p, bounds);\r\n\r\n\t\t\t\tif (codeOut === codeA) {\r\n\t\t\t\t\ta = p;\r\n\t\t\t\t\tcodeA = newCode;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tb = p;\r\n\t\t\t\t\tcodeB = newCode;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_getEdgeIntersection: function (a, b, code, bounds) {\r\n\t\tvar dx = b.x - a.x,\r\n\t\t dy = b.y - a.y,\r\n\t\t min = bounds.min,\r\n\t\t max = bounds.max;\r\n\r\n\t\tif (code & 8) { // top\r\n\t\t\treturn new L.Point(a.x + dx * (max.y - a.y) / dy, max.y);\r\n\t\t} else if (code & 4) { // bottom\r\n\t\t\treturn new L.Point(a.x + dx * (min.y - a.y) / dy, min.y);\r\n\t\t} else if (code & 2) { // right\r\n\t\t\treturn new L.Point(max.x, a.y + dy * (max.x - a.x) / dx);\r\n\t\t} else if (code & 1) { // left\r\n\t\t\treturn new L.Point(min.x, a.y + dy * (min.x - a.x) / dx);\r\n\t\t}\r\n\t},\r\n\r\n\t_getBitCode: function (/*Point*/ p, bounds) {\r\n\t\tvar code = 0;\r\n\r\n\t\tif (p.x < bounds.min.x) { // left\r\n\t\t\tcode |= 1;\r\n\t\t} else if (p.x > bounds.max.x) { // right\r\n\t\t\tcode |= 2;\r\n\t\t}\r\n\t\tif (p.y < bounds.min.y) { // bottom\r\n\t\t\tcode |= 4;\r\n\t\t} else if (p.y > bounds.max.y) { // top\r\n\t\t\tcode |= 8;\r\n\t\t}\r\n\r\n\t\treturn code;\r\n\t},\r\n\r\n\t// square distance (to avoid unnecessary Math.sqrt calls)\r\n\t_sqDist: function (p1, p2) {\r\n\t\tvar dx = p2.x - p1.x,\r\n\t\t dy = p2.y - p1.y;\r\n\t\treturn dx * dx + dy * dy;\r\n\t},\r\n\r\n\t// return closest point on segment or distance to that point\r\n\t_sqClosestPointOnSegment: function (p, p1, p2, sqDist) {\r\n\t\tvar x = p1.x,\r\n\t\t y = p1.y,\r\n\t\t dx = p2.x - x,\r\n\t\t dy = p2.y - y,\r\n\t\t dot = dx * dx + dy * dy,\r\n\t\t t;\r\n\r\n\t\tif (dot > 0) {\r\n\t\t\tt = ((p.x - x) * dx + (p.y - y) * dy) / dot;\r\n\r\n\t\t\tif (t > 1) {\r\n\t\t\t\tx = p2.x;\r\n\t\t\t\ty = p2.y;\r\n\t\t\t} else if (t > 0) {\r\n\t\t\t\tx += dx * t;\r\n\t\t\t\ty += dy * t;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdx = p.x - x;\r\n\t\tdy = p.y - y;\r\n\r\n\t\treturn sqDist ? dx * dx + dy * dy : new L.Point(x, y);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.Polyline is used to display polylines on a map.\r\n */\r\n\r\nL.Polyline = L.Path.extend({\r\n\tinitialize: function (latlngs, options) {\r\n\t\tL.Path.prototype.initialize.call(this, options);\r\n\r\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\r\n\t},\r\n\r\n\toptions: {\r\n\t\t// how much to simplify the polyline on each zoom level\r\n\t\t// more = better performance and smoother look, less = more accurate\r\n\t\tsmoothFactor: 1.0,\r\n\t\tnoClip: false\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tthis._originalPoints = [];\r\n\r\n\t\tfor (var i = 0, len = this._latlngs.length; i < len; i++) {\r\n\t\t\tthis._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]);\r\n\t\t}\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\tfor (var i = 0, len = this._parts.length, str = ''; i < len; i++) {\r\n\t\t\tstr += this._getPathPartStr(this._parts[i]);\r\n\t\t}\r\n\t\treturn str;\r\n\t},\r\n\r\n\tgetLatLngs: function () {\r\n\t\treturn this._latlngs;\r\n\t},\r\n\r\n\tsetLatLngs: function (latlngs) {\r\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\taddLatLng: function (latlng) {\r\n\t\tthis._latlngs.push(L.latLng(latlng));\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tspliceLatLngs: function () { // (Number index, Number howMany)\r\n\t\tvar removed = [].splice.apply(this._latlngs, arguments);\r\n\t\tthis._convertLatLngs(this._latlngs, true);\r\n\t\tthis.redraw();\r\n\t\treturn removed;\r\n\t},\r\n\r\n\tclosestLayerPoint: function (p) {\r\n\t\tvar minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null;\r\n\r\n\t\tfor (var j = 0, jLen = parts.length; j < jLen; j++) {\r\n\t\t\tvar points = parts[j];\r\n\t\t\tfor (var i = 1, len = points.length; i < len; i++) {\r\n\t\t\t\tp1 = points[i - 1];\r\n\t\t\t\tp2 = points[i];\r\n\t\t\t\tvar sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true);\r\n\t\t\t\tif (sqDist < minDistance) {\r\n\t\t\t\t\tminDistance = sqDist;\r\n\t\t\t\t\tminPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (minPoint) {\r\n\t\t\tminPoint.distance = Math.sqrt(minDistance);\r\n\t\t}\r\n\t\treturn minPoint;\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\treturn new L.LatLngBounds(this.getLatLngs());\r\n\t},\r\n\r\n\t_convertLatLngs: function (latlngs, overwrite) {\r\n\t\tvar i, len, target = overwrite ? latlngs : [];\r\n\r\n\t\tfor (i = 0, len = latlngs.length; i < len; i++) {\r\n\t\t\tif (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttarget[i] = L.latLng(latlngs[i]);\r\n\t\t}\r\n\t\treturn target;\r\n\t},\r\n\r\n\t_initEvents: function () {\r\n\t\tL.Path.prototype._initEvents.call(this);\r\n\t},\r\n\r\n\t_getPathPartStr: function (points) {\r\n\t\tvar round = L.Path.VML;\r\n\r\n\t\tfor (var j = 0, len2 = points.length, str = '', p; j < len2; j++) {\r\n\t\t\tp = points[j];\r\n\t\t\tif (round) {\r\n\t\t\t\tp._round();\r\n\t\t\t}\r\n\t\t\tstr += (j ? 'L' : 'M') + p.x + ' ' + p.y;\r\n\t\t}\r\n\t\treturn str;\r\n\t},\r\n\r\n\t_clipPoints: function () {\r\n\t\tvar points = this._originalPoints,\r\n\t\t len = points.length,\r\n\t\t i, k, segment;\r\n\r\n\t\tif (this.options.noClip) {\r\n\t\t\tthis._parts = [points];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._parts = [];\r\n\r\n\t\tvar parts = this._parts,\r\n\t\t vp = this._map._pathViewport,\r\n\t\t lu = L.LineUtil;\r\n\r\n\t\tfor (i = 0, k = 0; i < len - 1; i++) {\r\n\t\t\tsegment = lu.clipSegment(points[i], points[i + 1], vp, i);\r\n\t\t\tif (!segment) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tparts[k] = parts[k] || [];\r\n\t\t\tparts[k].push(segment[0]);\r\n\r\n\t\t\t// if segment goes out of screen, or it's the last one, it's the end of the line part\r\n\t\t\tif ((segment[1] !== points[i + 1]) || (i === len - 2)) {\r\n\t\t\t\tparts[k].push(segment[1]);\r\n\t\t\t\tk++;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// simplify each clipped part of the polyline\r\n\t_simplifyPoints: function () {\r\n\t\tvar parts = this._parts,\r\n\t\t lu = L.LineUtil;\r\n\r\n\t\tfor (var i = 0, len = parts.length; i < len; i++) {\r\n\t\t\tparts[i] = lu.simplify(parts[i], this.options.smoothFactor);\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._clipPoints();\r\n\t\tthis._simplifyPoints();\r\n\r\n\t\tL.Path.prototype._updatePath.call(this);\r\n\t}\r\n});\r\n\r\nL.polyline = function (latlngs, options) {\r\n\treturn new L.Polyline(latlngs, options);\r\n};\r\n\n\n/*\r\n * L.PolyUtil contains utility functions for polygons (clipping, etc.).\r\n */\r\n\r\n/*jshint bitwise:false */ // allow bitwise operations here\r\n\r\nL.PolyUtil = {};\r\n\r\n/*\r\n * Sutherland-Hodgeman polygon clipping algorithm.\r\n * Used to avoid rendering parts of a polygon that are not currently visible.\r\n */\r\nL.PolyUtil.clipPolygon = function (points, bounds) {\r\n\tvar clippedPoints,\r\n\t edges = [1, 4, 2, 8],\r\n\t i, j, k,\r\n\t a, b,\r\n\t len, edge, p,\r\n\t lu = L.LineUtil;\r\n\r\n\tfor (i = 0, len = points.length; i < len; i++) {\r\n\t\tpoints[i]._code = lu._getBitCode(points[i], bounds);\r\n\t}\r\n\r\n\t// for each edge (left, bottom, right, top)\r\n\tfor (k = 0; k < 4; k++) {\r\n\t\tedge = edges[k];\r\n\t\tclippedPoints = [];\r\n\r\n\t\tfor (i = 0, len = points.length, j = len - 1; i < len; j = i++) {\r\n\t\t\ta = points[i];\r\n\t\t\tb = points[j];\r\n\r\n\t\t\t// if a is inside the clip window\r\n\t\t\tif (!(a._code & edge)) {\r\n\t\t\t\t// if b is outside the clip window (a->b goes out of screen)\r\n\t\t\t\tif (b._code & edge) {\r\n\t\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds);\r\n\t\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\t\tclippedPoints.push(p);\r\n\t\t\t\t}\r\n\t\t\t\tclippedPoints.push(a);\r\n\r\n\t\t\t// else if b is inside the clip window (a->b enters the screen)\r\n\t\t\t} else if (!(b._code & edge)) {\r\n\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds);\r\n\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\tclippedPoints.push(p);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpoints = clippedPoints;\r\n\t}\r\n\r\n\treturn points;\r\n};\r\n\n\n/*\r\n * L.Polygon is used to display polygons on a map.\r\n */\r\n\r\nL.Polygon = L.Polyline.extend({\r\n\toptions: {\r\n\t\tfill: true\r\n\t},\r\n\r\n\tinitialize: function (latlngs, options) {\r\n\t\tL.Polyline.prototype.initialize.call(this, latlngs, options);\r\n\t\tthis._initWithHoles(latlngs);\r\n\t},\r\n\r\n\t_initWithHoles: function (latlngs) {\r\n\t\tvar i, len, hole;\r\n\t\tif (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {\r\n\t\t\tthis._latlngs = this._convertLatLngs(latlngs[0]);\r\n\t\t\tthis._holes = latlngs.slice(1);\r\n\r\n\t\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\t\thole = this._holes[i] = this._convertLatLngs(this._holes[i]);\r\n\t\t\t\tif (hole[0].equals(hole[hole.length - 1])) {\r\n\t\t\t\t\thole.pop();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// filter out last point if its equal to the first one\r\n\t\tlatlngs = this._latlngs;\r\n\r\n\t\tif (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) {\r\n\t\t\tlatlngs.pop();\r\n\t\t}\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tL.Polyline.prototype.projectLatlngs.call(this);\r\n\r\n\t\t// project polygon holes points\r\n\t\t// TODO move this logic to Polyline to get rid of duplication\r\n\t\tthis._holePoints = [];\r\n\r\n\t\tif (!this._holes) { return; }\r\n\r\n\t\tvar i, j, len, len2;\r\n\r\n\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\tthis._holePoints[i] = [];\r\n\r\n\t\t\tfor (j = 0, len2 = this._holes[i].length; j < len2; j++) {\r\n\t\t\t\tthis._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tsetLatLngs: function (latlngs) {\r\n\t\tif (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {\r\n\t\t\tthis._initWithHoles(latlngs);\r\n\t\t\treturn this.redraw();\r\n\t\t} else {\r\n\t\t\treturn L.Polyline.prototype.setLatLngs.call(this, latlngs);\r\n\t\t}\r\n\t},\r\n\r\n\t_clipPoints: function () {\r\n\t\tvar points = this._originalPoints,\r\n\t\t newParts = [];\r\n\r\n\t\tthis._parts = [points].concat(this._holePoints);\r\n\r\n\t\tif (this.options.noClip) { return; }\r\n\r\n\t\tfor (var i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tvar clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport);\r\n\t\t\tif (clipped.length) {\r\n\t\t\t\tnewParts.push(clipped);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._parts = newParts;\r\n\t},\r\n\r\n\t_getPathPartStr: function (points) {\r\n\t\tvar str = L.Polyline.prototype._getPathPartStr.call(this, points);\r\n\t\treturn str + (L.Browser.svg ? 'z' : 'x');\r\n\t}\r\n});\r\n\r\nL.polygon = function (latlngs, options) {\r\n\treturn new L.Polygon(latlngs, options);\r\n};\r\n\n\n/*\r\n * Contains L.MultiPolyline and L.MultiPolygon layers.\r\n */\r\n\r\n(function () {\r\n\tfunction createMulti(Klass) {\r\n\r\n\t\treturn L.FeatureGroup.extend({\r\n\r\n\t\t\tinitialize: function (latlngs, options) {\r\n\t\t\t\tthis._layers = {};\r\n\t\t\t\tthis._options = options;\r\n\t\t\t\tthis.setLatLngs(latlngs);\r\n\t\t\t},\r\n\r\n\t\t\tsetLatLngs: function (latlngs) {\r\n\t\t\t\tvar i = 0,\r\n\t\t\t\t len = latlngs.length;\r\n\r\n\t\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\t\tif (i < len) {\r\n\t\t\t\t\t\tlayer.setLatLngs(latlngs[i++]);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.removeLayer(layer);\r\n\t\t\t\t\t}\r\n\t\t\t\t}, this);\r\n\r\n\t\t\t\twhile (i < len) {\r\n\t\t\t\t\tthis.addLayer(new Klass(latlngs[i++], this._options));\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\tgetLatLngs: function () {\r\n\t\t\t\tvar latlngs = [];\r\n\r\n\t\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\t\tlatlngs.push(layer.getLatLngs());\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn latlngs;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tL.MultiPolyline = createMulti(L.Polyline);\r\n\tL.MultiPolygon = createMulti(L.Polygon);\r\n\r\n\tL.multiPolyline = function (latlngs, options) {\r\n\t\treturn new L.MultiPolyline(latlngs, options);\r\n\t};\r\n\r\n\tL.multiPolygon = function (latlngs, options) {\r\n\t\treturn new L.MultiPolygon(latlngs, options);\r\n\t};\r\n}());\r\n\n\n/*\r\n * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.\r\n */\r\n\r\nL.Rectangle = L.Polygon.extend({\r\n\tinitialize: function (latLngBounds, options) {\r\n\t\tL.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);\r\n\t},\r\n\r\n\tsetBounds: function (latLngBounds) {\r\n\t\tthis.setLatLngs(this._boundsToLatLngs(latLngBounds));\r\n\t},\r\n\r\n\t_boundsToLatLngs: function (latLngBounds) {\r\n\t\tlatLngBounds = L.latLngBounds(latLngBounds);\r\n\t\treturn [\r\n\t\t\tlatLngBounds.getSouthWest(),\r\n\t\t\tlatLngBounds.getNorthWest(),\r\n\t\t\tlatLngBounds.getNorthEast(),\r\n\t\t\tlatLngBounds.getSouthEast()\r\n\t\t];\r\n\t}\r\n});\r\n\r\nL.rectangle = function (latLngBounds, options) {\r\n\treturn new L.Rectangle(latLngBounds, options);\r\n};\r\n\n\n/*\r\n * L.Circle is a circle overlay (with a certain radius in meters).\r\n */\r\n\r\nL.Circle = L.Path.extend({\r\n\tinitialize: function (latlng, radius, options) {\r\n\t\tL.Path.prototype.initialize.call(this, options);\r\n\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tthis._mRadius = radius;\r\n\t},\r\n\r\n\toptions: {\r\n\t\tfill: true\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tsetRadius: function (radius) {\r\n\t\tthis._mRadius = radius;\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tvar lngRadius = this._getLngRadius(),\r\n\t\t latlng = this._latlng,\r\n\t\t pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]);\r\n\r\n\t\tthis._point = this._map.latLngToLayerPoint(latlng);\r\n\t\tthis._radius = Math.max(this._point.x - pointLeft.x, 1);\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar lngRadius = this._getLngRadius(),\r\n\t\t latRadius = (this._mRadius / 40075017) * 360,\r\n\t\t latlng = this._latlng;\r\n\r\n\t\treturn new L.LatLngBounds(\r\n\t\t [latlng.lat - latRadius, latlng.lng - lngRadius],\r\n\t\t [latlng.lat + latRadius, latlng.lng + lngRadius]);\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\tvar p = this._point,\r\n\t\t r = this._radius;\r\n\r\n\t\tif (this._checkIfEmpty()) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tif (L.Browser.svg) {\r\n\t\t\treturn 'M' + p.x + ',' + (p.y - r) +\r\n\t\t\t 'A' + r + ',' + r + ',0,1,1,' +\r\n\t\t\t (p.x - 0.1) + ',' + (p.y - r) + ' z';\r\n\t\t} else {\r\n\t\t\tp._round();\r\n\t\t\tr = Math.round(r);\r\n\t\t\treturn 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360);\r\n\t\t}\r\n\t},\r\n\r\n\tgetRadius: function () {\r\n\t\treturn this._mRadius;\r\n\t},\r\n\r\n\t// TODO Earth hardcoded, move into projection code!\r\n\r\n\t_getLatRadius: function () {\r\n\t\treturn (this._mRadius / 40075017) * 360;\r\n\t},\r\n\r\n\t_getLngRadius: function () {\r\n\t\treturn this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat);\r\n\t},\r\n\r\n\t_checkIfEmpty: function () {\r\n\t\tif (!this._map) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tvar vp = this._map._pathViewport,\r\n\t\t r = this._radius,\r\n\t\t p = this._point;\r\n\r\n\t\treturn p.x - r > vp.max.x || p.y - r > vp.max.y ||\r\n\t\t p.x + r < vp.min.x || p.y + r < vp.min.y;\r\n\t}\r\n});\r\n\r\nL.circle = function (latlng, radius, options) {\r\n\treturn new L.Circle(latlng, radius, options);\r\n};\r\n\n\n/*\r\n * L.CircleMarker is a circle overlay with a permanent pixel radius.\r\n */\r\n\r\nL.CircleMarker = L.Circle.extend({\r\n\toptions: {\r\n\t\tradius: 10,\r\n\t\tweight: 2\r\n\t},\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tL.Circle.prototype.initialize.call(this, latlng, null, options);\r\n\t\tthis._radius = this.options.radius;\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tthis._point = this._map.latLngToLayerPoint(this._latlng);\r\n\t},\r\n\r\n\t_updateStyle : function () {\r\n\t\tL.Circle.prototype._updateStyle.call(this);\r\n\t\tthis.setRadius(this.options.radius);\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tL.Circle.prototype.setLatLng.call(this, latlng);\r\n\t\tif (this._popup && this._popup._isOpen) {\r\n\t\t\tthis._popup.setLatLng(latlng);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetRadius: function (radius) {\r\n\t\tthis.options.radius = this._radius = radius;\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tgetRadius: function () {\r\n\t\treturn this._radius;\r\n\t}\r\n});\r\n\r\nL.circleMarker = function (latlng, options) {\r\n\treturn new L.CircleMarker(latlng, options);\r\n};\r\n\n\n/*\r\n * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines.\r\n */\r\n\r\nL.Polyline.include(!L.Path.CANVAS ? {} : {\r\n\t_containsPoint: function (p, closed) {\r\n\t\tvar i, j, k, len, len2, dist, part,\r\n\t\t w = this.options.weight / 2;\r\n\r\n\t\tif (L.Browser.touch) {\r\n\t\t\tw += 10; // polyline click tolerance on touch devices\r\n\t\t}\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tpart = this._parts[i];\r\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\r\n\t\t\t\tif (!closed && (j === 0)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]);\r\n\r\n\t\t\t\tif (dist <= w) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons.\r\n */\r\n\r\nL.Polygon.include(!L.Path.CANVAS ? {} : {\r\n\t_containsPoint: function (p) {\r\n\t\tvar inside = false,\r\n\t\t part, p1, p2,\r\n\t\t i, j, k,\r\n\t\t len, len2;\r\n\r\n\t\t// TODO optimization: check if within bounds first\r\n\r\n\t\tif (L.Polyline.prototype._containsPoint.call(this, p, true)) {\r\n\t\t\t// click on polygon border\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// ray casting algorithm for detecting if point is in polygon\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tpart = this._parts[i];\r\n\r\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\r\n\t\t\t\tp1 = part[j];\r\n\t\t\t\tp2 = part[k];\r\n\r\n\t\t\t\tif (((p1.y > p.y) !== (p2.y > p.y)) &&\r\n\t\t\t\t\t\t(p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\r\n\t\t\t\t\tinside = !inside;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn inside;\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Circle with Canvas-specific code.\r\n */\r\n\r\nL.Circle.include(!L.Path.CANVAS ? {} : {\r\n\t_drawPath: function () {\r\n\t\tvar p = this._point;\r\n\t\tthis._ctx.beginPath();\r\n\t\tthis._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false);\r\n\t},\r\n\r\n\t_containsPoint: function (p) {\r\n\t\tvar center = this._point,\r\n\t\t w2 = this.options.stroke ? this.options.weight / 2 : 0;\r\n\r\n\t\treturn (p.distanceTo(center) <= this._radius + w2);\r\n\t}\r\n});\r\n\n\n/*\n * CircleMarker canvas specific drawing parts.\n */\n\nL.CircleMarker.include(!L.Path.CANVAS ? {} : {\n\t_updateStyle: function () {\n\t\tL.Path.prototype._updateStyle.call(this);\n\t}\n});\n\n\n/*\r\n * L.GeoJSON turns any GeoJSON data into a Leaflet layer.\r\n */\r\n\r\nL.GeoJSON = L.FeatureGroup.extend({\r\n\r\n\tinitialize: function (geojson, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\r\n\t\tif (geojson) {\r\n\t\t\tthis.addData(geojson);\r\n\t\t}\r\n\t},\r\n\r\n\taddData: function (geojson) {\r\n\t\tvar features = L.Util.isArray(geojson) ? geojson : geojson.features,\r\n\t\t i, len, feature;\r\n\r\n\t\tif (features) {\r\n\t\t\tfor (i = 0, len = features.length; i < len; i++) {\r\n\t\t\t\t// Only add this if geometry or geometries are set and not null\r\n\t\t\t\tfeature = features[i];\r\n\t\t\t\tif (feature.geometries || feature.geometry || feature.features || feature.coordinates) {\r\n\t\t\t\t\tthis.addData(features[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.filter && !options.filter(geojson)) { return; }\r\n\r\n\t\tvar layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options);\r\n\t\tlayer.feature = L.GeoJSON.asFeature(geojson);\r\n\r\n\t\tlayer.defaultOptions = layer.options;\r\n\t\tthis.resetStyle(layer);\r\n\r\n\t\tif (options.onEachFeature) {\r\n\t\t\toptions.onEachFeature(geojson, layer);\r\n\t\t}\r\n\r\n\t\treturn this.addLayer(layer);\r\n\t},\r\n\r\n\tresetStyle: function (layer) {\r\n\t\tvar style = this.options.style;\r\n\t\tif (style) {\r\n\t\t\t// reset any custom styles\r\n\t\t\tL.Util.extend(layer.options, layer.defaultOptions);\r\n\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}, this);\r\n\t},\r\n\r\n\t_setLayerStyle: function (layer, style) {\r\n\t\tif (typeof style === 'function') {\r\n\t\t\tstyle = style(layer.feature);\r\n\t\t}\r\n\t\tif (layer.setStyle) {\r\n\t\t\tlayer.setStyle(style);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.extend(L.GeoJSON, {\r\n\tgeometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) {\r\n\t\tvar geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,\r\n\t\t coords = geometry.coordinates,\r\n\t\t layers = [],\r\n\t\t latlng, latlngs, i, len;\r\n\r\n\t\tcoordsToLatLng = coordsToLatLng || this.coordsToLatLng;\r\n\r\n\t\tswitch (geometry.type) {\r\n\t\tcase 'Point':\r\n\t\t\tlatlng = coordsToLatLng(coords);\r\n\t\t\treturn pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);\r\n\r\n\t\tcase 'MultiPoint':\r\n\t\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\t\tlatlng = coordsToLatLng(coords[i]);\r\n\t\t\t\tlayers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tcase 'LineString':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng);\r\n\t\t\treturn new L.Polyline(latlngs, vectorOptions);\r\n\r\n\t\tcase 'Polygon':\r\n\t\t\tif (coords.length === 2 && !coords[1].length) {\r\n\t\t\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t\t\t}\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);\r\n\t\t\treturn new L.Polygon(latlngs, vectorOptions);\r\n\r\n\t\tcase 'MultiLineString':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);\r\n\t\t\treturn new L.MultiPolyline(latlngs, vectorOptions);\r\n\r\n\t\tcase 'MultiPolygon':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng);\r\n\t\t\treturn new L.MultiPolygon(latlngs, vectorOptions);\r\n\r\n\t\tcase 'GeometryCollection':\r\n\t\t\tfor (i = 0, len = geometry.geometries.length; i < len; i++) {\r\n\r\n\t\t\t\tlayers.push(this.geometryToLayer({\r\n\t\t\t\t\tgeometry: geometry.geometries[i],\r\n\t\t\t\t\ttype: 'Feature',\r\n\t\t\t\t\tproperties: geojson.properties\r\n\t\t\t\t}, pointToLayer, coordsToLatLng, vectorOptions));\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tdefault:\r\n\t\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t\t}\r\n\t},\r\n\r\n\tcoordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng\r\n\t\treturn new L.LatLng(coords[1], coords[0], coords[2]);\r\n\t},\r\n\r\n\tcoordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array\r\n\t\tvar latlng, i, len,\r\n\t\t latlngs = [];\r\n\r\n\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\tlatlng = levelsDeep ?\r\n\t\t\t this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :\r\n\t\t\t (coordsToLatLng || this.coordsToLatLng)(coords[i]);\r\n\r\n\t\t\tlatlngs.push(latlng);\r\n\t\t}\r\n\r\n\t\treturn latlngs;\r\n\t},\r\n\r\n\tlatLngToCoords: function (latlng) {\r\n\t\tvar coords = [latlng.lng, latlng.lat];\r\n\r\n\t\tif (latlng.alt !== undefined) {\r\n\t\t\tcoords.push(latlng.alt);\r\n\t\t}\r\n\t\treturn coords;\r\n\t},\r\n\r\n\tlatLngsToCoords: function (latLngs) {\r\n\t\tvar coords = [];\r\n\r\n\t\tfor (var i = 0, len = latLngs.length; i < len; i++) {\r\n\t\t\tcoords.push(L.GeoJSON.latLngToCoords(latLngs[i]));\r\n\t\t}\r\n\r\n\t\treturn coords;\r\n\t},\r\n\r\n\tgetFeature: function (layer, newGeometry) {\r\n\t\treturn layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry);\r\n\t},\r\n\r\n\tasFeature: function (geoJSON) {\r\n\t\tif (geoJSON.type === 'Feature') {\r\n\t\t\treturn geoJSON;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'Feature',\r\n\t\t\tproperties: {},\r\n\t\t\tgeometry: geoJSON\r\n\t\t};\r\n\t}\r\n});\r\n\r\nvar PointToGeoJSON = {\r\n\ttoGeoJSON: function () {\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'Point',\r\n\t\t\tcoordinates: L.GeoJSON.latLngToCoords(this.getLatLng())\r\n\t\t});\r\n\t}\r\n};\r\n\r\nL.Marker.include(PointToGeoJSON);\r\nL.Circle.include(PointToGeoJSON);\r\nL.CircleMarker.include(PointToGeoJSON);\r\n\r\nL.Polyline.include({\r\n\ttoGeoJSON: function () {\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'LineString',\r\n\t\t\tcoordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs())\r\n\t\t});\r\n\t}\r\n});\r\n\r\nL.Polygon.include({\r\n\ttoGeoJSON: function () {\r\n\t\tvar coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())],\r\n\t\t i, len, hole;\r\n\r\n\t\tcoords[0].push(coords[0][0]);\r\n\r\n\t\tif (this._holes) {\r\n\t\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\t\thole = L.GeoJSON.latLngsToCoords(this._holes[i]);\r\n\t\t\t\thole.push(hole[0]);\r\n\t\t\t\tcoords.push(hole);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'Polygon',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t}\r\n});\r\n\r\n(function () {\r\n\tfunction multiToGeoJSON(type) {\r\n\t\treturn function () {\r\n\t\t\tvar coords = [];\r\n\r\n\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\tcoords.push(layer.toGeoJSON().geometry.coordinates);\r\n\t\t\t});\r\n\r\n\t\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\t\ttype: type,\r\n\t\t\t\tcoordinates: coords\r\n\t\t\t});\r\n\t\t};\r\n\t}\r\n\r\n\tL.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')});\r\n\tL.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')});\r\n\r\n\tL.LayerGroup.include({\r\n\t\ttoGeoJSON: function () {\r\n\r\n\t\t\tvar geometry = this.feature && this.feature.geometry,\r\n\t\t\t\tjsons = [],\r\n\t\t\t\tjson;\r\n\r\n\t\t\tif (geometry && geometry.type === 'MultiPoint') {\r\n\t\t\t\treturn multiToGeoJSON('MultiPoint').call(this);\r\n\t\t\t}\r\n\r\n\t\t\tvar isGeometryCollection = geometry && geometry.type === 'GeometryCollection';\r\n\r\n\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\tif (layer.toGeoJSON) {\r\n\t\t\t\t\tjson = layer.toGeoJSON();\r\n\t\t\t\t\tjsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (isGeometryCollection) {\r\n\t\t\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\t\t\tgeometries: jsons,\r\n\t\t\t\t\ttype: 'GeometryCollection'\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'FeatureCollection',\r\n\t\t\t\tfeatures: jsons\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n}());\r\n\r\nL.geoJson = function (geojson, options) {\r\n\treturn new L.GeoJSON(geojson, options);\r\n};\r\n\n\n/*\r\n * L.DomEvent contains functions for working with DOM events.\r\n */\r\n\r\nL.DomEvent = {\r\n\t/* inspired by John Resig, Dean Edwards and YUI addEvent implementations */\r\n\taddListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object])\r\n\r\n\t\tvar id = L.stamp(fn),\r\n\t\t key = '_leaflet_' + type + id,\r\n\t\t handler, originalHandler, newType;\r\n\r\n\t\tif (obj[key]) { return this; }\r\n\r\n\t\thandler = function (e) {\r\n\t\t\treturn fn.call(context || obj, e || L.DomEvent._getEvent());\r\n\t\t};\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\treturn this.addPointerListener(obj, type, handler, id);\r\n\t\t}\r\n\t\tif (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {\r\n\t\t\tthis.addDoubleTapListener(obj, handler, id);\r\n\t\t}\r\n\r\n\t\tif ('addEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.addEventListener('DOMMouseScroll', handler, false);\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\r\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\r\n\r\n\t\t\t\toriginalHandler = handler;\r\n\t\t\t\tnewType = (type === 'mouseenter' ? 'mouseover' : 'mouseout');\r\n\r\n\t\t\t\thandler = function (e) {\r\n\t\t\t\t\tif (!L.DomEvent._checkMouse(obj, e)) { return; }\r\n\t\t\t\t\treturn originalHandler(e);\r\n\t\t\t\t};\r\n\r\n\t\t\t\tobj.addEventListener(newType, handler, false);\r\n\r\n\t\t\t} else if (type === 'click' && L.Browser.android) {\r\n\t\t\t\toriginalHandler = handler;\r\n\t\t\t\thandler = function (e) {\r\n\t\t\t\t\treturn L.DomEvent._filterClick(e, originalHandler);\r\n\t\t\t\t};\r\n\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\t\t\t} else {\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\t\t\t}\r\n\r\n\t\t} else if ('attachEvent' in obj) {\r\n\t\t\tobj.attachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[key] = handler;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveListener: function (obj, type, fn) { // (HTMLElement, String, Function)\r\n\r\n\t\tvar id = L.stamp(fn),\r\n\t\t key = '_leaflet_' + type + id,\r\n\t\t handler = obj[key];\r\n\r\n\t\tif (!handler) { return this; }\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\tthis.removePointerListener(obj, type, id);\r\n\t\t} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {\r\n\t\t\tthis.removeDoubleTapListener(obj, id);\r\n\r\n\t\t} else if ('removeEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.removeEventListener('DOMMouseScroll', handler, false);\r\n\t\t\t\tobj.removeEventListener(type, handler, false);\r\n\r\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\r\n\t\t\t\tobj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false);\r\n\t\t\t} else {\r\n\t\t\t\tobj.removeEventListener(type, handler, false);\r\n\t\t\t}\r\n\t\t} else if ('detachEvent' in obj) {\r\n\t\t\tobj.detachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[key] = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstopPropagation: function (e) {\r\n\r\n\t\tif (e.stopPropagation) {\r\n\t\t\te.stopPropagation();\r\n\t\t} else {\r\n\t\t\te.cancelBubble = true;\r\n\t\t}\r\n\t\tL.DomEvent._skipped(e);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdisableScrollPropagation: function (el) {\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\treturn L.DomEvent\r\n\t\t\t.on(el, 'mousewheel', stop)\r\n\t\t\t.on(el, 'MozMousePixelScroll', stop);\r\n\t},\r\n\r\n\tdisableClickPropagation: function (el) {\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.on(el, L.Draggable.START[i], stop);\r\n\t\t}\r\n\r\n\t\treturn L.DomEvent\r\n\t\t\t.on(el, 'click', L.DomEvent._fakeStop)\r\n\t\t\t.on(el, 'dblclick', stop);\r\n\t},\r\n\r\n\tpreventDefault: function (e) {\r\n\r\n\t\tif (e.preventDefault) {\r\n\t\t\te.preventDefault();\r\n\t\t} else {\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstop: function (e) {\r\n\t\treturn L.DomEvent\r\n\t\t\t.preventDefault(e)\r\n\t\t\t.stopPropagation(e);\r\n\t},\r\n\r\n\tgetMousePosition: function (e, container) {\r\n\t\tif (!container) {\r\n\t\t\treturn new L.Point(e.clientX, e.clientY);\r\n\t\t}\r\n\r\n\t\tvar rect = container.getBoundingClientRect();\r\n\r\n\t\treturn new L.Point(\r\n\t\t\te.clientX - rect.left - container.clientLeft,\r\n\t\t\te.clientY - rect.top - container.clientTop);\r\n\t},\r\n\r\n\tgetWheelDelta: function (e) {\r\n\r\n\t\tvar delta = 0;\r\n\r\n\t\tif (e.wheelDelta) {\r\n\t\t\tdelta = e.wheelDelta / 120;\r\n\t\t}\r\n\t\tif (e.detail) {\r\n\t\t\tdelta = -e.detail / 3;\r\n\t\t}\r\n\t\treturn delta;\r\n\t},\r\n\r\n\t_skipEvents: {},\r\n\r\n\t_fakeStop: function (e) {\r\n\t\t// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)\r\n\t\tL.DomEvent._skipEvents[e.type] = true;\r\n\t},\r\n\r\n\t_skipped: function (e) {\r\n\t\tvar skipped = this._skipEvents[e.type];\r\n\t\t// reset when checking, as it's only used in map container and propagates outside of the map\r\n\t\tthis._skipEvents[e.type] = false;\r\n\t\treturn skipped;\r\n\t},\r\n\r\n\t// check if element really left/entered the event target (for mouseenter/mouseleave)\r\n\t_checkMouse: function (el, e) {\r\n\r\n\t\tvar related = e.relatedTarget;\r\n\r\n\t\tif (!related) { return true; }\r\n\r\n\t\ttry {\r\n\t\t\twhile (related && (related !== el)) {\r\n\t\t\t\trelated = related.parentNode;\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn (related !== el);\r\n\t},\r\n\r\n\t_getEvent: function () { // evil magic for IE\r\n\t\t/*jshint noarg:false */\r\n\t\tvar e = window.event;\r\n\t\tif (!e) {\r\n\t\t\tvar caller = arguments.callee.caller;\r\n\t\t\twhile (caller) {\r\n\t\t\t\te = caller['arguments'][0];\r\n\t\t\t\tif (e && window.Event === e.constructor) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcaller = caller.caller;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn e;\r\n\t},\r\n\r\n\t// this is a horrible workaround for a bug in Android where a single touch triggers two click events\r\n\t_filterClick: function (e, handler) {\r\n\t\tvar timeStamp = (e.timeStamp || e.originalEvent.timeStamp),\r\n\t\t\telapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);\r\n\r\n\t\t// are they closer together than 500ms yet more than 100ms?\r\n\t\t// Android typically triggers them ~300ms apart while multiple listeners\r\n\t\t// on the same event should be triggered far faster;\r\n\t\t// or check if click is simulated on the element, and if it is, reject any non-simulated events\r\n\r\n\t\tif ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {\r\n\t\t\tL.DomEvent.stop(e);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tL.DomEvent._lastClick = timeStamp;\r\n\r\n\t\treturn handler(e);\r\n\t}\r\n};\r\n\r\nL.DomEvent.on = L.DomEvent.addListener;\r\nL.DomEvent.off = L.DomEvent.removeListener;\r\n\n\n/*\r\n * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too.\r\n */\r\n\r\nL.Draggable = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\tstatics: {\r\n\t\tSTART: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],\r\n\t\tEND: {\r\n\t\t\tmousedown: 'mouseup',\r\n\t\t\ttouchstart: 'touchend',\r\n\t\t\tpointerdown: 'touchend',\r\n\t\t\tMSPointerDown: 'touchend'\r\n\t\t},\r\n\t\tMOVE: {\r\n\t\t\tmousedown: 'mousemove',\r\n\t\t\ttouchstart: 'touchmove',\r\n\t\t\tpointerdown: 'touchmove',\r\n\t\t\tMSPointerDown: 'touchmove'\r\n\t\t}\r\n\t},\r\n\r\n\tinitialize: function (element, dragStartTarget) {\r\n\t\tthis._element = element;\r\n\t\tthis._dragStartTarget = dragStartTarget || element;\r\n\t},\r\n\r\n\tenable: function () {\r\n\t\tif (this._enabled) { return; }\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);\r\n\t\t}\r\n\r\n\t\tthis._enabled = true;\r\n\t},\r\n\r\n\tdisable: function () {\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);\r\n\t\t}\r\n\r\n\t\tthis._enabled = false;\r\n\t\tthis._moved = false;\r\n\t},\r\n\r\n\t_onDown: function (e) {\r\n\t\tthis._moved = false;\r\n\r\n\t\tif (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }\r\n\r\n\t\tL.DomEvent.stopPropagation(e);\r\n\r\n\t\tif (L.Draggable._disabled) { return; }\r\n\r\n\t\tL.DomUtil.disableImageDrag();\r\n\t\tL.DomUtil.disableTextSelection();\r\n\r\n\t\tif (this._moving) { return; }\r\n\r\n\t\tvar first = e.touches ? e.touches[0] : e;\r\n\r\n\t\tthis._startPoint = new L.Point(first.clientX, first.clientY);\r\n\t\tthis._startPos = this._newPos = L.DomUtil.getPosition(this._element);\r\n\r\n\t\tL.DomEvent\r\n\t\t .on(document, L.Draggable.MOVE[e.type], this._onMove, this)\r\n\t\t .on(document, L.Draggable.END[e.type], this._onUp, this);\r\n\t},\r\n\r\n\t_onMove: function (e) {\r\n\t\tif (e.touches && e.touches.length > 1) {\r\n\t\t\tthis._moved = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\r\n\t\t newPoint = new L.Point(first.clientX, first.clientY),\r\n\t\t offset = newPoint.subtract(this._startPoint);\r\n\r\n\t\tif (!offset.x && !offset.y) { return; }\r\n\t\tif (L.Browser.touch && Math.abs(offset.x) + Math.abs(offset.y) < 3) { return; }\r\n\r\n\t\tL.DomEvent.preventDefault(e);\r\n\r\n\t\tif (!this._moved) {\r\n\t\t\tthis.fire('dragstart');\r\n\r\n\t\t\tthis._moved = true;\r\n\t\t\tthis._startPos = L.DomUtil.getPosition(this._element).subtract(offset);\r\n\r\n\t\t\tL.DomUtil.addClass(document.body, 'leaflet-dragging');\r\n\t\t\tthis._lastTarget = e.target || e.srcElement;\r\n\t\t\tL.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t}\r\n\r\n\t\tthis._newPos = this._startPos.add(offset);\r\n\t\tthis._moving = true;\r\n\r\n\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\t\tthis._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget);\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tthis.fire('predrag');\r\n\t\tL.DomUtil.setPosition(this._element, this._newPos);\r\n\t\tthis.fire('drag');\r\n\t},\r\n\r\n\t_onUp: function () {\r\n\t\tL.DomUtil.removeClass(document.body, 'leaflet-dragging');\r\n\r\n\t\tif (this._lastTarget) {\r\n\t\t\tL.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t\tthis._lastTarget = null;\r\n\t\t}\r\n\r\n\t\tfor (var i in L.Draggable.MOVE) {\r\n\t\t\tL.DomEvent\r\n\t\t\t .off(document, L.Draggable.MOVE[i], this._onMove)\r\n\t\t\t .off(document, L.Draggable.END[i], this._onUp);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.enableImageDrag();\r\n\t\tL.DomUtil.enableTextSelection();\r\n\r\n\t\tif (this._moved && this._moving) {\r\n\t\t\t// ensure drag is not fired after dragend\r\n\t\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\r\n\t\t\tthis.fire('dragend', {\r\n\t\t\t\tdistance: this._newPos.distanceTo(this._startPos)\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._moving = false;\r\n\t}\r\n});\r\n\n\n/*\n\tL.Handler is a base class for handler classes that are used internally to inject\n\tinteraction features like dragging to classes like Map and Marker.\n*/\n\nL.Handler = L.Class.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t},\n\n\tenable: function () {\n\t\tif (this._enabled) { return; }\n\n\t\tthis._enabled = true;\n\t\tthis.addHooks();\n\t},\n\n\tdisable: function () {\n\t\tif (!this._enabled) { return; }\n\n\t\tthis._enabled = false;\n\t\tthis.removeHooks();\n\t},\n\n\tenabled: function () {\n\t\treturn !!this._enabled;\n\t}\n});\n\n\n/*\n * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.\n */\n\nL.Map.mergeOptions({\n\tdragging: true,\n\n\tinertia: !L.Browser.android23,\n\tinertiaDeceleration: 3400, // px/s^2\n\tinertiaMaxSpeed: Infinity, // px/s\n\tinertiaThreshold: L.Browser.touch ? 32 : 18, // ms\n\teaseLinearity: 0.25,\n\n\t// TODO refactor, move to CRS\n\tworldCopyJump: false\n});\n\nL.Map.Drag = L.Handler.extend({\n\taddHooks: function () {\n\t\tif (!this._draggable) {\n\t\t\tvar map = this._map;\n\n\t\t\tthis._draggable = new L.Draggable(map._mapPane, map._container);\n\n\t\t\tthis._draggable.on({\n\t\t\t\t'dragstart': this._onDragStart,\n\t\t\t\t'drag': this._onDrag,\n\t\t\t\t'dragend': this._onDragEnd\n\t\t\t}, this);\n\n\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\tthis._draggable.on('predrag', this._onPreDrag, this);\n\t\t\t\tmap.on('viewreset', this._onViewReset, this);\n\n\t\t\t\tmap.whenReady(this._onViewReset, this);\n\t\t\t}\n\t\t}\n\t\tthis._draggable.enable();\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable.disable();\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\tvar map = this._map;\n\n\t\tif (map._panAnim) {\n\t\t\tmap._panAnim.stop();\n\t\t}\n\n\t\tmap\n\t\t .fire('movestart')\n\t\t .fire('dragstart');\n\n\t\tif (map.options.inertia) {\n\t\t\tthis._positions = [];\n\t\t\tthis._times = [];\n\t\t}\n\t},\n\n\t_onDrag: function () {\n\t\tif (this._map.options.inertia) {\n\t\t\tvar time = this._lastTime = +new Date(),\n\t\t\t pos = this._lastPos = this._draggable._newPos;\n\n\t\t\tthis._positions.push(pos);\n\t\t\tthis._times.push(time);\n\n\t\t\tif (time - this._times[0] > 200) {\n\t\t\t\tthis._positions.shift();\n\t\t\t\tthis._times.shift();\n\t\t\t}\n\t\t}\n\n\t\tthis._map\n\t\t .fire('move')\n\t\t .fire('drag');\n\t},\n\n\t_onViewReset: function () {\n\t\t// TODO fix hardcoded Earth values\n\t\tvar pxCenter = this._map.getSize()._divideBy(2),\n\t\t pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);\n\n\t\tthis._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;\n\t\tthis._worldWidth = this._map.project([0, 180]).x;\n\t},\n\n\t_onPreDrag: function () {\n\t\t// TODO refactor to be able to adjust map pane position after zoom\n\t\tvar worldWidth = this._worldWidth,\n\t\t halfWidth = Math.round(worldWidth / 2),\n\t\t dx = this._initialWorldOffset,\n\t\t x = this._draggable._newPos.x,\n\t\t newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,\n\t\t newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,\n\t\t newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;\n\n\t\tthis._draggable._newPos.x = newX;\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tvar map = this._map,\n\t\t options = map.options,\n\t\t delay = +new Date() - this._lastTime,\n\n\t\t noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0];\n\n\t\tmap.fire('dragend', e);\n\n\t\tif (noInertia) {\n\t\t\tmap.fire('moveend');\n\n\t\t} else {\n\n\t\t\tvar direction = this._lastPos.subtract(this._positions[0]),\n\t\t\t duration = (this._lastTime + delay - this._times[0]) / 1000,\n\t\t\t ease = options.easeLinearity,\n\n\t\t\t speedVector = direction.multiplyBy(ease / duration),\n\t\t\t speed = speedVector.distanceTo([0, 0]),\n\n\t\t\t limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),\n\t\t\t limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),\n\n\t\t\t decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),\n\t\t\t offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();\n\n\t\t\tif (!offset.x || !offset.y) {\n\t\t\t\tmap.fire('moveend');\n\n\t\t\t} else {\n\t\t\t\toffset = map._limitOffset(offset, map.options.maxBounds);\n\n\t\t\t\tL.Util.requestAnimFrame(function () {\n\t\t\t\t\tmap.panBy(offset, {\n\t\t\t\t\t\tduration: decelerationDuration,\n\t\t\t\t\t\teaseLinearity: ease,\n\t\t\t\t\t\tnoMoveStart: true\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);\n\n\n/*\n * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.\n */\n\nL.Map.mergeOptions({\n\tdoubleClickZoom: true\n});\n\nL.Map.DoubleClickZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tthis._map.on('dblclick', this._onDoubleClick, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._map.off('dblclick', this._onDoubleClick, this);\n\t},\n\n\t_onDoubleClick: function (e) {\n\t\tvar map = this._map,\n\t\t zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1);\n\n\t\tif (map.options.doubleClickZoom === 'center') {\n\t\t\tmap.setZoom(zoom);\n\t\t} else {\n\t\t\tmap.setZoomAround(e.containerPoint, zoom);\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);\n\n\n/*\n * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.\n */\n\nL.Map.mergeOptions({\n\tscrollWheelZoom: true\n});\n\nL.Map.ScrollWheelZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);\n\t\tL.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);\n\t\tthis._delta = 0;\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll);\n\t\tL.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);\n\t},\n\n\t_onWheelScroll: function (e) {\n\t\tvar delta = L.DomEvent.getWheelDelta(e);\n\n\t\tthis._delta += delta;\n\t\tthis._lastMousePos = this._map.mouseEventToContainerPoint(e);\n\n\t\tif (!this._startTime) {\n\t\t\tthis._startTime = +new Date();\n\t\t}\n\n\t\tvar left = Math.max(40 - (+new Date() - this._startTime), 0);\n\n\t\tclearTimeout(this._timer);\n\t\tthis._timer = setTimeout(L.bind(this._performZoom, this), left);\n\n\t\tL.DomEvent.preventDefault(e);\n\t\tL.DomEvent.stopPropagation(e);\n\t},\n\n\t_performZoom: function () {\n\t\tvar map = this._map,\n\t\t delta = this._delta,\n\t\t zoom = map.getZoom();\n\n\t\tdelta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n\t\tdelta = Math.max(Math.min(delta, 4), -4);\n\t\tdelta = map._limitZoom(zoom + delta) - zoom;\n\n\t\tthis._delta = 0;\n\t\tthis._startTime = null;\n\n\t\tif (!delta) { return; }\n\n\t\tif (map.options.scrollWheelZoom === 'center') {\n\t\t\tmap.setZoom(zoom + delta);\n\t\t} else {\n\t\t\tmap.setZoomAround(this._lastMousePos, zoom + delta);\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);\n\n\n/*\r\n * Extends the event handling code with double tap support for mobile browsers.\r\n */\r\n\r\nL.extend(L.DomEvent, {\r\n\r\n\t_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',\r\n\t_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',\r\n\r\n\t// inspired by Zepto touch code by Thomas Fuchs\r\n\taddDoubleTapListener: function (obj, handler, id) {\r\n\t\tvar last,\r\n\t\t doubleTap = false,\r\n\t\t delay = 250,\r\n\t\t touch,\r\n\t\t pre = '_leaflet_',\r\n\t\t touchstart = this._touchstart,\r\n\t\t touchend = this._touchend,\r\n\t\t trackedTouches = [];\r\n\r\n\t\tfunction onTouchStart(e) {\r\n\t\t\tvar count;\r\n\r\n\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\ttrackedTouches.push(e.pointerId);\r\n\t\t\t\tcount = trackedTouches.length;\r\n\t\t\t} else {\r\n\t\t\t\tcount = e.touches.length;\r\n\t\t\t}\r\n\t\t\tif (count > 1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar now = Date.now(),\r\n\t\t\t\tdelta = now - (last || now);\r\n\r\n\t\t\ttouch = e.touches ? e.touches[0] : e;\r\n\t\t\tdoubleTap = (delta > 0 && delta <= delay);\r\n\t\t\tlast = now;\r\n\t\t}\r\n\r\n\t\tfunction onTouchEnd(e) {\r\n\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\tvar idx = trackedTouches.indexOf(e.pointerId);\r\n\t\t\t\tif (idx === -1) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\ttrackedTouches.splice(idx, 1);\r\n\t\t\t}\r\n\r\n\t\t\tif (doubleTap) {\r\n\t\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\t\t// work around .type being readonly with MSPointer* events\r\n\t\t\t\t\tvar newTouch = { },\r\n\t\t\t\t\t\tprop;\r\n\r\n\t\t\t\t\t// jshint forin:false\r\n\t\t\t\t\tfor (var i in touch) {\r\n\t\t\t\t\t\tprop = touch[i];\r\n\t\t\t\t\t\tif (typeof prop === 'function') {\r\n\t\t\t\t\t\t\tnewTouch[i] = prop.bind(touch);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tnewTouch[i] = prop;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttouch = newTouch;\r\n\t\t\t\t}\r\n\t\t\t\ttouch.type = 'dblclick';\r\n\t\t\t\thandler(touch);\r\n\t\t\t\tlast = null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tobj[pre + touchstart + id] = onTouchStart;\r\n\t\tobj[pre + touchend + id] = onTouchEnd;\r\n\r\n\t\t// on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen\r\n\t\t// will not come through to us, so we will lose track of how many touches are ongoing\r\n\t\tvar endElement = L.Browser.pointer ? document.documentElement : obj;\r\n\r\n\t\tobj.addEventListener(touchstart, onTouchStart, false);\r\n\t\tendElement.addEventListener(touchend, onTouchEnd, false);\r\n\r\n\t\tif (L.Browser.pointer) {\r\n\t\t\tendElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveDoubleTapListener: function (obj, id) {\r\n\t\tvar pre = '_leaflet_';\r\n\r\n\t\tobj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);\r\n\t\t(L.Browser.pointer ? document.documentElement : obj).removeEventListener(\r\n\t\t this._touchend, obj[pre + this._touchend + id], false);\r\n\r\n\t\tif (L.Browser.pointer) {\r\n\t\t\tdocument.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id],\r\n\t\t\t\tfalse);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n\n/*\n * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.\n */\n\nL.extend(L.DomEvent, {\n\n\t//static\n\tPOINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown',\n\tPOINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove',\n\tPOINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup',\n\tPOINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',\n\n\t_pointers: [],\n\t_pointerDocumentListener: false,\n\n\t// Provides a touch events wrapper for (ms)pointer events.\n\t// Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019\n\t//ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890\n\n\taddPointerListener: function (obj, type, handler, id) {\n\n\t\tswitch (type) {\n\t\tcase 'touchstart':\n\t\t\treturn this.addPointerListenerStart(obj, type, handler, id);\n\t\tcase 'touchend':\n\t\t\treturn this.addPointerListenerEnd(obj, type, handler, id);\n\t\tcase 'touchmove':\n\t\t\treturn this.addPointerListenerMove(obj, type, handler, id);\n\t\tdefault:\n\t\t\tthrow 'Unknown touch event type';\n\t\t}\n\t},\n\n\taddPointerListenerStart: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t pointers = this._pointers;\n\n\t\tvar cb = function (e) {\n\t\t\tif (e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {\n\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t}\n\n\t\t\tvar alreadyInArray = false;\n\t\t\tfor (var i = 0; i < pointers.length; i++) {\n\t\t\t\tif (pointers[i].pointerId === e.pointerId) {\n\t\t\t\t\talreadyInArray = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!alreadyInArray) {\n\t\t\t\tpointers.push(e);\n\t\t\t}\n\n\t\t\te.touches = pointers.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t};\n\n\t\tobj[pre + 'touchstart' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_DOWN, cb, false);\n\n\t\t// need to also listen for end events to keep the _pointers list accurate\n\t\t// this needs to be on the body and never go away\n\t\tif (!this._pointerDocumentListener) {\n\t\t\tvar internalCb = function (e) {\n\t\t\t\tfor (var i = 0; i < pointers.length; i++) {\n\t\t\t\t\tif (pointers[i].pointerId === e.pointerId) {\n\t\t\t\t\t\tpointers.splice(i, 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t//We listen on the documentElement as any drags that end by moving the touch off the screen get fired there\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_UP, internalCb, false);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false);\n\n\t\t\tthis._pointerDocumentListener = true;\n\t\t}\n\n\t\treturn this;\n\t},\n\n\taddPointerListenerMove: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t touches = this._pointers;\n\n\t\tfunction cb(e) {\n\n\t\t\t// don't fire touch moves when mouse isn't down\n\t\t\tif ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }\n\n\t\t\tfor (var i = 0; i < touches.length; i++) {\n\t\t\t\tif (touches[i].pointerId === e.pointerId) {\n\t\t\t\t\ttouches[i] = e;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\te.touches = touches.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t}\n\n\t\tobj[pre + 'touchmove' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_MOVE, cb, false);\n\n\t\treturn this;\n\t},\n\n\taddPointerListenerEnd: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t touches = this._pointers;\n\n\t\tvar cb = function (e) {\n\t\t\tfor (var i = 0; i < touches.length; i++) {\n\t\t\t\tif (touches[i].pointerId === e.pointerId) {\n\t\t\t\t\ttouches.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\te.touches = touches.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t};\n\n\t\tobj[pre + 'touchend' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_UP, cb, false);\n\t\tobj.addEventListener(this.POINTER_CANCEL, cb, false);\n\n\t\treturn this;\n\t},\n\n\tremovePointerListener: function (obj, type, id) {\n\t\tvar pre = '_leaflet_',\n\t\t cb = obj[pre + type + id];\n\n\t\tswitch (type) {\n\t\tcase 'touchstart':\n\t\t\tobj.removeEventListener(this.POINTER_DOWN, cb, false);\n\t\t\tbreak;\n\t\tcase 'touchmove':\n\t\t\tobj.removeEventListener(this.POINTER_MOVE, cb, false);\n\t\t\tbreak;\n\t\tcase 'touchend':\n\t\t\tobj.removeEventListener(this.POINTER_UP, cb, false);\n\t\t\tobj.removeEventListener(this.POINTER_CANCEL, cb, false);\n\t\t\tbreak;\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n\n/*\n * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.\n */\n\nL.Map.mergeOptions({\n\ttouchZoom: L.Browser.touch && !L.Browser.android23,\n\tbounceAtZoomLimits: true\n});\n\nL.Map.TouchZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\t_onTouchStart: function (e) {\n\t\tvar map = this._map;\n\n\t\tif (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToLayerPoint(e.touches[0]),\n\t\t p2 = map.mouseEventToLayerPoint(e.touches[1]),\n\t\t viewCenter = map._getCenterLayerPoint();\n\n\t\tthis._startCenter = p1.add(p2)._divideBy(2);\n\t\tthis._startDist = p1.distanceTo(p2);\n\n\t\tthis._moved = false;\n\t\tthis._zooming = true;\n\n\t\tthis._centerOffset = viewCenter.subtract(this._startCenter);\n\n\t\tif (map._panAnim) {\n\t\t\tmap._panAnim.stop();\n\t\t}\n\n\t\tL.DomEvent\n\t\t .on(document, 'touchmove', this._onTouchMove, this)\n\t\t .on(document, 'touchend', this._onTouchEnd, this);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_onTouchMove: function (e) {\n\t\tvar map = this._map;\n\n\t\tif (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToLayerPoint(e.touches[0]),\n\t\t p2 = map.mouseEventToLayerPoint(e.touches[1]);\n\n\t\tthis._scale = p1.distanceTo(p2) / this._startDist;\n\t\tthis._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter);\n\n\t\tif (this._scale === 1) { return; }\n\n\t\tif (!map.options.bounceAtZoomLimits) {\n\t\t\tif ((map.getZoom() === map.getMinZoom() && this._scale < 1) ||\n\t\t\t (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; }\n\t\t}\n\n\t\tif (!this._moved) {\n\t\t\tL.DomUtil.addClass(map._mapPane, 'leaflet-touching');\n\n\t\t\tmap\n\t\t\t .fire('movestart')\n\t\t\t .fire('zoomstart');\n\n\t\t\tthis._moved = true;\n\t\t}\n\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\t\tthis._animRequest = L.Util.requestAnimFrame(\n\t\t this._updateOnMove, this, true, this._map._container);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_updateOnMove: function () {\n\t\tvar map = this._map,\n\t\t origin = this._getScaleOrigin(),\n\t\t center = map.layerPointToLatLng(origin),\n\t\t zoom = map.getScaleZoom(this._scale);\n\n\t\tmap._animateZoom(center, zoom, this._startCenter, this._scale, this._delta, false, true);\n\t},\n\n\t_onTouchEnd: function () {\n\t\tif (!this._moved || !this._zooming) {\n\t\t\tthis._zooming = false;\n\t\t\treturn;\n\t\t}\n\n\t\tvar map = this._map;\n\n\t\tthis._zooming = false;\n\t\tL.DomUtil.removeClass(map._mapPane, 'leaflet-touching');\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\tL.DomEvent\n\t\t .off(document, 'touchmove', this._onTouchMove)\n\t\t .off(document, 'touchend', this._onTouchEnd);\n\n\t\tvar origin = this._getScaleOrigin(),\n\t\t center = map.layerPointToLatLng(origin),\n\n\t\t oldZoom = map.getZoom(),\n\t\t floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom,\n\t\t roundZoomDelta = (floatZoomDelta > 0 ?\n\t\t Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)),\n\n\t\t zoom = map._limitZoom(oldZoom + roundZoomDelta),\n\t\t scale = map.getZoomScale(zoom) / this._scale;\n\n\t\tmap._animateZoom(center, zoom, origin, scale);\n\t},\n\n\t_getScaleOrigin: function () {\n\t\tvar centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale);\n\t\treturn this._startCenter.add(centerOffset);\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);\n\n\n/*\n * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.\n */\n\nL.Map.mergeOptions({\n\ttap: true,\n\ttapTolerance: 15\n});\n\nL.Map.Tap = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\t_onDown: function (e) {\n\t\tif (!e.touches) { return; }\n\n\t\tL.DomEvent.preventDefault(e);\n\n\t\tthis._fireClick = true;\n\n\t\t// don't simulate click or track longpress if more than 1 touch\n\t\tif (e.touches.length > 1) {\n\t\t\tthis._fireClick = false;\n\t\t\tclearTimeout(this._holdTimeout);\n\t\t\treturn;\n\t\t}\n\n\t\tvar first = e.touches[0],\n\t\t el = first.target;\n\n\t\tthis._startPos = this._newPos = new L.Point(first.clientX, first.clientY);\n\n\t\t// if touching a link, highlight it\n\t\tif (el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\tL.DomUtil.addClass(el, 'leaflet-active');\n\t\t}\n\n\t\t// simulate long hold but setting a timeout\n\t\tthis._holdTimeout = setTimeout(L.bind(function () {\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._fireClick = false;\n\t\t\t\tthis._onUp();\n\t\t\t\tthis._simulateEvent('contextmenu', first);\n\t\t\t}\n\t\t}, this), 1000);\n\n\t\tL.DomEvent\n\t\t\t.on(document, 'touchmove', this._onMove, this)\n\t\t\t.on(document, 'touchend', this._onUp, this);\n\t},\n\n\t_onUp: function (e) {\n\t\tclearTimeout(this._holdTimeout);\n\n\t\tL.DomEvent\n\t\t\t.off(document, 'touchmove', this._onMove, this)\n\t\t\t.off(document, 'touchend', this._onUp, this);\n\n\t\tif (this._fireClick && e && e.changedTouches) {\n\n\t\t\tvar first = e.changedTouches[0],\n\t\t\t el = first.target;\n\n\t\t\tif (el && el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\t\tL.DomUtil.removeClass(el, 'leaflet-active');\n\t\t\t}\n\n\t\t\t// simulate click if the touch didn't move too much\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._simulateEvent('click', first);\n\t\t\t}\n\t\t}\n\t},\n\n\t_isTapValid: function () {\n\t\treturn this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;\n\t},\n\n\t_onMove: function (e) {\n\t\tvar first = e.touches[0];\n\t\tthis._newPos = new L.Point(first.clientX, first.clientY);\n\t},\n\n\t_simulateEvent: function (type, e) {\n\t\tvar simulatedEvent = document.createEvent('MouseEvents');\n\n\t\tsimulatedEvent._simulated = true;\n\t\te.target._simulatedClick = true;\n\n\t\tsimulatedEvent.initMouseEvent(\n\t\t type, true, true, window, 1,\n\t\t e.screenX, e.screenY,\n\t\t e.clientX, e.clientY,\n\t\t false, false, false, false, 0, null);\n\n\t\te.target.dispatchEvent(simulatedEvent);\n\t}\n});\n\nif (L.Browser.touch && !L.Browser.pointer) {\n\tL.Map.addInitHook('addHandler', 'tap', L.Map.Tap);\n}\n\n\n/*\n * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map\n * (zoom to a selected bounding box), enabled by default.\n */\n\nL.Map.mergeOptions({\n\tboxZoom: true\n});\n\nL.Map.BoxZoom = L.Handler.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t\tthis._container = map._container;\n\t\tthis._pane = map._panes.overlayPane;\n\t\tthis._moved = false;\n\t},\n\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._container, 'mousedown', this._onMouseDown);\n\t\tthis._moved = false;\n\t},\n\n\tmoved: function () {\n\t\treturn this._moved;\n\t},\n\n\t_onMouseDown: function (e) {\n\t\tthis._moved = false;\n\n\t\tif (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n\t\tL.DomUtil.disableTextSelection();\n\t\tL.DomUtil.disableImageDrag();\n\n\t\tthis._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n\t\tL.DomEvent\n\t\t .on(document, 'mousemove', this._onMouseMove, this)\n\t\t .on(document, 'mouseup', this._onMouseUp, this)\n\t\t .on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._moved) {\n\t\t\tthis._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n\t\t\tL.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n\t\t\t//TODO refactor: move cursor to styles\n\t\t\tthis._container.style.cursor = 'crosshair';\n\t\t\tthis._map.fire('boxzoomstart');\n\t\t}\n\n\t\tvar startPoint = this._startLayerPoint,\n\t\t box = this._box,\n\n\t\t layerPoint = this._map.mouseEventToLayerPoint(e),\n\t\t offset = layerPoint.subtract(startPoint),\n\n\t\t newPos = new L.Point(\n\t\t Math.min(layerPoint.x, startPoint.x),\n\t\t Math.min(layerPoint.y, startPoint.y));\n\n\t\tL.DomUtil.setPosition(box, newPos);\n\n\t\tthis._moved = true;\n\n\t\t// TODO refactor: remove hardcoded 4 pixels\n\t\tbox.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n\t\tbox.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n\t},\n\n\t_finish: function () {\n\t\tif (this._moved) {\n\t\t\tthis._pane.removeChild(this._box);\n\t\t\tthis._container.style.cursor = '';\n\t\t}\n\n\t\tL.DomUtil.enableTextSelection();\n\t\tL.DomUtil.enableImageDrag();\n\n\t\tL.DomEvent\n\t\t .off(document, 'mousemove', this._onMouseMove)\n\t\t .off(document, 'mouseup', this._onMouseUp)\n\t\t .off(document, 'keydown', this._onKeyDown);\n\t},\n\n\t_onMouseUp: function (e) {\n\n\t\tthis._finish();\n\n\t\tvar map = this._map,\n\t\t layerPoint = map.mouseEventToLayerPoint(e);\n\n\t\tif (this._startLayerPoint.equals(layerPoint)) { return; }\n\n\t\tvar bounds = new L.LatLngBounds(\n\t\t map.layerPointToLatLng(this._startLayerPoint),\n\t\t map.layerPointToLatLng(layerPoint));\n\n\t\tmap.fitBounds(bounds);\n\n\t\tmap.fire('boxzoomend', {\n\t\t\tboxZoomBounds: bounds\n\t\t});\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.keyCode === 27) {\n\t\t\tthis._finish();\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);\n\n\n/*\n * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.\n */\n\nL.Map.mergeOptions({\n\tkeyboard: true,\n\tkeyboardPanOffset: 80,\n\tkeyboardZoomOffset: 1\n});\n\nL.Map.Keyboard = L.Handler.extend({\n\n\tkeyCodes: {\n\t\tleft: [37],\n\t\tright: [39],\n\t\tdown: [40],\n\t\tup: [38],\n\t\tzoomIn: [187, 107, 61, 171],\n\t\tzoomOut: [189, 109, 173]\n\t},\n\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\n\t\tthis._setPanOffset(map.options.keyboardPanOffset);\n\t\tthis._setZoomOffset(map.options.keyboardZoomOffset);\n\t},\n\n\taddHooks: function () {\n\t\tvar container = this._map._container;\n\n\t\t// make the container focusable by tabbing\n\t\tif (container.tabIndex === -1) {\n\t\t\tcontainer.tabIndex = '0';\n\t\t}\n\n\t\tL.DomEvent\n\t\t .on(container, 'focus', this._onFocus, this)\n\t\t .on(container, 'blur', this._onBlur, this)\n\t\t .on(container, 'mousedown', this._onMouseDown, this);\n\n\t\tthis._map\n\t\t .on('focus', this._addHooks, this)\n\t\t .on('blur', this._removeHooks, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._removeHooks();\n\n\t\tvar container = this._map._container;\n\n\t\tL.DomEvent\n\t\t .off(container, 'focus', this._onFocus, this)\n\t\t .off(container, 'blur', this._onBlur, this)\n\t\t .off(container, 'mousedown', this._onMouseDown, this);\n\n\t\tthis._map\n\t\t .off('focus', this._addHooks, this)\n\t\t .off('blur', this._removeHooks, this);\n\t},\n\n\t_onMouseDown: function () {\n\t\tif (this._focused) { return; }\n\n\t\tvar body = document.body,\n\t\t docEl = document.documentElement,\n\t\t top = body.scrollTop || docEl.scrollTop,\n\t\t left = body.scrollLeft || docEl.scrollLeft;\n\n\t\tthis._map._container.focus();\n\n\t\twindow.scrollTo(left, top);\n\t},\n\n\t_onFocus: function () {\n\t\tthis._focused = true;\n\t\tthis._map.fire('focus');\n\t},\n\n\t_onBlur: function () {\n\t\tthis._focused = false;\n\t\tthis._map.fire('blur');\n\t},\n\n\t_setPanOffset: function (pan) {\n\t\tvar keys = this._panKeys = {},\n\t\t codes = this.keyCodes,\n\t\t i, len;\n\n\t\tfor (i = 0, len = codes.left.length; i < len; i++) {\n\t\t\tkeys[codes.left[i]] = [-1 * pan, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.right.length; i < len; i++) {\n\t\t\tkeys[codes.right[i]] = [pan, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.down.length; i < len; i++) {\n\t\t\tkeys[codes.down[i]] = [0, pan];\n\t\t}\n\t\tfor (i = 0, len = codes.up.length; i < len; i++) {\n\t\t\tkeys[codes.up[i]] = [0, -1 * pan];\n\t\t}\n\t},\n\n\t_setZoomOffset: function (zoom) {\n\t\tvar keys = this._zoomKeys = {},\n\t\t codes = this.keyCodes,\n\t\t i, len;\n\n\t\tfor (i = 0, len = codes.zoomIn.length; i < len; i++) {\n\t\t\tkeys[codes.zoomIn[i]] = zoom;\n\t\t}\n\t\tfor (i = 0, len = codes.zoomOut.length; i < len; i++) {\n\t\t\tkeys[codes.zoomOut[i]] = -zoom;\n\t\t}\n\t},\n\n\t_addHooks: function () {\n\t\tL.DomEvent.on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_removeHooks: function () {\n\t\tL.DomEvent.off(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tvar key = e.keyCode,\n\t\t map = this._map;\n\n\t\tif (key in this._panKeys) {\n\n\t\t\tif (map._panAnim && map._panAnim._inProgress) { return; }\n\n\t\t\tmap.panBy(this._panKeys[key]);\n\n\t\t\tif (map.options.maxBounds) {\n\t\t\t\tmap.panInsideBounds(map.options.maxBounds);\n\t\t\t}\n\n\t\t} else if (key in this._zoomKeys) {\n\t\t\tmap.setZoom(map.getZoom() + this._zoomKeys[key]);\n\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tL.DomEvent.stop(e);\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);\n\n\n/*\n * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.\n */\n\nL.Handler.MarkerDrag = L.Handler.extend({\n\tinitialize: function (marker) {\n\t\tthis._marker = marker;\n\t},\n\n\taddHooks: function () {\n\t\tvar icon = this._marker._icon;\n\t\tif (!this._draggable) {\n\t\t\tthis._draggable = new L.Draggable(icon, icon);\n\t\t}\n\n\t\tthis._draggable\n\t\t\t.on('dragstart', this._onDragStart, this)\n\t\t\t.on('drag', this._onDrag, this)\n\t\t\t.on('dragend', this._onDragEnd, this);\n\t\tthis._draggable.enable();\n\t\tL.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable');\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable\n\t\t\t.off('dragstart', this._onDragStart, this)\n\t\t\t.off('drag', this._onDrag, this)\n\t\t\t.off('dragend', this._onDragEnd, this);\n\n\t\tthis._draggable.disable();\n\t\tL.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\tthis._marker\n\t\t .closePopup()\n\t\t .fire('movestart')\n\t\t .fire('dragstart');\n\t},\n\n\t_onDrag: function () {\n\t\tvar marker = this._marker,\n\t\t shadow = marker._shadow,\n\t\t iconPos = L.DomUtil.getPosition(marker._icon),\n\t\t latlng = marker._map.layerPointToLatLng(iconPos);\n\n\t\t// update shadow position\n\t\tif (shadow) {\n\t\t\tL.DomUtil.setPosition(shadow, iconPos);\n\t\t}\n\n\t\tmarker._latlng = latlng;\n\n\t\tmarker\n\t\t .fire('move', {latlng: latlng})\n\t\t .fire('drag');\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tthis._marker\n\t\t .fire('moveend')\n\t\t .fire('dragend', e);\n\t}\n});\n\n\n/*\r\n * L.Control is a base class for implementing map controls. Handles positioning.\r\n * All other controls extend from this class.\r\n */\r\n\r\nL.Control = L.Class.extend({\r\n\toptions: {\r\n\t\tposition: 'topright'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tgetPosition: function () {\r\n\t\treturn this.options.position;\r\n\t},\r\n\r\n\tsetPosition: function (position) {\r\n\t\tvar map = this._map;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.removeControl(this);\r\n\t\t}\r\n\r\n\t\tthis.options.position = position;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.addControl(this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tvar container = this._container = this.onAdd(map),\r\n\t\t pos = this.getPosition(),\r\n\t\t corner = map._controlCorners[pos];\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-control');\r\n\r\n\t\tif (pos.indexOf('bottom') !== -1) {\r\n\t\t\tcorner.insertBefore(container, corner.firstChild);\r\n\t\t} else {\r\n\t\t\tcorner.appendChild(container);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveFrom: function (map) {\r\n\t\tvar pos = this.getPosition(),\r\n\t\t corner = map._controlCorners[pos];\r\n\r\n\t\tcorner.removeChild(this._container);\r\n\t\tthis._map = null;\r\n\r\n\t\tif (this.onRemove) {\r\n\t\t\tthis.onRemove(map);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_refocusOnMap: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.getContainer().focus();\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.control = function (options) {\r\n\treturn new L.Control(options);\r\n};\r\n\r\n\r\n// adds control-related methods to L.Map\r\n\r\nL.Map.include({\r\n\taddControl: function (control) {\r\n\t\tcontrol.addTo(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveControl: function (control) {\r\n\t\tcontrol.removeFrom(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initControlPos: function () {\r\n\t\tvar corners = this._controlCorners = {},\r\n\t\t l = 'leaflet-',\r\n\t\t container = this._controlContainer =\r\n\t\t L.DomUtil.create('div', l + 'control-container', this._container);\r\n\r\n\t\tfunction createCorner(vSide, hSide) {\r\n\t\t\tvar className = l + vSide + ' ' + l + hSide;\r\n\r\n\t\t\tcorners[vSide + hSide] = L.DomUtil.create('div', className, container);\r\n\t\t}\r\n\r\n\t\tcreateCorner('top', 'left');\r\n\t\tcreateCorner('top', 'right');\r\n\t\tcreateCorner('bottom', 'left');\r\n\t\tcreateCorner('bottom', 'right');\r\n\t},\r\n\r\n\t_clearControlPos: function () {\r\n\t\tthis._container.removeChild(this._controlContainer);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.Control.Zoom is used for the default zoom buttons on the map.\r\n */\r\n\r\nL.Control.Zoom = L.Control.extend({\r\n\toptions: {\r\n\t\tposition: 'topleft',\r\n\t\tzoomInText: '+',\r\n\t\tzoomInTitle: 'Zoom in',\r\n\t\tzoomOutText: '-',\r\n\t\tzoomOutTitle: 'Zoom out'\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tvar zoomName = 'leaflet-control-zoom',\r\n\t\t container = L.DomUtil.create('div', zoomName + ' leaflet-bar');\r\n\r\n\t\tthis._map = map;\r\n\r\n\t\tthis._zoomInButton = this._createButton(\r\n\t\t this.options.zoomInText, this.options.zoomInTitle,\r\n\t\t zoomName + '-in', container, this._zoomIn, this);\r\n\t\tthis._zoomOutButton = this._createButton(\r\n\t\t this.options.zoomOutText, this.options.zoomOutTitle,\r\n\t\t zoomName + '-out', container, this._zoomOut, this);\r\n\r\n\t\tthis._updateDisabled();\r\n\t\tmap.on('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.off('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\t},\r\n\r\n\t_zoomIn: function (e) {\r\n\t\tthis._map.zoomIn(e.shiftKey ? 3 : 1);\r\n\t},\r\n\r\n\t_zoomOut: function (e) {\r\n\t\tthis._map.zoomOut(e.shiftKey ? 3 : 1);\r\n\t},\r\n\r\n\t_createButton: function (html, title, className, container, fn, context) {\r\n\t\tvar link = L.DomUtil.create('a', className, container);\r\n\t\tlink.innerHTML = html;\r\n\t\tlink.href = '#';\r\n\t\tlink.title = title;\r\n\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\tL.DomEvent\r\n\t\t .on(link, 'click', stop)\r\n\t\t .on(link, 'mousedown', stop)\r\n\t\t .on(link, 'dblclick', stop)\r\n\t\t .on(link, 'click', L.DomEvent.preventDefault)\r\n\t\t .on(link, 'click', fn, context)\r\n\t\t .on(link, 'click', this._refocusOnMap, context);\r\n\r\n\t\treturn link;\r\n\t},\r\n\r\n\t_updateDisabled: function () {\r\n\t\tvar map = this._map,\r\n\t\t\tclassName = 'leaflet-disabled';\r\n\r\n\t\tL.DomUtil.removeClass(this._zoomInButton, className);\r\n\t\tL.DomUtil.removeClass(this._zoomOutButton, className);\r\n\r\n\t\tif (map._zoom === map.getMinZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomOutButton, className);\r\n\t\t}\r\n\t\tif (map._zoom === map.getMaxZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomInButton, className);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.mergeOptions({\r\n\tzoomControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.zoomControl) {\r\n\t\tthis.zoomControl = new L.Control.Zoom();\r\n\t\tthis.addControl(this.zoomControl);\r\n\t}\r\n});\r\n\r\nL.control.zoom = function (options) {\r\n\treturn new L.Control.Zoom(options);\r\n};\r\n\r\n\n\n/*\r\n * L.Control.Attribution is used for displaying attribution on the map (added by default).\r\n */\r\n\r\nL.Control.Attribution = L.Control.extend({\r\n\toptions: {\r\n\t\tposition: 'bottomright',\r\n\t\tprefix: 'Leaflet'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._attributions = {};\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-control-attribution');\r\n\t\tL.DomEvent.disableClickPropagation(this._container);\r\n\r\n\t\tfor (var i in map._layers) {\r\n\t\t\tif (map._layers[i].getAttribution) {\r\n\t\t\t\tthis.addAttribution(map._layers[i].getAttribution());\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tmap\r\n\t\t .on('layeradd', this._onLayerAdd, this)\r\n\t\t .on('layerremove', this._onLayerRemove, this);\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t .off('layeradd', this._onLayerAdd)\r\n\t\t .off('layerremove', this._onLayerRemove);\r\n\r\n\t},\r\n\r\n\tsetPrefix: function (prefix) {\r\n\t\tthis.options.prefix = prefix;\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddAttribution: function (text) {\r\n\t\tif (!text) { return; }\r\n\r\n\t\tif (!this._attributions[text]) {\r\n\t\t\tthis._attributions[text] = 0;\r\n\t\t}\r\n\t\tthis._attributions[text]++;\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveAttribution: function (text) {\r\n\t\tif (!text) { return; }\r\n\r\n\t\tif (this._attributions[text]) {\r\n\t\t\tthis._attributions[text]--;\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar attribs = [];\r\n\r\n\t\tfor (var i in this._attributions) {\r\n\t\t\tif (this._attributions[i]) {\r\n\t\t\t\tattribs.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar prefixAndAttribs = [];\r\n\r\n\t\tif (this.options.prefix) {\r\n\t\t\tprefixAndAttribs.push(this.options.prefix);\r\n\t\t}\r\n\t\tif (attribs.length) {\r\n\t\t\tprefixAndAttribs.push(attribs.join(', '));\r\n\t\t}\r\n\r\n\t\tthis._container.innerHTML = prefixAndAttribs.join(' | ');\r\n\t},\r\n\r\n\t_onLayerAdd: function (e) {\r\n\t\tif (e.layer.getAttribution) {\r\n\t\t\tthis.addAttribution(e.layer.getAttribution());\r\n\t\t}\r\n\t},\r\n\r\n\t_onLayerRemove: function (e) {\r\n\t\tif (e.layer.getAttribution) {\r\n\t\t\tthis.removeAttribution(e.layer.getAttribution());\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.mergeOptions({\r\n\tattributionControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.attributionControl) {\r\n\t\tthis.attributionControl = (new L.Control.Attribution()).addTo(this);\r\n\t}\r\n});\r\n\r\nL.control.attribution = function (options) {\r\n\treturn new L.Control.Attribution(options);\r\n};\r\n\n\n/*\n * L.Control.Scale is used for displaying metric/imperial scale on the map.\n */\n\nL.Control.Scale = L.Control.extend({\n\toptions: {\n\t\tposition: 'bottomleft',\n\t\tmaxWidth: 100,\n\t\tmetric: true,\n\t\timperial: true,\n\t\tupdateWhenIdle: false\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\n\t\tvar className = 'leaflet-control-scale',\n\t\t container = L.DomUtil.create('div', className),\n\t\t options = this.options;\n\n\t\tthis._addScales(options, className, container);\n\n\t\tmap.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t\tmap.whenReady(this._update, this);\n\n\t\treturn container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t},\n\n\t_addScales: function (options, className, container) {\n\t\tif (options.metric) {\n\t\t\tthis._mScale = L.DomUtil.create('div', className + '-line', container);\n\t\t}\n\t\tif (options.imperial) {\n\t\t\tthis._iScale = L.DomUtil.create('div', className + '-line', container);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tvar bounds = this._map.getBounds(),\n\t\t centerLat = bounds.getCenter().lat,\n\t\t halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),\n\t\t dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180,\n\n\t\t size = this._map.getSize(),\n\t\t options = this.options,\n\t\t maxMeters = 0;\n\n\t\tif (size.x > 0) {\n\t\t\tmaxMeters = dist * (options.maxWidth / size.x);\n\t\t}\n\n\t\tthis._updateScales(options, maxMeters);\n\t},\n\n\t_updateScales: function (options, maxMeters) {\n\t\tif (options.metric && maxMeters) {\n\t\t\tthis._updateMetric(maxMeters);\n\t\t}\n\n\t\tif (options.imperial && maxMeters) {\n\t\t\tthis._updateImperial(maxMeters);\n\t\t}\n\t},\n\n\t_updateMetric: function (maxMeters) {\n\t\tvar meters = this._getRoundNum(maxMeters);\n\n\t\tthis._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px';\n\t\tthis._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\t},\n\n\t_updateImperial: function (maxMeters) {\n\t\tvar maxFeet = maxMeters * 3.2808399,\n\t\t scale = this._iScale,\n\t\t maxMiles, miles, feet;\n\n\t\tif (maxFeet > 5280) {\n\t\t\tmaxMiles = maxFeet / 5280;\n\t\t\tmiles = this._getRoundNum(maxMiles);\n\n\t\t\tscale.style.width = this._getScaleWidth(miles / maxMiles) + 'px';\n\t\t\tscale.innerHTML = miles + ' mi';\n\n\t\t} else {\n\t\t\tfeet = this._getRoundNum(maxFeet);\n\n\t\t\tscale.style.width = this._getScaleWidth(feet / maxFeet) + 'px';\n\t\t\tscale.innerHTML = feet + ' ft';\n\t\t}\n\t},\n\n\t_getScaleWidth: function (ratio) {\n\t\treturn Math.round(this.options.maxWidth * ratio) - 10;\n\t},\n\n\t_getRoundNum: function (num) {\n\t\tvar pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n\t\t d = num / pow10;\n\n\t\td = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1;\n\n\t\treturn pow10 * d;\n\t}\n});\n\nL.control.scale = function (options) {\n\treturn new L.Control.Scale(options);\n};\n\n\n/*\r\n * L.Control.Layers is a control to allow users to switch between different layers on the map.\r\n */\r\n\r\nL.Control.Layers = L.Control.extend({\r\n\toptions: {\r\n\t\tcollapsed: true,\r\n\t\tposition: 'topright',\r\n\t\tautoZIndex: true\r\n\t},\r\n\r\n\tinitialize: function (baseLayers, overlays, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\t\tthis._lastZIndex = 0;\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tfor (var i in baseLayers) {\r\n\t\t\tthis._addLayer(baseLayers[i], i);\r\n\t\t}\r\n\r\n\t\tfor (i in overlays) {\r\n\t\t\tthis._addLayer(overlays[i], i, true);\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._initLayout();\r\n\t\tthis._update();\r\n\r\n\t\tmap\r\n\t\t .on('layeradd', this._onLayerChange, this)\r\n\t\t .on('layerremove', this._onLayerChange, this);\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t .off('layeradd', this._onLayerChange, this)\r\n\t\t .off('layerremove', this._onLayerChange, this);\r\n\t},\r\n\r\n\taddBaseLayer: function (layer, name) {\r\n\t\tthis._addLayer(layer, name);\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddOverlay: function (layer, name) {\r\n\t\tthis._addLayer(layer, name, true);\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = L.stamp(layer);\r\n\t\tdelete this._layers[id];\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar className = 'leaflet-control-layers',\r\n\t\t container = this._container = L.DomUtil.create('div', className);\r\n\r\n\t\t//Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released\r\n\t\tcontainer.setAttribute('aria-haspopup', true);\r\n\r\n\t\tif (!L.Browser.touch) {\r\n\t\t\tL.DomEvent\r\n\t\t\t\t.disableClickPropagation(container)\r\n\t\t\t\t.disableScrollPropagation(container);\r\n\t\t} else {\r\n\t\t\tL.DomEvent.on(container, 'click', L.DomEvent.stopPropagation);\r\n\t\t}\r\n\r\n\t\tvar form = this._form = L.DomUtil.create('form', className + '-list');\r\n\r\n\t\tif (this.options.collapsed) {\r\n\t\t\tif (!L.Browser.android) {\r\n\t\t\t\tL.DomEvent\r\n\t\t\t\t .on(container, 'mouseover', this._expand, this)\r\n\t\t\t\t .on(container, 'mouseout', this._collapse, this);\r\n\t\t\t}\r\n\t\t\tvar link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);\r\n\t\t\tlink.href = '#';\r\n\t\t\tlink.title = 'Layers';\r\n\r\n\t\t\tif (L.Browser.touch) {\r\n\t\t\t\tL.DomEvent\r\n\t\t\t\t .on(link, 'click', L.DomEvent.stop)\r\n\t\t\t\t .on(link, 'click', this._expand, this);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tL.DomEvent.on(link, 'focus', this._expand, this);\r\n\t\t\t}\r\n\t\t\t//Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033\r\n\t\t\tL.DomEvent.on(form, 'click', function () {\r\n\t\t\t\tsetTimeout(L.bind(this._onInputClick, this), 0);\r\n\t\t\t}, this);\r\n\r\n\t\t\tthis._map.on('click', this._collapse, this);\r\n\t\t\t// TODO keyboard accessibility\r\n\t\t} else {\r\n\t\t\tthis._expand();\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList = L.DomUtil.create('div', className + '-base', form);\r\n\t\tthis._separator = L.DomUtil.create('div', className + '-separator', form);\r\n\t\tthis._overlaysList = L.DomUtil.create('div', className + '-overlays', form);\r\n\r\n\t\tcontainer.appendChild(form);\r\n\t},\r\n\r\n\t_addLayer: function (layer, name, overlay) {\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tthis._layers[id] = {\r\n\t\t\tlayer: layer,\r\n\t\t\tname: name,\r\n\t\t\toverlay: overlay\r\n\t\t};\r\n\r\n\t\tif (this.options.autoZIndex && layer.setZIndex) {\r\n\t\t\tthis._lastZIndex++;\r\n\t\t\tlayer.setZIndex(this._lastZIndex);\r\n\t\t}\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._container) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList.innerHTML = '';\r\n\t\tthis._overlaysList.innerHTML = '';\r\n\r\n\t\tvar baseLayersPresent = false,\r\n\t\t overlaysPresent = false,\r\n\t\t i, obj;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tobj = this._layers[i];\r\n\t\t\tthis._addItem(obj);\r\n\t\t\toverlaysPresent = overlaysPresent || obj.overlay;\r\n\t\t\tbaseLayersPresent = baseLayersPresent || !obj.overlay;\r\n\t\t}\r\n\r\n\t\tthis._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';\r\n\t},\r\n\r\n\t_onLayerChange: function (e) {\r\n\t\tvar obj = this._layers[L.stamp(e.layer)];\r\n\r\n\t\tif (!obj) { return; }\r\n\r\n\t\tif (!this._handlingClick) {\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tvar type = obj.overlay ?\r\n\t\t\t(e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') :\r\n\t\t\t(e.type === 'layeradd' ? 'baselayerchange' : null);\r\n\r\n\t\tif (type) {\r\n\t\t\tthis._map.fire(type, obj);\r\n\t\t}\r\n\t},\r\n\r\n\t// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)\r\n\t_createRadioElement: function (name, checked) {\r\n\r\n\t\tvar radioHtml = '';\r\n\r\n\t\tvar radioFragment = document.createElement('div');\r\n\t\tradioFragment.innerHTML = radioHtml;\r\n\r\n\t\treturn radioFragment.firstChild;\r\n\t},\r\n\r\n\t_addItem: function (obj) {\r\n\t\tvar label = document.createElement('label'),\r\n\t\t input,\r\n\t\t checked = this._map.hasLayer(obj.layer);\r\n\r\n\t\tif (obj.overlay) {\r\n\t\t\tinput = document.createElement('input');\r\n\t\t\tinput.type = 'checkbox';\r\n\t\t\tinput.className = 'leaflet-control-layers-selector';\r\n\t\t\tinput.defaultChecked = checked;\r\n\t\t} else {\r\n\t\t\tinput = this._createRadioElement('leaflet-base-layers', checked);\r\n\t\t}\r\n\r\n\t\tinput.layerId = L.stamp(obj.layer);\r\n\r\n\t\tL.DomEvent.on(input, 'click', this._onInputClick, this);\r\n\r\n\t\tvar name = document.createElement('span');\r\n\t\tname.innerHTML = ' ' + obj.name;\r\n\r\n\t\tlabel.appendChild(input);\r\n\t\tlabel.appendChild(name);\r\n\r\n\t\tvar container = obj.overlay ? this._overlaysList : this._baseLayersList;\r\n\t\tcontainer.appendChild(label);\r\n\r\n\t\treturn label;\r\n\t},\r\n\r\n\t_onInputClick: function () {\r\n\t\tvar i, input, obj,\r\n\t\t inputs = this._form.getElementsByTagName('input'),\r\n\t\t inputsLen = inputs.length;\r\n\r\n\t\tthis._handlingClick = true;\r\n\r\n\t\tfor (i = 0; i < inputsLen; i++) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tobj = this._layers[input.layerId];\r\n\r\n\t\t\tif (input.checked && !this._map.hasLayer(obj.layer)) {\r\n\t\t\t\tthis._map.addLayer(obj.layer);\r\n\r\n\t\t\t} else if (!input.checked && this._map.hasLayer(obj.layer)) {\r\n\t\t\t\tthis._map.removeLayer(obj.layer);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tthis._refocusOnMap();\r\n\t},\r\n\r\n\t_expand: function () {\r\n\t\tL.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded');\r\n\t},\r\n\r\n\t_collapse: function () {\r\n\t\tthis._container.className = this._container.className.replace(' leaflet-control-layers-expanded', '');\r\n\t}\r\n});\r\n\r\nL.control.layers = function (baseLayers, overlays, options) {\r\n\treturn new L.Control.Layers(baseLayers, overlays, options);\r\n};\r\n\n\n/*\n * L.PosAnimation is used by Leaflet internally for pan animations.\n */\n\nL.PosAnimation = L.Class.extend({\n\tincludes: L.Mixin.Events,\n\n\trun: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])\n\t\tthis.stop();\n\n\t\tthis._el = el;\n\t\tthis._inProgress = true;\n\t\tthis._newPos = newPos;\n\n\t\tthis.fire('start');\n\n\t\tel.style[L.DomUtil.TRANSITION] = 'all ' + (duration || 0.25) +\n\t\t 's cubic-bezier(0,0,' + (easeLinearity || 0.5) + ',1)';\n\n\t\tL.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);\n\t\tL.DomUtil.setPosition(el, newPos);\n\n\t\t// toggle reflow, Chrome flickers for some reason if you don't do this\n\t\tL.Util.falseFn(el.offsetWidth);\n\n\t\t// there's no native way to track value updates of transitioned properties, so we imitate this\n\t\tthis._stepTimer = setInterval(L.bind(this._onStep, this), 50);\n\t},\n\n\tstop: function () {\n\t\tif (!this._inProgress) { return; }\n\n\t\t// if we just removed the transition property, the element would jump to its final position,\n\t\t// so we need to make it stay at the current position\n\n\t\tL.DomUtil.setPosition(this._el, this._getPos());\n\t\tthis._onTransitionEnd();\n\t\tL.Util.falseFn(this._el.offsetWidth); // force reflow in case we are about to start a new animation\n\t},\n\n\t_onStep: function () {\n\t\tvar stepPos = this._getPos();\n\t\tif (!stepPos) {\n\t\t\tthis._onTransitionEnd();\n\t\t\treturn;\n\t\t}\n\t\t// jshint camelcase: false\n\t\t// make L.DomUtil.getPosition return intermediate position value during animation\n\t\tthis._el._leaflet_pos = stepPos;\n\n\t\tthis.fire('step');\n\t},\n\n\t// you can't easily get intermediate values of properties animated with CSS3 Transitions,\n\t// we need to parse computed style (in case of transform it returns matrix string)\n\n\t_transformRe: /([-+]?(?:\\d*\\.)?\\d+)\\D*, ([-+]?(?:\\d*\\.)?\\d+)\\D*\\)/,\n\n\t_getPos: function () {\n\t\tvar left, top, matches,\n\t\t el = this._el,\n\t\t style = window.getComputedStyle(el);\n\n\t\tif (L.Browser.any3d) {\n\t\t\tmatches = style[L.DomUtil.TRANSFORM].match(this._transformRe);\n\t\t\tif (!matches) { return; }\n\t\t\tleft = parseFloat(matches[1]);\n\t\t\ttop = parseFloat(matches[2]);\n\t\t} else {\n\t\t\tleft = parseFloat(style.left);\n\t\t\ttop = parseFloat(style.top);\n\t\t}\n\n\t\treturn new L.Point(left, top, true);\n\t},\n\n\t_onTransitionEnd: function () {\n\t\tL.DomEvent.off(this._el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);\n\n\t\tif (!this._inProgress) { return; }\n\t\tthis._inProgress = false;\n\n\t\tthis._el.style[L.DomUtil.TRANSITION] = '';\n\n\t\t// jshint camelcase: false\n\t\t// make sure L.DomUtil.getPosition returns the final position value after animation\n\t\tthis._el._leaflet_pos = this._newPos;\n\n\t\tclearInterval(this._stepTimer);\n\n\t\tthis.fire('step').fire('end');\n\t}\n\n});\n\n\n/*\n * Extends L.Map to handle panning animations.\n */\n\nL.Map.include({\n\n\tsetView: function (center, zoom, options) {\n\n\t\tzoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);\n\t\tcenter = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);\n\t\toptions = options || {};\n\n\t\tif (this._panAnim) {\n\t\t\tthis._panAnim.stop();\n\t\t}\n\n\t\tif (this._loaded && !options.reset && options !== true) {\n\n\t\t\tif (options.animate !== undefined) {\n\t\t\t\toptions.zoom = L.extend({animate: options.animate}, options.zoom);\n\t\t\t\toptions.pan = L.extend({animate: options.animate}, options.pan);\n\t\t\t}\n\n\t\t\t// try animating pan or zoom\n\t\t\tvar animated = (this._zoom !== zoom) ?\n\t\t\t\tthis._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :\n\t\t\t\tthis._tryAnimatedPan(center, options.pan);\n\n\t\t\tif (animated) {\n\t\t\t\t// prevent resize handler call, the view will refresh after animation anyway\n\t\t\t\tclearTimeout(this._sizeTimer);\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\n\t\t// animation didn't start, just reset the map view\n\t\tthis._resetView(center, zoom);\n\n\t\treturn this;\n\t},\n\n\tpanBy: function (offset, options) {\n\t\toffset = L.point(offset).round();\n\t\toptions = options || {};\n\n\t\tif (!offset.x && !offset.y) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!this._panAnim) {\n\t\t\tthis._panAnim = new L.PosAnimation();\n\n\t\t\tthis._panAnim.on({\n\t\t\t\t'step': this._onPanTransitionStep,\n\t\t\t\t'end': this._onPanTransitionEnd\n\t\t\t}, this);\n\t\t}\n\n\t\t// don't fire movestart if animating inertia\n\t\tif (!options.noMoveStart) {\n\t\t\tthis.fire('movestart');\n\t\t}\n\n\t\t// animate pan unless animate: false specified\n\t\tif (options.animate !== false) {\n\t\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');\n\n\t\t\tvar newPos = this._getMapPanePos().subtract(offset);\n\t\t\tthis._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);\n\t\t} else {\n\t\t\tthis._rawPanBy(offset);\n\t\t\tthis.fire('move').fire('moveend');\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_onPanTransitionStep: function () {\n\t\tthis.fire('move');\n\t},\n\n\t_onPanTransitionEnd: function () {\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');\n\t\tthis.fire('moveend');\n\t},\n\n\t_tryAnimatedPan: function (center, options) {\n\t\t// difference between the new and current centers in pixels\n\t\tvar offset = this._getCenterOffset(center)._floor();\n\n\t\t// don't animate too far unless animate: true specified in options\n\t\tif ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }\n\n\t\tthis.panBy(offset, options);\n\n\t\treturn true;\n\t}\n});\n\n\n/*\n * L.PosAnimation fallback implementation that powers Leaflet pan animations\n * in browsers that don't support CSS3 Transitions.\n */\n\nL.PosAnimation = L.DomUtil.TRANSITION ? L.PosAnimation : L.PosAnimation.extend({\n\n\trun: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])\n\t\tthis.stop();\n\n\t\tthis._el = el;\n\t\tthis._inProgress = true;\n\t\tthis._duration = duration || 0.25;\n\t\tthis._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);\n\n\t\tthis._startPos = L.DomUtil.getPosition(el);\n\t\tthis._offset = newPos.subtract(this._startPos);\n\t\tthis._startTime = +new Date();\n\n\t\tthis.fire('start');\n\n\t\tthis._animate();\n\t},\n\n\tstop: function () {\n\t\tif (!this._inProgress) { return; }\n\n\t\tthis._step();\n\t\tthis._complete();\n\t},\n\n\t_animate: function () {\n\t\t// animation loop\n\t\tthis._animId = L.Util.requestAnimFrame(this._animate, this);\n\t\tthis._step();\n\t},\n\n\t_step: function () {\n\t\tvar elapsed = (+new Date()) - this._startTime,\n\t\t duration = this._duration * 1000;\n\n\t\tif (elapsed < duration) {\n\t\t\tthis._runFrame(this._easeOut(elapsed / duration));\n\t\t} else {\n\t\t\tthis._runFrame(1);\n\t\t\tthis._complete();\n\t\t}\n\t},\n\n\t_runFrame: function (progress) {\n\t\tvar pos = this._startPos.add(this._offset.multiplyBy(progress));\n\t\tL.DomUtil.setPosition(this._el, pos);\n\n\t\tthis.fire('step');\n\t},\n\n\t_complete: function () {\n\t\tL.Util.cancelAnimFrame(this._animId);\n\n\t\tthis._inProgress = false;\n\t\tthis.fire('end');\n\t},\n\n\t_easeOut: function (t) {\n\t\treturn 1 - Math.pow(1 - t, this._easeOutPower);\n\t}\n});\n\n\n/*\n * Extends L.Map to handle zoom animations.\n */\n\nL.Map.mergeOptions({\n\tzoomAnimation: true,\n\tzoomAnimationThreshold: 4\n});\n\nif (L.DomUtil.TRANSITION) {\n\n\tL.Map.addInitHook(function () {\n\t\t// don't animate on browsers without hardware-accelerated transitions or old Android/Opera\n\t\tthis._zoomAnimated = this.options.zoomAnimation && L.DomUtil.TRANSITION &&\n\t\t\t\tL.Browser.any3d && !L.Browser.android23 && !L.Browser.mobileOpera;\n\n\t\t// zoom transitions run with the same duration for all layers, so if one of transitionend events\n\t\t// happens after starting zoom animation (propagating to the map pane), we know that it ended globally\n\t\tif (this._zoomAnimated) {\n\t\t\tL.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this);\n\t\t}\n\t});\n}\n\nL.Map.include(!L.DomUtil.TRANSITION ? {} : {\n\n\t_catchTransitionEnd: function (e) {\n\t\tif (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {\n\t\t\tthis._onZoomTransitionEnd();\n\t\t}\n\t},\n\n\t_nothingToAnimate: function () {\n\t\treturn !this._container.getElementsByClassName('leaflet-zoom-animated').length;\n\t},\n\n\t_tryAnimatedZoom: function (center, zoom, options) {\n\n\t\tif (this._animatingZoom) { return true; }\n\n\t\toptions = options || {};\n\n\t\t// don't animate if disabled, not supported or zoom difference is too large\n\t\tif (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||\n\t\t Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }\n\n\t\t// offset is the pixel coords of the zoom origin relative to the current center\n\t\tvar scale = this.getZoomScale(zoom),\n\t\t offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale),\n\t\t\torigin = this._getCenterLayerPoint()._add(offset);\n\n\t\t// don't animate if the zoom origin isn't within one screen from the current center, unless forced\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) { return false; }\n\n\t\tthis\n\t\t .fire('movestart')\n\t\t .fire('zoomstart');\n\n\t\tthis._animateZoom(center, zoom, origin, scale, null, true);\n\n\t\treturn true;\n\t},\n\n\t_animateZoom: function (center, zoom, origin, scale, delta, backwards, forTouchZoom) {\n\n\t\tif (!forTouchZoom) {\n\t\t\tthis._animatingZoom = true;\n\t\t}\n\n\t\t// put transform transition on all layers with leaflet-zoom-animated class\n\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');\n\n\t\t// remember what center/zoom to set after animation\n\t\tthis._animateToCenter = center;\n\t\tthis._animateToZoom = zoom;\n\n\t\t// disable any dragging during animation\n\t\tif (L.Draggable) {\n\t\t\tL.Draggable._disabled = true;\n\t\t}\n\n\t\tL.Util.requestAnimFrame(function () {\n\t\t\tthis.fire('zoomanim', {\n\t\t\t\tcenter: center,\n\t\t\t\tzoom: zoom,\n\t\t\t\torigin: origin,\n\t\t\t\tscale: scale,\n\t\t\t\tdelta: delta,\n\t\t\t\tbackwards: backwards\n\t\t\t});\n\t\t\t// horrible hack to work around a Chrome bug https://github.com/Leaflet/Leaflet/issues/3689\n\t\t\tsetTimeout(L.bind(this._onZoomTransitionEnd, this), 250);\n\t\t}, this);\n\t},\n\n\t_onZoomTransitionEnd: function () {\n\t\tif (!this._animatingZoom) { return; }\n\n\t\tthis._animatingZoom = false;\n\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');\n\n\t\tL.Util.requestAnimFrame(function () {\n\t\t\tthis._resetView(this._animateToCenter, this._animateToZoom, true, true);\n\n\t\t\tif (L.Draggable) {\n\t\t\t\tL.Draggable._disabled = false;\n\t\t\t}\n\t\t}, this);\n\t}\n});\n\n\n/*\n\tZoom animation logic for L.TileLayer.\n*/\n\nL.TileLayer.include({\n\t_animateZoom: function (e) {\n\t\tif (!this._animating) {\n\t\t\tthis._animating = true;\n\t\t\tthis._prepareBgBuffer();\n\t\t}\n\n\t\tvar bg = this._bgBuffer,\n\t\t transform = L.DomUtil.TRANSFORM,\n\t\t initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform],\n\t\t scaleStr = L.DomUtil.getScaleString(e.scale, e.origin);\n\n\t\tbg.style[transform] = e.backwards ?\n\t\t\t\tscaleStr + ' ' + initialTransform :\n\t\t\t\tinitialTransform + ' ' + scaleStr;\n\t},\n\n\t_endZoomAnim: function () {\n\t\tvar front = this._tileContainer,\n\t\t bg = this._bgBuffer;\n\n\t\tfront.style.visibility = '';\n\t\tfront.parentNode.appendChild(front); // Bring to fore\n\n\t\t// force reflow\n\t\tL.Util.falseFn(bg.offsetWidth);\n\n\t\tvar zoom = this._map.getZoom();\n\t\tif (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\n\t\t\tthis._clearBgBuffer();\n\t\t}\n\n\t\tthis._animating = false;\n\t},\n\n\t_clearBgBuffer: function () {\n\t\tvar map = this._map;\n\n\t\tif (map && !map._animatingZoom && !map.touchZoom._zooming) {\n\t\t\tthis._bgBuffer.innerHTML = '';\n\t\t\tthis._bgBuffer.style[L.DomUtil.TRANSFORM] = '';\n\t\t}\n\t},\n\n\t_prepareBgBuffer: function () {\n\n\t\tvar front = this._tileContainer,\n\t\t bg = this._bgBuffer;\n\n\t\t// if foreground layer doesn't have many tiles but bg layer does,\n\t\t// keep the existing bg layer and just zoom it some more\n\n\t\tvar bgLoaded = this._getLoadedTilesPercentage(bg),\n\t\t frontLoaded = this._getLoadedTilesPercentage(front);\n\n\t\tif (bg && bgLoaded > 0.5 && frontLoaded < 0.5) {\n\n\t\t\tfront.style.visibility = 'hidden';\n\t\t\tthis._stopLoadingImages(front);\n\t\t\treturn;\n\t\t}\n\n\t\t// prepare the buffer to become the front tile pane\n\t\tbg.style.visibility = 'hidden';\n\t\tbg.style[L.DomUtil.TRANSFORM] = '';\n\n\t\t// switch out the current layer to be the new bg layer (and vice-versa)\n\t\tthis._tileContainer = bg;\n\t\tbg = this._bgBuffer = front;\n\n\t\tthis._stopLoadingImages(bg);\n\n\t\t//prevent bg buffer from clearing right after zoom\n\t\tclearTimeout(this._clearBgBufferTimer);\n\t},\n\n\t_getLoadedTilesPercentage: function (container) {\n\t\tvar tiles = container.getElementsByTagName('img'),\n\t\t i, len, count = 0;\n\n\t\tfor (i = 0, len = tiles.length; i < len; i++) {\n\t\t\tif (tiles[i].complete) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count / len;\n\t},\n\n\t// stops loading all tiles in the background layer\n\t_stopLoadingImages: function (container) {\n\t\tvar tiles = Array.prototype.slice.call(container.getElementsByTagName('img')),\n\t\t i, len, tile;\n\n\t\tfor (i = 0, len = tiles.length; i < len; i++) {\n\t\t\ttile = tiles[i];\n\n\t\t\tif (!tile.complete) {\n\t\t\t\ttile.onload = L.Util.falseFn;\n\t\t\t\ttile.onerror = L.Util.falseFn;\n\t\t\t\ttile.src = L.Util.emptyImageUrl;\n\n\t\t\t\ttile.parentNode.removeChild(tile);\n\t\t\t}\n\t\t}\n\t}\n});\n\n\n/*\r\n * Provides L.Map with convenient shortcuts for using browser geolocation features.\r\n */\r\n\r\nL.Map.include({\r\n\t_defaultLocateOptions: {\r\n\t\twatch: false,\r\n\t\tsetView: false,\r\n\t\tmaxZoom: Infinity,\r\n\t\ttimeout: 10000,\r\n\t\tmaximumAge: 0,\r\n\t\tenableHighAccuracy: false\r\n\t},\r\n\r\n\tlocate: function (/*Object*/ options) {\r\n\r\n\t\toptions = this._locateOptions = L.extend(this._defaultLocateOptions, options);\r\n\r\n\t\tif (!navigator.geolocation) {\r\n\t\t\tthis._handleGeolocationError({\r\n\t\t\t\tcode: 0,\r\n\t\t\t\tmessage: 'Geolocation not supported.'\r\n\t\t\t});\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar onResponse = L.bind(this._handleGeolocationResponse, this),\r\n\t\t\tonError = L.bind(this._handleGeolocationError, this);\r\n\r\n\t\tif (options.watch) {\r\n\t\t\tthis._locationWatchId =\r\n\t\t\t navigator.geolocation.watchPosition(onResponse, onError, options);\r\n\t\t} else {\r\n\t\t\tnavigator.geolocation.getCurrentPosition(onResponse, onError, options);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstopLocate: function () {\r\n\t\tif (navigator.geolocation) {\r\n\t\t\tnavigator.geolocation.clearWatch(this._locationWatchId);\r\n\t\t}\r\n\t\tif (this._locateOptions) {\r\n\t\t\tthis._locateOptions.setView = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_handleGeolocationError: function (error) {\r\n\t\tvar c = error.code,\r\n\t\t message = error.message ||\r\n\t\t (c === 1 ? 'permission denied' :\r\n\t\t (c === 2 ? 'position unavailable' : 'timeout'));\r\n\r\n\t\tif (this._locateOptions.setView && !this._loaded) {\r\n\t\t\tthis.fitWorld();\r\n\t\t}\r\n\r\n\t\tthis.fire('locationerror', {\r\n\t\t\tcode: c,\r\n\t\t\tmessage: 'Geolocation error: ' + message + '.'\r\n\t\t});\r\n\t},\r\n\r\n\t_handleGeolocationResponse: function (pos) {\r\n\t\tvar lat = pos.coords.latitude,\r\n\t\t lng = pos.coords.longitude,\r\n\t\t latlng = new L.LatLng(lat, lng),\r\n\r\n\t\t latAccuracy = 180 * pos.coords.accuracy / 40075017,\r\n\t\t lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat),\r\n\r\n\t\t bounds = L.latLngBounds(\r\n\t\t [lat - latAccuracy, lng - lngAccuracy],\r\n\t\t [lat + latAccuracy, lng + lngAccuracy]),\r\n\r\n\t\t options = this._locateOptions;\r\n\r\n\t\tif (options.setView) {\r\n\t\t\tvar zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom);\r\n\t\t\tthis.setView(latlng, zoom);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tbounds: bounds,\r\n\t\t\ttimestamp: pos.timestamp\r\n\t\t};\r\n\r\n\t\tfor (var i in pos.coords) {\r\n\t\t\tif (typeof pos.coords[i] === 'number') {\r\n\t\t\t\tdata[i] = pos.coords[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.fire('locationfound', data);\r\n\t}\r\n});\r\n\n\n}(window, document));"],"sourceRoot":""}