diff --git a/.jscsrc b/.jscsrc
index 2f4841ec..5821a918 100644
--- a/.jscsrc
+++ b/.jscsrc
@@ -1,3 +1,4 @@
{
- "preset": "airbnb"
+ "preset": "airbnb",
+ "requireCurlyBraces": true
}
diff --git a/README.md b/README.md
index cd81f16a..27936df6 100644
--- a/README.md
+++ b/README.md
@@ -4,20 +4,18 @@
Library. This software aims to easily embed maps managed by Leaflet on your project.
### [tombatossals/angular-leaflet-directive](http://github.com/tombatossals/angular-leaflet-directive)
-This is a personal project, which has been coded by me helped by many people for some years. I'm evolving it frequently, actually I'm making the code transition to Leaflet 1.0 and Angular 2. If you need enterprise for older versions, sorry, I can't give you more support that my spare time allows me. If you want to help with the actual code it would be really appreciated, but first of all, please, read the * [CONTRIBUTING documentation](https://github.com/tombatossals/angular-leaflet-directive/blob/master/CONTRIBUTING.md)
+This is a personal project, which has been coded by me helped by many people for some years. I'm evolving it frequently, actually I'm making the code transition to Leaflet 1.0 and Angular 2. If you need enterprise for older versions, sorry, I can't give you more support that my spare time allows me. If you want to help with the actual code it would be really appreciated, but first of all, please, read the [CONTRIBUTING documentation](https://github.com/tombatossals/angular-leaflet-directive/blob/master/CONTRIBUTING.md)
[](https://travis-ci.org/tombatossals/angular-leaflet-directive) [](https://david-dm.org/tombatossals/angular-leaflet-directive)
-[](https://david-dm.org/tombatossals/angular-leaflet-directive) [](http://tombatossals.github.io/angular-leaflet-directive/coverage/PhantomJS%201.9.7%20%28Linux%29/lcov-report/dist/angular-leaflet-directive.js.html)
+[](https://david-dm.org/tombatossals/angular-leaflet-directive)
[](https://github.com/semantic-release/semantic-release)
### [angular-ui](http://github.com/angular-ui/ui-leaflet)
If you need better response time with your doubts and needs with the code of version 0.9.0, take a look at the [angular-ui](http://github.com/angular-ui/ui-leaflet) fork of this project, it's lead by really awesome developers which have helped me evolving the project for some time.
[](https://travis-ci.org/angular-ui/ui-leaflet) [](https://david-dm.org/angular-ui/ui-leaflet)
-[](https://david-dm.org/angular-ui/ui-leaflet) [](http://realtymaps.github.io/ui-leaflet/coverage/PhantomJS%201.9.7%20%28Linux%29/lcov-report/dist/ui-leaflet.js.html)
+[](https://david-dm.org/angular-ui/ui-leaflet)
## Examples
@@ -44,11 +42,11 @@ interacting on the scope and on the leaflet map in two-way binding. Example:
```javascript
angular.extend($scope, {
- center: {
- lat: 51.505,
- lng: -0.09,
- zoom: 8
- }
+ center: {
+ lat: 51.505,
+ lng: -0.09,
+ zoom: 8
+ }
});
```
diff --git a/dist/angular-leaflet-directive.js b/dist/angular-leaflet-directive.js
index b4e92c96..6b84007e 100644
--- a/dist/angular-leaflet-directive.js
+++ b/dist/angular-leaflet-directive.js
@@ -28,7 +28,7 @@
*/
/*!
-* angular-leaflet-directive 2015-11-06
+* angular-leaflet-directive 0.10.1 2015-11-13
* angular-leaflet-directive - An AngularJS directive to easily interact with Leaflet maps
* git: https://github.com/tombatossals/angular-leaflet-directive
*/
@@ -39,20 +39,18 @@ angular.module('leaflet-directive', []).directive('leaflet', ["$q", "leafletData
restrict: 'EA',
replace: true,
scope: {
- center: '=',
- lfCenter: '=',
- defaults: '=',
- maxbounds: '=',
- bounds: '=',
- markers: '=',
- legend: '=',
- geojson: '=',
- paths: '=',
- tiles: '=',
- layers: '=',
- controls: '=',
- decorations: '=',
- eventBroadcast: '=',
+ center: '=lfCenter',
+ defaults: '=lfDefaults',
+ maxbounds: '=lfMaxbounds',
+ bounds: '=lfBounds',
+ markers: '=lfMarkers',
+ geojson: '=lfGeojson',
+ paths: '=lfPaths',
+ tiles: '=lfTiles',
+ layers: '=lfLayers',
+ controls: '=lfControls',
+ decorations: '=lfDecorations',
+ events: '=lfEvents',
markersWatchOptions: '=',
geojsonWatchOptions: '=',
},
@@ -131,12 +129,12 @@ angular.module('leaflet-directive', []).directive('leaflet', ["$q", "leafletData
var map = new L.Map(element[0], leafletMapDefaults.getMapCreationDefaults(attrs.id));
ctrl._leafletMap.resolve(map);
- if (!isDefined(attrs.center) && !isDefined(attrs.lfCenter)) {
+ if (!isDefined(attrs.lfCenter)) {
map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
}
// If no layers nor tiles defined, set the default tileLayer
- if (!isDefined(attrs.tiles) && (!isDefined(attrs.layers))) {
+ if (!isDefined(attrs.lfTiles) && (!isDefined(attrs.lfLayers))) {
var tileLayerObj = L.tileLayer(defaults.tileLayer, defaults.tileLayerOptions);
tileLayerObj.addTo(map);
leafletData.setTiles(tileLayerObj, attrs.id);
@@ -159,7 +157,7 @@ angular.module('leaflet-directive', []).directive('leaflet', ["$q", "leafletData
}
// if no event-broadcast attribute, all events are broadcasted
- if (!isDefined(attrs.eventBroadcast)) {
+ if (!isDefined(attrs.lfEvents)) {
var logic = 'broadcast';
addEvents(map, mapEvents, 'eventName', scope, logic);
}
@@ -185,7 +183,7 @@ angular.module('leaflet-directive', []).directive('leaflet', ["$q", "leafletData
};
}]);
-angular.module('leaflet-directive').factory('leafletBoundsHelpers', ["$log", "leafletHelpers", function($log, leafletHelpers) {
+angular.module('leaflet-directive').factory('leafletBoundsHelpers', ["leafletLogger", "leafletHelpers", function(leafletLogger, leafletHelpers) {
var isArray = leafletHelpers.isArray;
var isNumber = leafletHelpers.isNumber;
@@ -215,7 +213,7 @@ angular.module('leaflet-directive').factory('leafletBoundsHelpers', ["$log", "le
boundsArray[0].length === 2 && boundsArray[1].length === 2 &&
isNumber(boundsArray[0][0]) && isNumber(boundsArray[0][1]) &&
isNumber(boundsArray[1][0]) && isNumber(boundsArray[1][1]))) {
- $log.error('[AngularJS - Leaflet] The bounds array is not valid.');
+ leafletLogger.error('The bounds array is not valid.');
return;
}
@@ -233,7 +231,7 @@ angular.module('leaflet-directive').factory('leafletBoundsHelpers', ["$log", "le
createBoundsFromLeaflet: function(lfBounds) {
if (!(isDefined(lfBounds) && isFunction(lfBounds.getNorthEast) && isFunction(lfBounds.getSouthWest))) {
- $log.error('[AngularJS - Leaflet] The leaflet bounds is not valid object.');
+ leafletLogger.error('The leaflet bounds is not valid object.');
return;
}
@@ -254,12 +252,11 @@ angular.module('leaflet-directive').factory('leafletBoundsHelpers', ["$log", "le
};
}]);
-angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScope", "$log", "leafletHelpers", "leafletLayerHelpers", "leafletMapDefaults", function($rootScope, $log, leafletHelpers, leafletLayerHelpers, leafletMapDefaults) {
+angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScope", "leafletLogger", "leafletHelpers", "leafletLayerHelpers", "leafletMapDefaults", function($rootScope, leafletLogger, leafletHelpers, leafletLayerHelpers, leafletMapDefaults) {
var isDefined = leafletHelpers.isDefined;
var isObject = leafletHelpers.isObject;
var createLayer = leafletLayerHelpers.createLayer;
var _controls = {};
- var errorHeader = leafletHelpers.errorHeader + ' [Controls] ';
var _controlLayersMustBeVisible = function(baselayers, overlays, mapId) {
var defaults = leafletMapDefaults.getDefaults(mapId);
@@ -314,7 +311,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop
draw: {
isPluginLoaded: function() {
if (!angular.isDefined(L.Control.Draw)) {
- $log.error(errorHeader + ' Draw plugin is not loaded.');
+ leafletLogger.error('Draw plugin is not loaded.');
return false;
}
@@ -345,7 +342,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop
fullscreen: {
isPluginLoaded: function() {
if (!angular.isDefined(L.Control.Fullscreen)) {
- $log.error(errorHeader + ' Fullscreen plugin is not loaded.');
+ leafletLogger.error('Fullscreen plugin is not loaded.');
return false;
}
@@ -363,7 +360,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop
search: {
isPluginLoaded: function() {
if (!angular.isDefined(L.Control.Search)) {
- $log.error(errorHeader + ' Search plugin is not loaded.');
+ leafletLogger.error(' Search plugin is not loaded.');
return false;
}
@@ -382,7 +379,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop
minimap: {
isPluginLoaded: function() {
if (!angular.isDefined(L.Control.MiniMap)) {
- $log.error(errorHeader + ' Minimap plugin is not loaded.');
+ leafletLogger.error('Minimap plugin is not loaded.');
return false;
}
@@ -391,7 +388,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop
checkValidParams: function(params) {
if (!isDefined(params.layer)) {
- $log.warn(errorHeader + ' minimap "layer" option should be defined.');
+ leafletLogger.warn('minimap "layer" option should be defined.');
return false;
}
@@ -402,7 +399,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop
var layer = createLayer(params.layer);
if (!isDefined(layer)) {
- $log.warn(errorHeader + ' minimap control "layer" could not be created.');
+ leafletLogger.warn('minimap control "layer" could not be created.');
return;
}
@@ -471,13 +468,13 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop
};
}]);
-angular.module('leaflet-directive').service('leafletData', ["$log", "$q", "leafletHelpers", function($log, $q, leafletHelpers) {
- var getDefer = leafletHelpers.getDefer,
- getUnresolvedDefer = leafletHelpers.getUnresolvedDefer,
- setResolvedDefer = leafletHelpers.setResolvedDefer;
+angular.module('leaflet-directive').service('leafletData', ["leafletLogger", "$q", "leafletHelpers", function(leafletLogger, $q, leafletHelpers) {
+ var getDefer = leafletHelpers.getDefer;
+ var getUnresolvedDefer = leafletHelpers.getUnresolvedDefer;
+ var setResolvedDefer = leafletHelpers.setResolvedDefer;
var _private = {};
- var self = this;
+ var _this = this;
var upperFirst = function(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
@@ -492,7 +489,8 @@ angular.module('leaflet-directive').service('leafletData', ["$log", "$q", "leafl
'geoJSON',
'UTFGrid', //odd ball on naming convention keeping to not break
'decorations',
- 'directiveControls',];
+ 'directiveControls',
+ ];
//init
_privateItems.forEach(function(itemName) {
@@ -509,13 +507,13 @@ angular.module('leaflet-directive').service('leafletData', ["$log", "$q", "leafl
//int repetitive stuff (get and sets)
_privateItems.forEach(function(itemName) {
var name = upperFirst(itemName);
- self['set' + name] = function(lObject, scopeId) {
+ _this['set' + name] = function(lObject, scopeId) {
var defer = getUnresolvedDefer(_private[itemName], scopeId);
defer.resolve(lObject);
setResolvedDefer(_private[itemName], scopeId);
};
- self['get' + name] = function(scopeId) {
+ _this['get' + name] = function(scopeId) {
var defer = getDefer(_private[itemName], scopeId);
return defer.promise;
};
@@ -523,19 +521,15 @@ angular.module('leaflet-directive').service('leafletData', ["$log", "$q", "leafl
}]);
angular.module('leaflet-directive')
-.service('leafletDirectiveControlsHelpers', ["$log", "leafletData", "leafletHelpers", function($log, leafletData, leafletHelpers) {
+.service('leafletDirectiveControlsHelpers', ["leafletLogger", "leafletData", "leafletHelpers", function(leafletLogger, leafletData, leafletHelpers) {
var _isDefined = leafletHelpers.isDefined;
var _isString = leafletHelpers.isString;
var _isObject = leafletHelpers.isObject;
- var _mainErrorHeader = leafletHelpers.errorHeader;
-
- var _errorHeader = _mainErrorHeader + '[leafletDirectiveControlsHelpers';
var _extend = function(id, thingToAddName, createFn, cleanFn) {
- var _fnHeader = _errorHeader + '.extend] ';
var extender = {};
if (!_isDefined(thingToAddName)) {
- $log.error(_fnHeader + 'thingToAddName cannot be undefined');
+ leafletLogger.error('control name cannot be undefined');
return;
}
@@ -547,7 +541,7 @@ angular.module('leaflet-directive')
} else if (_isObject(thingToAddName) && !_isDefined(createFn) && !_isDefined(cleanFn)) {
extender = thingToAddName;
} else {
- $log.error(_fnHeader + 'incorrect arguments');
+ leafletLogger.error('incorrect arguments');
return;
}
@@ -645,8 +639,7 @@ angular.module('leaflet-directive')
};
}]);
-angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", function($q, $log) {
- var _errorHeader = '[AngularJS - Leaflet] ';
+angular.module('leaflet-directive').service('leafletHelpers', ["$q", "leafletLogger", function($q, leafletLogger) {
var _copy = angular.copy;
var _clone = _copy;
/*
@@ -664,8 +657,9 @@ angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", fun
*/
var _getObjectValue = function(object, pathStr) {
var obj;
- if (!object || !angular.isObject(object))
- return;
+ if (!object || !angular.isObject(object)) {
+ return;
+ }
//if the key is not a sting then we already have the value
if ((pathStr === null) || !angular.isString(pathStr)) {
@@ -718,7 +712,7 @@ angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", fun
}
}
} else {
- $log.error(_errorHeader + '- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call');
+ leafletLogger.error('You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call');
}
} else {
id = mapId;
@@ -792,7 +786,6 @@ angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", fun
directiveNormalize: directiveNormalize,
copy:_copy,
clone:_clone,
- errorHeader: _errorHeader,
getObjectValue: _getObjectValue,
getObjectArrayPath:_getObjectArrayPath,
getObjectDotPath: _getObjectDotPath,
@@ -1305,7 +1298,7 @@ angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", fun
if (this.isLoaded()) {
return layer instanceof L.UtfGrid;
} else {
- $log.error('[AngularJS - Leaflet] No UtfGrid plugin found.');
+ leafletLogger.error('No UtfGrid plugin found.');
return false;
}
},
@@ -1376,10 +1369,9 @@ angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", fun
};
}]);
-angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafletHelpers", function($log, leafletHelpers) {
+angular.module('leaflet-directive').service('leafletIterators', ["leafletLogger", "leafletHelpers", function(leafletLogger, leafletHelpers) {
var lHlp = leafletHelpers;
- var errorHeader = leafletHelpers.errorHeader + 'leafletIterators: ';
//BEGIN COPY from underscore
var _keys = Object.keys;
@@ -1411,23 +1403,34 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle
// of the passed-in callback, to be repeatedly applied in other Underscore
// functions.
var optimizeCb = function(func, context, argCount) {
- if (context === void 0) return func;
+ if (context === void 0) {
+ return func;
+ }
+
switch (argCount === null ? 3 : argCount) {
- case 1: return function(value) {
- return func.call(context, value);
- };
+ case 1: {
+ return function(value) {
+ return func.call(context, value);
+ };
+ }
- case 2: return function(value, other) {
- return func.call(context, value, other);
- };
+ case 2: {
+ return function(value, other) {
+ return func.call(context, value, other);
+ };
+ }
- case 3: return function(value, index, collection) {
- return func.call(context, value, index, collection);
- };
+ case 3: {
+ return function(value, index, collection) {
+ return func.call(context, value, index, collection);
+ };
+ }
- case 4: return function(accumulator, value, index, collection) {
- return func.call(context, accumulator, value, index, collection);
- };
+ case 4: {
+ return function(accumulator, value, index, collection) {
+ return func.call(context, accumulator, value, index, collection);
+ };
+ }
}
return function() {
return func.apply(context, arguments);
@@ -1438,7 +1441,10 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle
var createAssigner = function(keysFunc, undefinedOnly) {
return function(obj) {
var length = arguments.length;
- if (length < 2 || obj === null) return obj;
+ if (length < 2 || obj === null) {
+ return obj;
+ }
+
for (var index = 1; index < length; index++) {
var source = arguments[index];
var keys = keysFunc(source);
@@ -1446,7 +1452,9 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle
for (var i = 0; i < l; i++) {
var key = keys[i];
- if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
+ if (!undefinedOnly || obj[key] === void 0) {
+ obj[key] = source[key];
+ }
}
}
@@ -1464,11 +1472,16 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle
var _isMatch = function(object, attrs) {
var keys = _keys(attrs);
var length = keys.length;
- if (object === null) return !length;
+ if (object === null) {
+ return !length;
+ }
+
var obj = Object(object);
for (var i = 0; i < length; i++) {
var key = keys[i];
- if (attrs[key] !== obj[key] || !(key in obj)) return false;
+ if (attrs[key] !== obj[key] || !(key in obj)) {
+ return false;
+ }
}
return true;
@@ -1489,9 +1502,18 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle
// to each element in a collection, returning the desired result — either
// identity, an arbitrary callback, a property matcher, or a property accessor.
var cb = function(value, context, argCount) {
- if (value === null) return _identity;
- if (_isFunction(value)) return optimizeCb(value, context, argCount);
- if (_isObject(value)) return _matcher(value);
+ if (value === null) {
+ return _identity;
+ }
+
+ if (_isFunction(value)) {
+ return optimizeCb(value, context, argCount);
+ }
+
+ if (_isObject(value)) {
+ return _matcher(value);
+ }
+
return _property(value);
};
@@ -1503,7 +1525,9 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle
var length = (keys || obj).length;
for (var index = 0; index < length; index++) {
var currentKey = keys ? keys[index] : index;
- if (!predicate(obj[currentKey], currentKey, obj)) return false;
+ if (!predicate(obj[currentKey], currentKey, obj)) {
+ return false;
+ }
}
return true;
@@ -1520,7 +1544,7 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle
if (!lHlp.isFunction(cb)) {
cbName = lHlp.defaultTo(cb, 'cb');
- $log.error(errorHeader + cbName + ' is not a function');
+ leafletLogger.error(cbName + ' is not a function', 'iterators');
return true;
}
@@ -1558,18 +1582,17 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle
}]);
angular.module('leaflet-directive')
-.factory('leafletLayerHelpers', ["$rootScope", "$log", "$q", "leafletHelpers", "leafletIterators", function($rootScope, $log, $q, leafletHelpers, leafletIterators) {
+.factory('leafletLayerHelpers', ["$rootScope", "leafletLogger", "$q", "leafletHelpers", "leafletIterators", function($rootScope, leafletLogger, $q, leafletHelpers, leafletIterators) {
var Helpers = leafletHelpers;
var isString = leafletHelpers.isString;
var isObject = leafletHelpers.isObject;
var isArray = leafletHelpers.isArray;
var isDefined = leafletHelpers.isDefined;
- var errorHeader = leafletHelpers.errorHeader;
var $it = leafletIterators;
var utfGridCreateLayer = function(params) {
if (!Helpers.UTFGridPlugin.isLoaded()) {
- $log.error('[AngularJS - Leaflet] The UTFGrid plugin is not loaded.');
+ leafletLogger.error('The UTFGrid plugin is not loaded');
return;
}
@@ -1812,7 +1835,7 @@ angular.module('leaflet-directive')
mustHaveUrl: true,
createLayer: function(params) {
if (!Helpers.AGSFeatureLayerPlugin.isLoaded()) {
- $log.warn(errorHeader + ' The esri plugin is not loaded.');
+ leafletLogger.warn('The AGS Feature plugin is not loaded.');
return;
}
@@ -1838,7 +1861,7 @@ angular.module('leaflet-directive')
mustHaveUrl: true,
createLayer: function(params) {
if (!Helpers.AGSTiledMapLayerPlugin.isLoaded()) {
- $log.warn(errorHeader + ' The esri plugin is not loaded.');
+ leafletLogger.warn(' The AGS Tiled plugin is not loaded');
return;
}
@@ -1851,7 +1874,7 @@ angular.module('leaflet-directive')
mustHaveUrl: true,
createLayer: function(params) {
if (!Helpers.AGSDynamicMapLayerPlugin.isLoaded()) {
- $log.warn(errorHeader + ' The esri plugin is not loaded.');
+ leafletLogger.warn(' The AGS Dynamic plugin is not loaded.');
return;
}
@@ -1864,7 +1887,7 @@ angular.module('leaflet-directive')
mustHaveUrl: true,
createLayer: function(params) {
if (!Helpers.AGSImageMapLayerPlugin.isLoaded()) {
- $log.warn(errorHeader + ' The esri plugin is not loaded.');
+ leafletLogger.warn('The AGSIImageMapLayer plugin is not loaded.');
return;
}
@@ -1877,12 +1900,12 @@ angular.module('leaflet-directive')
mustHaveUrl: true,
createLayer: function(params) {
if (!Helpers.AGSClusteredLayerPlugin.isLoaded()) {
- $log.warn(errorHeader + ' The esri clustered layer plugin is not loaded.');
+ leafletLogger.warn(' The AGS clustered layer plugin is not loaded.');
return;
}
if (!Helpers.MarkerClusterPlugin.isLoaded()) {
- $log.warn(errorHeader + ' The markercluster plugin is not loaded.');
+ leafletLogger.warn('The markercluster plugin is not loaded.');
return;
}
@@ -1893,12 +1916,12 @@ angular.module('leaflet-directive')
mustHaveUrl: true,
createLayer: function(params) {
if (!Helpers.AGSHeatmapLayerPlugin.isLoaded()) {
- $log.warn(errorHeader + ' The esri heatmap layer plugin is not loaded.');
+ leafletLogger.warn('The AGS heatmap layer plugin is not loaded.');
return;
}
if (!Helpers.HeatLayerPlugin.isLoaded()) {
- $log.warn(errorHeader + ' The heatlayer plugin is not loaded.');
+ leafletLogger.warn('The heatlayer plugin is not loaded.');
return;
}
@@ -1909,7 +1932,7 @@ angular.module('leaflet-directive')
mustHaveUrl: false,
createLayer: function(params) {
if (!Helpers.MarkerClusterPlugin.isLoaded()) {
- $log.warn(errorHeader + ' The markercluster plugin is not loaded.');
+ leafletLogger.warn('The markercluster plugin is not loaded.');
return;
}
@@ -1997,7 +2020,7 @@ angular.module('leaflet-directive')
if (params.layer instanceof L.Class) {
return angular.copy(params.layer);
} else {
- $log.error('[AngularJS - Leaflet] A custom layer must be a leaflet Class');
+ leafletLogger.error('A custom layer must be a leaflet Class');
}
},
},
@@ -2012,38 +2035,38 @@ angular.module('leaflet-directive')
function isValidLayerType(layerDefinition) {
// Check if the baselayer has a valid type
if (!isString(layerDefinition.type)) {
- $log.error('[AngularJS - Leaflet] A layer must have a valid type defined.');
+ leafletLogger.error('A layer must have a valid type defined.');
return false;
}
if (Object.keys(layerTypes).indexOf(layerDefinition.type) === -1) {
- $log.error('[AngularJS - Leaflet] A layer must have a valid type: ' + Object.keys(layerTypes));
+ leafletLogger.error('A layer must have a valid type: ' + Object.keys(layerTypes));
return false;
}
// Check if the layer must have an URL
if (layerTypes[layerDefinition.type].mustHaveUrl && !isString(layerDefinition.url)) {
- $log.error('[AngularJS - Leaflet] A base layer must have an url');
+ leafletLogger.error('A base layer must have an url');
return false;
}
if (layerTypes[layerDefinition.type].mustHaveData && !isDefined(layerDefinition.data)) {
- $log.error('[AngularJS - Leaflet] The base layer must have a "data" array attribute');
+ leafletLogger.error('The base layer must have a "data" array attribute');
return false;
}
if (layerTypes[layerDefinition.type].mustHaveLayer && !isDefined(layerDefinition.layer)) {
- $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have an layer defined');
+ leafletLogger.error('The type of layer ' + layerDefinition.type + ' must have an layer defined');
return false;
}
if (layerTypes[layerDefinition.type].mustHaveBounds && !isDefined(layerDefinition.bounds)) {
- $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have bounds defined');
+ leafletLogger.error('The type of layer ' + layerDefinition.type + ' must have bounds defined');
return false;
}
if (layerTypes[layerDefinition.type].mustHaveKey && !isDefined(layerDefinition.key)) {
- $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have key defined');
+ leafletLogger.error('The type of layer ' + layerDefinition.type + ' must have key defined');
return false;
}
@@ -2056,7 +2079,7 @@ angular.module('leaflet-directive')
}
if (!isString(layerDefinition.name)) {
- $log.error('[AngularJS - Leaflet] A base layer must have a name');
+ leafletLogger.error('A base layer must have a name');
return;
}
@@ -2104,7 +2127,6 @@ angular.module('leaflet-directive')
if (isDefined(layerOptions) && isDefined(layerOptions.loadedDefer)) {
if (angular.isFunction(layerOptions.loadedDefer)) {
var defers = layerOptions.loadedDefer();
- $log.debug('Loaded Deferred', defers);
var count = defers.length;
if (count > 0) {
var resolve = function() {
@@ -2203,6 +2225,38 @@ angular.module('leaflet-directive').factory('leafletLegendHelpers', function() {
};
});
+angular.module('leaflet-directive').service('leafletLogger', ["$log", function($log) {
+ var prefix = '[angular-leaflet] ';
+
+ return {
+ log: function(msg, section) {
+ section = section ? '[' + section + '] ' : '';
+ $log.log(prefix + section + msg);
+ },
+
+ debug: function(msg, section) {
+ section = section ? '[' + section + '] ' : '';
+ $log.debug(prefix + section + msg);
+ },
+
+ info: function(msg, section) {
+ section = section ? '[' + section + '] ' : '';
+ $log.info(prefix + section + msg);
+ },
+
+ warn: function(msg, section) {
+ section = section ? '[' + section + '] ' : '';
+ $log.warn(prefix + section + msg);
+ },
+
+ error: function(msg, section) {
+ section = section ? '[' + section + '] ' : '';
+ $log.error(prefix + section + msg);
+ },
+
+ };
+}]);
+
angular.module('leaflet-directive').factory('leafletMapDefaults', ["$q", "leafletHelpers", function($q, leafletHelpers) {
function _getDefaults() {
return {
@@ -2378,7 +2432,7 @@ angular.module('leaflet-directive').factory('leafletMapDefaults', ["$q", "leafle
};
}]);
-angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScope", "$timeout", "leafletHelpers", "$log", "$compile", "leafletGeoJsonHelpers", function($rootScope, $timeout, leafletHelpers, $log, $compile, leafletGeoJsonHelpers) {
+angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScope", "$timeout", "leafletHelpers", "leafletLogger", "$compile", "leafletGeoJsonHelpers", function($rootScope, $timeout, leafletHelpers, leafletLogger, $compile, leafletGeoJsonHelpers) {
var isDefined = leafletHelpers.isDefined;
var defaultTo = leafletHelpers.defaultTo;
var MarkerClusterPlugin = leafletHelpers.MarkerClusterPlugin;
@@ -2394,7 +2448,6 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
var isObject = leafletHelpers.isObject;
var groups = {};
var geoHlp = leafletGeoJsonHelpers;
- var errorHeader = leafletHelpers.errorHeader;
var _string = function(marker) {
//this exists since JSON.stringify barfs on cyclic
@@ -2406,15 +2459,10 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
return '[leafletMarker] : \n' + retStr;
};
- var _log = function(marker, useConsole) {
- var logger = useConsole ? console : $log;
- logger.debug(_string(marker));
- };
-
var createLeafletIcon = function(iconData) {
if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'awesomeMarker') {
if (!AwesomeMarkersPlugin.isLoaded()) {
- $log.error(errorHeader + ' The AwesomeMarkers Plugin is not loaded.');
+ leafletLogger.error('The AwesomeMarkers Plugin is not loaded.');
}
return new L.AwesomeMarkers.icon(iconData);
@@ -2422,7 +2470,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'vectorMarker') {
if (!VectorMarkersPlugin.isLoaded()) {
- $log.error(errorHeader + ' The VectorMarkers Plugin is not loaded.');
+ leafletLogger.error('The VectorMarkers Plugin is not loaded.');
}
return new L.VectorMarkers.icon(iconData);
@@ -2430,7 +2478,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'makiMarker') {
if (!MakiMarkersPlugin.isLoaded()) {
- $log.error(errorHeader + 'The MakiMarkers Plugin is not loaded.');
+ leafletLogger.error('The MakiMarkers Plugin is not loaded.');
}
return new L.MakiMarkers.icon(iconData);
@@ -2438,7 +2486,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'extraMarker') {
if (!ExtraMarkersPlugin.isLoaded()) {
- $log.error(errorHeader + 'The ExtraMarkers Plugin is not loaded.');
+ leafletLogger.error('The ExtraMarkers Plugin is not loaded.');
}
return new L.ExtraMarkers.icon(iconData);
@@ -2450,7 +2498,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'dom') {
if (!DomMarkersPlugin.isLoaded()) {
- $log.error(errorHeader + 'The DomMarkers Plugin is not loaded.');
+ leafletLogger.error('The DomMarkers Plugin is not loaded.');
}
var markerScope = angular.isFunction(iconData.getMarkerScope) ? iconData.getMarkerScope() : $rootScope;
@@ -2568,7 +2616,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
if (compileMessage) {
if (!isDefined(marker._popup) || !isDefined(marker._popup._contentNode)) {
- $log.error(errorHeader + 'Popup is invalid or does not have any content.');
+ leafletLogger.error('Popup is invalid or does not have any content.');
return false;
}
@@ -2600,7 +2648,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
// Update the lat-lng property (always present in marker properties)
if (!geoHlp.validateCoords(markerData)) {
- $log.warn('There are problems with lat-lng data, please verify your marker model');
+ leafletLogger.warn('There are problems with lat-lng data, please verify your marker model');
_deleteMarker(marker, map, layers);
return;
}
@@ -2651,14 +2699,14 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
// The markerData.layer is defined so we add the marker to the layer if it is different from the old data
if (!isDefined(layers.overlays[markerData.layer])) {
- $log.error(errorHeader + 'You must use a name of an existing layer');
+ leafletLogger.error('You must use a name of an existing layer');
return;
}
// Is a group layer?
var layerGroup = layers.overlays[markerData.layer];
if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {
- $log.error(errorHeader + 'A marker can only be added to a layer of type "group" or "featureGroup"');
+ leafletLogger.error('A marker can only be added to a layer of type "group" or "featureGroup"');
return;
}
@@ -2771,7 +2819,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
}
// The markerData.focus property must be true so we update if there wasn't a previous value or it wasn't true
- if (markerData.focus === true && (!isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) {
+ if (markerData.focus === true && (markerData.lat !== oldMarkerData.lat || markerData.lng !== oldMarkerData.lng || !isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) {
// Reopen the popup when focus is still true
marker.openPopup();
updatedFocus = true;
@@ -2833,14 +2881,14 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
createMarker: function(markerData) {
if (!isDefined(markerData) || !geoHlp.validateCoords(markerData)) {
- $log.error(errorHeader + 'The marker definition is not valid.');
+ leafletLogger.error('The marker definition is not valid.');
return;
}
var coords = geoHlp.getCoords(markerData);
if (!isDefined(coords)) {
- $log.error(errorHeader + 'Unable to get coordinates from markerData.');
+ leafletLogger.error('Unable to get coordinates from markerData.');
return;
}
@@ -2872,12 +2920,12 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
addMarkerToGroup: function(marker, groupName, groupOptions, map) {
if (!isString(groupName)) {
- $log.error(errorHeader + 'The marker group you have specified is invalid.');
+ leafletLogger.error('The marker group you have specified is invalid.');
return;
}
if (!MarkerClusterPlugin.isLoaded()) {
- $log.error(errorHeader + 'The MarkerCluster plugin is not loaded.');
+ leafletLogger.error('The MarkerCluster plugin is not loaded.');
return;
}
@@ -2907,8 +2955,9 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
marker.on('add', function(/* event */) {
safeApply(leafletScope, function() {
- if ('label' in markerData)
- _manageOpenLabel(marker, markerData);
+ if ('label' in markerData) {
+ _manageOpenLabel(marker, markerData);
+ }
});
});
},
@@ -2931,11 +2980,10 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
},
string: _string,
- log: _log,
};
}]);
-angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope", "$log", "leafletHelpers", function($rootScope, $log, leafletHelpers) {
+angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope", "leafletLogger", "leafletHelpers", function($rootScope, leafletLogger, leafletHelpers) {
var isDefined = leafletHelpers.isDefined;
var isArray = leafletHelpers.isArray;
var isNumber = leafletHelpers.isNumber;
@@ -3202,7 +3250,7 @@ angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope"
var pathData = _getPathData(path);
if (!pathTypes[path.type].isValid(pathData)) {
- $log.error('[AngularJS - Leaflet] Invalid data passed to the ' + path.type + ' path');
+ leafletLogger.error('Invalid data passed to the ' + path.type + ' path');
return;
}
@@ -3218,8 +3266,9 @@ angular.module('leaflet-directive')
//watchOptions.isDeep is/should be ignored in $watchCollection
var unWatch = scope[watchFunctionName](thingToWatchStr, function(newValue, oldValue) {
initCb(newValue, oldValue);
- if (!watchOptions.doWatch)
- unWatch();
+ if (!watchOptions.doWatch) {
+ unWatch();
+ }
}, watchOptions.isDeep);
return unWatch;
@@ -3275,7 +3324,7 @@ angular.module('leaflet-directive').factory('nominatimService', ["$q", "$http",
};
}]);
-angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$http", "leafletHelpers", "nominatimService", "leafletBoundsHelpers", function($log, $timeout, $http, leafletHelpers, nominatimService, leafletBoundsHelpers) {
+angular.module('leaflet-directive').directive('lfBounds', ["leafletLogger", "$timeout", "$http", "leafletHelpers", "nominatimService", "leafletBoundsHelpers", function(leafletLogger, $timeout, $http, leafletHelpers, nominatimService, leafletBoundsHelpers) {
return {
restrict: 'A',
@@ -3288,7 +3337,6 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h
var createLeafletBounds = leafletBoundsHelpers.createLeafletBounds;
var leafletScope = controller[0].getLeafletScope();
var mapController = controller[0];
- var errorHeader = leafletHelpers.errorHeader + ' [Bounds] ';
var emptyBounds = function(bounds) {
return (bounds._southWest.lat === 0 && bounds._southWest.lng === 0 &&
@@ -3327,8 +3375,10 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h
var lastNominatimQuery;
leafletScope.$watch('bounds', function(bounds) {
- if (scope.settingBoundsFromLeaflet)
- return;
+ if (scope.settingBoundsFromLeaflet) {
+ return;
+ }
+
if (isDefined(bounds.address) && bounds.address !== lastNominatimQuery) {
scope.settingBoundsFromScope = true;
nominatimService.query(bounds.address, attrs.id).then(function(data) {
@@ -3337,7 +3387,7 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h
map.fitBounds(newBounds);
}, function(errMsg) {
- $log.error(errorHeader + ' ' + errMsg + '.');
+ leafletLogger.error(errMsg, 'bounds');
});
lastNominatimQuery = bounds.address;
@@ -3362,239 +3412,224 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h
};
}]);
-var centerDirectiveTypes = ['center', 'lfCenter'];
-var centerDirectives = {};
-
-centerDirectiveTypes.forEach(function(directiveName) {
- centerDirectives[directiveName] = ['$log', '$q', '$location', '$timeout', 'leafletMapDefaults', 'leafletHelpers',
- 'leafletBoundsHelpers', 'leafletMapEvents',
- function($log, $q, $location, $timeout, leafletMapDefaults, leafletHelpers,
- leafletBoundsHelpers, leafletMapEvents) {
+angular.module('leaflet-directive').directive('lfCenter', ["leafletLogger", "$q", "$location", "$timeout", "leafletMapDefaults", "leafletHelpers", "leafletBoundsHelpers", "leafletMapEvents", function(leafletLogger, $q, $location, $timeout, leafletMapDefaults, leafletHelpers, leafletBoundsHelpers, leafletMapEvents) {
+ var isDefined = leafletHelpers.isDefined;
+ var isNumber = leafletHelpers.isNumber;
+ var isSameCenterOnMap = leafletHelpers.isSameCenterOnMap;
+ var safeApply = leafletHelpers.safeApply;
+ var isValidCenter = leafletHelpers.isValidCenter;
+ var isValidBounds = leafletBoundsHelpers.isValidBounds;
+ var isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty;
- var isDefined = leafletHelpers.isDefined;
- var isNumber = leafletHelpers.isNumber;
- var isSameCenterOnMap = leafletHelpers.isSameCenterOnMap;
- var safeApply = leafletHelpers.safeApply;
- var isValidCenter = leafletHelpers.isValidCenter;
- var isValidBounds = leafletBoundsHelpers.isValidBounds;
- var isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty;
- var errorHeader = leafletHelpers.errorHeader;
+ var shouldInitializeMapWithBounds = function(bounds, center) {
+ return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center);
+ };
- var shouldInitializeMapWithBounds = function(bounds, center) {
- return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center);
+ var _leafletCenter;
+ return {
+ restrict: 'A',
+ scope: false,
+ replace: false,
+ require: 'leaflet',
+ controller: function() {
+ _leafletCenter = $q.defer();
+ this.getCenter = function() {
+ return _leafletCenter.promise;
};
+ },
- var _leafletCenter;
- return {
- restrict: 'A',
- scope: false,
- replace: false,
- require: 'leaflet',
- controller: function() {
- _leafletCenter = $q.defer();
- this.getCenter = function() {
- return _leafletCenter.promise;
- };
- },
+ link: function(scope, element, attrs, controller) {
+ var leafletScope = controller.getLeafletScope();
- link: function(scope, element, attrs, controller) {
- var leafletScope = controller.getLeafletScope();
- var centerModel = leafletScope[directiveName];
+ if (!isDefined(leafletScope.center)) {
+ leafletLogger.error('The scope "center" variable is not defined', 'center');
+ leafletScope.center = {};
+ }
- controller.getMap().then(function(map) {
- var defaults = leafletMapDefaults.getDefaults(attrs.id);
+ var centerModel = leafletScope.center;
+ controller.getMap().then(function(map) {
+ var defaults = leafletMapDefaults.getDefaults(attrs.id);
- if (attrs[directiveName].search('-') !== -1) {
- $log.error(errorHeader + ' The "center" variable can\'t use a "-" on its key name: "' + attrs[directiveName] + '".');
- map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
- return;
- } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) {
- map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds), leafletScope.bounds.options);
- centerModel = map.getCenter();
- safeApply(leafletScope, function(scope) {
- angular.extend(scope[directiveName], {
- lat: map.getCenter().lat,
- lng: map.getCenter().lng,
- zoom: map.getZoom(),
- autoDiscover: false,
- });
- });
+ if (attrs.lfCenter.search('-') !== -1) {
+ leafletLogger.error('The "center" variable can\'t use a "-" on its key name: "' + attrs.lfCenter, 'center');
+ map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
+ return;
+ } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) {
+ map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds), leafletScope.bounds.options);
+ safeApply(leafletScope, function(scope) {
+ angular.extend(scope.center, {
+ lat: map.getCenter().lat,
+ lng: map.getCenter().lng,
+ zoom: map.getZoom(),
+ autoDiscover: false,
+ });
+ });
- safeApply(leafletScope, function(scope) {
- var mapBounds = map.getBounds();
- scope.bounds = {
- northEast: {
- lat: mapBounds._northEast.lat,
- lng: mapBounds._northEast.lng,
- },
- southWest: {
- lat: mapBounds._southWest.lat,
- lng: mapBounds._southWest.lng,
- },
+ safeApply(leafletScope, function(scope) {
+ var mapBounds = map.getBounds();
+ scope.bounds = {
+ northEast: {
+ lat: mapBounds._northEast.lat,
+ lng: mapBounds._northEast.lng,
+ },
+ southWest: {
+ lat: mapBounds._southWest.lat,
+ lng: mapBounds._southWest.lng,
+ },
+ };
+ });
+ } else if (!isDefined(centerModel)) {
+ leafletLogger.error('The "center" property is not defined in the main scope', 'center');
+ map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
+ return;
+ } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) {
+ angular.copy(defaults.center, centerModel);
+ }
+
+ var urlCenterHash;
+ var mapReady;
+ if (centerModel.allowUrlHashCenter === true) {
+ var extractCenterFromUrl = function() {
+ var search = $location.search();
+ var centerParam;
+ if (isDefined(search.c)) {
+ var cParam = search.c.split(':');
+ if (cParam.length === 3) {
+ centerParam = {
+ lat: parseFloat(cParam[0]),
+ lng: parseFloat(cParam[1]),
+ zoom: parseInt(cParam[2], 10),
+ allowUrlHashCenter: centerModel.allowUrlHashCenter,
};
- });
- } else if (!isDefined(centerModel)) {
- $log.error(errorHeader + ' The "center" property is not defined in the main scope');
- map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
- return;
- } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) {
- angular.copy(defaults.center, centerModel);
+ }
}
- var urlCenterHash;
- var mapReady;
- if (attrs.urlHashCenter === 'yes') {
- var extractCenterFromUrl = function() {
- var search = $location.search();
- var centerParam;
- if (isDefined(search.c)) {
- var cParam = search.c.split(':');
- if (cParam.length === 3) {
- centerParam = {
- lat: parseFloat(cParam[0]),
- lng: parseFloat(cParam[1]),
- zoom: parseInt(cParam[2], 10),
- };
- }
- }
-
- return centerParam;
- };
+ return centerParam;
+ };
- urlCenterHash = extractCenterFromUrl();
+ urlCenterHash = extractCenterFromUrl();
- leafletScope.$on('$locationChangeSuccess', function(event) {
- var scope = event.currentScope;
+ leafletScope.$on('$locationChangeSuccess', function(event) {
+ var scope = event.currentScope;
- //$log.debug("updated location...");
- var urlCenter = extractCenterFromUrl();
- if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) {
- //$log.debug("updating center model...", urlCenter);
- angular.extend(scope[directiveName], {
- lat: urlCenter.lat,
- lng: urlCenter.lng,
- zoom: urlCenter.zoom,
- });
- }
+ var urlCenter = extractCenterFromUrl();
+ if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) {
+ angular.extend(scope.center, {
+ lat: urlCenter.lat,
+ lng: urlCenter.lng,
+ zoom: urlCenter.zoom,
+ allowUrlHashCenter: centerModel.allowUrlHashCenter,
});
}
+ });
+ }
- leafletScope.$watch(directiveName, function(center) {
- if (leafletScope.settingCenterFromLeaflet)
- return;
+ leafletScope.$watch('center', function(center) {
+ if (leafletScope.settingCenterFromLeaflet) {
+ return;
+ }
- //$log.debug("updated center model...");
- // The center from the URL has priority
- if (isDefined(urlCenterHash)) {
- angular.copy(urlCenterHash, center);
- urlCenterHash = undefined;
- }
+ // The center from the URL has priority
+ if (isDefined(urlCenterHash)) {
+ angular.copy(urlCenterHash, center);
+ urlCenterHash = undefined;
+ }
- if (!isValidCenter(center) && center.autoDiscover !== true) {
- $log.warn(errorHeader + ' invalid \'center\'');
+ if (!isValidCenter(center) && center.autoDiscover !== true) {
+ leafletLogger.warn(' invalid \'center\'', 'center');
- //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
- return;
- }
+ //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
+ return;
+ }
- if (center.autoDiscover === true) {
- if (!isNumber(center.zoom)) {
- map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
- }
+ if (center.autoDiscover === true) {
+ if (!isNumber(center.zoom)) {
+ map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
+ }
- if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) {
- map.locate({
- setView: true,
- maxZoom: center.zoom,
- });
- } else if (isDefined(defaults.maxZoom)) {
- map.locate({
- setView: true,
- maxZoom: defaults.maxZoom,
- });
- } else {
- map.locate({
- setView: true,
- });
- }
+ if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) {
+ map.locate({
+ setView: true,
+ maxZoom: center.zoom,
+ });
+ } else if (isDefined(defaults.maxZoom)) {
+ map.locate({
+ setView: true,
+ maxZoom: defaults.maxZoom,
+ });
+ } else {
+ map.locate({
+ setView: true,
+ });
+ }
- return;
- }
+ return;
+ }
- if (mapReady && isSameCenterOnMap(center, map)) {
- //$log.debug("no need to update map again.");
- return;
- }
+ if (mapReady && isSameCenterOnMap(center, map)) {
+ return;
+ }
- //$log.debug("updating map center...", center);
- leafletScope.settingCenterFromScope = true;
- map.setView([center.lat, center.lng], center.zoom);
- leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
- $timeout(function() {
+ leafletScope.settingCenterFromScope = true;
+ map.setView([center.lat, center.lng], center.zoom);
+ leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
+ $timeout(function() {
leafletScope.settingCenterFromScope = false;
-
- //$log.debug("allow center scope updates");
});
- }, true);
+ }, true);
- map.whenReady(function() {
- mapReady = true;
- });
+ map.whenReady(function() {
+ mapReady = true;
+ });
- map.on('moveend', function(/* event */) {
- // Resolve the center after the first map position
- _leafletCenter.resolve();
- leafletMapEvents.notifyCenterUrlHashChanged(leafletScope, map, attrs, $location.search());
+ map.on('moveend', function(/* event */) {
+ // Resolve the center after the first map position
+ _leafletCenter.resolve();
- //$log.debug("updated center on map...");
- if (isSameCenterOnMap(centerModel, map) || leafletScope.settingCenterFromScope) {
- //$log.debug("same center in model, no need to update again.");
- return;
- }
+ if (centerModel.allowUrlHashCenter === true) {
+ leafletMapEvents.notifyCenterUrlHashChanged(leafletScope, map, $location.search());
+ }
- leafletScope.settingCenterFromLeaflet = true;
- safeApply(leafletScope, function(scope) {
- if (!leafletScope.settingCenterFromScope) {
- //$log.debug("updating center model...", map.getCenter(), map.getZoom());
- angular.extend(scope[directiveName], {
- lat: map.getCenter().lat,
- lng: map.getCenter().lng,
- zoom: map.getZoom(),
- autoDiscover: false,
- });
- }
+ if (isSameCenterOnMap(centerModel, map) || leafletScope.settingCenterFromScope) {
+ return;
+ }
- leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
- $timeout(function() {
- leafletScope.settingCenterFromLeaflet = false;
- });
+ leafletScope.settingCenterFromLeaflet = true;
+ safeApply(leafletScope, function(scope) {
+ if (!leafletScope.settingCenterFromScope) {
+ angular.extend(scope.center, {
+ lat: map.getCenter().lat,
+ lng: map.getCenter().lng,
+ zoom: map.getZoom(),
+ autoDiscover: false,
});
+ }
+
+ leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
+ $timeout(function() {
+ leafletScope.settingCenterFromLeaflet = false;
});
+ });
+ });
- if (centerModel.autoDiscover === true) {
- map.on('locationerror', function() {
- $log.warn(errorHeader + ' The Geolocation API is unauthorized on this page.');
- if (isValidCenter(centerModel)) {
- map.setView([centerModel.lat, centerModel.lng], centerModel.zoom);
- leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
- } else {
- map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
- leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
- }
- });
+ if (centerModel.autoDiscover === true) {
+ map.on('locationerror', function() {
+ leafletLogger.warn('The Geolocation API is unauthorized on this page.', 'center');
+ if (isValidCenter(centerModel)) {
+ map.setView([centerModel.lat, centerModel.lng], centerModel.zoom);
+ leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
+ } else {
+ map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
+ leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
}
});
- },
- };
+ }
+ });
},
- ];
-});
-
-centerDirectiveTypes.forEach(function(dirType) {
- angular.module('leaflet-directive').directive(dirType, centerDirectives[dirType]);
-});
+ };
+}]);
-angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpers", "leafletControlHelpers", function($log, leafletHelpers, leafletControlHelpers) {
+angular.module('leaflet-directive').directive('lfControls', ["leafletLogger", "leafletHelpers", "leafletControlHelpers", function(leafletLogger, leafletHelpers, leafletControlHelpers) {
return {
restrict: 'A',
@@ -3613,7 +3648,6 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe
var isDefined = leafletHelpers.isDefined;
var isArray = leafletHelpers.isArray;
var leafletControls = {};
- var errorHeader = leafletHelpers.errorHeader + ' [Controls] ';
controller.getMap().then(function(map) {
@@ -3636,7 +3670,7 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe
var controlType = isDefined(newControls[newName].type) ? newControls[newName].type : newName;
if (!isValidControlType(controlType)) {
- $log.error(errorHeader + ' Invalid control type: ' + controlType + '.');
+ leafletLogger.error(' Invalid control type: ' + controlType, 'controls');
return;
}
@@ -3666,7 +3700,16 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe
};
}]);
-angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHelpers", function($log, leafletHelpers) {
+angular.module('leaflet-directive').directive('decorations', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "decorations" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-decorations" markup attributes.', 'decorations');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('lfDecorations', ["leafletLogger", "leafletHelpers", function(leafletLogger, leafletHelpers) {
return {
restrict: 'A',
@@ -3684,7 +3727,7 @@ angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHe
function createDecoration(options) {
if (isDefined(options) && isDefined(options.coordinates)) {
if (!PolylineDecoratorPlugin.isLoaded()) {
- $log.error('[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.');
+ leafletLogger.error('The PolylineDecorator Plugin is not loaded.', 'decorations');
}
}
@@ -3727,7 +3770,115 @@ angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHe
};
}]);
-angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootScope", "leafletHelpers", "leafletMapEvents", "leafletIterators", function($log, $rootScope, leafletHelpers, leafletMapEvents, leafletIterators) {
+angular.module('leaflet-directive').directive('maxbounds', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "maxbounds" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-maxbounds" markup attributes.', 'maxbounds');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('defaults', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "defaults" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-defaults" markup attributes.', 'defaults');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('bounds', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "bounds" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-bounds" markup attributes.', 'bounds');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('controls', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "controls" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-controls" markup attributes.', 'controls');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('center', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "center" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-center" markup attributes.', 'center');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('paths', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "paths" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-paths" markup attributes.', 'paths');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('tiles', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "tiles" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-tiles" markup attributes.', 'tiles');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('markers', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "markers" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-markers" markup attributes.', 'markers');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('eventBroadcast', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "event-broadcast" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-events" markup attributes.', 'events');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('geojson', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "geojson" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-geojson" markup attributes.', 'geojson');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('layers', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "layers" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-layers" markup attributes.', 'layers');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('markers', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "markers" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-markers" markup attributes.', 'markers');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('lfEvents', ["leafletLogger", "$rootScope", "leafletHelpers", "leafletMapEvents", "leafletIterators", function(leafletLogger, $rootScope, leafletHelpers, leafletMapEvents, leafletIterators) {
return {
restrict: 'A',
@@ -3739,7 +3890,7 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS
var isObject = leafletHelpers.isObject;
var isDefined = leafletHelpers.isDefined;
var leafletScope = controller.getLeafletScope();
- var eventBroadcast = leafletScope.eventBroadcast;
+ var eventBroadcast = leafletScope.lfEvents;
var availableMapEvents = leafletMapEvents.getAvailableMapEvents();
var addEvents = leafletMapEvents.addEvents;
@@ -3749,24 +3900,24 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS
var logic = 'broadcast';
// We have a possible valid object
- if (!isDefined(eventBroadcast.map)) {
+ if (!isDefined(eventBroadcast) || !isDefined(eventBroadcast.map)) {
// We do not have events enable/disable do we do nothing (all enabled by default)
mapEvents = availableMapEvents;
} else if (!isObject(eventBroadcast.map)) {
// Not a valid object
- $log.warn('[AngularJS - Leaflet] event-broadcast.map must be an object check your model.');
+ leafletLogger.warn('event-broadcast.map must be an object check your model.', 'events');
} else {
// We have a possible valid map object
// Event propadation logic
if (eventBroadcast.map.logic !== 'emit' && eventBroadcast.map.logic !== 'broadcast') {
// This is an error
- $log.warn('[AngularJS - Leaflet] Available event propagation logic are: \'emit\' or \'broadcast\'.');
+ leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.', 'events');
} else {
logic = eventBroadcast.map.logic;
}
if (!(isObject(eventBroadcast.map.enable) && eventBroadcast.map.enable.length >= 0)) {
- $log.warn('[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.');
+ leafletLogger.warn('[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.', 'events');
} else {
// Enable events
leafletIterators.each(eventBroadcast.map.enable, function(eventName) {
@@ -3788,7 +3939,7 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS
}]);
angular.module('leaflet-directive')
-.directive('geojson', ["$log", "$rootScope", "leafletData", "leafletHelpers", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", "leafletIterators", "leafletGeoJsonEvents", function($log, $rootScope, leafletData, leafletHelpers,
+.directive('lfGeojson', ["leafletLogger", "$rootScope", "leafletData", "leafletHelpers", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", "leafletIterators", "leafletGeoJsonEvents", function(leafletLogger, $rootScope, leafletData, leafletHelpers,
leafletWatchHelpers, leafletDirectiveControlsHelpers, leafletIterators, leafletGeoJsonEvents) {
var _maybeWatch = leafletWatchHelpers.maybeWatch;
var _watchOptions = leafletHelpers.watchOptions;
@@ -3836,8 +3987,10 @@ angular.module('leaflet-directive')
hlp.isTruthy(attrs.geojsonNested));
var _clean = function() {
- if (!leafletGeoJSON)
- return;
+ if (!leafletGeoJSON) {
+ return;
+ }
+
var _remove = function(lObject) {
if (isDefined(lObject) && map.hasLayer(lObject)) {
map.removeLayer(lObject);
@@ -3894,8 +4047,10 @@ angular.module('leaflet-directive')
var _create = function(model) {
_clean();
if (isNested) {
- if (!model || !Object.keys(model).length)
- return;
+ if (!model || !Object.keys(model).length) {
+ return;
+ }
+
$it.each(model, function(m, name) {
//name could be layerName and or groupName
//for now it is not tied to a layer
@@ -3918,7 +4073,7 @@ angular.module('leaflet-directive')
};
}]);
-angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log", "leafletData", "leafletHelpers", function($filter, $log, leafletData, leafletHelpers) {
+angular.module('leaflet-directive').directive('layercontrol', ["$filter", "leafletLogger", "leafletData", "leafletHelpers", function($filter, leafletLogger, leafletData, leafletHelpers) {
return {
restrict: 'E',
@@ -3934,7 +4089,6 @@ angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log"
transclude: false,
require: '^leaflet',
controller: ["$scope", "$element", "$sce", function($scope, $element, $sce) {
- $log.debug('[Angular Directive - Layers] layers', $scope, $element);
var safeApply = leafletHelpers.safeApply;
var isDefined = leafletHelpers.isDefined;
angular.extend($scope, {
@@ -4232,7 +4386,7 @@ angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log"
};
}]);
-angular.module('leaflet-directive').directive('layers', ["$log", "$q", "leafletData", "leafletHelpers", "leafletLayerHelpers", "leafletControlHelpers", function($log, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) {
+angular.module('leaflet-directive').directive('lfLayers', ["leafletLogger", "$q", "leafletData", "leafletHelpers", "leafletLayerHelpers", "leafletControlHelpers", function(leafletLogger, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) {
return {
restrict: 'A',
@@ -4441,7 +4595,7 @@ angular.module('leaflet-directive').directive('layers', ["$log", "$q", "leafletD
};
}]);
-angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafletHelpers", "leafletLegendHelpers", function($log, $http, leafletHelpers, leafletLegendHelpers) {
+angular.module('leaflet-directive').directive('lfLegend', ["leafletLogger", "$http", "leafletHelpers", "leafletLegendHelpers", function(leafletLogger, $http, leafletHelpers, leafletLegendHelpers) {
return {
restrict: 'A',
@@ -4481,7 +4635,6 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl
leafletScope.$watch('legend', function(newLegend) {
if (!isDefined(newLegend)) {
-
if (isDefined(leafletLegend)) {
leafletLegend.removeFrom(map);
leafletLegend = null;
@@ -4491,16 +4644,12 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl
}
if (!isDefined(newLegend.url) && (type === 'arcgis') && (!isArray(newLegend.colors) || !isArray(newLegend.labels) || newLegend.colors.length !== newLegend.labels.length)) {
-
- $log.warn('[AngularJS - Leaflet] legend.colors and legend.labels must be set.');
-
+ leafletLogger.warn('legend.colors and legend.labels must be set.', 'legend');
return;
}
if (isDefined(newLegend.url)) {
-
- $log.info('[AngularJS - Leaflet] loading legend service.');
-
+ leafletLogger.info('loading legend service.', 'legend');
return;
}
@@ -4512,12 +4661,12 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl
leafletLegend = L.control({
position: position,
});
+
if (type === 'arcgis') {
leafletLegend.onAdd = leafletLegendHelpers.getOnAddArrayLegend(newLegend, legendClass);
}
leafletLegend.addTo(map);
-
});
leafletScope.$watch('legend.url', function(newURL) {
@@ -4526,187 +4675,184 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl
return;
}
- $http.get(newURL)
- .success(function(legendData) {
-
- if (isDefined(leafletLegend)) {
-
- leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL);
-
- } else {
-
- leafletLegend = L.control({
- position: position,
- });
- leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL);
- leafletLegend.addTo(map);
- }
+ $http.get(newURL).success(function(legendData) {
+ if (isDefined(leafletLegend)) {
+ leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL);
+ } else {
+ leafletLegend = L.control({ position: position, });
+ leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL);
+ leafletLegend.addTo(map);
+ }
- if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) {
- legend.loadedData();
- }
- })
- .error(function() {
- $log.warn('[AngularJS - Leaflet] legend.url not loaded.');
- });
+ if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) {
+ legend.loadedData();
+ }
+ }).error(function() {
+ leafletLogger.warn('legend.url not loaded.', 'legend');
+ });
});
-
});
},
};
}]);
-angular.module('leaflet-directive').directive('markers',
- ["$log", "$rootScope", "$q", "leafletData", "leafletHelpers", "leafletMapDefaults", "leafletMarkersHelpers", "leafletMarkerEvents", "leafletIterators", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", function($log, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults,
- leafletMarkersHelpers, leafletMarkerEvents, leafletIterators, leafletWatchHelpers,
- leafletDirectiveControlsHelpers) {
- //less terse vars to helpers
- var isDefined = leafletHelpers.isDefined;
- var errorHeader = leafletHelpers.errorHeader;
- var Helpers = leafletHelpers;
- var isString = leafletHelpers.isString;
- var addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher;
- var updateMarker = leafletMarkersHelpers.updateMarker;
- var listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents;
- var addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup;
- var createMarker = leafletMarkersHelpers.createMarker;
- var deleteMarker = leafletMarkersHelpers.deleteMarker;
- var $it = leafletIterators;
- var _markersWatchOptions = leafletHelpers.watchOptions;
- var maybeWatch = leafletWatchHelpers.maybeWatch;
- var extendDirectiveControls = leafletDirectiveControlsHelpers.extend;
-
- var _getLMarker = function(leafletMarkers, name, maybeLayerName) {
- if (!Object.keys(leafletMarkers).length) return;
- if (maybeLayerName && isString(maybeLayerName)) {
- if (!leafletMarkers[maybeLayerName] || !Object.keys(leafletMarkers[maybeLayerName]).length)
- return;
- return leafletMarkers[maybeLayerName][name];
- }
+angular.module('leaflet-directive').directive('lfMarkers', ["leafletLogger", "$rootScope", "$q", "leafletData", "leafletHelpers", "leafletMapDefaults", "leafletMarkersHelpers", "leafletMarkerEvents", "leafletIterators", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", function(leafletLogger, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, leafletMarkersHelpers, leafletMarkerEvents, leafletIterators, leafletWatchHelpers, leafletDirectiveControlsHelpers) {
+ var isDefined = leafletHelpers.isDefined;
+ var Helpers = leafletHelpers;
+ var isString = leafletHelpers.isString;
+ var addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher;
+ var updateMarker = leafletMarkersHelpers.updateMarker;
+ var listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents;
+ var addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup;
+ var createMarker = leafletMarkersHelpers.createMarker;
+ var deleteMarker = leafletMarkersHelpers.deleteMarker;
+ var $it = leafletIterators;
+ var _markersWatchOptions = leafletHelpers.watchOptions;
+ var maybeWatch = leafletWatchHelpers.maybeWatch;
+ var extendDirectiveControls = leafletDirectiveControlsHelpers.extend;
- return leafletMarkers[name];
- };
+ var _getLMarker = function(leafletMarkers, name, maybeLayerName) {
+ if (!Object.keys(leafletMarkers).length) {
+ return;
+ }
+
+ if (maybeLayerName && isString(maybeLayerName)) {
+ if (!leafletMarkers[maybeLayerName] || !Object.keys(leafletMarkers[maybeLayerName]).length) {
+ return;
+ }
- var _setLMarker = function(lObject, leafletMarkers, name, maybeLayerName) {
+ return leafletMarkers[maybeLayerName][name];
+ }
+
+ return leafletMarkers[name];
+ };
+
+ var _setLMarker = function(lObject, leafletMarkers, name, maybeLayerName) {
if (maybeLayerName && isString(maybeLayerName)) {
- if (!isDefined(leafletMarkers[maybeLayerName]))
- leafletMarkers[maybeLayerName] = {};
+ if (!isDefined(leafletMarkers[maybeLayerName])) {
+ leafletMarkers[maybeLayerName] = {};
+ }
+
leafletMarkers[maybeLayerName][name] = lObject;
- } else
- leafletMarkers[name] = lObject;
+ } else {
+ leafletMarkers[name] = lObject;
+ }
+
return lObject;
};
- var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map) {
-
- if (!isString(layerName)) {
- $log.error(errorHeader + ' A layername must be a string');
- return false;
- }
+ var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map) {
- if (!isDefined(layers)) {
- $log.error(errorHeader + ' You must add layers to the directive if the markers are going to use this functionality.');
- return false;
- }
+ if (!isString(layerName)) {
+ leafletLogger.error('A layername must be a string', 'markers');
+ return false;
+ }
- if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) {
- $log.error(errorHeader + ' A marker can only be added to a layer of type "group"');
- return false;
- }
+ if (!isDefined(layers)) {
+ leafletLogger.error('You must add layers to the directive if the markers are going to use this functionality.', 'markers');
+ return false;
+ }
- var layerGroup = layers.overlays[layerName];
- if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {
- $log.error(errorHeader + ' Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"');
- return false;
- }
+ if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) {
+ leafletLogger.error('A marker can only be added to a layer of type "group"', 'markers');
+ return false;
+ }
- // The marker goes to a correct layer group, so first of all we add it
- layerGroup.addLayer(marker);
+ var layerGroup = layers.overlays[layerName];
+ if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {
+ leafletLogger.error('Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"', 'markers');
+ return false;
+ }
- // The marker is automatically added to the map depending on the visibility
- // of the layer, so we only have to open the popup if the marker is in the map
- if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) {
- marker.openPopup();
- }
+ // The marker goes to a correct layer group, so first of all we add it
+ layerGroup.addLayer(marker);
- return true;
- };
+ // The marker is automatically added to the map depending on the visibility
+ // of the layer, so we only have to open the popup if the marker is in the map
+ if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) {
+ marker.openPopup();
+ }
- //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already)
- var _addMarkers = function(mapId, markersToRender, oldModels, map, layers, leafletMarkers, leafletScope,
- watchOptions, maybeLayerName, skips) {
- for (var newName in markersToRender) {
- if (skips[newName])
- continue;
+ return true;
+ };
- if (newName.search('-') !== -1) {
- $log.error('The marker can\'t use a "-" on his key name: "' + newName + '".');
- continue;
- }
+ //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already)
+ var _addMarkers = function(mapId, markersToRender, oldModels, map, layers, leafletMarkers, leafletScope,
+ watchOptions, maybeLayerName, skips) {
+ for (var newName in markersToRender) {
+ if (skips[newName]) {
+ continue;
+ }
- var model = Helpers.copy(markersToRender[newName]);
- var pathToMarker = Helpers.getObjectDotPath(maybeLayerName ? [maybeLayerName, newName] : [newName]);
- var maybeLMarker = _getLMarker(leafletMarkers, newName, maybeLayerName);
- if (!isDefined(maybeLMarker)) {
- //(nmccready) very important to not have model changes when lObject is changed
- //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal
- //if it is left as the reference then all changes from oldModel vs newModel are ignored
- //see _destroy (where modelDiff becomes meaningless if we do not copy here)
- var marker = createMarker(model);
- var layerName = (model ? model.layer : undefined) || maybeLayerName; //original way takes pref
- if (!isDefined(marker)) {
- $log.error(errorHeader + ' Received invalid data on the marker ' + newName + '.');
- continue;
- }
+ if (newName.search('-') !== -1) {
+ leafletLogger.error('The marker can\'t use a "-" on his key name: "' + newName + '".', 'markers');
+ continue;
+ }
- _setLMarker(marker, leafletMarkers, newName, maybeLayerName);
+ var model = Helpers.copy(markersToRender[newName]);
+ var pathToMarker = Helpers.getObjectDotPath(maybeLayerName ? [maybeLayerName, newName] : [newName]);
+ var maybeLMarker = _getLMarker(leafletMarkers, newName, maybeLayerName);
+ if (!isDefined(maybeLMarker)) {
+ //(nmccready) very important to not have model changes when lObject is changed
+ //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal
+ //if it is left as the reference then all changes from oldModel vs newModel are ignored
+ //see _destroy (where modelDiff becomes meaningless if we do not copy here)
+ var marker = createMarker(model);
+ var layerName = (model ? model.layer : undefined) || maybeLayerName; //original way takes pref
+ if (!isDefined(marker)) {
+ leafletLogger.error('Received invalid data on the marker ' + newName, 'markers');
+ continue;
+ }
- // Bind message
- if (isDefined(model.message)) {
- marker.bindPopup(model.message, model.popupOptions);
- }
+ _setLMarker(marker, leafletMarkers, newName, maybeLayerName);
- // Add the marker to a cluster group if needed
- if (isDefined(model.group)) {
- var groupOptions = isDefined(model.groupOption) ? model.groupOption : null;
- addMarkerToGroup(marker, model.group, groupOptions, map);
- }
+ // Bind message
+ if (isDefined(model.message)) {
+ marker.bindPopup(model.message, model.popupOptions);
+ }
- // Show label if defined
- if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) {
- marker.bindLabel(model.label.message, model.label.options);
- }
+ // Add the marker to a cluster group if needed
+ if (isDefined(model.group)) {
+ var groupOptions = isDefined(model.groupOption) ? model.groupOption : null;
+ addMarkerToGroup(marker, model.group, groupOptions, map);
+ }
- // Check if the marker should be added to a layer
- if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))) {
-
- var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker,
- watchOptions.individual.doWatch, map);
- if (!pass)
- continue; //something went wrong move on in the loop
- } else if (!isDefined(model.group)) {
- // We do not have a layer attr, so the marker goes to the map layer
- map.addLayer(marker);
- if (!watchOptions.individual.doWatch && model.focus === true) {
- marker.openPopup();
- }
- }
+ // Show label if defined
+ if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) {
+ marker.bindLabel(model.label.message, model.label.options);
+ }
- if (watchOptions.individual.doWatch) {
- addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map,
- watchOptions.individual.isDeep);
- }
+ // Check if the marker should be added to a layer
+ if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))) {
- listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch, map);
- leafletMarkerEvents.bindEvents(mapId, marker, pathToMarker, model, leafletScope, layerName);
- } else {
- var oldModel = isDefined(oldModel) ? oldModels[newName] : undefined;
- updateMarker(model, oldModel, maybeLMarker, pathToMarker, leafletScope, layers, map);
+ var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker,
+ watchOptions.individual.doWatch, map);
+ if (!pass) {
+ continue; //something went wrong move on in the loop
+ }
+ } else if (!isDefined(model.group)) {
+ // We do not have a layer attr, so the marker goes to the map layer
+ map.addLayer(marker);
+ if (!watchOptions.individual.doWatch && model.focus === true) {
+ marker.openPopup();
}
}
- };
- var _seeWhatWeAlreadyHave = function(markerModels, oldMarkerModels, lMarkers, isEqual, cb) {
+ if (watchOptions.individual.doWatch) {
+ addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map,
+ watchOptions.individual.isDeep);
+ }
+
+ listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch, map);
+ leafletMarkerEvents.bindEvents(mapId, marker, pathToMarker, model, leafletScope, layerName);
+ } else {
+ var oldModel = isDefined(oldModel) ? oldModels[newName] : undefined;
+ updateMarker(model, oldModel, maybeLMarker, pathToMarker, leafletScope, layers, map);
+ }
+ }
+ };
+
+ var _seeWhatWeAlreadyHave = function(markerModels, oldMarkerModels, lMarkers, isEqual, cb) {
var hasLogged = false;
var equals = false;
var oldMarker;
@@ -4715,7 +4861,6 @@ angular.module('leaflet-directive').directive('markers',
var doCheckOldModel = isDefined(oldMarkerModels);
for (var name in lMarkers) {
if (!hasLogged) {
- $log.debug(errorHeader + '[markers] destroy: ');
hasLogged = true;
}
@@ -4732,37 +4877,38 @@ angular.module('leaflet-directive').directive('markers',
!isDefined(markerModels[name]) ||
!Object.keys(markerModels[name]).length ||
equals) {
- if (cb && Helpers.isFunction(cb))
- cb(newMarker, oldMarker, name);
+ if (cb && Helpers.isFunction(cb)) {
+ cb(newMarker, oldMarker, name);
+ }
}
}
};
- var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers) {
+ var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers) {
_seeWhatWeAlreadyHave(markerModels, oldMarkerModels, lMarkers, false,
function(newMarker, oldMarker, lMarkerName) {
- $log.debug(errorHeader + '[marker] is deleting marker: ' + lMarkerName);
+ leafletLogger.debug('Deleting marker: ' + lMarkerName, 'markers');
deleteMarker(lMarkers[lMarkerName], map, layers);
delete lMarkers[lMarkerName];
});
};
- var _getNewModelsToSkipp = function(newModels, oldModels, lMarkers) {
+ var _getNewModelsToSkipp = function(newModels, oldModels, lMarkers) {
var skips = {};
_seeWhatWeAlreadyHave(newModels, oldModels, lMarkers, true,
function(newMarker, oldMarker, lMarkerName) {
- $log.debug(errorHeader + '[marker] is already rendered, marker: ' + lMarkerName);
+ leafletLogger.debug('Already rendered marker: ' + lMarkerName, 'markers');
skips[lMarkerName] = newMarker;
});
return skips;
};
- return {
+ return {
restrict: 'A',
scope: false,
replace: false,
- require: ['leaflet', '?layers'],
+ require: ['leaflet', '?lfLayers'],
link: function(scope, element, attrs, controller) {
var mapController = controller[0];
@@ -4786,9 +4932,10 @@ angular.module('leaflet-directive').directive('markers',
var watchOptions = leafletScope.markersWatchOptions || _markersWatchOptions;
// backwards compat
- if (isDefined(attrs.watchMarkers))
- watchOptions.doWatch = watchOptions.individual.doWatch =
- (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers));
+ if (isDefined(attrs.watchMarkers)) {
+ watchOptions.doWatch = watchOptions.individual.doWatch =
+ (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers));
+ }
var isNested = (isDefined(attrs.markersNested) && Helpers.isTruthy(attrs.markersNested));
@@ -4835,9 +4982,9 @@ angular.module('leaflet-directive').directive('markers',
});
},
};
- }]);
+}]);
-angular.module('leaflet-directive').directive('maxbounds', ["$log", "leafletMapDefaults", "leafletBoundsHelpers", "leafletHelpers", function($log, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) {
+angular.module('leaflet-directive').directive('lfMaxbounds', ["leafletLogger", "leafletMapDefaults", "leafletBoundsHelpers", "leafletHelpers", function(leafletLogger, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) {
return {
restrict: 'A',
@@ -4873,13 +5020,13 @@ angular.module('leaflet-directive').directive('maxbounds', ["$log", "leafletMapD
};
}]);
-angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletPathsHelpers", "leafletPathEvents", function($log, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletPathEvents) {
+angular.module('leaflet-directive').directive('lfPaths', ["leafletLogger", "$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletPathsHelpers", "leafletPathEvents", function(leafletLogger, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletPathEvents) {
return {
restrict: 'A',
scope: false,
replace: false,
- require: ['leaflet', '?layers'],
+ require: ['leaflet', '?lfLayers'],
link: function(scope, element, attrs, controller) {
var mapController = controller[0];
@@ -4955,7 +5102,7 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa
}
if (newName.search('-') !== -1) {
- $log.error('[AngularJS - Leaflet] The path name "' + newName + '" is not valid. It must not include "-" and a number.');
+ leafletLogger.error('The path name "' + newName + '" is not valid. It must not include "-" and a number.', 'paths');
continue;
}
@@ -4977,23 +5124,23 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa
if (isDefined(pathData) && isDefined(pathData.layer)) {
if (!isString(pathData.layer)) {
- $log.error('[AngularJS - Leaflet] A layername must be a string');
+ leafletLogger.error('A layername must be a string', 'paths');
continue;
}
if (!isDefined(layers)) {
- $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.');
+ leafletLogger.error('You must add layers to the directive if the markers are going to use this functionality', 'paths');
continue;
}
if (!isDefined(layers.overlays) || !isDefined(layers.overlays[pathData.layer])) {
- $log.error('[AngularJS - Leaflet] A path can only be added to a layer of type "group"');
+ leafletLogger.error('A path can only be added to a layer of type "group"', 'paths');
continue;
}
var layerGroup = layers.overlays[pathData.layer];
if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {
- $log.error('[AngularJS - Leaflet] Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"');
+ leafletLogger.error('Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"', 'paths');
continue;
}
@@ -5030,7 +5177,7 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa
};
}]);
-angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "leafletMapDefaults", "leafletHelpers", function($log, leafletData, leafletMapDefaults, leafletHelpers) {
+angular.module('leaflet-directive').directive('lfTiles', ["leafletLogger", "leafletData", "leafletMapDefaults", "leafletHelpers", function(leafletLogger, leafletData, leafletMapDefaults, leafletHelpers) {
return {
restrict: 'A',
@@ -5044,14 +5191,16 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "
var tiles = leafletScope.tiles;
if (!isDefined(tiles) || !isDefined(tiles.url)) {
- $log.warn('[AngularJS - Leaflet] The \'tiles\' definition doesn\'t have the \'url\' property.');
+ leafletLogger.warn('[AngularJS - Leaflet] The \'tiles\' definition doesn\'t have the \'url\' property.', 'tiles');
return;
}
controller.getMap().then(function(map) {
var defaults = leafletMapDefaults.getDefaults(attrs.id);
var tileLayerObj;
+
leafletScope.$watch('tiles', function(tiles, oldtiles) {
+
var tileLayerOptions = defaults.tileLayerOptions;
var tileLayerUrl = defaults.tileLayer;
@@ -5082,7 +5231,7 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "
return;
}
- // If the options of the tilelayer is changed, we need to redraw the layer
+ // If the options of the tilelayer are changed, we need to redraw the layer
if (isDefined(tiles.url) && isDefined(tiles.options) &&
(tiles.type !== oldtiles.type || !angular.equals(tiles.options, tileLayerOptions))) {
map.removeLayer(tileLayerObj);
@@ -5118,13 +5267,12 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "
*/
['markers', 'geojson'].forEach(function(name) {
angular.module('leaflet-directive').directive(name + 'WatchOptions', [
- '$log', '$rootScope', '$q', 'leafletData', 'leafletHelpers',
- function($log, $rootScope, $q, leafletData, leafletHelpers) {
+ 'leafletLogger', '$rootScope', '$q', 'leafletData', 'leafletHelpers',
+ function(leafletLogger, $rootScope, $q, leafletData, leafletHelpers) {
- var isDefined = leafletHelpers.isDefined,
- errorHeader = leafletHelpers.errorHeader,
- isObject = leafletHelpers.isObject,
- _watchOptions = leafletHelpers.watchOptions;
+ var isDefined = leafletHelpers.isDefined;
+ var isObject = leafletHelpers.isObject;
+ var _watchOptions = leafletHelpers.watchOptions;
return {
restrict: 'A',
@@ -5141,26 +5289,24 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "
if (isObject(scope[name + 'WatchOptions']))
angular.extend(_watchOptions, scope[name + 'WatchOptions']);
else
- $log.error(errorHeader + '[' + name + 'WatchOptions] is not an object');
+ leafletLogger.error('is not an object', 'watch options');
leafletScope[name + 'WatchOptions'] = _watchOptions;
}
});
},
};
- },]);
+ }, ]);
});
angular.module('leaflet-directive')
-.factory('LeafletEventsHelpersFactory', ["$rootScope", "$q", "$log", "leafletHelpers", function($rootScope, $q, $log, leafletHelpers) {
+.factory('LeafletEventsHelpersFactory', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", function($rootScope, $q, leafletLogger, leafletHelpers) {
var safeApply = leafletHelpers.safeApply;
var isDefined = leafletHelpers.isDefined;
var isObject = leafletHelpers.isObject;
var isArray = leafletHelpers.isArray;
- var errorHeader = leafletHelpers.errorHeader;
var EventsHelper = function(rootBroadcastName, lObjectType) {
this.rootBroadcastName = rootBroadcastName;
- $log.debug('LeafletEventsHelpersFactory: lObjectType: ' + lObjectType + 'rootBroadcastName: ' + rootBroadcastName);
//used to path/key out certain properties based on the type , "markers", "geojson"
this.lObjectType = lObjectType;
@@ -5190,12 +5336,12 @@ angular.module('leaflet-directive')
var _this = this;
maybeMapId = maybeMapId || '';
- if (maybeMapId)
+ if (maybeMapId) {
maybeMapId = '.' + maybeMapId;
+ }
return function(e) {
var broadcastName = _this.rootBroadcastName + maybeMapId + '.' + eventName;
- $log.debug(broadcastName);
_this.fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName, extra);
};
};
@@ -5209,8 +5355,9 @@ angular.module('leaflet-directive')
modelName: modelName,
model: model,
};
- if (isDefined(layerName))
- angular.extend(toSend, {layerName: layerName});
+ if (isDefined(layerName)) {
+ angular.extend(toSend, {layerName: layerName});
+ }
if (logic === 'emit') {
scope.$emit(broadcastName, toSend);
@@ -5230,7 +5377,7 @@ angular.module('leaflet-directive')
events = this.getAvailableEvents();
} else if (!isObject(leafletScope.eventBroadcast)) {
// Not a valid object
- $log.error(errorHeader + 'event-broadcast must be an object check your model.');
+ leafletLogger.error('event-broadcast must be an object check your model.');
} else {
// We have a possible valid object
if (!isDefined(leafletScope.eventBroadcast[_this.lObjectType])) {
@@ -5238,33 +5385,37 @@ angular.module('leaflet-directive')
events = this.getAvailableEvents();
} else if (!isObject(leafletScope.eventBroadcast[_this.lObjectType])) {
// Not a valid object
- $log.warn(errorHeader + 'event-broadcast.' + [_this.lObjectType] + ' must be an object check your model.');
+ leafletLogger.warn('event-broadcast.' + [_this.lObjectType] + ' must be an object check your model.');
} else {
// We have a possible valid map object
// Event propadation logic
if (isDefined(leafletScope.eventBroadcast[this.lObjectType].logic)) {
// We take care of possible propagation logic
if (leafletScope.eventBroadcast[_this.lObjectType].logic !== 'emit' &&
- leafletScope.eventBroadcast[_this.lObjectType].logic !== 'broadcast')
- $log.warn(errorHeader + 'Available event propagation logic are: \'emit\' or \'broadcast\'.');
+ leafletScope.eventBroadcast[_this.lObjectType].logic !== 'broadcast') {
+ leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.');
+ }
}
// Enable / Disable
var eventsEnable = false;
var eventsDisable = false;
if (isDefined(leafletScope.eventBroadcast[_this.lObjectType].enable) &&
- isArray(leafletScope.eventBroadcast[_this.lObjectType].enable))
- eventsEnable = true;
+ isArray(leafletScope.eventBroadcast[_this.lObjectType].enable)) {
+ eventsEnable = true;
+ }
+
if (isDefined(leafletScope.eventBroadcast[_this.lObjectType].disable) &&
- isArray(leafletScope.eventBroadcast[_this.lObjectType].disable))
- eventsDisable = true;
+ isArray(leafletScope.eventBroadcast[_this.lObjectType].disable)) {
+ eventsDisable = true;
+ }
if (eventsEnable && eventsDisable) {
// Both are active, this is an error
- $log.warn(errorHeader + 'can not enable and disable events at the same time');
+ leafletLogger.warn('can not enable and disable events at the same time');
} else if (!eventsEnable && !eventsDisable) {
// Both are inactive, this is an error
- $log.warn(errorHeader + 'must enable or disable events');
+ leafletLogger.warn('must enable or disable events');
} else {
// At this point the object is OK, lets enable or disable events
if (eventsEnable) {
@@ -5273,12 +5424,12 @@ angular.module('leaflet-directive')
// Do we have already the event enabled?
if (events.indexOf(eventName) !== -1) {
// Repeated event, this is an error
- $log.warn(errorHeader + 'This event ' + eventName + ' is already enabled');
+ leafletLogger.warn('This event ' + eventName + ' is already enabled');
} else {
// Does the event exists?
if (_this.getAvailableEvents().indexOf(eventName) === -1) {
// The event does not exists, this is an error
- $log.warn(errorHeader + 'This event ' + eventName + ' does not exist');
+ leafletLogger.warn('This event ' + eventName + ' does not exist');
} else {
// All ok enable the event
events.push(eventName);
@@ -5292,7 +5443,7 @@ angular.module('leaflet-directive')
var index = events.indexOf(eventName);
if (index === -1) {
// The event does not exist
- $log.warn(errorHeader + 'This event ' + eventName + ' does not exist or has been already disabled');
+ leafletLogger.warn('This event ' + eventName + ' does not exist or has been already disabled');
} else {
events.splice(index, 1);
@@ -5317,7 +5468,7 @@ angular.module('leaflet-directive')
}]);
angular.module('leaflet-directive')
-.factory('leafletGeoJsonEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletData", function($rootScope, $q, $log, leafletHelpers,
+.factory('leafletGeoJsonEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletData", function($rootScope, $q, leafletLogger, leafletHelpers,
LeafletEventsHelpersFactory, leafletData) {
var safeApply = leafletHelpers.safeApply;
var EventsHelper = LeafletEventsHelpersFactory;
@@ -5365,7 +5516,7 @@ angular.module('leaflet-directive')
}]);
angular.module('leaflet-directive')
-.factory('leafletLabelEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory) {
+.factory('leafletLabelEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory) {
var Helpers = leafletHelpers;
var EventsHelper = LeafletEventsHelpersFactory;
@@ -5408,7 +5559,7 @@ angular.module('leaflet-directive')
}]);
angular.module('leaflet-directive')
-.factory('leafletMapEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletEventsHelpers", "leafletIterators", function($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers, leafletIterators) {
+.factory('leafletMapEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "leafletEventsHelpers", "leafletIterators", function($rootScope, $q, leafletLogger, leafletHelpers, leafletEventsHelpers, leafletIterators) {
var isDefined = leafletHelpers.isDefined;
var fire = leafletEventsHelpers.fire;
@@ -5462,12 +5613,13 @@ angular.module('leaflet-directive')
};
var _genDispatchMapEvent = function(scope, eventName, logic, maybeMapId) {
- if (maybeMapId)
+ if (maybeMapId) {
maybeMapId = maybeMapId + '.';
+ }
+
return function(e) {
// Put together broadcast name
var broadcastName = 'leafletDirectiveMap.' + maybeMapId + eventName;
- $log.debug(broadcastName);
// Safely broadcast the event
fire(scope, broadcastName, logic, e, e.target, scope);
@@ -5478,15 +5630,10 @@ angular.module('leaflet-directive')
scope.$broadcast('boundsChanged');
};
- var _notifyCenterUrlHashChanged = function(scope, map, attrs, search) {
- if (!isDefined(attrs.urlHashCenter)) {
- return;
- }
-
+ var _notifyCenterUrlHashChanged = function(scope, map, search) {
var center = map.getCenter();
var centerUrlHash = (center.lat).toFixed(4) + ':' + (center.lng).toFixed(4) + ':' + map.getZoom();
if (!isDefined(search.c) || search.c !== centerUrlHash) {
- //$log.debug("notified new center...");
scope.$emit('centerUrlHash', centerUrlHash);
}
};
@@ -5509,7 +5656,7 @@ angular.module('leaflet-directive')
}]);
angular.module('leaflet-directive')
-.factory('leafletMarkerEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletLabelEvents", function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory, leafletLabelEvents) {
+.factory('leafletMarkerEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletLabelEvents", function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory, leafletLabelEvents) {
var safeApply = leafletHelpers.safeApply;
var isDefined = leafletHelpers.isDefined;
var Helpers = leafletHelpers;
@@ -5580,11 +5727,10 @@ angular.module('leaflet-directive')
}]);
angular.module('leaflet-directive')
-.factory('leafletPathEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletLabelEvents", "leafletEventsHelpers", function($rootScope, $q, $log, leafletHelpers, leafletLabelEvents, leafletEventsHelpers) {
+.factory('leafletPathEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "leafletLabelEvents", "leafletEventsHelpers", function($rootScope, $q, leafletLogger, leafletHelpers, leafletLabelEvents, leafletEventsHelpers) {
var isDefined = leafletHelpers.isDefined;
var isObject = leafletHelpers.isObject;
var Helpers = leafletHelpers;
- var errorHeader = leafletHelpers.errorHeader;
var lblHelp = leafletLabelEvents;
var fire = leafletEventsHelpers.fire;
@@ -5595,12 +5741,12 @@ angular.module('leaflet-directive')
var _genDispatchPathEvent = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName) {
maybeMapId = maybeMapId || '';
- if (maybeMapId)
+ if (maybeMapId) {
maybeMapId = '.' + maybeMapId;
+ }
return function(e) {
var broadcastName = 'leafletDirectivePath' + maybeMapId + '.' + eventName;
- $log.debug(broadcastName);
fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName);
};
};
@@ -5616,7 +5762,7 @@ angular.module('leaflet-directive')
pathEvents = _getAvailablePathEvents();
} else if (!isObject(leafletScope.eventBroadcast)) {
// Not a valid object
- $log.error(errorHeader + 'event-broadcast must be an object check your model.');
+ leafletLogger.error('event-broadcast must be an object check your model.');
} else {
// We have a possible valid object
if (!isDefined(leafletScope.eventBroadcast.path)) {
@@ -5624,7 +5770,7 @@ angular.module('leaflet-directive')
pathEvents = _getAvailablePathEvents();
} else if (isObject(leafletScope.eventBroadcast.paths)) {
// Not a valid object
- $log.warn(errorHeader + 'event-broadcast.path must be an object check your model.');
+ leafletLogger.warn('event-broadcast.path must be an object check your model.');
} else {
// We have a possible valid map object
// Event propadation logic
@@ -5632,7 +5778,7 @@ angular.module('leaflet-directive')
// We take care of possible propagation logic
if (leafletScope.eventBroadcast.path.logic !== 'emit' && leafletScope.eventBroadcast.path.logic !== 'broadcast') {
// This is an error
- $log.warn(errorHeader + 'Available event propagation logic are: \'emit\' or \'broadcast\'.');
+ leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.');
} else if (leafletScope.eventBroadcast.path.logic === 'emit') {
logic = 'emit';
}
@@ -5655,10 +5801,10 @@ angular.module('leaflet-directive')
if (pathEventsEnable && pathEventsDisable) {
// Both are active, this is an error
- $log.warn(errorHeader + 'can not enable and disable events at the same time');
+ leafletLogger.warn('can not enable and disable events at the same time');
} else if (!pathEventsEnable && !pathEventsDisable) {
// Both are inactive, this is an error
- $log.warn(errorHeader + 'must enable or disable events');
+ leafletLogger.warn('must enable or disable events');
} else {
// At this point the path object is OK, lets enable or disable events
if (pathEventsEnable) {
@@ -5669,12 +5815,12 @@ angular.module('leaflet-directive')
// Do we have already the event enabled?
if (pathEvents.indexOf(eventName) !== -1) {
// Repeated event, this is an error
- $log.warn(errorHeader + 'This event ' + eventName + ' is already enabled');
+ leafletLogger.warn('This event ' + eventName + ' is already enabled');
} else {
// Does the event exists?
if (_getAvailablePathEvents().indexOf(eventName) === -1) {
// The event does not exists, this is an error
- $log.warn(errorHeader + 'This event ' + eventName + ' does not exist');
+ leafletLogger.warn('This event ' + eventName + ' does not exist');
} else {
// All ok enable the event
pathEvents.push(eventName);
@@ -5689,7 +5835,7 @@ angular.module('leaflet-directive')
var index = pathEvents.indexOf(eventName);
if (index === -1) {
// The event does not exist
- $log.warn(errorHeader + 'This event ' + eventName + ' does not exist or has been already disabled');
+ leafletLogger.warn('This event ' + eventName + ' does not exist or has been already disabled');
} else {
pathEvents.splice(index, 1);
diff --git a/dist/angular-leaflet-directive.min.js b/dist/angular-leaflet-directive.min.js
index cbcd8406..5676c0b8 100644
--- a/dist/angular-leaflet-directive.min.js
+++ b/dist/angular-leaflet-directive.min.js
@@ -28,13 +28,13 @@
*/
/*!
-* angular-leaflet-directive 2015-11-06
+* angular-leaflet-directive 0.10.1 2015-11-13
* angular-leaflet-directive - An AngularJS directive to easily interact with Leaflet maps
* git: https://github.com/tombatossals/angular-leaflet-directive
*/
(function(angular){
'use strict';
-!function(angular){"use strict";angular.module("leaflet-directive",[]).directive("leaflet",["$q","leafletData","leafletMapDefaults","leafletHelpers","leafletMapEvents",function(a,b,c,d,e){return{restrict:"EA",replace:!0,scope:{center:"=",lfCenter:"=",defaults:"=",maxbounds:"=",bounds:"=",markers:"=",legend:"=",geojson:"=",paths:"=",tiles:"=",layers:"=",controls:"=",decorations:"=",eventBroadcast:"=",markersWatchOptions:"=",geojsonWatchOptions:"="},transclude:!0,template:'
',controller:["$scope",function(b){this._leafletMap=a.defer(),this.getMap=function(){return this._leafletMap.promise},this.getLeafletScope=function(){return b}}],link:function(a,f,g,h){function i(){isNaN(g.width)?f.css("width",g.width):f.css("width",g.width+"px")}function j(){isNaN(g.height)?f.css("height",g.height):f.css("height",g.height+"px")}var k=d.isDefined,l=c.setDefaults(a.defaults,g.id),m=e.getAvailableMapEvents(),n=e.addEvents;a.mapId=g.id,b.setDirectiveControls({},g.id),k(g.width)&&(i(),a.$watch(function(){return f[0].getAttribute("width")},function(){i(),o.invalidateSize()})),k(g.height)&&(j(),a.$watch(function(){return f[0].getAttribute("height")},function(){j(),o.invalidateSize()}));var o=new L.Map(f[0],c.getMapCreationDefaults(g.id));if(h._leafletMap.resolve(o),k(g.center)||k(g.lfCenter)||o.setView([l.center.lat,l.center.lng],l.center.zoom),!k(g.tiles)&&!k(g.layers)){var p=L.tileLayer(l.tileLayer,l.tileLayerOptions);p.addTo(o),b.setTiles(p,g.id)}if(k(o.zoomControl)&&k(l.zoomControlPosition)&&o.zoomControl.setPosition(l.zoomControlPosition),k(o.zoomControl)&&l.zoomControl===!1&&o.zoomControl.removeFrom(o),k(o.zoomsliderControl)&&k(l.zoomsliderControl)&&l.zoomsliderControl===!1&&o.zoomsliderControl.removeFrom(o),!k(g.eventBroadcast)){var q="broadcast";n(o,m,"eventName",a,q)}o.whenReady(function(){b.setMap(o,g.id)}),a.$on("$destroy",function(){c.reset(),o.remove(),b.unresolveMap(g.id)}),a.$on("invalidateSize",function(){o.invalidateSize()})}}}]),angular.module("leaflet-directive").factory("leafletBoundsHelpers",["$log","leafletHelpers",function(a,b){function c(a){return angular.isDefined(a)&&angular.isDefined(a.southWest)&&angular.isDefined(a.northEast)&&angular.isNumber(a.southWest.lat)&&angular.isNumber(a.southWest.lng)&&angular.isNumber(a.northEast.lat)&&angular.isNumber(a.northEast.lng)}var d=b.isArray,e=b.isNumber,f=b.isFunction,g=b.isDefined;return{createLeafletBounds:function(a){return c(a)?L.latLngBounds([a.southWest.lat,a.southWest.lng],[a.northEast.lat,a.northEast.lng]):void 0},isValidBounds:c,createBoundsFromArray:function(b){return d(b)&&2===b.length&&d(b[0])&&d(b[1])&&2===b[0].length&&2===b[1].length&&e(b[0][0])&&e(b[0][1])&&e(b[1][0])&&e(b[1][1])?{northEast:{lat:b[0][0],lng:b[0][1]},southWest:{lat:b[1][0],lng:b[1][1]}}:void a.error("[AngularJS - Leaflet] The bounds array is not valid.")},createBoundsFromLeaflet:function(b){if(!(g(b)&&f(b.getNorthEast)&&f(b.getSouthWest)))return void a.error("[AngularJS - Leaflet] The leaflet bounds is not valid object.");var c=b.getNorthEast(),d=b.getSouthWest();return{northEast:{lat:c.lat,lng:c.lng},southWest:{lat:d.lat,lng:d.lng}}}}}]),angular.module("leaflet-directive").factory("leafletControlHelpers",["$rootScope","$log","leafletHelpers","leafletLayerHelpers","leafletMapDefaults",function(a,b,c,d,e){var f=c.isDefined,g=c.isObject,h=d.createLayer,i={},j=c.errorHeader+" [Controls] ",k=function(a,b,c){var d=e.getDefaults(c);if(!d.controls.layers.visible)return!1;var h=!1;return g(a)&&Object.keys(a).forEach(function(b){var c=a[b];f(c.layerOptions)&&c.layerOptions.showOnSelector===!1||(h=!0)}),g(b)&&Object.keys(b).forEach(function(a){var c=b[a];f(c.layerParams)&&c.layerParams.showOnSelector===!1||(h=!0)}),h},l=function(a){var b=e.getDefaults(a),c={collapsed:b.controls.layers.collapsed,position:b.controls.layers.position,autoZIndex:!1};angular.extend(c,b.controls.layers.options);var d;return d=b.controls.layers&&f(b.controls.layers.control)?b.controls.layers.control.apply(this,[[],[],c]):new L.control.layers([],[],c)},m={draw:{isPluginLoaded:function(){return angular.isDefined(L.Control.Draw)?!0:(b.error(j+" Draw plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Draw(a)}},scale:{isPluginLoaded:function(){return!0},checkValidParams:function(){return!0},createControl:function(a){return new L.control.scale(a)}},fullscreen:{isPluginLoaded:function(){return angular.isDefined(L.Control.Fullscreen)?!0:(b.error(j+" Fullscreen plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Fullscreen(a)}},search:{isPluginLoaded:function(){return angular.isDefined(L.Control.Search)?!0:(b.error(j+" Search plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Search(a)}},custom:{},minimap:{isPluginLoaded:function(){return angular.isDefined(L.Control.MiniMap)?!0:(b.error(j+" Minimap plugin is not loaded."),!1)},checkValidParams:function(a){return f(a.layer)?!0:(b.warn(j+' minimap "layer" option should be defined.'),!1)},createControl:function(a){var c=h(a.layer);return f(c)?new L.Control.MiniMap(c,a):void b.warn(j+' minimap control "layer" could not be created.')}}};return{layersControlMustBeVisible:k,isValidControlType:function(a){return-1!==Object.keys(m).indexOf(a)},createControl:function(a,b){return m[a].checkValidParams(b)?m[a].createControl(b):void 0},updateLayersControl:function(a,b,c,d,e,g){var h,j=i[b],m=k(d,e,b);if(f(j)&&c){for(h in g.baselayers)j.removeLayer(g.baselayers[h]);for(h in g.overlays)j.removeLayer(g.overlays[h]);a.removeControl(j),delete i[b]}if(m){j=l(b),i[b]=j;for(h in d){var n=f(d[h].layerOptions)&&d[h].layerOptions.showOnSelector===!1;!n&&f(g.baselayers[h])&&j.addBaseLayer(g.baselayers[h],d[h].name)}for(h in e){var o=f(e[h].layerParams)&&e[h].layerParams.showOnSelector===!1;!o&&f(g.overlays[h])&&j.addOverlay(g.overlays[h],e[h].name)}a.addControl(j)}return m}}}]),angular.module("leaflet-directive").service("leafletData",["$log","$q","leafletHelpers",function(a,b,c){var d=c.getDefer,e=c.getUnresolvedDefer,f=c.setResolvedDefer,g={},h=this,i=function(a){return a.charAt(0).toUpperCase()+a.slice(1)},j=["map","tiles","layers","paths","markers","geoJSON","UTFGrid","decorations","directiveControls"];j.forEach(function(a){g[a]={}}),this.unresolveMap=function(a){var b=c.obtainEffectiveMapId(g.map,a);j.forEach(function(a){g[a][b]=void 0})},j.forEach(function(a){var b=i(a);h["set"+b]=function(b,c){var d=e(g[a],c);d.resolve(b),f(g[a],c)},h["get"+b]=function(b){var c=d(g[a],b);return c.promise}})}]),angular.module("leaflet-directive").service("leafletDirectiveControlsHelpers",["$log","leafletData","leafletHelpers",function(a,b,c){var d=c.isDefined,e=c.isString,f=c.isObject,g=c.errorHeader,h=g+"[leafletDirectiveControlsHelpers",i=function(c,g,i,j){var k=h+".extend] ",l={};if(!d(g))return void a.error(k+"thingToAddName cannot be undefined");if(e(g)&&d(i)&&d(j))l[g]={create:i,clean:j};else{if(!f(g)||d(i)||d(j))return void a.error(k+"incorrect arguments");l=g}b.getDirectiveControls().then(function(a){angular.extend(a,l),b.setDirectiveControls(a,c)})};return{extend:i}}]),angular.module("leaflet-directive").service("leafletGeoJsonHelpers",["leafletHelpers","leafletIterators",function(a,b){var c=a,d=b,e=function(a,b){return this.lat=a,this.lng=b,this},f=function(a){return Array.isArray(a)&&2===a.length?a[1]:c.isDefined(a.type)&&"Point"===a.type?+a.coordinates[1]:+a.lat},g=function(a){return Array.isArray(a)&&2===a.length?a[0]:c.isDefined(a.type)&&"Point"===a.type?+a.coordinates[0]:+a.lng},h=function(a){if(c.isUndefined(a))return!1;if(c.isArray(a)){if(2===a.length&&c.isNumber(a[0])&&c.isNumber(a[1]))return!0}else if(c.isDefined(a.type)&&"Point"===a.type&&c.isArray(a.coordinates)&&2===a.coordinates.length&&c.isNumber(a.coordinates[0])&&c.isNumber(a.coordinates[1]))return!0;var b=d.all(["lat","lng"],function(b){return c.isDefined(a[b])&&c.isNumber(a[b])});return b},i=function(a){if(a&&h(a)){var b=null;if(Array.isArray(a)&&2===a.length)b=new e(a[1],a[0]);else{if(!c.isDefined(a.type)||"Point"!==a.type)return a;b=new e(a.coordinates[1],a.coordinates[0])}return angular.extend(a,b)}};return{getLat:f,getLng:g,validateCoords:h,getCoords:i}}]),angular.module("leaflet-directive").service("leafletHelpers",["$q","$log",function(a,b){function c(a,c){var d,f;if(angular.isDefined(c))d=c;else if(0===Object.keys(a).length)d="main";else if(Object.keys(a).length>=1)for(f in a)a.hasOwnProperty(f)&&(d=f);else b.error(e+"- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call");return d}function d(b,d){var e,f=c(b,d);return angular.isDefined(b[f])&&b[f].resolvedDefer!==!0?e=b[f].defer:(e=a.defer(),b[f]={defer:e,resolvedDefer:!1}),e}var e="[AngularJS - Leaflet] ",f=angular.copy,g=f,h=function(a,b){var c;if(a&&angular.isObject(a))return null!==b&&angular.isString(b)?(c=a,b.split(".").forEach(function(a){c&&(c=c[a])}),c):b},i=function(a){return a.split(".").reduce(function(a,b){return a+'["'+b+'"]'})},j=function(a){return a.reduce(function(a,b){return a+"."+b})},k=function(a){return angular.isDefined(a)&&null!==a},l=function(a){return!k(a)},m=/([\:\-\_]+(.))/g,n=/^moz([A-Z])/,o=/^((?:x|data)[\:\-_])/i,p=function(a){return a.replace(m,function(a,b,c,d){return d?c.toUpperCase():c}).replace(n,"Moz$1")},q=function(a){return p(a.replace(o,""))};return{camelCase:p,directiveNormalize:q,copy:f,clone:g,errorHeader:e,getObjectValue:h,getObjectArrayPath:i,getObjectDotPath:j,defaultTo:function(a,b){return k(a)?a:b},isTruthy:function(a){return"true"===a||a===!0},isEmpty:function(a){return 0===Object.keys(a).length},isUndefinedOrEmpty:function(a){return angular.isUndefined(a)||null===a||0===Object.keys(a).length},isDefined:k,isUndefined:l,isNumber:angular.isNumber,isString:angular.isString,isArray:angular.isArray,isObject:angular.isObject,isFunction:angular.isFunction,equals:angular.equals,isValidCenter:function(a){return angular.isDefined(a)&&angular.isNumber(a.lat)&&angular.isNumber(a.lng)&&angular.isNumber(a.zoom)},isValidPoint:function(a){return angular.isDefined(a)?angular.isArray(a)?2===a.length&&angular.isNumber(a[0])&&angular.isNumber(a[1]):angular.isNumber(a.lat)&&angular.isNumber(a.lng):!1},isSameCenterOnMap:function(a,b){var c=b.getCenter(),d=b.getZoom();return a.lat&&a.lng&&c.lat.toFixed(4)===a.lat.toFixed(4)&&c.lng.toFixed(4)===a.lng.toFixed(4)&&d===a.zoom?!0:!1},safeApply:function(a,b){var c=a.$root.$$phase;"$apply"===c||"$digest"===c?a.$eval(b):a.$evalAsync(b)},obtainEffectiveMapId:c,getDefer:function(a,b){var e,f=c(a,b);return e=angular.isDefined(a[f])&&a[f].resolvedDefer!==!1?a[f].defer:d(a,b)},getUnresolvedDefer:d,setResolvedDefer:function(a,b){var d=c(a,b);a[d].resolvedDefer=!0},rangeIsSupported:function(){var a=document.createElement("input");return a.setAttribute("type","range"),"range"===a.type},FullScreenControlPlugin:{isLoaded:function(){return angular.isDefined(L.Control.Fullscreen)}},MiniMapControlPlugin:{isLoaded:function(){return angular.isDefined(L.Control.MiniMap)}},AwesomeMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.AwesomeMarkers)&&angular.isDefined(L.AwesomeMarkers.Icon)},is:function(a){return this.isLoaded()?a instanceof L.AwesomeMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},VectorMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.VectorMarkers)&&angular.isDefined(L.VectorMarkers.Icon)},is:function(a){return this.isLoaded()?a instanceof L.VectorMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},DomMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.DomMarkers)&&angular.isDefined(L.DomMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.DomMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},PolylineDecoratorPlugin:{isLoaded:function(){return angular.isDefined(L.PolylineDecorator)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.PolylineDecorator:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},MakiMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.MakiMarkers)&&angular.isDefined(L.MakiMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.MakiMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},ExtraMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.ExtraMarkers)&&angular.isDefined(L.ExtraMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.ExtraMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},LabelPlugin:{isLoaded:function(){return angular.isDefined(L.Label)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},MarkerClusterPlugin:{isLoaded:function(){return angular.isDefined(L.MarkerClusterGroup)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},GoogleLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Google)},is:function(a){return this.isLoaded()?a instanceof L.Google:!1}},LeafletProviderPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.Provider)},is:function(a){return this.isLoaded()?a instanceof L.TileLayer.Provider:!1}},ChinaLayerPlugin:{isLoaded:function(){return angular.isDefined(L.tileLayer.chinaProvider)}},HeatLayerPlugin:{isLoaded:function(){return angular.isDefined(L.heatLayer)}},WebGLHeatMapLayerPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.WebGLHeatMap)}},BingLayerPlugin:{isLoaded:function(){return angular.isDefined(L.BingLayer)},is:function(a){return this.isLoaded()?a instanceof L.BingLayer:!1}},WFSLayerPlugin:{isLoaded:function(){return void 0!==L.GeoJSON.WFS},is:function(a){return this.isLoaded()?a instanceof L.GeoJSON.WFS:!1}},AGSBaseLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.basemapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.basemapLayer:!1}},AGSLayerPlugin:{isLoaded:function(){return void 0!==lvector&&void 0!==lvector.AGS},is:function(a){return this.isLoaded()?a instanceof lvector.AGS:!1}},AGSFeatureLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.featureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.featureLayer:!1}},AGSTiledMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.tiledMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.tiledMapLayer:!1}},AGSDynamicMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.dynamicMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.dynamicMapLayer:!1}},AGSImageMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.imageMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.imageMapLayer:!1}},AGSClusteredLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.clusteredFeatureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.clusteredFeatureLayer:!1}},AGSHeatmapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.heatmapFeatureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.heatmapFeatureLayer:!1}},YandexLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Yandex)},is:function(a){return this.isLoaded()?a instanceof L.Yandex:!1}},GeoJSONPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.GeoJSON)},is:function(a){return this.isLoaded()?a instanceof L.TileLayer.GeoJSON:!1}},UTFGridPlugin:{isLoaded:function(){return angular.isDefined(L.UtfGrid)},is:function(a){return this.isLoaded()?a instanceof L.UtfGrid:(b.error("[AngularJS - Leaflet] No UtfGrid plugin found."),!1)}},CartoDB:{isLoaded:function(){return cartodb},is:function(){return!0}},Leaflet:{DivIcon:{is:function(a){return a instanceof L.DivIcon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}},Icon:{is:function(a){return a instanceof L.Icon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}}},watchOptions:{doWatch:!0,isDeep:!0,individual:{doWatch:!0,isDeep:!0}}}}]),angular.module("leaflet-directive").service("leafletIterators",["$log","leafletHelpers",function(a,b){var c,d=b,e=b.errorHeader+"leafletIterators: ",f=Object.keys,g=d.isFunction,h=d.isObject,i=Math.pow(2,53)-1,j=function(a){var b=null!==a&&a.length;return d.isNumber(b)&&b>=0&&i>=b},k=function(a){return a},l=function(a){return function(b){return null===b?void 0:b[a]}},m=function(a,b,c){if(void 0===b)return a;switch(null===c?3:c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)};case 4:return function(c,d,e,f){return a.call(b,c,d,e,f)}}return function(){return a.apply(b,arguments)}},n=function(a,b){return function(c){var d=arguments.length;if(2>d||null===c)return c;for(var e=1;d>e;e++)for(var f=arguments[e],g=a(f),h=g.length,i=0;h>i;i++){var j=g[i];b&&void 0!==c[j]||(c[j]=f[j])}return c}},o=null;c=o=n(f);var p,q=function(a,b){var c=f(b),d=c.length;if(null===a)return!d;for(var e=Object(a),g=0;d>g;g++){var h=c[g];if(b[h]!==e[h]||!(h in e))return!1}return!0},r=null;p=r=function(a){return a=c({},a),function(b){return q(b,a)}};var s,t=function(a,b,c){return null===a?k:g(a)?m(a,b,c):h(a)?p(a):l(a)},u=null;s=u=function(a,b,c){b=t(b,c);for(var d=!j(a)&&f(a),e=(d||a).length,g=0;e>g;g++){var h=d?d[g]:g;if(!b(a[h],h,a))return!1}return!0};var v=function(b,c,f,g){return f||d.isDefined(b)&&d.isDefined(c)?d.isFunction(c)?!1:(g=d.defaultTo(c,"cb"),a.error(e+g+" is not a function"),!0):!0},w=function(a,b,c){if(!v(void 0,c,!0,"internalCb")&&!v(a,b))for(var d in a)a.hasOwnProperty(d)&&c(a[d],d)},x=function(a,b){w(a,b,function(a,c){b(a,c)})};return{each:x,forEach:x,every:s,all:u}}]),angular.module("leaflet-directive").factory("leafletLayerHelpers",["$rootScope","$log","$q","leafletHelpers","leafletIterators",function($rootScope,$log,$q,leafletHelpers,leafletIterators){function isValidLayerType(a){return isString(a.type)?-1===Object.keys(layerTypes).indexOf(a.type)?($log.error("[AngularJS - Leaflet] A layer must have a valid type: "+Object.keys(layerTypes)),!1):layerTypes[a.type].mustHaveUrl&&!isString(a.url)?($log.error("[AngularJS - Leaflet] A base layer must have an url"),!1):layerTypes[a.type].mustHaveData&&!isDefined(a.data)?($log.error('[AngularJS - Leaflet] The base layer must have a "data" array attribute'),!1):layerTypes[a.type].mustHaveLayer&&!isDefined(a.layer)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have an layer defined"),!1):layerTypes[a.type].mustHaveBounds&&!isDefined(a.bounds)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have bounds defined"),!1):layerTypes[a.type].mustHaveKey&&!isDefined(a.key)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have key defined"),!1):!0:($log.error("[AngularJS - Leaflet] A layer must have a valid type defined."),!1)}function createLayer(a){if(isValidLayerType(a)){if(!isString(a.name))return void $log.error("[AngularJS - Leaflet] A base layer must have a name");isObject(a.layerParams)||(a.layerParams={}),isObject(a.layerOptions)||(a.layerOptions={});for(var b in a.layerParams)a.layerOptions[b]=a.layerParams[b];var c={url:a.url,data:a.data,options:a.layerOptions,layer:a.layer,icon:a.icon,type:a.layerType,bounds:a.bounds,key:a.key,apiKey:a.apiKey,pluginOptions:a.pluginOptions,user:a.user};return layerTypes[a.type].createLayer(c)}}function safeAddLayer(a,b){b&&"function"==typeof b.addTo?b.addTo(a):a.addLayer(b)}function safeRemoveLayer(a,b,c){if(isDefined(c)&&isDefined(c.loadedDefer))if(angular.isFunction(c.loadedDefer)){var d=c.loadedDefer();$log.debug("Loaded Deferred",d);var e=d.length;if(e>0)for(var f=function(){e--,0===e&&a.removeLayer(b)},g=0;g'+b.error.message+"";else if("arcgis"===c)for(var e=0;e'+f.layerName+"";for(var g=0;g'+h.label+"
"}}else"image"===c&&(a.innerHTML=' ')},b=function(b,c,d,e){return function(){var f=L.DomUtil.create("div",c);return L.Browser.touch?L.DomEvent.on(f,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(f),L.DomEvent.on(f,"mousewheel",L.DomEvent.stopPropagation)),a(f,b,d,e),f}},c=function(a,b){return function(){for(var c=L.DomUtil.create("div",b),d=0;d'+a.labels[d]+"
";return L.Browser.touch?L.DomEvent.on(c,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(c),L.DomEvent.on(c,"mousewheel",L.DomEvent.stopPropagation)),c}};return{getOnAddLegend:b,getOnAddArrayLegend:c,updateLegend:a}}),angular.module("leaflet-directive").factory("leafletMapDefaults",["$q","leafletHelpers",function(a,b){function c(){return{keyboard:!0,dragging:!0,worldCopyJump:!1,doubleClickZoom:!0,scrollWheelZoom:!0,tap:!0,touchZoom:!0,zoomControl:!0,zoomsliderControl:!1,zoomControlPosition:"topleft",attributionControl:!0,controls:{layers:{visible:!0,position:"topright",collapsed:!0}},nominatim:{server:" http://nominatim.openstreetmap.org/search"},crs:L.CRS.EPSG3857,tileLayer:"//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",tileLayerOptions:{attribution:'© OpenStreetMap contributors'},path:{weight:10,opacity:1,color:"#0000ff"},center:{lat:0,lng:0,zoom:1}}}var d=b.isDefined,e=b.isObject,f=b.obtainEffectiveMapId,g={};return{reset:function(){g={}},getDefaults:function(a){var b=f(g,a);return g[b]},getMapCreationDefaults:function(a){var b=f(g,a),c=g[b],e={maxZoom:c.maxZoom,keyboard:c.keyboard,dragging:c.dragging,zoomControl:c.zoomControl,doubleClickZoom:c.doubleClickZoom,scrollWheelZoom:c.scrollWheelZoom,tap:c.tap,touchZoom:c.touchZoom,attributionControl:c.attributionControl,worldCopyJump:c.worldCopyJump,crs:c.crs};if(d(c.minZoom)&&(e.minZoom=c.minZoom),d(c.zoomAnimation)&&(e.zoomAnimation=c.zoomAnimation),d(c.fadeAnimation)&&(e.fadeAnimation=c.fadeAnimation),d(c.markerZoomAnimation)&&(e.markerZoomAnimation=c.markerZoomAnimation),c.map)for(var h in c.map)e[h]=c.map[h];return e},setDefaults:function(a,b){var h=c();d(a)&&(h.doubleClickZoom=d(a.doubleClickZoom)?a.doubleClickZoom:h.doubleClickZoom,h.scrollWheelZoom=d(a.scrollWheelZoom)?a.scrollWheelZoom:h.doubleClickZoom,h.tap=d(a.tap)?a.tap:h.tap,h.touchZoom=d(a.touchZoom)?a.touchZoom:h.doubleClickZoom,h.zoomControl=d(a.zoomControl)?a.zoomControl:h.zoomControl,h.zoomsliderControl=d(a.zoomsliderControl)?a.zoomsliderControl:h.zoomsliderControl,h.attributionControl=d(a.attributionControl)?a.attributionControl:h.attributionControl,h.tileLayer=d(a.tileLayer)?a.tileLayer:h.tileLayer,h.zoomControlPosition=d(a.zoomControlPosition)?a.zoomControlPosition:h.zoomControlPosition,h.keyboard=d(a.keyboard)?a.keyboard:h.keyboard,h.dragging=d(a.dragging)?a.dragging:h.dragging,d(a.controls)&&angular.extend(h.controls,a.controls),e(a.crs)?h.crs=a.crs:d(L.CRS[a.crs])&&(h.crs=L.CRS[a.crs]),d(a.center)&&angular.copy(a.center,h.center),d(a.tileLayerOptions)&&angular.copy(a.tileLayerOptions,h.tileLayerOptions),d(a.maxZoom)&&(h.maxZoom=a.maxZoom),d(a.minZoom)&&(h.minZoom=a.minZoom),d(a.zoomAnimation)&&(h.zoomAnimation=a.zoomAnimation),d(a.fadeAnimation)&&(h.fadeAnimation=a.fadeAnimation),d(a.markerZoomAnimation)&&(h.markerZoomAnimation=a.markerZoomAnimation),d(a.worldCopyJump)&&(h.worldCopyJump=a.worldCopyJump),d(a.map)&&(h.map=a.map),d(a.path)&&(h.path=a.path));var i=f(g,b);return g[i]=h,h}}}]),angular.module("leaflet-directive").service("leafletMarkersHelpers",["$rootScope","$timeout","leafletHelpers","$log","$compile","leafletGeoJsonHelpers",function(a,b,c,d,e,f){var g=c.isDefined,h=c.defaultTo,i=c.MarkerClusterPlugin,j=c.AwesomeMarkersPlugin,k=c.VectorMarkersPlugin,l=c.MakiMarkersPlugin,m=c.ExtraMarkersPlugin,n=c.DomMarkersPlugin,o=c.safeApply,p=c,q=c.isString,r=c.isNumber,s=c.isObject,t={},u=f,v=c.errorHeader,w=function(a){
-var b="";return["_icon","_latlng","_leaflet_id","_map","_shadow"].forEach(function(c){b+=c+": "+h(a[c],"undefined")+" \n"}),"[leafletMarker] : \n"+b},x=function(a,b){var c=b?console:d;c.debug(w(a))},y=function(b){if(g(b)&&g(b.type)&&"awesomeMarker"===b.type)return j.isLoaded()||d.error(v+" The AwesomeMarkers Plugin is not loaded."),new L.AwesomeMarkers.icon(b);if(g(b)&&g(b.type)&&"vectorMarker"===b.type)return k.isLoaded()||d.error(v+" The VectorMarkers Plugin is not loaded."),new L.VectorMarkers.icon(b);if(g(b)&&g(b.type)&&"makiMarker"===b.type)return l.isLoaded()||d.error(v+"The MakiMarkers Plugin is not loaded."),new L.MakiMarkers.icon(b);if(g(b)&&g(b.type)&&"extraMarker"===b.type)return m.isLoaded()||d.error(v+"The ExtraMarkers Plugin is not loaded."),new L.ExtraMarkers.icon(b);if(g(b)&&g(b.type)&&"div"===b.type)return new L.divIcon(b);if(g(b)&&g(b.type)&&"dom"===b.type){n.isLoaded()||d.error(v+"The DomMarkers Plugin is not loaded.");var c=angular.isFunction(b.getMarkerScope)?b.getMarkerScope():a,f=e(b.template)(c),h=angular.copy(b);return h.element=f[0],new L.DomMarkers.icon(h)}if(g(b)&&g(b.type)&&"icon"===b.type)return b.icon;var i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAGmklEQVRYw7VXeUyTZxjvNnfELFuyIzOabermMZEeQC/OclkO49CpOHXOLJl/CAURuYbQi3KLgEhbrhZ1aDwmaoGqKII6odATmH/scDFbdC7LvFqOCc+e95s2VG50X/LLm/f4/Z7neY/ne18aANCmAr5E/xZf1uDOkTcGcWR6hl9247tT5U7Y6SNvWsKT63P58qbfeLJG8M5qcgTknrvvrdDbsT7Ml+tv82X6vVxJE33aRmgSyYtcWVMqX97Yv2JvW39UhRE2HuyBL+t+gK1116ly06EeWFNlAmHxlQE0OMiV6mQCScusKRlhS3QLeVJdl1+23h5dY4FNB3thrbYboqptEFlphTC1hSpJnbRvxP4NWgsE5Jyz86QNNi/5qSUTGuFk1gu54tN9wuK2wc3o+Wc13RCmsoBwEqzGcZsxsvCSy/9wJKf7UWf1mEY8JWfewc67UUoDbDjQC+FqK4QqLVMGGR9d2wurKzqBk3nqIT/9zLxRRjgZ9bqQgub+DdoeCC03Q8j+0QhFhBHR/eP3U/zCln7Uu+hihJ1+bBNffLIvmkyP0gpBZWYXhKussK6mBz5HT6M1Nqpcp+mBCPXosYQfrekGvrjewd59/GvKCE7TbK/04/ZV5QZYVWmDwH1mF3xa2Q3ra3DBC5vBT1oP7PTj4C0+CcL8c7C2CtejqhuCnuIQHaKHzvcRfZpnylFfXsYJx3pNLwhKzRAwAhEqG0SpusBHfAKkxw3w4627MPhoCH798z7s0ZnBJ/MEJbZSbXPhER2ih7p2ok/zSj2cEJDd4CAe+5WYnBCgR2uruyEw6zRoW6/DWJ/OeAP8pd/BGtzOZKpG8oke0SX6GMmRk6GFlyAc59K32OTEinILRJRchah8HQwND8N435Z9Z0FY1EqtxUg+0SO6RJ/mmXz4VuS+DpxXC3gXmZwIL7dBSH4zKE50wESf8qwVgrP1EIlTO5JP9Igu0aexdh28F1lmAEGJGfh7jE6ElyM5Rw/FDcYJjWhbeiBYoYNIpc2FT/SILivp0F1ipDWk4BIEo2VuodEJUifhbiltnNBIXPUFCMpthtAyqws/BPlEF/VbaIxErdxPphsU7rcCp8DohC+GvBIPJS/tW2jtvTmmAeuNO8BNOYQeG8G/2OzCJ3q+soYB5i6NhMaKr17FSal7GIHheuV3uSCY8qYVuEm1cOzqdWr7ku/R0BDoTT+DT+ohCM6/CCvKLKO4RI+dXPeAuaMqksaKrZ7L3FE5FIFbkIceeOZ2OcHO6wIhTkNo0ffgjRGxEqogXHYUPHfWAC/lADpwGcLRY3aeK4/oRGCKYcZXPVoeX/kelVYY8dUGf8V5EBRbgJXT5QIPhP9ePJi428JKOiEYhYXFBqou2Guh+p/mEB1/RfMw6rY7cxcjTrneI1FrDyuzUSRm9miwEJx8E/gUmqlyvHGkneiwErR21F3tNOK5Tf0yXaT+O7DgCvALTUBXdM4YhC/IawPU+2PduqMvuaR6eoxSwUk75ggqsYJ7VicsnwGIkZBSXKOUww73WGXyqP+J2/b9c+gi1YAg/xpwck3gJuucNrh5JvDPvQr0WFXf0piyt8f8/WI0hV4pRxxkQZdJDfDJNOAmM0Ag8jyT6hz0WGXWuP94Yh2jcfjmXAGvHCMslRimDHYuHuDsy2QtHuIavznhbYURq5R57KpzBBRZKPJi8eQg48h4j8SDdowifdIrEVdU+gbO6QNvRRt4ZBthUaZhUnjlYObNagV3keoeru3rU7rcuceqU1mJBxy+BWZYlNEBH+0eH4vRiB+OYybU2hnblYlTvkHinM4m54YnxSyaZYSF6R3jwgP7udKLGIX6r/lbNa9N6y5MFynjWDtrHd75ZvTYAPO/6RgF0k76mQla3FGq7dO+cH8sKn0Vo7nDllwAhqwLPkxrHwWmHJOo+AKJ4rab5OgrM7rVu8eWb2Pu0Dh4eDgXoOfvp7Y7QeqknRmvcTBEyq9m/HQQSCSz6LHq3z0yzsNySRfMS253wl2KyRDbcZPcfJKjZmSEOjcxyi+Y8dUOtsIEH6R2wNykdqrkYJ0RV92H0W58pkfQk7cKevsLK10Py8SdMGfXNXATY+pPbyJR/ET6n9nIfztNtZYRV9XniQu9IA2vOVgy4ir7GCLVmmd+zjkH0eAF9Po6K61pmCXHxU5rHMYd1ftc3owjwRSVRzLjKvqZEty6cRUD7jGqiOdu5HG6MdHjNcNYGqfDm5YRzLBBCCDl/2bk8a8gdbqcfwECu62Fg/HrggAAAABJRU5ErkJggg==",o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=";return g(b)&&g(b.iconUrl)?new L.Icon(b):new L.Icon.Default({iconUrl:i,shadowUrl:o,iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]})},z=function(a){g(t[a])&&t.splice(a,1)},A=function(){t={}},B=function(a,b,c){if(a.closePopup(),g(c)&&g(c.overlays))for(var d in c.overlays)if((c.overlays[d]instanceof L.LayerGroup||c.overlays[d]instanceof L.FeatureGroup)&&c.overlays[d].hasLayer(a))return void c.overlays[d].removeLayer(a);if(g(t))for(var e in t)t[e].hasLayer(a)&&t[e].removeLayer(a);b.hasLayer(a)&&b.removeLayer(a)},C=function(a,b){var c=a._popup._container.offsetHeight,d=new L.Point(a._popup._containerLeft,-c-a._popup._containerBottom),e=b.layerPointToContainerPoint(d);null!==e&&a._popup._adjustPan()},D=function(a,b){e(a._popup._contentNode)(b)},E=function(a,c,d){var e=a._popup._contentNode.innerText||a._popup._contentNode.textContent;e.length<1&&b(function(){E(a,c,d)});var f=a._popup._contentNode.offsetWidth;return a._popup._updateLayout(),a._popup._updatePosition(),a._popup.options.autoPan&&C(a,d),f},F=function(b,c,e){var f=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,h=g(c.compileMessage)?c.compileMessage:!0;if(h){if(!g(b._popup)||!g(b._popup._contentNode))return d.error(v+"Popup is invalid or does not have any content."),!1;D(b,f),E(b,c,e)}},G=function(b,c){var d=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,f=angular.isFunction(c.getLabelScope)?c.getLabelScope():d,h=g(c.compileMessage)?c.compileMessage:!0;p.LabelPlugin.isLoaded()&&g(c.label)&&(g(c.label.options)&&c.label.options.noHide===!0&&b.showLabel(),h&&g(b.label)&&e(b.label._container)(f))},H=function(a,b,c,e,f,h,i){if(g(b)){if(!u.validateCoords(a))return d.warn("There are problems with lat-lng data, please verify your marker model"),void B(c,i,h);var j=a===b;if(g(a.iconAngle)&&b.iconAngle!==a.iconAngle&&c.setIconAngle(a.iconAngle),q(a.layer)||q(b.layer)&&(g(h.overlays[b.layer])&&h.overlays[b.layer].hasLayer(c)&&(h.overlays[b.layer].removeLayer(c),c.closePopup()),i.hasLayer(c)||i.addLayer(c)),(r(a.opacity)||r(parseFloat(a.opacity)))&&a.opacity!==b.opacity&&c.setOpacity(a.opacity),q(a.layer)&&b.layer!==a.layer){if(q(b.layer)&&g(h.overlays[b.layer])&&h.overlays[b.layer].hasLayer(c)&&h.overlays[b.layer].removeLayer(c),c.closePopup(),i.hasLayer(c)&&i.removeLayer(c),!g(h.overlays[a.layer]))return void d.error(v+"You must use a name of an existing layer");var k=h.overlays[a.layer];if(!(k instanceof L.LayerGroup||k instanceof L.FeatureGroup))return void d.error(v+'A marker can only be added to a layer of type "group" or "featureGroup"');k.addLayer(c),i.hasLayer(c)&&a.focus===!0&&c.openPopup()}if(a.draggable!==!0&&b.draggable===!0&&g(c.dragging)&&c.dragging.disable(),a.draggable===!0&&b.draggable!==!0&&(c.dragging?c.dragging.enable():L.Handler.MarkerDrag&&(c.dragging=new L.Handler.MarkerDrag(c),c.options.draggable=!0,c.dragging.enable())),s(a.icon)||s(b.icon)&&(c.setIcon(y()),c.closePopup(),c.unbindPopup(),q(a.message)&&c.bindPopup(a.message,a.popupOptions)),s(a.icon)&&s(b.icon)&&!angular.equals(a.icon,b.icon)){var l=!1;c.dragging&&(l=c.dragging.enabled()),c.setIcon(y(a.icon)),l&&c.dragging.enable(),c.closePopup(),c.unbindPopup(),q(a.message)&&(c.bindPopup(a.message,a.popupOptions),i.hasLayer(c)&&a.focus===!0&&c.openPopup())}!q(a.message)&&q(b.message)&&(c.closePopup(),c.unbindPopup()),p.LabelPlugin.isLoaded()&&(g(a.label)&&g(a.label.message)?"label"in b&&"message"in b.label&&!angular.equals(a.label.message,b.label.message)?c.updateLabelContent(a.label.message):!angular.isFunction(c.getLabel)||angular.isFunction(c.getLabel)&&!g(c.getLabel())?(c.bindLabel(a.label.message,a.label.options),G(c,a)):G(c,a):(!("label"in a)||"message"in a.label)&&angular.isFunction(c.unbindLabel)&&c.unbindLabel()),q(a.message)&&!q(b.message)&&c.bindPopup(a.message,a.popupOptions),q(a.message)&&q(b.message)&&a.message!==b.message&&c.setPopupContent(a.message);var m=!1;a.focus!==!0&&b.focus===!0&&(c.closePopup(),m=!0),(a.focus===!0&&(!g(b.focus)||b.focus===!1)||j&&a.focus===!0)&&(c.openPopup(),m=!0),b.zIndexOffset!==a.zIndexOffset&&c.setZIndexOffset(a.zIndexOffset);var n=c.getLatLng(),o=q(a.layer)&&p.MarkerClusterPlugin.is(h.overlays[a.layer]);o?m?(a.lat!==b.lat||a.lng!==b.lng)&&(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):n.lat!==a.lat||n.lng!==a.lng?(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):a.lat!==b.lat||a.lng!==b.lng?(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):s(a.icon)&&s(b.icon)&&!angular.equals(a.icon,b.icon)&&(h.overlays[a.layer].removeLayer(c),h.overlays[a.layer].addLayer(c)):(n.lat!==a.lat||n.lng!==a.lng)&&c.setLatLng([a.lat,a.lng])}};return{resetMarkerGroup:z,resetMarkerGroups:A,deleteMarker:B,manageOpenPopup:F,manageOpenLabel:G,createMarker:function(a){if(!g(a)||!u.validateCoords(a))return void d.error(v+"The marker definition is not valid.");var b=u.getCoords(a);if(!g(b))return void d.error(v+"Unable to get coordinates from markerData.");var c={icon:y(a.icon),title:g(a.title)?a.title:"",draggable:g(a.draggable)?a.draggable:!1,clickable:g(a.clickable)?a.clickable:!0,riseOnHover:g(a.riseOnHover)?a.riseOnHover:!1,zIndexOffset:g(a.zIndexOffset)?a.zIndexOffset:0,iconAngle:g(a.iconAngle)?a.iconAngle:0};for(var e in a)a.hasOwnProperty(e)&&!c.hasOwnProperty(e)&&(c[e]=a[e]);var f=new L.marker(b,c);return q(a.message)||f.unbindPopup(),f},addMarkerToGroup:function(a,b,c,e){return q(b)?i.isLoaded()?(g(t[b])||(t[b]=new L.MarkerClusterGroup(c),e.addLayer(t[b])),void t[b].addLayer(a)):void d.error(v+"The MarkerCluster plugin is not loaded."):void d.error(v+"The marker group you have specified is invalid.")},listenMarkerEvents:function(a,b,c,d,e){a.on("popupopen",function(){o(c,function(){(g(a._popup)||g(a._popup._contentNode))&&(b.focus=!0,F(a,b,e))})}),a.on("popupclose",function(){o(c,function(){b.focus=!1})}),a.on("add",function(){o(c,function(){"label"in b&&G(a,b)})})},updateMarker:H,addMarkerWatcher:function(a,b,c,d,e,f){var i=p.getObjectArrayPath("markers."+b);f=h(f,!0);var j=c.$watch(i,function(f,h){return g(f)?void H(f,h,a,b,c,d,e):(B(a,e,d),void j())},f)},string:w,log:x}}]),angular.module("leaflet-directive").factory("leafletPathsHelpers",["$rootScope","$log","leafletHelpers",function(a,b,c){function d(a){return a.filter(function(a){return k(a)}).map(function(a){return e(a)})}function e(a){return i(a)?new L.LatLng(a[0],a[1]):new L.LatLng(a.lat,a.lng)}function f(a){return a.map(function(a){return d(a)})}function g(a,b){for(var c={},d=0;d0&&e(a[0].boundingbox)?i.resolve(a[0]):i.reject("[Nominatim] Invalid address")}),i.promise}}}]),angular.module("leaflet-directive").directive("bounds",["$log","$timeout","$http","leafletHelpers","nominatimService","leafletBoundsHelpers",function(a,b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:["leaflet"],link:function(c,g,h,i){var j=d.isDefined,k=f.createLeafletBounds,l=i[0].getLeafletScope(),m=i[0],n=d.errorHeader+" [Bounds] ",o=function(a){return 0===a._southWest.lat&&0===a._southWest.lng&&0===a._northEast.lat&&0===a._northEast.lng};m.getMap().then(function(d){l.$on("boundsChanged",function(a){var c=a.currentScope,e=d.getBounds();if(!o(e)&&!c.settingBoundsFromScope){c.settingBoundsFromLeaflet=!0;var f={northEast:{lat:e._northEast.lat,lng:e._northEast.lng},southWest:{lat:e._southWest.lat,lng:e._southWest.lng},options:e.options};angular.equals(c.bounds,f)||(c.bounds=f),b(function(){c.settingBoundsFromLeaflet=!1})}});var f;l.$watch("bounds",function(g){if(!c.settingBoundsFromLeaflet){if(j(g.address)&&g.address!==f)return c.settingBoundsFromScope=!0,e.query(g.address,h.id).then(function(a){var b=a.boundingbox,c=[[b[0],b[2]],[b[1],b[3]]];d.fitBounds(c)},function(b){a.error(n+" "+b+".")}),f=g.address,void b(function(){c.settingBoundsFromScope=!1});var i=k(g);i&&!d.getBounds().equals(i)&&(c.settingBoundsFromScope=!0,d.fitBounds(i,g.options),b(function(){c.settingBoundsFromScope=!1}))}},!0)})}}}]);var centerDirectiveTypes=["center","lfCenter"],centerDirectives={};centerDirectiveTypes.forEach(function(a){centerDirectives[a]=["$log","$q","$location","$timeout","leafletMapDefaults","leafletHelpers","leafletBoundsHelpers","leafletMapEvents",function(b,c,d,e,f,g,h,i){var j,k=g.isDefined,l=g.isNumber,m=g.isSameCenterOnMap,n=g.safeApply,o=g.isValidCenter,p=h.isValidBounds,q=g.isUndefinedOrEmpty,r=g.errorHeader,s=function(a,b){return k(a)&&p(a)&&q(b)};return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:function(){j=c.defer(),this.getCenter=function(){return j.promise}},link:function(c,g,p,q){var t=q.getLeafletScope(),u=t[a];q.getMap().then(function(c){var g=f.getDefaults(p.id);if(-1!==p[a].search("-"))return b.error(r+' The "center" variable can\'t use a "-" on its key name: "'+p[a]+'".'),void c.setView([g.center.lat,g.center.lng],g.center.zoom);if(s(t.bounds,u))c.fitBounds(h.createLeafletBounds(t.bounds),t.bounds.options),u=c.getCenter(),n(t,function(b){angular.extend(b[a],{lat:c.getCenter().lat,lng:c.getCenter().lng,zoom:c.getZoom(),autoDiscover:!1})}),n(t,function(a){var b=c.getBounds();a.bounds={northEast:{lat:b._northEast.lat,lng:b._northEast.lng},southWest:{lat:b._southWest.lat,lng:b._southWest.lng}}});else{if(!k(u))return b.error(r+' The "center" property is not defined in the main scope'),void c.setView([g.center.lat,g.center.lng],g.center.zoom);k(u.lat)&&k(u.lng)||k(u.autoDiscover)||angular.copy(g.center,u)}var q,v;if("yes"===p.urlHashCenter){var w=function(){var a,b=d.search();if(k(b.c)){var c=b.c.split(":");3===c.length&&(a={lat:parseFloat(c[0]),lng:parseFloat(c[1]),zoom:parseInt(c[2],10)})}return a};q=w(),t.$on("$locationChangeSuccess",function(b){var d=b.currentScope,e=w();k(e)&&!m(e,c)&&angular.extend(d[a],{lat:e.lat,lng:e.lng,zoom:e.zoom})})}t.$watch(a,function(a){return t.settingCenterFromLeaflet?void 0:(k(q)&&(angular.copy(q,a),q=void 0),o(a)||a.autoDiscover===!0?a.autoDiscover===!0?(l(a.zoom)||c.setView([g.center.lat,g.center.lng],g.center.zoom),void(l(a.zoom)&&a.zoom>g.center.zoom?c.locate({setView:!0,maxZoom:a.zoom}):k(g.maxZoom)?c.locate({setView:!0,maxZoom:g.maxZoom}):c.locate({setView:!0}))):void(v&&m(a,c)||(t.settingCenterFromScope=!0,c.setView([a.lat,a.lng],a.zoom),i.notifyCenterChangedToBounds(t,c),e(function(){t.settingCenterFromScope=!1}))):void b.warn(r+" invalid 'center'"))},!0),c.whenReady(function(){v=!0}),c.on("moveend",function(){j.resolve(),i.notifyCenterUrlHashChanged(t,c,p,d.search()),m(u,c)||t.settingCenterFromScope||(t.settingCenterFromLeaflet=!0,n(t,function(b){t.settingCenterFromScope||angular.extend(b[a],{lat:c.getCenter().lat,lng:c.getCenter().lng,zoom:c.getZoom(),autoDiscover:!1}),i.notifyCenterChangedToBounds(t,c),e(function(){t.settingCenterFromLeaflet=!1})}))}),u.autoDiscover===!0&&c.on("locationerror",function(){b.warn(r+" The Geolocation API is unauthorized on this page."),o(u)?(c.setView([u.lat,u.lng],u.zoom),i.notifyCenterChangedToBounds(t,c)):(c.setView([g.center.lat,g.center.lng],g.center.zoom),i.notifyCenterChangedToBounds(t,c))})})}}}]}),centerDirectiveTypes.forEach(function(a){angular.module("leaflet-directive").directive(a,centerDirectives[a])}),angular.module("leaflet-directive").directive("controls",["$log","leafletHelpers","leafletControlHelpers",function(a,b,c){return{restrict:"A",scope:!1,replace:!1,require:"?^leaflet",link:function(d,e,f,g){if(g){var h=c.createControl,i=c.isValidControlType,j=g.getLeafletScope(),k=b.isDefined,l=b.isArray,m={},n=b.errorHeader+" [Controls] ";g.getMap().then(function(b){j.$watchCollection("controls",function(c){for(var d in m)k(c[d])||(b.hasControl(m[d])&&b.removeControl(m[d]),delete m[d]);for(var e in c){var f,g=k(c[e].type)?c[e].type:e;if(!i(g))return void a.error(n+" Invalid control type: "+g+".");if("custom"!==g)f=h(g,c[e]),b.addControl(f),m[e]=f;else{var j=c[e];if(l(j))for(var o in j){var p=j[o];b.addControl(p),m[e]=k(m[e])?m[e].concat([p]):[p]}else b.addControl(j),m[e]=j}}})})}}}}]),angular.module("leaflet-directive").directive("decorations",["$log","leafletHelpers",function(a,b){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(c,d,e,f){function g(b){return k(b)&&k(b.coordinates)&&(j.isLoaded()||a.error("[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.")),L.polylineDecorator(b.coordinates)}function h(a,b){return k(a)&&k(b)&&k(b.coordinates)&&k(b.patterns)?(a.setPaths(b.coordinates),a.setPatterns(b.patterns),a):void 0}var i=f.getLeafletScope(),j=b.PolylineDecoratorPlugin,k=b.isDefined,l={};f.getMap().then(function(a){i.$watch("decorations",function(b){for(var c in l)k(b[c])&&angular.equals(b[c],l)||(a.removeLayer(l[c]),delete l[c]);for(var d in b){var e=b[d],f=g(e);k(f)&&(l[d]=f,a.addLayer(f),h(f,e))}},!0)})}}}]),angular.module("leaflet-directive").directive("eventBroadcast",["$log","$rootScope","leafletHelpers","leafletMapEvents","leafletIterators",function(a,b,c,d,e){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(b,f,g,h){var i=c.isObject,j=c.isDefined,k=h.getLeafletScope(),l=k.eventBroadcast,m=d.getAvailableMapEvents(),n=d.addEvents;h.getMap().then(function(b){var c=[],d="broadcast";j(l.map)?i(l.map)?("emit"!==l.map.logic&&"broadcast"!==l.map.logic?a.warn("[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'."):d=l.map.logic,i(l.map.enable)&&l.map.enable.length>=0?e.each(l.map.enable,function(a){-1===c.indexOf(a)&&-1!==m.indexOf(a)&&c.push(a)}):a.warn("[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.")):a.warn("[AngularJS - Leaflet] event-broadcast.map must be an object check your model."):c=m,n(b,c,"eventName",k,d)})}}}]),angular.module("leaflet-directive").directive("geojson",["$log","$rootScope","leafletData","leafletHelpers","leafletWatchHelpers","leafletDirectiveControlsHelpers","leafletIterators","leafletGeoJsonEvents",function(a,b,c,d,e,f,g,h){var i=e.maybeWatch,j=d.watchOptions,k=f.extend,l=d,m=g;return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,b,e,f){var g=d.isDefined,n=f.getLeafletScope(),o={},p=!1;f.getMap().then(function(a){var b=n.geojsonWatchOptions||j,f=function(a,b){var c;return c=angular.isFunction(a.onEachFeature)?a.onEachFeature:function(c,f){d.LabelPlugin.isLoaded()&&g(c.properties.description)&&f.bindLabel(c.properties.description),h.bindEvents(e.id,f,null,c,n,b,{resetStyleOnMouseout:a.resetStyleOnMouseout,mapId:e.id})}},q=l.isDefined(e.geojsonNested)&&l.isTruthy(e.geojsonNested),r=function(){if(o){var b=function(b){g(b)&&a.hasLayer(b)&&a.removeLayer(b)};return q?void m.each(o,function(a){b(a)}):void b(o)}},s=function(b,d){var h=angular.copy(b);if(g(h)&&g(h.data)){var i=f(h,d);g(h.options)||(h.options={style:h.style,filter:h.filter,onEachFeature:i,pointToLayer:h.pointToLayer});var j=L.geoJson(h.data,h.options);d&&l.isString(d)?o[d]=j:o=j,j.addTo(a),p||(p=!0,c.setGeoJSON(o,e.id))}},t=function(a){if(r(),q){if(!a||!Object.keys(a).length)return;return void m.each(a,function(a,b){s(a,b)})}s(a)};k(e.id,"geojson",t,r),i(n,"geojson",b,function(a){t(a)})})}}}]),angular.module("leaflet-directive").directive("layercontrol",["$filter","$log","leafletData","leafletHelpers",function(a,b,c,d){return{restrict:"E",scope:{icons:"=?",autoHideOpacity:"=?",showGroups:"=?",title:"@",baseTitle:"@",overlaysTitle:"@"},replace:!0,transclude:!1,require:"^leaflet",controller:["$scope","$element","$sce",function(a,e,f){b.debug("[Angular Directive - Layers] layers",a,e);var g=d.safeApply,h=d.isDefined;angular.extend(a,{baselayer:"",oldGroup:"",layerProperties:{},groupProperties:{},rangeIsSupported:d.rangeIsSupported(),changeBaseLayer:function(b,e){d.safeApply(a,function(d){d.baselayer=b,c.getMap().then(function(e){c.getLayers().then(function(c){if(!e.hasLayer(c.baselayers[b])){for(var f in d.layers.baselayers)d.layers.baselayers[f].icon=d.icons.unradio,e.hasLayer(c.baselayers[f])&&e.removeLayer(c.baselayers[f]);e.addLayer(c.baselayers[b]),d.layers.baselayers[b].icon=a.icons.radio}})})}),e.preventDefault()},moveLayer:function(b,c,d){var e=Object.keys(a.layers.baselayers).length;if(c>=1+e&&c<=a.overlaysArray.length+e){var f;for(var h in a.layers.overlays)if(a.layers.overlays[h].index===c){f=a.layers.overlays[h];break}f&&g(a,function(){f.index=b.index,b.index=c})}d.stopPropagation(),d.preventDefault()},initIndex:function(b,c){var d=Object.keys(a.layers.baselayers).length;b.index=h(b.index)?b.index:c+d+1},initGroup:function(b){a.groupProperties[b]=a.groupProperties[b]?a.groupProperties[b]:{}},toggleOpacity:function(b,c){if(c.visible){if(a.autoHideOpacity&&!a.layerProperties[c.name].opacityControl)for(var d in a.layerProperties)a.layerProperties[d].opacityControl=!1;a.layerProperties[c.name].opacityControl=!a.layerProperties[c.name].opacityControl}b.stopPropagation(),b.preventDefault()},toggleLegend:function(b){a.layerProperties[b.name].showLegend=!a.layerProperties[b.name].showLegend},showLegend:function(b){return b.legend&&a.layerProperties[b.name].showLegend},unsafeHTML:function(a){return f.trustAsHtml(a)},getOpacityIcon:function(b){return b.visible&&a.layerProperties[b.name].opacityControl?a.icons.close:a.icons.open},getGroupIcon:function(b){return b.visible?a.icons.check:a.icons.uncheck},changeOpacity:function(b){var d=a.layerProperties[b.name].opacity;c.getMap().then(function(e){c.getLayers().then(function(c){var f;for(var g in a.layers.overlays)if(a.layers.overlays[g]===b){f=c.overlays[g];break}e.hasLayer(f)&&(f.setOpacity&&f.setOpacity(d/100),f.getLayers&&f.eachLayer&&f.eachLayer(function(a){a.setOpacity&&a.setOpacity(d/100)}))})})},changeGroupVisibility:function(b){if(h(a.groupProperties[b])){var c=a.groupProperties[b].visible;for(var d in a.layers.overlays){var e=a.layers.overlays[d];e.group===b&&(e.visible=c)}}}});var i=e.get(0);L.Browser.touch?L.DomEvent.on(i,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(i),L.DomEvent.on(i,"mousewheel",L.DomEvent.stopPropagation))}],template:'',link:function(a,b,e,f){var g=d.isDefined,h=f.getLeafletScope(),i=h.layers;a.$watch("icons",function(){var b={uncheck:"fa fa-square-o",check:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",unradio:"fa fa-circle-o",up:"fa fa-angle-up",down:"fa fa-angle-down",open:"fa fa-angle-double-down",close:"fa fa-angle-double-up",toggleLegend:"fa fa-pencil-square-o"};g(a.icons)?(angular.extend(b,a.icons),angular.extend(a.icons,b)):a.icons=b}),e.order=!g(e.order)||"normal"!==e.order&&"reverse"!==e.order?"normal":e.order,a.order="normal"===e.order,a.orderNumber="normal"===e.order?-1:1,a.layers=i,f.getMap().then(function(b){h.$watch("layers.baselayers",function(d){var e={};c.getLayers().then(function(c){var f;for(f in d){var g=d[f];g.icon=a.icons[b.hasLayer(c.baselayers[f])?"radio":"unradio"],e[f]=g}a.baselayersArray=e})}),h.$watch("layers.overlays",function(b){var d=[],e={};c.getLayers().then(function(c){var f;for(f in b){var h=b[f];h.icon=a.icons[h.visible?"check":"uncheck"],d.push(h),g(a.layerProperties[h.name])||(a.layerProperties[h.name]={opacity:g(h.layerOptions.opacity)?100*h.layerOptions.opacity:100,opacityControl:!1,showLegend:!0}),g(h.group)&&(g(a.groupProperties[h.group])||(a.groupProperties[h.group]={visible:!1}),e[h.group]=g(e[h.group])?e[h.group]:{count:0,visibles:0},e[h.group].count++,h.visible&&e[h.group].visibles++),g(h.index)&&c.overlays[f].setZIndex&&c.overlays[f].setZIndex(b[f].index)}for(f in e)a.groupProperties[f].visible=e[f].visibles===e[f].count;a.overlaysArray=d})},!0)})}}}]),angular.module("leaflet-directive").directive("layers",["$log","$q","leafletData","leafletHelpers","leafletLayerHelpers","leafletControlHelpers",function(a,b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:["$scope",function(a){a._leafletLayers=b.defer(),this.getLayers=function(){return a._leafletLayers.promise}}],link:function(a,b,g,h){var i=d.isDefined,j={},k=h.getLeafletScope(),l=k.layers,m=e.createLayer,n=e.safeAddLayer,o=e.safeRemoveLayer,p=f.updateLayersControl,q=!1;h.getMap().then(function(b){a._leafletLayers.resolve(j),c.setLayers(j,g.id),j.baselayers={},j.overlays={};var d=g.id,e=!1;for(var f in l.baselayers){var h=m(l.baselayers[f]);i(h)?(j.baselayers[f]=h,l.baselayers[f].top===!0&&(n(b,j.baselayers[f]),e=!0)):delete l.baselayers[f]}!e&&Object.keys(j.baselayers).length>0&&n(b,j.baselayers[Object.keys(l.baselayers)[0]]);for(f in l.overlays){var r=m(l.overlays[f]);i(r)?(j.overlays[f]=r,l.overlays[f].visible===!0&&n(b,j.overlays[f])):delete l.overlays[f]}k.$watch("layers.baselayers",function(a,c){if(angular.equals(a,c))return q=p(b,d,q,a,l.overlays,j),!0;for(var e in j.baselayers)(!i(a[e])||a[e].doRefresh)&&(b.hasLayer(j.baselayers[e])&&b.removeLayer(j.baselayers[e]),delete j.baselayers[e],a[e]&&a[e].doRefresh&&(a[e].doRefresh=!1));for(var f in a)if(i(j.baselayers[f]))a[f].top!==!0||b.hasLayer(j.baselayers[f])?a[f].top===!1&&b.hasLayer(j.baselayers[f])&&b.removeLayer(j.baselayers[f]):n(b,j.baselayers[f]);else{var g=m(a[f]);i(g)&&(j.baselayers[f]=g,a[f].top===!0&&n(b,j.baselayers[f]))}var h=!1;for(var k in j.baselayers)if(b.hasLayer(j.baselayers[k])){h=!0;break}!h&&Object.keys(j.baselayers).length>0&&n(b,j.baselayers[Object.keys(j.baselayers)[0]]),q=p(b,d,q,a,l.overlays,j)},!0),k.$watch("layers.overlays",function(a,c){if(angular.equals(a,c))return q=p(b,d,q,l.baselayers,a,j),!0;for(var e in j.overlays)if(!i(a[e])||a[e].doRefresh){if(b.hasLayer(j.overlays[e])){var f=i(a[e])?a[e].layerOptions:null;o(b,j.overlays[e],f)}delete j.overlays[e],a[e]&&a[e].doRefresh&&(a[e].doRefresh=!1)}for(var g in a){if(i(j.overlays[g]))a[g].visible&&!b.hasLayer(j.overlays[g])?n(b,j.overlays[g]):a[g].visible===!1&&b.hasLayer(j.overlays[g])&&o(b,j.overlays[g],a[g].layerOptions);else{
-var h=m(a[g]);if(!i(h))continue;j.overlays[g]=h,a[g].visible===!0&&n(b,j.overlays[g])}a[g].visible&&b._loaded&&a[g].data&&"heatmap"===a[g].type&&(j.overlays[g].setData(a[g].data),j.overlays[g].update())}q=p(b,d,q,l.baselayers,a,j)},!0)})}}}]),angular.module("leaflet-directive").directive("legend",["$log","$http","leafletHelpers","leafletLegendHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i,j,k,l,m=c.isArray,n=c.isDefined,o=c.isFunction,p=h.getLeafletScope(),q=p.legend;p.$watch("legend",function(a){n(a)&&(i=a.legendClass?a.legendClass:"legend",j=a.position||"bottomright",l=a.type||"arcgis")},!0),h.getMap().then(function(c){p.$watch("legend",function(b){return n(b)?n(b.url)||"arcgis"!==l||m(b.colors)&&m(b.labels)&&b.colors.length===b.labels.length?n(b.url)?void a.info("[AngularJS - Leaflet] loading legend service."):(n(k)&&(k.removeFrom(c),k=null),k=L.control({position:j}),"arcgis"===l&&(k.onAdd=d.getOnAddArrayLegend(b,i)),void k.addTo(c)):void a.warn("[AngularJS - Leaflet] legend.colors and legend.labels must be set."):void(n(k)&&(k.removeFrom(c),k=null))}),p.$watch("legend.url",function(e){n(e)&&b.get(e).success(function(a){n(k)?d.updateLegend(k.getContainer(),a,l,e):(k=L.control({position:j}),k.onAdd=d.getOnAddLegend(a,i,l,e),k.addTo(c)),n(q.loadedData)&&o(q.loadedData)&&q.loadedData()}).error(function(){a.warn("[AngularJS - Leaflet] legend.url not loaded.")})})})}}}]),angular.module("leaflet-directive").directive("markers",["$log","$rootScope","$q","leafletData","leafletHelpers","leafletMapDefaults","leafletMarkersHelpers","leafletMarkerEvents","leafletIterators","leafletWatchHelpers","leafletDirectiveControlsHelpers",function(a,b,c,d,e,f,g,h,i,j,k){var l=e.isDefined,m=e.errorHeader,n=e,o=e.isString,p=g.addMarkerWatcher,q=g.updateMarker,r=g.listenMarkerEvents,s=g.addMarkerToGroup,t=g.createMarker,u=g.deleteMarker,v=i,w=e.watchOptions,x=j.maybeWatch,y=k.extend,z=function(a,b,c){if(Object.keys(a).length){if(c&&o(c)){if(!a[c]||!Object.keys(a[c]).length)return;return a[c][b]}return a[b]}},A=function(a,b,c,d){return d&&o(d)?(l(b[d])||(b[d]={}),b[d][c]=a):b[c]=a,a},B=function(b,c,d,e,f,g){if(!o(b))return a.error(m+" A layername must be a string"),!1;if(!l(c))return a.error(m+" You must add layers to the directive if the markers are going to use this functionality."),!1;if(!l(c.overlays)||!l(c.overlays[b]))return a.error(m+' A marker can only be added to a layer of type "group"'),!1;var h=c.overlays[b];return h instanceof L.LayerGroup||h instanceof L.FeatureGroup?(h.addLayer(e),!f&&g.hasLayer(e)&&d.focus===!0&&e.openPopup(),!0):(a.error(m+' Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"'),!1)},C=function(b,c,d,e,f,g,i,j,k,o){for(var u in c)if(!o[u])if(-1===u.search("-")){var v=n.copy(c[u]),w=n.getObjectDotPath(k?[k,u]:[u]),x=z(g,u,k);if(l(x)){var y=l(y)?d[u]:void 0;q(v,y,x,w,i,f,e)}else{var C=t(v),D=(v?v.layer:void 0)||k;if(!l(C)){a.error(m+" Received invalid data on the marker "+u+".");continue}if(A(C,g,u,k),l(v.message)&&C.bindPopup(v.message,v.popupOptions),l(v.group)){var E=l(v.groupOption)?v.groupOption:null;s(C,v.group,E,e)}if(n.LabelPlugin.isLoaded()&&l(v.label)&&l(v.label.message)&&C.bindLabel(v.label.message,v.label.options),l(v)&&(l(v.layer)||l(k))){var F=B(D,f,v,C,j.individual.doWatch,e);if(!F)continue}else l(v.group)||(e.addLayer(C),j.individual.doWatch||v.focus!==!0||C.openPopup());j.individual.doWatch&&p(C,w,i,f,e,j.individual.isDeep),r(C,v,i,j.individual.doWatch,e),h.bindEvents(b,C,w,v,i,D)}}else a.error('The marker can\'t use a "-" on his key name: "'+u+'".')},D=function(b,c,d,e,f){var g,h,i=!1,j=!1,k=l(c);for(var o in d)i||(a.debug(m+"[markers] destroy: "),i=!0),k&&(h=b[o],g=c[o],j=angular.equals(h,g)&&e),l(b)&&Object.keys(b).length&&l(b[o])&&Object.keys(b[o]).length&&!j||f&&n.isFunction(f)&&f(h,g,o)},E=function(b,c,d,e,f){D(b,c,d,!1,function(b,c,g){a.debug(m+"[marker] is deleting marker: "+g),u(d[g],e,f),delete d[g]})},F=function(b,c,d){var e={};return D(b,c,d,!0,function(b,c,d){a.debug(m+"[marker] is already rendered, marker: "+d),e[d]=b}),e};return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?layers"],link:function(a,b,e,f){var g=f[0],h=g.getLeafletScope();g.getMap().then(function(a){var b,g={};b=l(f[1])?f[1].getLayers:function(){var a=c.defer();return a.resolve(),a.promise};var i=h.markersWatchOptions||w;l(e.watchMarkers)&&(i.doWatch=i.individual.doWatch=!l(e.watchMarkers)||n.isTruthy(e.watchMarkers));var j=l(e.markersNested)&&n.isTruthy(e.markersNested);b().then(function(b){var c=function(c,d){return j?void v.each(c,function(c,e){var f=l(f)?d[e]:void 0;E(c,f,g[e],a,b)}):void E(c,d,g,a,b)},f=function(d,f){c(d,f);var k=null;return j?void v.each(d,function(c,j){var m=l(m)?f[j]:void 0;k=F(d[j],m,g[j]),C(e.id,c,f,a,b,g,h,i,j,k)}):(k=F(d,f,g),void C(e.id,d,f,a,b,g,h,i,void 0,k))};y(e.id,"markers",f,c),d.setMarkers(g,e.id),x(h,"markers",i,function(a,b){f(a,b)})})})}}}]),angular.module("leaflet-directive").directive("maxbounds",["$log","leafletMapDefaults","leafletBoundsHelpers","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,b,e,f){var g=f.getLeafletScope(),h=c.isValidBounds,i=d.isNumber;f.getMap().then(function(a){g.$watch("maxbounds",function(b){if(!h(b))return void a.setMaxBounds();var d=c.createLeafletBounds(b);i(b.pad)&&(d=d.pad(b.pad)),a.setMaxBounds(d),e.center||e.lfCenter||a.fitBounds(d)})})}}}]),angular.module("leaflet-directive").directive("paths",["$log","$q","leafletData","leafletMapDefaults","leafletHelpers","leafletPathsHelpers","leafletPathEvents",function(a,b,c,d,e,f,g){return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?layers"],link:function(h,i,j,k){var l=k[0],m=e.isDefined,n=e.isString,o=l.getLeafletScope(),p=o.paths,q=f.createPath,r=g.bindPathEvents,s=f.setPathOptions;l.getMap().then(function(f){var g,h=d.getDefaults(j.id);g=m(k[1])?k[1].getLayers:function(){var a=b.defer();return a.resolve(),a.promise},m(p)&&g().then(function(b){var d={};c.setPaths(d,j.id);var g=!m(j.watchPaths)||"true"===j.watchPaths,i=function(a,c){var d=o.$watch('paths["'+c+'"]',function(c,e){if(!m(c)){if(m(e.layer))for(var g in b.overlays){var h=b.overlays[g];h.removeLayer(a)}return f.removeLayer(a),void d()}s(a,c.type,c)},!0)};o.$watchCollection("paths",function(c){for(var k in d)m(c[k])||(f.removeLayer(d[k]),delete d[k]);for(var l in c)if(0!==l.search("\\$"))if(-1===l.search("-")){if(!m(d[l])){var p=c[l],t=q(l,c[l],h);if(m(t)&&m(p.message)&&t.bindPopup(p.message,p.popupOptions),e.LabelPlugin.isLoaded()&&m(p.label)&&m(p.label.message)&&t.bindLabel(p.label.message,p.label.options),m(p)&&m(p.layer)){if(!n(p.layer)){a.error("[AngularJS - Leaflet] A layername must be a string");continue}if(!m(b)){a.error("[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.");continue}if(!m(b.overlays)||!m(b.overlays[p.layer])){a.error('[AngularJS - Leaflet] A path can only be added to a layer of type "group"');continue}var u=b.overlays[p.layer];if(!(u instanceof L.LayerGroup||u instanceof L.FeatureGroup)){a.error('[AngularJS - Leaflet] Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"');continue}d[l]=t,u.addLayer(t),g?i(t,l):s(t,p.type,p)}else m(t)&&(d[l]=t,f.addLayer(t),g?i(t,l):s(t,p.type,p));r(j.id,t,l,p,o)}}else a.error('[AngularJS - Leaflet] The path name "'+l+'" is not valid. It must not include "-" and a number.')})})})}}}]),angular.module("leaflet-directive").directive("tiles",["$log","leafletData","leafletMapDefaults","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i=d.isDefined,j=h.getLeafletScope(),k=j.tiles;return i(k)&&i(k.url)?void h.getMap().then(function(a){var d,e=c.getDefaults(g.id);j.$watch("tiles",function(c,f){var h=e.tileLayerOptions,j=e.tileLayer;return!i(c.url)&&i(d)?void a.removeLayer(d):i(d)?!i(c.url)||!i(c.options)||c.type===f.type&&angular.equals(c.options,h)?void(i(c.url)&&d.setUrl(c.url)):(a.removeLayer(d),h=e.tileLayerOptions,angular.copy(c.options,h),j=c.url,d="wms"===c.type?L.tileLayer.wms(j,h):L.tileLayer(j,h),d.addTo(a),void b.setTiles(d,g.id)):(i(c.options)&&angular.copy(c.options,h),i(c.url)&&(j=c.url),d="wms"===c.type?L.tileLayer.wms(j,h):L.tileLayer(j,h),d.addTo(a),void b.setTiles(d,g.id))},!0)}):void a.warn("[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property.")}}}]),["markers","geojson"].forEach(function(a){angular.module("leaflet-directive").directive(a+"WatchOptions",["$log","$rootScope","$q","leafletData","leafletHelpers",function(b,c,d,e,f){var g=f.isDefined,h=f.errorHeader,i=f.isObject,j=f.watchOptions;return{restrict:"A",scope:!1,replace:!1,require:["leaflet"],link:function(c,d,e,f){var k=f[0],l=k.getLeafletScope();k.getMap().then(function(){g(c[a+"WatchOptions"])&&(i(c[a+"WatchOptions"])?angular.extend(j,c[a+"WatchOptions"]):b.error(h+"["+a+"WatchOptions] is not an object"),l[a+"WatchOptions"]=j)})}}}])}),angular.module("leaflet-directive").factory("LeafletEventsHelpersFactory",["$rootScope","$q","$log","leafletHelpers",function(a,b,c,d){var e=d.safeApply,f=d.isDefined,g=d.isObject,h=d.isArray,i=d.errorHeader,j=function(a,b){this.rootBroadcastName=a,c.debug("LeafletEventsHelpersFactory: lObjectType: "+b+"rootBroadcastName: "+a),this.lObjectType=b};return j.prototype.getAvailableEvents=function(){return[]},j.prototype.genDispatchEvent=function(a,b,d,e,f,g,h,i,j){var k=this;return a=a||"",a&&(a="."+a),function(l){var m=k.rootBroadcastName+a+"."+b;c.debug(m),k.fire(e,m,d,l,l.target||f,h,g,i,j)}},j.prototype.fire=function(b,c,d,g,h,i,j,k){e(b,function(){var e={leafletEvent:g,leafletObject:h,modelName:j,model:i};f(k)&&angular.extend(e,{layerName:k}),"emit"===d?b.$emit(c,e):a.$broadcast(c,e)})},j.prototype.bindEvents=function(a,b,d,e,j,k,l){var m=[],n="emit",o=this;if(f(j.eventBroadcast))if(g(j.eventBroadcast))if(f(j.eventBroadcast[o.lObjectType]))if(g(j.eventBroadcast[o.lObjectType])){f(j.eventBroadcast[this.lObjectType].logic)&&"emit"!==j.eventBroadcast[o.lObjectType].logic&&"broadcast"!==j.eventBroadcast[o.lObjectType].logic&&c.warn(i+"Available event propagation logic are: 'emit' or 'broadcast'.");var p=!1,q=!1;f(j.eventBroadcast[o.lObjectType].enable)&&h(j.eventBroadcast[o.lObjectType].enable)&&(p=!0),f(j.eventBroadcast[o.lObjectType].disable)&&h(j.eventBroadcast[o.lObjectType].disable)&&(q=!0),p&&q?c.warn(i+"can not enable and disable events at the same time"):p||q?p?j.eventBroadcast[this.lObjectType].enable.forEach(function(a){-1!==m.indexOf(a)?c.warn(i+"This event "+a+" is already enabled"):-1===o.getAvailableEvents().indexOf(a)?c.warn(i+"This event "+a+" does not exist"):m.push(a)}):(m=this.getAvailableEvents(),j.eventBroadcast[o.lObjectType].disable.forEach(function(a){var b=m.indexOf(a);-1===b?c.warn(i+"This event "+a+" does not exist or has been already disabled"):m.splice(b,1)})):c.warn(i+"must enable or disable events")}else c.warn(i+"event-broadcast."+[o.lObjectType]+" must be an object check your model.");else m=this.getAvailableEvents();else c.error(i+"event-broadcast must be an object check your model.");else m=this.getAvailableEvents();return m.forEach(function(c){b.on(c,o.genDispatchEvent(a,c,n,j,b,d,e,k,l))}),n},j}]).service("leafletEventsHelpers",["LeafletEventsHelpersFactory",function(a){return new a}]),angular.module("leaflet-directive").factory("leafletGeoJsonEvents",["$rootScope","$q","$log","leafletHelpers","LeafletEventsHelpersFactory","leafletData",function(a,b,c,d,e,f){var g=d.safeApply,h=e,i=function(){h.call(this,"leafletDirectiveGeoJson","geojson")};return i.prototype=new h,i.prototype.genDispatchEvent=function(b,c,d,e,i,j,k,l,m){var n=h.prototype.genDispatchEvent.call(this,b,c,d,e,i,j,k,l),o=this;return function(b){"mouseout"===c&&(m.resetStyleOnMouseout&&f.getGeoJSON(m.mapId).then(function(a){var c=l?a[l]:a;c.resetStyle(b.target)}),g(e,function(){a.$broadcast(o.rootBroadcastName+".mouseout",b)})),n(b)}},i.prototype.getAvailableEvents=function(){return["click","dblclick","mouseover","mouseout"]},new i}]),angular.module("leaflet-directive").factory("leafletLabelEvents",["$rootScope","$q","$log","leafletHelpers","LeafletEventsHelpersFactory",function(a,b,c,d,e){var f=d,g=e,h=function(){g.call(this,"leafletDirectiveLabel","markers")};return h.prototype=new g,h.prototype.genDispatchEvent=function(a,b,c,d,e,f,h,i){var j=f.replace("markers.","");return g.prototype.genDispatchEvent.call(this,a,b,c,d,e,j,h,i)},h.prototype.getAvailableEvents=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu"]},h.prototype.genEvents=function(a,b,c,d,e,g,h,i){var j=this,k=this.getAvailableEvents(),l=f.getObjectArrayPath("markers."+g);k.forEach(function(b){e.label.on(b,j.genDispatchEvent(a,b,c,d,e.label,l,h,i))})},h.prototype.bindEvents=function(){},new h}]),angular.module("leaflet-directive").factory("leafletMapEvents",["$rootScope","$q","$log","leafletHelpers","leafletEventsHelpers","leafletIterators",function(a,b,c,d,e,f){var g=d.isDefined,h=e.fire,i=function(){return["click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","contextmenu","focus","blur","preclick","load","unload","viewreset","movestart","move","moveend","dragstart","drag","dragend","zoomstart","zoomanim","zoomend","zoomlevelschange","resize","autopanstart","layeradd","layerremove","baselayerchange","overlayadd","overlayremove","locationfound","locationerror","popupopen","popupclose","draw:created","draw:edited","draw:deleted","draw:drawstart","draw:drawstop","draw:editstart","draw:editstop","draw:deletestart","draw:deletestop"]},j=function(a,b,d,e){return e&&(e+="."),function(f){var g="leafletDirectiveMap."+e+b;c.debug(g),h(a,g,d,f,f.target,a)}},k=function(a){a.$broadcast("boundsChanged")},l=function(a,b,c,d){if(g(c.urlHashCenter)){var e=b.getCenter(),f=e.lat.toFixed(4)+":"+e.lng.toFixed(4)+":"+b.getZoom();g(d.c)&&d.c===f||a.$emit("centerUrlHash",f)}},m=function(a,b,c,d,e){f.each(b,function(b){var f={};f[c]=b,a.on(b,j(d,b,e,a._container.id||""),f)})};return{getAvailableMapEvents:i,genDispatchMapEvent:j,notifyCenterChangedToBounds:k,notifyCenterUrlHashChanged:l,addEvents:m}}]),angular.module("leaflet-directive").factory("leafletMarkerEvents",["$rootScope","$q","$log","leafletHelpers","LeafletEventsHelpersFactory","leafletLabelEvents",function(a,b,c,d,e,f){var g=d.safeApply,h=d.isDefined,i=d,j=f,k=e,l=function(){k.call(this,"leafletDirectiveMarker","markers")};return l.prototype=new k,l.prototype.genDispatchEvent=function(b,c,d,e,f,h,i,j){var l=k.prototype.genDispatchEvent.call(this,b,c,d,e,f,h,i,j);return function(b){"click"===c?g(e,function(){a.$broadcast("leafletDirectiveMarkersClick",h)}):"dragend"===c&&(g(e,function(){i.lat=f.getLatLng().lat,i.lng=f.getLatLng().lng}),i.message&&i.focus===!0&&f.openPopup()),l(b)}},l.prototype.getAvailableEvents=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu","dragstart","drag","dragend","move","remove","popupopen","popupclose","touchend","touchstart","touchmove","touchcancel","touchleave"]},l.prototype.bindEvents=function(a,b,c,d,e,f){var g=k.prototype.bindEvents.call(this,a,b,c,d,e,f);i.LabelPlugin.isLoaded()&&h(b.label)&&j.genEvents(a,c,g,e,b,d,f)},new l}]),angular.module("leaflet-directive").factory("leafletPathEvents",["$rootScope","$q","$log","leafletHelpers","leafletLabelEvents","leafletEventsHelpers",function(a,b,c,d,e,f){var g=d.isDefined,h=d.isObject,i=d,j=d.errorHeader,k=e,l=f.fire,m=function(a,b,d,e,f,g,h,i){return a=a||"",a&&(a="."+a),function(j){var k="leafletDirectivePath"+a+"."+b;c.debug(k),l(e,k,d,j,j.target||f,h,g,i)}},n=function(a,b,d,e,f){var l,n,p=[],q="broadcast";if(g(f.eventBroadcast))if(h(f.eventBroadcast))if(g(f.eventBroadcast.path))if(h(f.eventBroadcast.paths))c.warn(j+"event-broadcast.path must be an object check your model.");else{void 0!==f.eventBroadcast.path.logic&&null!==f.eventBroadcast.path.logic&&("emit"!==f.eventBroadcast.path.logic&&"broadcast"!==f.eventBroadcast.path.logic?c.warn(j+"Available event propagation logic are: 'emit' or 'broadcast'."):"emit"===f.eventBroadcast.path.logic&&(q="emit"));var r=!1,s=!1;if(void 0!==f.eventBroadcast.path.enable&&null!==f.eventBroadcast.path.enable&&"object"==typeof f.eventBroadcast.path.enable&&(r=!0),void 0!==f.eventBroadcast.path.disable&&null!==f.eventBroadcast.path.disable&&"object"==typeof f.eventBroadcast.path.disable&&(s=!0),r&&s)c.warn(j+"can not enable and disable events at the same time");else if(r||s)if(r)for(l=0;l
',controller:["$scope",function(b){this._leafletMap=a.defer(),this.getMap=function(){return this._leafletMap.promise},this.getLeafletScope=function(){return b}}],link:function(a,f,g,h){function i(){isNaN(g.width)?f.css("width",g.width):f.css("width",g.width+"px")}function j(){isNaN(g.height)?f.css("height",g.height):f.css("height",g.height+"px")}var k=d.isDefined,l=c.setDefaults(a.defaults,g.id),m=e.getAvailableMapEvents(),n=e.addEvents;a.mapId=g.id,b.setDirectiveControls({},g.id),k(g.width)&&(i(),a.$watch(function(){return f[0].getAttribute("width")},function(){i(),o.invalidateSize()})),k(g.height)&&(j(),a.$watch(function(){return f[0].getAttribute("height")},function(){j(),o.invalidateSize()}));var o=new L.Map(f[0],c.getMapCreationDefaults(g.id));if(h._leafletMap.resolve(o),k(g.lfCenter)||o.setView([l.center.lat,l.center.lng],l.center.zoom),!k(g.lfTiles)&&!k(g.lfLayers)){var p=L.tileLayer(l.tileLayer,l.tileLayerOptions);p.addTo(o),b.setTiles(p,g.id)}if(k(o.zoomControl)&&k(l.zoomControlPosition)&&o.zoomControl.setPosition(l.zoomControlPosition),k(o.zoomControl)&&l.zoomControl===!1&&o.zoomControl.removeFrom(o),k(o.zoomsliderControl)&&k(l.zoomsliderControl)&&l.zoomsliderControl===!1&&o.zoomsliderControl.removeFrom(o),!k(g.lfEvents)){var q="broadcast";n(o,m,"eventName",a,q)}o.whenReady(function(){b.setMap(o,g.id)}),a.$on("$destroy",function(){c.reset(),o.remove(),b.unresolveMap(g.id)}),a.$on("invalidateSize",function(){o.invalidateSize()})}}}]),angular.module("leaflet-directive").factory("leafletBoundsHelpers",["leafletLogger","leafletHelpers",function(a,b){function c(a){return angular.isDefined(a)&&angular.isDefined(a.southWest)&&angular.isDefined(a.northEast)&&angular.isNumber(a.southWest.lat)&&angular.isNumber(a.southWest.lng)&&angular.isNumber(a.northEast.lat)&&angular.isNumber(a.northEast.lng)}var d=b.isArray,e=b.isNumber,f=b.isFunction,g=b.isDefined;return{createLeafletBounds:function(a){return c(a)?L.latLngBounds([a.southWest.lat,a.southWest.lng],[a.northEast.lat,a.northEast.lng]):void 0},isValidBounds:c,createBoundsFromArray:function(b){return d(b)&&2===b.length&&d(b[0])&&d(b[1])&&2===b[0].length&&2===b[1].length&&e(b[0][0])&&e(b[0][1])&&e(b[1][0])&&e(b[1][1])?{northEast:{lat:b[0][0],lng:b[0][1]},southWest:{lat:b[1][0],lng:b[1][1]}}:void a.error("The bounds array is not valid.")},createBoundsFromLeaflet:function(b){if(!(g(b)&&f(b.getNorthEast)&&f(b.getSouthWest)))return void a.error("The leaflet bounds is not valid object.");var c=b.getNorthEast(),d=b.getSouthWest();return{northEast:{lat:c.lat,lng:c.lng},southWest:{lat:d.lat,lng:d.lng}}}}}]),angular.module("leaflet-directive").factory("leafletControlHelpers",["$rootScope","leafletLogger","leafletHelpers","leafletLayerHelpers","leafletMapDefaults",function(a,b,c,d,e){var f=c.isDefined,g=c.isObject,h=d.createLayer,i={},j=function(a,b,c){var d=e.getDefaults(c);if(!d.controls.layers.visible)return!1;var h=!1;return g(a)&&Object.keys(a).forEach(function(b){var c=a[b];f(c.layerOptions)&&c.layerOptions.showOnSelector===!1||(h=!0)}),g(b)&&Object.keys(b).forEach(function(a){var c=b[a];f(c.layerParams)&&c.layerParams.showOnSelector===!1||(h=!0)}),h},k=function(a){var b=e.getDefaults(a),c={collapsed:b.controls.layers.collapsed,position:b.controls.layers.position,autoZIndex:!1};angular.extend(c,b.controls.layers.options);var d;return d=b.controls.layers&&f(b.controls.layers.control)?b.controls.layers.control.apply(this,[[],[],c]):new L.control.layers([],[],c)},l={draw:{isPluginLoaded:function(){return angular.isDefined(L.Control.Draw)?!0:(b.error("Draw plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Draw(a)}},scale:{isPluginLoaded:function(){return!0},checkValidParams:function(){return!0},createControl:function(a){return new L.control.scale(a)}},fullscreen:{isPluginLoaded:function(){return angular.isDefined(L.Control.Fullscreen)?!0:(b.error("Fullscreen plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Fullscreen(a)}},search:{isPluginLoaded:function(){return angular.isDefined(L.Control.Search)?!0:(b.error(" Search plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Search(a)}},custom:{},minimap:{isPluginLoaded:function(){return angular.isDefined(L.Control.MiniMap)?!0:(b.error("Minimap plugin is not loaded."),!1)},checkValidParams:function(a){return f(a.layer)?!0:(b.warn('minimap "layer" option should be defined.'),!1)},createControl:function(a){var c=h(a.layer);return f(c)?new L.Control.MiniMap(c,a):void b.warn('minimap control "layer" could not be created.')}}};return{layersControlMustBeVisible:j,isValidControlType:function(a){return-1!==Object.keys(l).indexOf(a)},createControl:function(a,b){return l[a].checkValidParams(b)?l[a].createControl(b):void 0},updateLayersControl:function(a,b,c,d,e,g){var h,l=i[b],m=j(d,e,b);if(f(l)&&c){for(h in g.baselayers)l.removeLayer(g.baselayers[h]);for(h in g.overlays)l.removeLayer(g.overlays[h]);a.removeControl(l),delete i[b]}if(m){l=k(b),i[b]=l;for(h in d){var n=f(d[h].layerOptions)&&d[h].layerOptions.showOnSelector===!1;!n&&f(g.baselayers[h])&&l.addBaseLayer(g.baselayers[h],d[h].name)}for(h in e){var o=f(e[h].layerParams)&&e[h].layerParams.showOnSelector===!1;!o&&f(g.overlays[h])&&l.addOverlay(g.overlays[h],e[h].name)}a.addControl(l)}return m}}}]),angular.module("leaflet-directive").service("leafletData",["leafletLogger","$q","leafletHelpers",function(a,b,c){var d=c.getDefer,e=c.getUnresolvedDefer,f=c.setResolvedDefer,g={},h=this,i=function(a){return a.charAt(0).toUpperCase()+a.slice(1)},j=["map","tiles","layers","paths","markers","geoJSON","UTFGrid","decorations","directiveControls"];j.forEach(function(a){g[a]={}}),this.unresolveMap=function(a){var b=c.obtainEffectiveMapId(g.map,a);j.forEach(function(a){g[a][b]=void 0})},j.forEach(function(a){var b=i(a);h["set"+b]=function(b,c){var d=e(g[a],c);d.resolve(b),f(g[a],c)},h["get"+b]=function(b){var c=d(g[a],b);return c.promise}})}]),angular.module("leaflet-directive").service("leafletDirectiveControlsHelpers",["leafletLogger","leafletData","leafletHelpers",function(a,b,c){var d=c.isDefined,e=c.isString,f=c.isObject,g=function(c,g,h,i){var j={};if(!d(g))return void a.error("control name cannot be undefined");if(e(g)&&d(h)&&d(i))j[g]={create:h,clean:i};else{if(!f(g)||d(h)||d(i))return void a.error("incorrect arguments");j=g}b.getDirectiveControls().then(function(a){angular.extend(a,j),b.setDirectiveControls(a,c)})};return{extend:g}}]),angular.module("leaflet-directive").service("leafletGeoJsonHelpers",["leafletHelpers","leafletIterators",function(a,b){var c=a,d=b,e=function(a,b){return this.lat=a,this.lng=b,this},f=function(a){return Array.isArray(a)&&2===a.length?a[1]:c.isDefined(a.type)&&"Point"===a.type?+a.coordinates[1]:+a.lat},g=function(a){return Array.isArray(a)&&2===a.length?a[0]:c.isDefined(a.type)&&"Point"===a.type?+a.coordinates[0]:+a.lng},h=function(a){if(c.isUndefined(a))return!1;if(c.isArray(a)){if(2===a.length&&c.isNumber(a[0])&&c.isNumber(a[1]))return!0}else if(c.isDefined(a.type)&&"Point"===a.type&&c.isArray(a.coordinates)&&2===a.coordinates.length&&c.isNumber(a.coordinates[0])&&c.isNumber(a.coordinates[1]))return!0;var b=d.all(["lat","lng"],function(b){return c.isDefined(a[b])&&c.isNumber(a[b])});return b},i=function(a){if(a&&h(a)){var b=null;if(Array.isArray(a)&&2===a.length)b=new e(a[1],a[0]);else{if(!c.isDefined(a.type)||"Point"!==a.type)return a;b=new e(a.coordinates[1],a.coordinates[0])}return angular.extend(a,b)}};return{getLat:f,getLng:g,validateCoords:h,getCoords:i}}]),angular.module("leaflet-directive").service("leafletHelpers",["$q","leafletLogger",function(a,b){function c(a,c){var d,e;if(angular.isDefined(c))d=c;else if(0===Object.keys(a).length)d="main";else if(Object.keys(a).length>=1)for(e in a)a.hasOwnProperty(e)&&(d=e);else b.error("You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call");return d}function d(b,d){var e,f=c(b,d);return angular.isDefined(b[f])&&b[f].resolvedDefer!==!0?e=b[f].defer:(e=a.defer(),b[f]={defer:e,resolvedDefer:!1}),e}var e=angular.copy,f=e,g=function(a,b){var c;if(a&&angular.isObject(a))return null!==b&&angular.isString(b)?(c=a,b.split(".").forEach(function(a){c&&(c=c[a])}),c):b},h=function(a){return a.split(".").reduce(function(a,b){return a+'["'+b+'"]'})},i=function(a){return a.reduce(function(a,b){return a+"."+b})},j=function(a){return angular.isDefined(a)&&null!==a},k=function(a){return!j(a)},l=/([\:\-\_]+(.))/g,m=/^moz([A-Z])/,n=/^((?:x|data)[\:\-_])/i,o=function(a){return a.replace(l,function(a,b,c,d){return d?c.toUpperCase():c}).replace(m,"Moz$1")},p=function(a){return o(a.replace(n,""))};return{camelCase:o,directiveNormalize:p,copy:e,clone:f,getObjectValue:g,getObjectArrayPath:h,getObjectDotPath:i,defaultTo:function(a,b){return j(a)?a:b},isTruthy:function(a){return"true"===a||a===!0},isEmpty:function(a){return 0===Object.keys(a).length},isUndefinedOrEmpty:function(a){return angular.isUndefined(a)||null===a||0===Object.keys(a).length},isDefined:j,isUndefined:k,isNumber:angular.isNumber,isString:angular.isString,isArray:angular.isArray,isObject:angular.isObject,isFunction:angular.isFunction,equals:angular.equals,isValidCenter:function(a){return angular.isDefined(a)&&angular.isNumber(a.lat)&&angular.isNumber(a.lng)&&angular.isNumber(a.zoom)},isValidPoint:function(a){return angular.isDefined(a)?angular.isArray(a)?2===a.length&&angular.isNumber(a[0])&&angular.isNumber(a[1]):angular.isNumber(a.lat)&&angular.isNumber(a.lng):!1},isSameCenterOnMap:function(a,b){var c=b.getCenter(),d=b.getZoom();return a.lat&&a.lng&&c.lat.toFixed(4)===a.lat.toFixed(4)&&c.lng.toFixed(4)===a.lng.toFixed(4)&&d===a.zoom?!0:!1},safeApply:function(a,b){var c=a.$root.$$phase;"$apply"===c||"$digest"===c?a.$eval(b):a.$evalAsync(b)},obtainEffectiveMapId:c,getDefer:function(a,b){var e,f=c(a,b);return e=angular.isDefined(a[f])&&a[f].resolvedDefer!==!1?a[f].defer:d(a,b)},getUnresolvedDefer:d,setResolvedDefer:function(a,b){var d=c(a,b);a[d].resolvedDefer=!0},rangeIsSupported:function(){var a=document.createElement("input");return a.setAttribute("type","range"),"range"===a.type},FullScreenControlPlugin:{isLoaded:function(){return angular.isDefined(L.Control.Fullscreen)}},MiniMapControlPlugin:{isLoaded:function(){return angular.isDefined(L.Control.MiniMap)}},AwesomeMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.AwesomeMarkers)&&angular.isDefined(L.AwesomeMarkers.Icon)},is:function(a){return this.isLoaded()?a instanceof L.AwesomeMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},VectorMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.VectorMarkers)&&angular.isDefined(L.VectorMarkers.Icon)},is:function(a){return this.isLoaded()?a instanceof L.VectorMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},DomMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.DomMarkers)&&angular.isDefined(L.DomMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.DomMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},PolylineDecoratorPlugin:{isLoaded:function(){return angular.isDefined(L.PolylineDecorator)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.PolylineDecorator:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},MakiMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.MakiMarkers)&&angular.isDefined(L.MakiMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.MakiMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},ExtraMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.ExtraMarkers)&&angular.isDefined(L.ExtraMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.ExtraMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},LabelPlugin:{isLoaded:function(){return angular.isDefined(L.Label)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},MarkerClusterPlugin:{isLoaded:function(){return angular.isDefined(L.MarkerClusterGroup)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},GoogleLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Google)},is:function(a){return this.isLoaded()?a instanceof L.Google:!1}},LeafletProviderPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.Provider)},is:function(a){return this.isLoaded()?a instanceof L.TileLayer.Provider:!1}},ChinaLayerPlugin:{isLoaded:function(){return angular.isDefined(L.tileLayer.chinaProvider)}},HeatLayerPlugin:{isLoaded:function(){return angular.isDefined(L.heatLayer)}},WebGLHeatMapLayerPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.WebGLHeatMap)}},BingLayerPlugin:{isLoaded:function(){return angular.isDefined(L.BingLayer)},is:function(a){return this.isLoaded()?a instanceof L.BingLayer:!1}},WFSLayerPlugin:{isLoaded:function(){return void 0!==L.GeoJSON.WFS},is:function(a){return this.isLoaded()?a instanceof L.GeoJSON.WFS:!1}},AGSBaseLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.basemapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.basemapLayer:!1}},AGSLayerPlugin:{isLoaded:function(){return void 0!==lvector&&void 0!==lvector.AGS},is:function(a){return this.isLoaded()?a instanceof lvector.AGS:!1}},AGSFeatureLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.featureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.featureLayer:!1}},AGSTiledMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.tiledMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.tiledMapLayer:!1}},AGSDynamicMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.dynamicMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.dynamicMapLayer:!1}},AGSImageMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.imageMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.imageMapLayer:!1}},AGSClusteredLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.clusteredFeatureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.clusteredFeatureLayer:!1}},AGSHeatmapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.heatmapFeatureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.heatmapFeatureLayer:!1}},YandexLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Yandex)},is:function(a){return this.isLoaded()?a instanceof L.Yandex:!1}},GeoJSONPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.GeoJSON)},is:function(a){return this.isLoaded()?a instanceof L.TileLayer.GeoJSON:!1}},UTFGridPlugin:{isLoaded:function(){return angular.isDefined(L.UtfGrid)},is:function(a){return this.isLoaded()?a instanceof L.UtfGrid:(b.error("No UtfGrid plugin found."),!1)}},CartoDB:{isLoaded:function(){return cartodb},is:function(){return!0}},Leaflet:{DivIcon:{is:function(a){return a instanceof L.DivIcon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}},Icon:{is:function(a){return a instanceof L.Icon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}}},watchOptions:{doWatch:!0,isDeep:!0,individual:{doWatch:!0,isDeep:!0}}}}]),angular.module("leaflet-directive").service("leafletIterators",["leafletLogger","leafletHelpers",function(a,b){var c,d=b,e=Object.keys,f=d.isFunction,g=d.isObject,h=Math.pow(2,53)-1,i=function(a){var b=null!==a&&a.length;return d.isNumber(b)&&b>=0&&h>=b},j=function(a){return a},k=function(a){return function(b){return null===b?void 0:b[a]}},l=function(a,b,c){if(void 0===b)return a;switch(null===c?3:c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)};case 4:return function(c,d,e,f){return a.call(b,c,d,e,f)}}return function(){return a.apply(b,arguments)}},m=function(a,b){return function(c){var d=arguments.length;if(2>d||null===c)return c;for(var e=1;d>e;e++)for(var f=arguments[e],g=a(f),h=g.length,i=0;h>i;i++){var j=g[i];b&&void 0!==c[j]||(c[j]=f[j])}return c}},n=null;c=n=m(e);var o,p=function(a,b){var c=e(b),d=c.length;if(null===a)return!d;for(var f=Object(a),g=0;d>g;g++){var h=c[g];if(b[h]!==f[h]||!(h in f))return!1}return!0},q=null;o=q=function(a){return a=c({},a),function(b){return p(b,a)}};var r,s=function(a,b,c){return null===a?j:f(a)?l(a,b,c):g(a)?o(a):k(a)},t=null;r=t=function(a,b,c){b=s(b,c);for(var d=!i(a)&&e(a),f=(d||a).length,g=0;f>g;g++){var h=d?d[g]:g;if(!b(a[h],h,a))return!1}return!0};var u=function(b,c,e,f){return e||d.isDefined(b)&&d.isDefined(c)?d.isFunction(c)?!1:(f=d.defaultTo(c,"cb"),a.error(f+" is not a function","iterators"),!0):!0},v=function(a,b,c){if(!u(void 0,c,!0,"internalCb")&&!u(a,b))for(var d in a)a.hasOwnProperty(d)&&c(a[d],d)},w=function(a,b){v(a,b,function(a,c){b(a,c)})};return{each:w,forEach:w,every:r,all:t}}]),angular.module("leaflet-directive").factory("leafletLayerHelpers",["$rootScope","leafletLogger","$q","leafletHelpers","leafletIterators",function($rootScope,leafletLogger,$q,leafletHelpers,leafletIterators){function isValidLayerType(a){return isString(a.type)?-1===Object.keys(layerTypes).indexOf(a.type)?(leafletLogger.error("A layer must have a valid type: "+Object.keys(layerTypes)),!1):layerTypes[a.type].mustHaveUrl&&!isString(a.url)?(leafletLogger.error("A base layer must have an url"),!1):layerTypes[a.type].mustHaveData&&!isDefined(a.data)?(leafletLogger.error('The base layer must have a "data" array attribute'),!1):layerTypes[a.type].mustHaveLayer&&!isDefined(a.layer)?(leafletLogger.error("The type of layer "+a.type+" must have an layer defined"),!1):layerTypes[a.type].mustHaveBounds&&!isDefined(a.bounds)?(leafletLogger.error("The type of layer "+a.type+" must have bounds defined"),!1):layerTypes[a.type].mustHaveKey&&!isDefined(a.key)?(leafletLogger.error("The type of layer "+a.type+" must have key defined"),!1):!0:(leafletLogger.error("A layer must have a valid type defined."),!1)}function createLayer(a){if(isValidLayerType(a)){if(!isString(a.name))return void leafletLogger.error("A base layer must have a name");isObject(a.layerParams)||(a.layerParams={}),isObject(a.layerOptions)||(a.layerOptions={});for(var b in a.layerParams)a.layerOptions[b]=a.layerParams[b];var c={url:a.url,data:a.data,options:a.layerOptions,layer:a.layer,icon:a.icon,type:a.layerType,bounds:a.bounds,key:a.key,apiKey:a.apiKey,pluginOptions:a.pluginOptions,user:a.user};return layerTypes[a.type].createLayer(c)}}function safeAddLayer(a,b){b&&"function"==typeof b.addTo?b.addTo(a):a.addLayer(b)}function safeRemoveLayer(a,b,c){if(isDefined(c)&&isDefined(c.loadedDefer))if(angular.isFunction(c.loadedDefer)){var d=c.loadedDefer(),e=d.length;if(e>0)for(var f=function(){e--,0===e&&a.removeLayer(b)},g=0;g'+b.error.message+"";else if("arcgis"===c)for(var e=0;e'+f.layerName+"";for(var g=0;g'+h.label+"
"}}else"image"===c&&(a.innerHTML=' ')},b=function(b,c,d,e){return function(){var f=L.DomUtil.create("div",c);return L.Browser.touch?L.DomEvent.on(f,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(f),L.DomEvent.on(f,"mousewheel",L.DomEvent.stopPropagation)),a(f,b,d,e),f}},c=function(a,b){return function(){for(var c=L.DomUtil.create("div",b),d=0;d'+a.labels[d]+"
";return L.Browser.touch?L.DomEvent.on(c,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(c),L.DomEvent.on(c,"mousewheel",L.DomEvent.stopPropagation)),c}};return{getOnAddLegend:b,getOnAddArrayLegend:c,updateLegend:a}}),angular.module("leaflet-directive").service("leafletLogger",["$log",function(a){var b="[angular-leaflet] ";return{log:function(c,d){d=d?"["+d+"] ":"",a.log(b+d+c)},debug:function(c,d){d=d?"["+d+"] ":"",a.debug(b+d+c)},info:function(c,d){d=d?"["+d+"] ":"",a.info(b+d+c)},warn:function(c,d){d=d?"["+d+"] ":"",a.warn(b+d+c)},error:function(c,d){d=d?"["+d+"] ":"",a.error(b+d+c)}}}]),angular.module("leaflet-directive").factory("leafletMapDefaults",["$q","leafletHelpers",function(a,b){function c(){return{keyboard:!0,dragging:!0,worldCopyJump:!1,doubleClickZoom:!0,scrollWheelZoom:!0,tap:!0,touchZoom:!0,zoomControl:!0,zoomsliderControl:!1,zoomControlPosition:"topleft",attributionControl:!0,controls:{layers:{visible:!0,position:"topright",collapsed:!0}},nominatim:{server:" http://nominatim.openstreetmap.org/search"},crs:L.CRS.EPSG3857,tileLayer:"//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",tileLayerOptions:{attribution:'© OpenStreetMap contributors'},path:{weight:10,opacity:1,color:"#0000ff"},center:{lat:0,lng:0,zoom:1}}}var d=b.isDefined,e=b.isObject,f=b.obtainEffectiveMapId,g={};return{reset:function(){g={}},getDefaults:function(a){var b=f(g,a);return g[b]},getMapCreationDefaults:function(a){var b=f(g,a),c=g[b],e={maxZoom:c.maxZoom,keyboard:c.keyboard,dragging:c.dragging,zoomControl:c.zoomControl,doubleClickZoom:c.doubleClickZoom,scrollWheelZoom:c.scrollWheelZoom,tap:c.tap,touchZoom:c.touchZoom,attributionControl:c.attributionControl,worldCopyJump:c.worldCopyJump,crs:c.crs};if(d(c.minZoom)&&(e.minZoom=c.minZoom),d(c.zoomAnimation)&&(e.zoomAnimation=c.zoomAnimation),d(c.fadeAnimation)&&(e.fadeAnimation=c.fadeAnimation),d(c.markerZoomAnimation)&&(e.markerZoomAnimation=c.markerZoomAnimation),c.map)for(var h in c.map)e[h]=c.map[h];return e},setDefaults:function(a,b){var h=c();d(a)&&(h.doubleClickZoom=d(a.doubleClickZoom)?a.doubleClickZoom:h.doubleClickZoom,h.scrollWheelZoom=d(a.scrollWheelZoom)?a.scrollWheelZoom:h.doubleClickZoom,h.tap=d(a.tap)?a.tap:h.tap,h.touchZoom=d(a.touchZoom)?a.touchZoom:h.doubleClickZoom,h.zoomControl=d(a.zoomControl)?a.zoomControl:h.zoomControl,h.zoomsliderControl=d(a.zoomsliderControl)?a.zoomsliderControl:h.zoomsliderControl,h.attributionControl=d(a.attributionControl)?a.attributionControl:h.attributionControl,h.tileLayer=d(a.tileLayer)?a.tileLayer:h.tileLayer,h.zoomControlPosition=d(a.zoomControlPosition)?a.zoomControlPosition:h.zoomControlPosition,h.keyboard=d(a.keyboard)?a.keyboard:h.keyboard,h.dragging=d(a.dragging)?a.dragging:h.dragging,d(a.controls)&&angular.extend(h.controls,a.controls),e(a.crs)?h.crs=a.crs:d(L.CRS[a.crs])&&(h.crs=L.CRS[a.crs]),d(a.center)&&angular.copy(a.center,h.center),d(a.tileLayerOptions)&&angular.copy(a.tileLayerOptions,h.tileLayerOptions),d(a.maxZoom)&&(h.maxZoom=a.maxZoom),d(a.minZoom)&&(h.minZoom=a.minZoom),d(a.zoomAnimation)&&(h.zoomAnimation=a.zoomAnimation),d(a.fadeAnimation)&&(h.fadeAnimation=a.fadeAnimation),d(a.markerZoomAnimation)&&(h.markerZoomAnimation=a.markerZoomAnimation),d(a.worldCopyJump)&&(h.worldCopyJump=a.worldCopyJump),d(a.map)&&(h.map=a.map),d(a.path)&&(h.path=a.path));var i=f(g,b);return g[i]=h,h}}}]),angular.module("leaflet-directive").service("leafletMarkersHelpers",["$rootScope","$timeout","leafletHelpers","leafletLogger","$compile","leafletGeoJsonHelpers",function(a,b,c,d,e,f){
+var g=c.isDefined,h=c.defaultTo,i=c.MarkerClusterPlugin,j=c.AwesomeMarkersPlugin,k=c.VectorMarkersPlugin,l=c.MakiMarkersPlugin,m=c.ExtraMarkersPlugin,n=c.DomMarkersPlugin,o=c.safeApply,p=c,q=c.isString,r=c.isNumber,s=c.isObject,t={},u=f,v=function(a){var b="";return["_icon","_latlng","_leaflet_id","_map","_shadow"].forEach(function(c){b+=c+": "+h(a[c],"undefined")+" \n"}),"[leafletMarker] : \n"+b},w=function(b){if(g(b)&&g(b.type)&&"awesomeMarker"===b.type)return j.isLoaded()||d.error("The AwesomeMarkers Plugin is not loaded."),new L.AwesomeMarkers.icon(b);if(g(b)&&g(b.type)&&"vectorMarker"===b.type)return k.isLoaded()||d.error("The VectorMarkers Plugin is not loaded."),new L.VectorMarkers.icon(b);if(g(b)&&g(b.type)&&"makiMarker"===b.type)return l.isLoaded()||d.error("The MakiMarkers Plugin is not loaded."),new L.MakiMarkers.icon(b);if(g(b)&&g(b.type)&&"extraMarker"===b.type)return m.isLoaded()||d.error("The ExtraMarkers Plugin is not loaded."),new L.ExtraMarkers.icon(b);if(g(b)&&g(b.type)&&"div"===b.type)return new L.divIcon(b);if(g(b)&&g(b.type)&&"dom"===b.type){n.isLoaded()||d.error("The DomMarkers Plugin is not loaded.");var c=angular.isFunction(b.getMarkerScope)?b.getMarkerScope():a,f=e(b.template)(c),h=angular.copy(b);return h.element=f[0],new L.DomMarkers.icon(h)}if(g(b)&&g(b.type)&&"icon"===b.type)return b.icon;var i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAGmklEQVRYw7VXeUyTZxjvNnfELFuyIzOabermMZEeQC/OclkO49CpOHXOLJl/CAURuYbQi3KLgEhbrhZ1aDwmaoGqKII6odATmH/scDFbdC7LvFqOCc+e95s2VG50X/LLm/f4/Z7neY/ne18aANCmAr5E/xZf1uDOkTcGcWR6hl9247tT5U7Y6SNvWsKT63P58qbfeLJG8M5qcgTknrvvrdDbsT7Ml+tv82X6vVxJE33aRmgSyYtcWVMqX97Yv2JvW39UhRE2HuyBL+t+gK1116ly06EeWFNlAmHxlQE0OMiV6mQCScusKRlhS3QLeVJdl1+23h5dY4FNB3thrbYboqptEFlphTC1hSpJnbRvxP4NWgsE5Jyz86QNNi/5qSUTGuFk1gu54tN9wuK2wc3o+Wc13RCmsoBwEqzGcZsxsvCSy/9wJKf7UWf1mEY8JWfewc67UUoDbDjQC+FqK4QqLVMGGR9d2wurKzqBk3nqIT/9zLxRRjgZ9bqQgub+DdoeCC03Q8j+0QhFhBHR/eP3U/zCln7Uu+hihJ1+bBNffLIvmkyP0gpBZWYXhKussK6mBz5HT6M1Nqpcp+mBCPXosYQfrekGvrjewd59/GvKCE7TbK/04/ZV5QZYVWmDwH1mF3xa2Q3ra3DBC5vBT1oP7PTj4C0+CcL8c7C2CtejqhuCnuIQHaKHzvcRfZpnylFfXsYJx3pNLwhKzRAwAhEqG0SpusBHfAKkxw3w4627MPhoCH798z7s0ZnBJ/MEJbZSbXPhER2ih7p2ok/zSj2cEJDd4CAe+5WYnBCgR2uruyEw6zRoW6/DWJ/OeAP8pd/BGtzOZKpG8oke0SX6GMmRk6GFlyAc59K32OTEinILRJRchah8HQwND8N435Z9Z0FY1EqtxUg+0SO6RJ/mmXz4VuS+DpxXC3gXmZwIL7dBSH4zKE50wESf8qwVgrP1EIlTO5JP9Igu0aexdh28F1lmAEGJGfh7jE6ElyM5Rw/FDcYJjWhbeiBYoYNIpc2FT/SILivp0F1ipDWk4BIEo2VuodEJUifhbiltnNBIXPUFCMpthtAyqws/BPlEF/VbaIxErdxPphsU7rcCp8DohC+GvBIPJS/tW2jtvTmmAeuNO8BNOYQeG8G/2OzCJ3q+soYB5i6NhMaKr17FSal7GIHheuV3uSCY8qYVuEm1cOzqdWr7ku/R0BDoTT+DT+ohCM6/CCvKLKO4RI+dXPeAuaMqksaKrZ7L3FE5FIFbkIceeOZ2OcHO6wIhTkNo0ffgjRGxEqogXHYUPHfWAC/lADpwGcLRY3aeK4/oRGCKYcZXPVoeX/kelVYY8dUGf8V5EBRbgJXT5QIPhP9ePJi428JKOiEYhYXFBqou2Guh+p/mEB1/RfMw6rY7cxcjTrneI1FrDyuzUSRm9miwEJx8E/gUmqlyvHGkneiwErR21F3tNOK5Tf0yXaT+O7DgCvALTUBXdM4YhC/IawPU+2PduqMvuaR6eoxSwUk75ggqsYJ7VicsnwGIkZBSXKOUww73WGXyqP+J2/b9c+gi1YAg/xpwck3gJuucNrh5JvDPvQr0WFXf0piyt8f8/WI0hV4pRxxkQZdJDfDJNOAmM0Ag8jyT6hz0WGXWuP94Yh2jcfjmXAGvHCMslRimDHYuHuDsy2QtHuIavznhbYURq5R57KpzBBRZKPJi8eQg48h4j8SDdowifdIrEVdU+gbO6QNvRRt4ZBthUaZhUnjlYObNagV3keoeru3rU7rcuceqU1mJBxy+BWZYlNEBH+0eH4vRiB+OYybU2hnblYlTvkHinM4m54YnxSyaZYSF6R3jwgP7udKLGIX6r/lbNa9N6y5MFynjWDtrHd75ZvTYAPO/6RgF0k76mQla3FGq7dO+cH8sKn0Vo7nDllwAhqwLPkxrHwWmHJOo+AKJ4rab5OgrM7rVu8eWb2Pu0Dh4eDgXoOfvp7Y7QeqknRmvcTBEyq9m/HQQSCSz6LHq3z0yzsNySRfMS253wl2KyRDbcZPcfJKjZmSEOjcxyi+Y8dUOtsIEH6R2wNykdqrkYJ0RV92H0W58pkfQk7cKevsLK10Py8SdMGfXNXATY+pPbyJR/ET6n9nIfztNtZYRV9XniQu9IA2vOVgy4ir7GCLVmmd+zjkH0eAF9Po6K61pmCXHxU5rHMYd1ftc3owjwRSVRzLjKvqZEty6cRUD7jGqiOdu5HG6MdHjNcNYGqfDm5YRzLBBCCDl/2bk8a8gdbqcfwECu62Fg/HrggAAAABJRU5ErkJggg==",o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=";return g(b)&&g(b.iconUrl)?new L.Icon(b):new L.Icon.Default({iconUrl:i,shadowUrl:o,iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]})},x=function(a){g(t[a])&&t.splice(a,1)},y=function(){t={}},z=function(a,b,c){if(a.closePopup(),g(c)&&g(c.overlays))for(var d in c.overlays)if((c.overlays[d]instanceof L.LayerGroup||c.overlays[d]instanceof L.FeatureGroup)&&c.overlays[d].hasLayer(a))return void c.overlays[d].removeLayer(a);if(g(t))for(var e in t)t[e].hasLayer(a)&&t[e].removeLayer(a);b.hasLayer(a)&&b.removeLayer(a)},A=function(a,b){var c=a._popup._container.offsetHeight,d=new L.Point(a._popup._containerLeft,-c-a._popup._containerBottom),e=b.layerPointToContainerPoint(d);null!==e&&a._popup._adjustPan()},B=function(a,b){e(a._popup._contentNode)(b)},C=function(a,c,d){var e=a._popup._contentNode.innerText||a._popup._contentNode.textContent;e.length<1&&b(function(){C(a,c,d)});var f=a._popup._contentNode.offsetWidth;return a._popup._updateLayout(),a._popup._updatePosition(),a._popup.options.autoPan&&A(a,d),f},D=function(b,c,e){var f=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,h=g(c.compileMessage)?c.compileMessage:!0;if(h){if(!g(b._popup)||!g(b._popup._contentNode))return d.error("Popup is invalid or does not have any content."),!1;B(b,f),C(b,c,e)}},E=function(b,c){var d=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,f=angular.isFunction(c.getLabelScope)?c.getLabelScope():d,h=g(c.compileMessage)?c.compileMessage:!0;p.LabelPlugin.isLoaded()&&g(c.label)&&(g(c.label.options)&&c.label.options.noHide===!0&&b.showLabel(),h&&g(b.label)&&e(b.label._container)(f))},F=function(a,b,c,e,f,h,i){if(g(b)){if(!u.validateCoords(a))return d.warn("There are problems with lat-lng data, please verify your marker model"),void z(c,i,h);var j=a===b;if(g(a.iconAngle)&&b.iconAngle!==a.iconAngle&&c.setIconAngle(a.iconAngle),q(a.layer)||q(b.layer)&&(g(h.overlays[b.layer])&&h.overlays[b.layer].hasLayer(c)&&(h.overlays[b.layer].removeLayer(c),c.closePopup()),i.hasLayer(c)||i.addLayer(c)),(r(a.opacity)||r(parseFloat(a.opacity)))&&a.opacity!==b.opacity&&c.setOpacity(a.opacity),q(a.layer)&&b.layer!==a.layer){if(q(b.layer)&&g(h.overlays[b.layer])&&h.overlays[b.layer].hasLayer(c)&&h.overlays[b.layer].removeLayer(c),c.closePopup(),i.hasLayer(c)&&i.removeLayer(c),!g(h.overlays[a.layer]))return void d.error("You must use a name of an existing layer");var k=h.overlays[a.layer];if(!(k instanceof L.LayerGroup||k instanceof L.FeatureGroup))return void d.error('A marker can only be added to a layer of type "group" or "featureGroup"');k.addLayer(c),i.hasLayer(c)&&a.focus===!0&&c.openPopup()}if(a.draggable!==!0&&b.draggable===!0&&g(c.dragging)&&c.dragging.disable(),a.draggable===!0&&b.draggable!==!0&&(c.dragging?c.dragging.enable():L.Handler.MarkerDrag&&(c.dragging=new L.Handler.MarkerDrag(c),c.options.draggable=!0,c.dragging.enable())),s(a.icon)||s(b.icon)&&(c.setIcon(w()),c.closePopup(),c.unbindPopup(),q(a.message)&&c.bindPopup(a.message,a.popupOptions)),s(a.icon)&&s(b.icon)&&!angular.equals(a.icon,b.icon)){var l=!1;c.dragging&&(l=c.dragging.enabled()),c.setIcon(w(a.icon)),l&&c.dragging.enable(),c.closePopup(),c.unbindPopup(),q(a.message)&&(c.bindPopup(a.message,a.popupOptions),i.hasLayer(c)&&a.focus===!0&&c.openPopup())}!q(a.message)&&q(b.message)&&(c.closePopup(),c.unbindPopup()),p.LabelPlugin.isLoaded()&&(g(a.label)&&g(a.label.message)?"label"in b&&"message"in b.label&&!angular.equals(a.label.message,b.label.message)?c.updateLabelContent(a.label.message):!angular.isFunction(c.getLabel)||angular.isFunction(c.getLabel)&&!g(c.getLabel())?(c.bindLabel(a.label.message,a.label.options),E(c,a)):E(c,a):(!("label"in a)||"message"in a.label)&&angular.isFunction(c.unbindLabel)&&c.unbindLabel()),q(a.message)&&!q(b.message)&&c.bindPopup(a.message,a.popupOptions),q(a.message)&&q(b.message)&&a.message!==b.message&&c.setPopupContent(a.message);var m=!1;a.focus!==!0&&b.focus===!0&&(c.closePopup(),m=!0),(a.focus===!0&&(a.lat!==b.lat||a.lng!==b.lng||!g(b.focus)||b.focus===!1)||j&&a.focus===!0)&&(c.openPopup(),m=!0),b.zIndexOffset!==a.zIndexOffset&&c.setZIndexOffset(a.zIndexOffset);var n=c.getLatLng(),o=q(a.layer)&&p.MarkerClusterPlugin.is(h.overlays[a.layer]);o?m?(a.lat!==b.lat||a.lng!==b.lng)&&(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):n.lat!==a.lat||n.lng!==a.lng?(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):a.lat!==b.lat||a.lng!==b.lng?(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):s(a.icon)&&s(b.icon)&&!angular.equals(a.icon,b.icon)&&(h.overlays[a.layer].removeLayer(c),h.overlays[a.layer].addLayer(c)):(n.lat!==a.lat||n.lng!==a.lng)&&c.setLatLng([a.lat,a.lng])}};return{resetMarkerGroup:x,resetMarkerGroups:y,deleteMarker:z,manageOpenPopup:D,manageOpenLabel:E,createMarker:function(a){if(!g(a)||!u.validateCoords(a))return void d.error("The marker definition is not valid.");var b=u.getCoords(a);if(!g(b))return void d.error("Unable to get coordinates from markerData.");var c={icon:w(a.icon),title:g(a.title)?a.title:"",draggable:g(a.draggable)?a.draggable:!1,clickable:g(a.clickable)?a.clickable:!0,riseOnHover:g(a.riseOnHover)?a.riseOnHover:!1,zIndexOffset:g(a.zIndexOffset)?a.zIndexOffset:0,iconAngle:g(a.iconAngle)?a.iconAngle:0};for(var e in a)a.hasOwnProperty(e)&&!c.hasOwnProperty(e)&&(c[e]=a[e]);var f=new L.marker(b,c);return q(a.message)||f.unbindPopup(),f},addMarkerToGroup:function(a,b,c,e){return q(b)?i.isLoaded()?(g(t[b])||(t[b]=new L.MarkerClusterGroup(c),e.addLayer(t[b])),void t[b].addLayer(a)):void d.error("The MarkerCluster plugin is not loaded."):void d.error("The marker group you have specified is invalid.")},listenMarkerEvents:function(a,b,c,d,e){a.on("popupopen",function(){o(c,function(){(g(a._popup)||g(a._popup._contentNode))&&(b.focus=!0,D(a,b,e))})}),a.on("popupclose",function(){o(c,function(){b.focus=!1})}),a.on("add",function(){o(c,function(){"label"in b&&E(a,b)})})},updateMarker:F,addMarkerWatcher:function(a,b,c,d,e,f){var i=p.getObjectArrayPath("markers."+b);f=h(f,!0);var j=c.$watch(i,function(f,h){return g(f)?void F(f,h,a,b,c,d,e):(z(a,e,d),void j())},f)},string:v}}]),angular.module("leaflet-directive").factory("leafletPathsHelpers",["$rootScope","leafletLogger","leafletHelpers",function(a,b,c){function d(a){return a.filter(function(a){return k(a)}).map(function(a){return e(a)})}function e(a){return i(a)?new L.LatLng(a[0],a[1]):new L.LatLng(a.lat,a.lng)}function f(a){return a.map(function(a){return d(a)})}function g(a,b){for(var c={},d=0;d0&&e(a[0].boundingbox)?i.resolve(a[0]):i.reject("[Nominatim] Invalid address")}),i.promise}}}]),angular.module("leaflet-directive").directive("lfBounds",["leafletLogger","$timeout","$http","leafletHelpers","nominatimService","leafletBoundsHelpers",function(a,b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:["leaflet"],link:function(c,g,h,i){var j=d.isDefined,k=f.createLeafletBounds,l=i[0].getLeafletScope(),m=i[0],n=function(a){return 0===a._southWest.lat&&0===a._southWest.lng&&0===a._northEast.lat&&0===a._northEast.lng};m.getMap().then(function(d){l.$on("boundsChanged",function(a){var c=a.currentScope,e=d.getBounds();if(!n(e)&&!c.settingBoundsFromScope){c.settingBoundsFromLeaflet=!0;var f={northEast:{lat:e._northEast.lat,lng:e._northEast.lng},southWest:{lat:e._southWest.lat,lng:e._southWest.lng},options:e.options};angular.equals(c.bounds,f)||(c.bounds=f),b(function(){c.settingBoundsFromLeaflet=!1})}});var f;l.$watch("bounds",function(g){if(!c.settingBoundsFromLeaflet){if(j(g.address)&&g.address!==f)return c.settingBoundsFromScope=!0,e.query(g.address,h.id).then(function(a){var b=a.boundingbox,c=[[b[0],b[2]],[b[1],b[3]]];d.fitBounds(c)},function(b){a.error(b,"bounds")}),f=g.address,void b(function(){c.settingBoundsFromScope=!1});var i=k(g);i&&!d.getBounds().equals(i)&&(c.settingBoundsFromScope=!0,d.fitBounds(i,g.options),b(function(){c.settingBoundsFromScope=!1}))}},!0)})}}}]),angular.module("leaflet-directive").directive("lfCenter",["leafletLogger","$q","$location","$timeout","leafletMapDefaults","leafletHelpers","leafletBoundsHelpers","leafletMapEvents",function(a,b,c,d,e,f,g,h){var i,j=f.isDefined,k=f.isNumber,l=f.isSameCenterOnMap,m=f.safeApply,n=f.isValidCenter,o=g.isValidBounds,p=f.isUndefinedOrEmpty,q=function(a,b){return j(a)&&o(a)&&p(b)};return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:function(){i=b.defer(),this.getCenter=function(){return i.promise}},link:function(b,f,o,p){var r=p.getLeafletScope();j(r.center)||(a.error('The scope "center" variable is not defined',"center"),r.center={});var s=r.center;p.getMap().then(function(b){var f=e.getDefaults(o.id);if(-1!==o.lfCenter.search("-"))return a.error('The "center" variable can\'t use a "-" on its key name: "'+o.lfCenter,"center"),void b.setView([f.center.lat,f.center.lng],f.center.zoom);if(q(r.bounds,s))b.fitBounds(g.createLeafletBounds(r.bounds),r.bounds.options),m(r,function(a){angular.extend(a.center,{lat:b.getCenter().lat,lng:b.getCenter().lng,zoom:b.getZoom(),autoDiscover:!1})}),m(r,function(a){var c=b.getBounds();a.bounds={northEast:{lat:c._northEast.lat,lng:c._northEast.lng},southWest:{lat:c._southWest.lat,lng:c._southWest.lng}}});else{if(!j(s))return a.error('The "center" property is not defined in the main scope',"center"),void b.setView([f.center.lat,f.center.lng],f.center.zoom);j(s.lat)&&j(s.lng)||j(s.autoDiscover)||angular.copy(f.center,s)}var p,t;if(s.allowUrlHashCenter===!0){var u=function(){var a,b=c.search();if(j(b.c)){var d=b.c.split(":");3===d.length&&(a={lat:parseFloat(d[0]),lng:parseFloat(d[1]),zoom:parseInt(d[2],10),allowUrlHashCenter:s.allowUrlHashCenter})}return a};p=u(),r.$on("$locationChangeSuccess",function(a){var c=a.currentScope,d=u();j(d)&&!l(d,b)&&angular.extend(c.center,{lat:d.lat,lng:d.lng,zoom:d.zoom,allowUrlHashCenter:s.allowUrlHashCenter})})}r.$watch("center",function(c){return r.settingCenterFromLeaflet?void 0:(j(p)&&(angular.copy(p,c),p=void 0),n(c)||c.autoDiscover===!0?c.autoDiscover===!0?(k(c.zoom)||b.setView([f.center.lat,f.center.lng],f.center.zoom),void(k(c.zoom)&&c.zoom>f.center.zoom?b.locate({setView:!0,maxZoom:c.zoom}):j(f.maxZoom)?b.locate({setView:!0,maxZoom:f.maxZoom}):b.locate({setView:!0}))):void(t&&l(c,b)||(r.settingCenterFromScope=!0,b.setView([c.lat,c.lng],c.zoom),h.notifyCenterChangedToBounds(r,b),d(function(){r.settingCenterFromScope=!1}))):void a.warn(" invalid 'center'","center"))},!0),b.whenReady(function(){t=!0}),b.on("moveend",function(){i.resolve(),s.allowUrlHashCenter===!0&&h.notifyCenterUrlHashChanged(r,b,c.search()),l(s,b)||r.settingCenterFromScope||(r.settingCenterFromLeaflet=!0,m(r,function(a){r.settingCenterFromScope||angular.extend(a.center,{lat:b.getCenter().lat,lng:b.getCenter().lng,zoom:b.getZoom(),autoDiscover:!1}),h.notifyCenterChangedToBounds(r,b),d(function(){r.settingCenterFromLeaflet=!1})}))}),s.autoDiscover===!0&&b.on("locationerror",function(){a.warn("The Geolocation API is unauthorized on this page.","center"),n(s)?(b.setView([s.lat,s.lng],s.zoom),h.notifyCenterChangedToBounds(r,b)):(b.setView([f.center.lat,f.center.lng],f.center.zoom),h.notifyCenterChangedToBounds(r,b))})})}}}]),angular.module("leaflet-directive").directive("lfControls",["leafletLogger","leafletHelpers","leafletControlHelpers",function(a,b,c){return{restrict:"A",scope:!1,replace:!1,require:"?^leaflet",link:function(d,e,f,g){if(g){var h=c.createControl,i=c.isValidControlType,j=g.getLeafletScope(),k=b.isDefined,l=b.isArray,m={};g.getMap().then(function(b){j.$watchCollection("controls",function(c){for(var d in m)k(c[d])||(b.hasControl(m[d])&&b.removeControl(m[d]),delete m[d]);for(var e in c){var f,g=k(c[e].type)?c[e].type:e;if(!i(g))return void a.error(" Invalid control type: "+g,"controls");if("custom"!==g)f=h(g,c[e]),b.addControl(f),m[e]=f;else{var j=c[e];if(l(j))for(var n in j){var o=j[n];b.addControl(o),m[e]=k(m[e])?m[e].concat([o]):[o]}else b.addControl(j),m[e]=j}}})})}}}}]),angular.module("leaflet-directive").directive("decorations",["leafletLogger",function(a){return{link:function(){a.error('The "decorations" markup code is deprecated now. Please update your HTML with "lf-decorations" markup attributes.',"decorations")}}}]),angular.module("leaflet-directive").directive("lfDecorations",["leafletLogger","leafletHelpers",function(a,b){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(c,d,e,f){function g(b){return k(b)&&k(b.coordinates)&&(j.isLoaded()||a.error("The PolylineDecorator Plugin is not loaded.","decorations")),L.polylineDecorator(b.coordinates)}function h(a,b){return k(a)&&k(b)&&k(b.coordinates)&&k(b.patterns)?(a.setPaths(b.coordinates),a.setPatterns(b.patterns),a):void 0}var i=f.getLeafletScope(),j=b.PolylineDecoratorPlugin,k=b.isDefined,l={};f.getMap().then(function(a){i.$watch("decorations",function(b){for(var c in l)k(b[c])&&angular.equals(b[c],l)||(a.removeLayer(l[c]),delete l[c]);for(var d in b){var e=b[d],f=g(e);k(f)&&(l[d]=f,a.addLayer(f),h(f,e))}},!0)})}}}]),angular.module("leaflet-directive").directive("maxbounds",["leafletLogger",function(a){return{link:function(){a.error('The "maxbounds" markup code is deprecated now. Please update your HTML with "lf-maxbounds" markup attributes.',"maxbounds")}}}]),angular.module("leaflet-directive").directive("defaults",["leafletLogger",function(a){return{link:function(){a.error('The "defaults" markup code is deprecated now. Please update your HTML with "lf-defaults" markup attributes.',"defaults")}}}]),angular.module("leaflet-directive").directive("bounds",["leafletLogger",function(a){return{link:function(){a.error('The "bounds" markup code is deprecated now. Please update your HTML with "lf-bounds" markup attributes.',"bounds")}}}]),angular.module("leaflet-directive").directive("controls",["leafletLogger",function(a){return{link:function(){a.error('The "controls" markup code is deprecated now. Please update your HTML with "lf-controls" markup attributes.',"controls")}}}]),angular.module("leaflet-directive").directive("center",["leafletLogger",function(a){return{link:function(){a.error('The "center" markup code is deprecated now. Please update your HTML with "lf-center" markup attributes.',"center")}}}]),angular.module("leaflet-directive").directive("paths",["leafletLogger",function(a){return{link:function(){a.error('The "paths" markup code is deprecated now. Please update your HTML with "lf-paths" markup attributes.',"paths")}}}]),angular.module("leaflet-directive").directive("tiles",["leafletLogger",function(a){return{link:function(){a.error('The "tiles" markup code is deprecated now. Please update your HTML with "lf-tiles" markup attributes.',"tiles")}}}]),angular.module("leaflet-directive").directive("markers",["leafletLogger",function(a){return{link:function(){a.error('The "markers" markup code is deprecated now. Please update your HTML with "lf-markers" markup attributes.',"markers")}}}]),angular.module("leaflet-directive").directive("eventBroadcast",["leafletLogger",function(a){return{link:function(){a.error('The "event-broadcast" markup code is deprecated now. Please update your HTML with "lf-events" markup attributes.',"events")}}}]),angular.module("leaflet-directive").directive("geojson",["leafletLogger",function(a){return{link:function(){a.error('The "geojson" markup code is deprecated now. Please update your HTML with "lf-geojson" markup attributes.',"geojson")}}}]),angular.module("leaflet-directive").directive("layers",["leafletLogger",function(a){return{link:function(){a.error('The "layers" markup code is deprecated now. Please update your HTML with "lf-layers" markup attributes.',"layers")}}}]),angular.module("leaflet-directive").directive("markers",["leafletLogger",function(a){return{link:function(){a.error('The "markers" markup code is deprecated now. Please update your HTML with "lf-markers" markup attributes.',"markers")}}}]),angular.module("leaflet-directive").directive("lfEvents",["leafletLogger","$rootScope","leafletHelpers","leafletMapEvents","leafletIterators",function(a,b,c,d,e){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(b,f,g,h){var i=c.isObject,j=c.isDefined,k=h.getLeafletScope(),l=k.lfEvents,m=d.getAvailableMapEvents(),n=d.addEvents;h.getMap().then(function(b){var c=[],d="broadcast";j(l)&&j(l.map)?i(l.map)?("emit"!==l.map.logic&&"broadcast"!==l.map.logic?a.warn("Available event propagation logic are: 'emit' or 'broadcast'.","events"):d=l.map.logic,i(l.map.enable)&&l.map.enable.length>=0?e.each(l.map.enable,function(a){-1===c.indexOf(a)&&-1!==m.indexOf(a)&&c.push(a)}):a.warn("[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.","events")):a.warn("event-broadcast.map must be an object check your model.","events"):c=m,n(b,c,"eventName",k,d)})}}}]),angular.module("leaflet-directive").directive("lfGeojson",["leafletLogger","$rootScope","leafletData","leafletHelpers","leafletWatchHelpers","leafletDirectiveControlsHelpers","leafletIterators","leafletGeoJsonEvents",function(a,b,c,d,e,f,g,h){var i=e.maybeWatch,j=d.watchOptions,k=f.extend,l=d,m=g;return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,b,e,f){var g=d.isDefined,n=f.getLeafletScope(),o={},p=!1;f.getMap().then(function(a){var b=n.geojsonWatchOptions||j,f=function(a,b){var c;return c=angular.isFunction(a.onEachFeature)?a.onEachFeature:function(c,f){d.LabelPlugin.isLoaded()&&g(c.properties.description)&&f.bindLabel(c.properties.description),h.bindEvents(e.id,f,null,c,n,b,{resetStyleOnMouseout:a.resetStyleOnMouseout,mapId:e.id})}},q=l.isDefined(e.geojsonNested)&&l.isTruthy(e.geojsonNested),r=function(){if(o){var b=function(b){g(b)&&a.hasLayer(b)&&a.removeLayer(b)};return q?void m.each(o,function(a){b(a)}):void b(o)}},s=function(b,d){var h=angular.copy(b);if(g(h)&&g(h.data)){var i=f(h,d);g(h.options)||(h.options={style:h.style,filter:h.filter,onEachFeature:i,pointToLayer:h.pointToLayer});var j=L.geoJson(h.data,h.options);d&&l.isString(d)?o[d]=j:o=j,j.addTo(a),p||(p=!0,c.setGeoJSON(o,e.id))}},t=function(a){if(r(),q){if(!a||!Object.keys(a).length)return;return void m.each(a,function(a,b){s(a,b)})}s(a)};k(e.id,"geojson",t,r),i(n,"geojson",b,function(a){t(a)})})}}}]),angular.module("leaflet-directive").directive("layercontrol",["$filter","leafletLogger","leafletData","leafletHelpers",function(a,b,c,d){return{restrict:"E",scope:{icons:"=?",autoHideOpacity:"=?",showGroups:"=?",title:"@",baseTitle:"@",overlaysTitle:"@"},replace:!0,transclude:!1,require:"^leaflet",controller:["$scope","$element","$sce",function(a,b,e){var f=d.safeApply,g=d.isDefined;angular.extend(a,{baselayer:"",oldGroup:"",layerProperties:{},groupProperties:{},rangeIsSupported:d.rangeIsSupported(),changeBaseLayer:function(b,e){d.safeApply(a,function(d){d.baselayer=b,c.getMap().then(function(e){c.getLayers().then(function(c){if(!e.hasLayer(c.baselayers[b])){for(var f in d.layers.baselayers)d.layers.baselayers[f].icon=d.icons.unradio,e.hasLayer(c.baselayers[f])&&e.removeLayer(c.baselayers[f]);e.addLayer(c.baselayers[b]),d.layers.baselayers[b].icon=a.icons.radio}})})}),e.preventDefault()},moveLayer:function(b,c,d){var e=Object.keys(a.layers.baselayers).length;if(c>=1+e&&c<=a.overlaysArray.length+e){var g;for(var h in a.layers.overlays)if(a.layers.overlays[h].index===c){g=a.layers.overlays[h];break}g&&f(a,function(){g.index=b.index,b.index=c})}d.stopPropagation(),d.preventDefault()},initIndex:function(b,c){var d=Object.keys(a.layers.baselayers).length;b.index=g(b.index)?b.index:c+d+1},initGroup:function(b){a.groupProperties[b]=a.groupProperties[b]?a.groupProperties[b]:{}},toggleOpacity:function(b,c){if(c.visible){if(a.autoHideOpacity&&!a.layerProperties[c.name].opacityControl)for(var d in a.layerProperties)a.layerProperties[d].opacityControl=!1;a.layerProperties[c.name].opacityControl=!a.layerProperties[c.name].opacityControl}b.stopPropagation(),b.preventDefault()},toggleLegend:function(b){a.layerProperties[b.name].showLegend=!a.layerProperties[b.name].showLegend},showLegend:function(b){return b.legend&&a.layerProperties[b.name].showLegend},unsafeHTML:function(a){return e.trustAsHtml(a)},getOpacityIcon:function(b){return b.visible&&a.layerProperties[b.name].opacityControl?a.icons.close:a.icons.open},getGroupIcon:function(b){return b.visible?a.icons.check:a.icons.uncheck},changeOpacity:function(b){var d=a.layerProperties[b.name].opacity;c.getMap().then(function(e){c.getLayers().then(function(c){var f;for(var g in a.layers.overlays)if(a.layers.overlays[g]===b){f=c.overlays[g];break}e.hasLayer(f)&&(f.setOpacity&&f.setOpacity(d/100),f.getLayers&&f.eachLayer&&f.eachLayer(function(a){a.setOpacity&&a.setOpacity(d/100)}))})})},changeGroupVisibility:function(b){if(g(a.groupProperties[b])){var c=a.groupProperties[b].visible;for(var d in a.layers.overlays){var e=a.layers.overlays[d];e.group===b&&(e.visible=c)}}}});var h=b.get(0);L.Browser.touch?L.DomEvent.on(h,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(h),L.DomEvent.on(h,"mousewheel",L.DomEvent.stopPropagation))}],template:'',link:function(a,b,e,f){var g=d.isDefined,h=f.getLeafletScope(),i=h.layers;a.$watch("icons",function(){var b={uncheck:"fa fa-square-o",check:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",unradio:"fa fa-circle-o",up:"fa fa-angle-up",down:"fa fa-angle-down",open:"fa fa-angle-double-down",close:"fa fa-angle-double-up",toggleLegend:"fa fa-pencil-square-o"};g(a.icons)?(angular.extend(b,a.icons),
+angular.extend(a.icons,b)):a.icons=b}),e.order=!g(e.order)||"normal"!==e.order&&"reverse"!==e.order?"normal":e.order,a.order="normal"===e.order,a.orderNumber="normal"===e.order?-1:1,a.layers=i,f.getMap().then(function(b){h.$watch("layers.baselayers",function(d){var e={};c.getLayers().then(function(c){var f;for(f in d){var g=d[f];g.icon=a.icons[b.hasLayer(c.baselayers[f])?"radio":"unradio"],e[f]=g}a.baselayersArray=e})}),h.$watch("layers.overlays",function(b){var d=[],e={};c.getLayers().then(function(c){var f;for(f in b){var h=b[f];h.icon=a.icons[h.visible?"check":"uncheck"],d.push(h),g(a.layerProperties[h.name])||(a.layerProperties[h.name]={opacity:g(h.layerOptions.opacity)?100*h.layerOptions.opacity:100,opacityControl:!1,showLegend:!0}),g(h.group)&&(g(a.groupProperties[h.group])||(a.groupProperties[h.group]={visible:!1}),e[h.group]=g(e[h.group])?e[h.group]:{count:0,visibles:0},e[h.group].count++,h.visible&&e[h.group].visibles++),g(h.index)&&c.overlays[f].setZIndex&&c.overlays[f].setZIndex(b[f].index)}for(f in e)a.groupProperties[f].visible=e[f].visibles===e[f].count;a.overlaysArray=d})},!0)})}}}]),angular.module("leaflet-directive").directive("lfLayers",["leafletLogger","$q","leafletData","leafletHelpers","leafletLayerHelpers","leafletControlHelpers",function(a,b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:["$scope",function(a){a._leafletLayers=b.defer(),this.getLayers=function(){return a._leafletLayers.promise}}],link:function(a,b,g,h){var i=d.isDefined,j={},k=h.getLeafletScope(),l=k.layers,m=e.createLayer,n=e.safeAddLayer,o=e.safeRemoveLayer,p=f.updateLayersControl,q=!1;h.getMap().then(function(b){a._leafletLayers.resolve(j),c.setLayers(j,g.id),j.baselayers={},j.overlays={};var d=g.id,e=!1;for(var f in l.baselayers){var h=m(l.baselayers[f]);i(h)?(j.baselayers[f]=h,l.baselayers[f].top===!0&&(n(b,j.baselayers[f]),e=!0)):delete l.baselayers[f]}!e&&Object.keys(j.baselayers).length>0&&n(b,j.baselayers[Object.keys(l.baselayers)[0]]);for(f in l.overlays){var r=m(l.overlays[f]);i(r)?(j.overlays[f]=r,l.overlays[f].visible===!0&&n(b,j.overlays[f])):delete l.overlays[f]}k.$watch("layers.baselayers",function(a,c){if(angular.equals(a,c))return q=p(b,d,q,a,l.overlays,j),!0;for(var e in j.baselayers)(!i(a[e])||a[e].doRefresh)&&(b.hasLayer(j.baselayers[e])&&b.removeLayer(j.baselayers[e]),delete j.baselayers[e],a[e]&&a[e].doRefresh&&(a[e].doRefresh=!1));for(var f in a)if(i(j.baselayers[f]))a[f].top!==!0||b.hasLayer(j.baselayers[f])?a[f].top===!1&&b.hasLayer(j.baselayers[f])&&b.removeLayer(j.baselayers[f]):n(b,j.baselayers[f]);else{var g=m(a[f]);i(g)&&(j.baselayers[f]=g,a[f].top===!0&&n(b,j.baselayers[f]))}var h=!1;for(var k in j.baselayers)if(b.hasLayer(j.baselayers[k])){h=!0;break}!h&&Object.keys(j.baselayers).length>0&&n(b,j.baselayers[Object.keys(j.baselayers)[0]]),q=p(b,d,q,a,l.overlays,j)},!0),k.$watch("layers.overlays",function(a,c){if(angular.equals(a,c))return q=p(b,d,q,l.baselayers,a,j),!0;for(var e in j.overlays)if(!i(a[e])||a[e].doRefresh){if(b.hasLayer(j.overlays[e])){var f=i(a[e])?a[e].layerOptions:null;o(b,j.overlays[e],f)}delete j.overlays[e],a[e]&&a[e].doRefresh&&(a[e].doRefresh=!1)}for(var g in a){if(i(j.overlays[g]))a[g].visible&&!b.hasLayer(j.overlays[g])?n(b,j.overlays[g]):a[g].visible===!1&&b.hasLayer(j.overlays[g])&&o(b,j.overlays[g],a[g].layerOptions);else{var h=m(a[g]);if(!i(h))continue;j.overlays[g]=h,a[g].visible===!0&&n(b,j.overlays[g])}a[g].visible&&b._loaded&&a[g].data&&"heatmap"===a[g].type&&(j.overlays[g].setData(a[g].data),j.overlays[g].update())}q=p(b,d,q,l.baselayers,a,j)},!0)})}}}]),angular.module("leaflet-directive").directive("lfLegend",["leafletLogger","$http","leafletHelpers","leafletLegendHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i,j,k,l,m=c.isArray,n=c.isDefined,o=c.isFunction,p=h.getLeafletScope(),q=p.legend;p.$watch("legend",function(a){n(a)&&(i=a.legendClass?a.legendClass:"legend",j=a.position||"bottomright",l=a.type||"arcgis")},!0),h.getMap().then(function(c){p.$watch("legend",function(b){return n(b)?n(b.url)||"arcgis"!==l||m(b.colors)&&m(b.labels)&&b.colors.length===b.labels.length?n(b.url)?void a.info("loading legend service.","legend"):(n(k)&&(k.removeFrom(c),k=null),k=L.control({position:j}),"arcgis"===l&&(k.onAdd=d.getOnAddArrayLegend(b,i)),void k.addTo(c)):void a.warn("legend.colors and legend.labels must be set.","legend"):void(n(k)&&(k.removeFrom(c),k=null))}),p.$watch("legend.url",function(e){n(e)&&b.get(e).success(function(a){n(k)?d.updateLegend(k.getContainer(),a,l,e):(k=L.control({position:j}),k.onAdd=d.getOnAddLegend(a,i,l,e),k.addTo(c)),n(q.loadedData)&&o(q.loadedData)&&q.loadedData()}).error(function(){a.warn("legend.url not loaded.","legend")})})})}}}]),angular.module("leaflet-directive").directive("lfMarkers",["leafletLogger","$rootScope","$q","leafletData","leafletHelpers","leafletMapDefaults","leafletMarkersHelpers","leafletMarkerEvents","leafletIterators","leafletWatchHelpers","leafletDirectiveControlsHelpers",function(a,b,c,d,e,f,g,h,i,j,k){var l=e.isDefined,m=e,n=e.isString,o=g.addMarkerWatcher,p=g.updateMarker,q=g.listenMarkerEvents,r=g.addMarkerToGroup,s=g.createMarker,t=g.deleteMarker,u=i,v=e.watchOptions,w=j.maybeWatch,x=k.extend,y=function(a,b,c){if(Object.keys(a).length){if(c&&n(c)){if(!a[c]||!Object.keys(a[c]).length)return;return a[c][b]}return a[b]}},z=function(a,b,c,d){return d&&n(d)?(l(b[d])||(b[d]={}),b[d][c]=a):b[c]=a,a},A=function(b,c,d,e,f,g){if(!n(b))return a.error("A layername must be a string","markers"),!1;if(!l(c))return a.error("You must add layers to the directive if the markers are going to use this functionality.","markers"),!1;if(!l(c.overlays)||!l(c.overlays[b]))return a.error('A marker can only be added to a layer of type "group"',"markers"),!1;var h=c.overlays[b];return h instanceof L.LayerGroup||h instanceof L.FeatureGroup?(h.addLayer(e),!f&&g.hasLayer(e)&&d.focus===!0&&e.openPopup(),!0):(a.error('Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"',"markers"),!1)},B=function(b,c,d,e,f,g,i,j,k,n){for(var t in c)if(!n[t])if(-1===t.search("-")){var u=m.copy(c[t]),v=m.getObjectDotPath(k?[k,t]:[t]),w=y(g,t,k);if(l(w)){var x=l(x)?d[t]:void 0;p(u,x,w,v,i,f,e)}else{var B=s(u),C=(u?u.layer:void 0)||k;if(!l(B)){a.error("Received invalid data on the marker "+t,"markers");continue}if(z(B,g,t,k),l(u.message)&&B.bindPopup(u.message,u.popupOptions),l(u.group)){var D=l(u.groupOption)?u.groupOption:null;r(B,u.group,D,e)}if(m.LabelPlugin.isLoaded()&&l(u.label)&&l(u.label.message)&&B.bindLabel(u.label.message,u.label.options),l(u)&&(l(u.layer)||l(k))){var E=A(C,f,u,B,j.individual.doWatch,e);if(!E)continue}else l(u.group)||(e.addLayer(B),j.individual.doWatch||u.focus!==!0||B.openPopup());j.individual.doWatch&&o(B,v,i,f,e,j.individual.isDeep),q(B,u,i,j.individual.doWatch,e),h.bindEvents(b,B,v,u,i,C)}}else a.error('The marker can\'t use a "-" on his key name: "'+t+'".',"markers")},C=function(a,b,c,d,e){var f,g,h=!1,i=!1,j=l(b);for(var k in c)h||(h=!0),j&&(g=a[k],f=b[k],i=angular.equals(g,f)&&d),l(a)&&Object.keys(a).length&&l(a[k])&&Object.keys(a[k]).length&&!i||e&&m.isFunction(e)&&e(g,f,k)},D=function(b,c,d,e,f){C(b,c,d,!1,function(b,c,g){a.debug("Deleting marker: "+g,"markers"),t(d[g],e,f),delete d[g]})},E=function(b,c,d){var e={};return C(b,c,d,!0,function(b,c,d){a.debug("Already rendered marker: "+d,"markers"),e[d]=b}),e};return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?lfLayers"],link:function(a,b,e,f){var g=f[0],h=g.getLeafletScope();g.getMap().then(function(a){var b,g={};b=l(f[1])?f[1].getLayers:function(){var a=c.defer();return a.resolve(),a.promise};var i=h.markersWatchOptions||v;l(e.watchMarkers)&&(i.doWatch=i.individual.doWatch=!l(e.watchMarkers)||m.isTruthy(e.watchMarkers));var j=l(e.markersNested)&&m.isTruthy(e.markersNested);b().then(function(b){var c=function(c,d){return j?void u.each(c,function(c,e){var f=l(f)?d[e]:void 0;D(c,f,g[e],a,b)}):void D(c,d,g,a,b)},f=function(d,f){c(d,f);var k=null;return j?void u.each(d,function(c,j){var m=l(m)?f[j]:void 0;k=E(d[j],m,g[j]),B(e.id,c,f,a,b,g,h,i,j,k)}):(k=E(d,f,g),void B(e.id,d,f,a,b,g,h,i,void 0,k))};x(e.id,"markers",f,c),d.setMarkers(g,e.id),w(h,"markers",i,function(a,b){f(a,b)})})})}}}]),angular.module("leaflet-directive").directive("lfMaxbounds",["leafletLogger","leafletMapDefaults","leafletBoundsHelpers","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,b,e,f){var g=f.getLeafletScope(),h=c.isValidBounds,i=d.isNumber;f.getMap().then(function(a){g.$watch("maxbounds",function(b){if(!h(b))return void a.setMaxBounds();var d=c.createLeafletBounds(b);i(b.pad)&&(d=d.pad(b.pad)),a.setMaxBounds(d),e.center||e.lfCenter||a.fitBounds(d)})})}}}]),angular.module("leaflet-directive").directive("lfPaths",["leafletLogger","$q","leafletData","leafletMapDefaults","leafletHelpers","leafletPathsHelpers","leafletPathEvents",function(a,b,c,d,e,f,g){return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?lfLayers"],link:function(h,i,j,k){var l=k[0],m=e.isDefined,n=e.isString,o=l.getLeafletScope(),p=o.paths,q=f.createPath,r=g.bindPathEvents,s=f.setPathOptions;l.getMap().then(function(f){var g,h=d.getDefaults(j.id);g=m(k[1])?k[1].getLayers:function(){var a=b.defer();return a.resolve(),a.promise},m(p)&&g().then(function(b){var d={};c.setPaths(d,j.id);var g=!m(j.watchPaths)||"true"===j.watchPaths,i=function(a,c){var d=o.$watch('paths["'+c+'"]',function(c,e){if(!m(c)){if(m(e.layer))for(var g in b.overlays){var h=b.overlays[g];h.removeLayer(a)}return f.removeLayer(a),void d()}s(a,c.type,c)},!0)};o.$watchCollection("paths",function(c){for(var k in d)m(c[k])||(f.removeLayer(d[k]),delete d[k]);for(var l in c)if(0!==l.search("\\$"))if(-1===l.search("-")){if(!m(d[l])){var p=c[l],t=q(l,c[l],h);if(m(t)&&m(p.message)&&t.bindPopup(p.message,p.popupOptions),e.LabelPlugin.isLoaded()&&m(p.label)&&m(p.label.message)&&t.bindLabel(p.label.message,p.label.options),m(p)&&m(p.layer)){if(!n(p.layer)){a.error("A layername must be a string","paths");continue}if(!m(b)){a.error("You must add layers to the directive if the markers are going to use this functionality","paths");continue}if(!m(b.overlays)||!m(b.overlays[p.layer])){a.error('A path can only be added to a layer of type "group"',"paths");continue}var u=b.overlays[p.layer];if(!(u instanceof L.LayerGroup||u instanceof L.FeatureGroup)){a.error('Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"',"paths");continue}d[l]=t,u.addLayer(t),g?i(t,l):s(t,p.type,p)}else m(t)&&(d[l]=t,f.addLayer(t),g?i(t,l):s(t,p.type,p));r(j.id,t,l,p,o)}}else a.error('The path name "'+l+'" is not valid. It must not include "-" and a number.',"paths")})})})}}}]),angular.module("leaflet-directive").directive("lfTiles",["leafletLogger","leafletData","leafletMapDefaults","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i=d.isDefined,j=h.getLeafletScope(),k=j.tiles;return i(k)&&i(k.url)?void h.getMap().then(function(a){var d,e=c.getDefaults(g.id);j.$watch("tiles",function(c,f){var h=e.tileLayerOptions,j=e.tileLayer;return!i(c.url)&&i(d)?void a.removeLayer(d):i(d)?!i(c.url)||!i(c.options)||c.type===f.type&&angular.equals(c.options,h)?void(i(c.url)&&d.setUrl(c.url)):(a.removeLayer(d),h=e.tileLayerOptions,angular.copy(c.options,h),j=c.url,d="wms"===c.type?L.tileLayer.wms(j,h):L.tileLayer(j,h),d.addTo(a),void b.setTiles(d,g.id)):(i(c.options)&&angular.copy(c.options,h),i(c.url)&&(j=c.url),d="wms"===c.type?L.tileLayer.wms(j,h):L.tileLayer(j,h),d.addTo(a),void b.setTiles(d,g.id))},!0)}):void a.warn("[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property.","tiles")}}}]),["markers","geojson"].forEach(function(a){angular.module("leaflet-directive").directive(a+"WatchOptions",["leafletLogger","$rootScope","$q","leafletData","leafletHelpers",function(b,c,d,e,f){var g=f.isDefined,h=f.isObject,i=f.watchOptions;return{restrict:"A",scope:!1,replace:!1,require:["leaflet"],link:function(c,d,e,f){var j=f[0],k=j.getLeafletScope();j.getMap().then(function(){g(c[a+"WatchOptions"])&&(h(c[a+"WatchOptions"])?angular.extend(i,c[a+"WatchOptions"]):b.error("is not an object","watch options"),k[a+"WatchOptions"]=i)})}}}])}),angular.module("leaflet-directive").factory("LeafletEventsHelpersFactory",["$rootScope","$q","leafletLogger","leafletHelpers",function(a,b,c,d){var e=d.safeApply,f=d.isDefined,g=d.isObject,h=d.isArray,i=function(a,b){this.rootBroadcastName=a,this.lObjectType=b};return i.prototype.getAvailableEvents=function(){return[]},i.prototype.genDispatchEvent=function(a,b,c,d,e,f,g,h,i){var j=this;return a=a||"",a&&(a="."+a),function(k){var l=j.rootBroadcastName+a+"."+b;j.fire(d,l,c,k,k.target||e,g,f,h,i)}},i.prototype.fire=function(b,c,d,g,h,i,j,k){e(b,function(){var e={leafletEvent:g,leafletObject:h,modelName:j,model:i};f(k)&&angular.extend(e,{layerName:k}),"emit"===d?b.$emit(c,e):a.$broadcast(c,e)})},i.prototype.bindEvents=function(a,b,d,e,i,j,k){var l=[],m="emit",n=this;if(f(i.eventBroadcast))if(g(i.eventBroadcast))if(f(i.eventBroadcast[n.lObjectType]))if(g(i.eventBroadcast[n.lObjectType])){f(i.eventBroadcast[this.lObjectType].logic)&&"emit"!==i.eventBroadcast[n.lObjectType].logic&&"broadcast"!==i.eventBroadcast[n.lObjectType].logic&&c.warn("Available event propagation logic are: 'emit' or 'broadcast'.");var o=!1,p=!1;f(i.eventBroadcast[n.lObjectType].enable)&&h(i.eventBroadcast[n.lObjectType].enable)&&(o=!0),f(i.eventBroadcast[n.lObjectType].disable)&&h(i.eventBroadcast[n.lObjectType].disable)&&(p=!0),o&&p?c.warn("can not enable and disable events at the same time"):o||p?o?i.eventBroadcast[this.lObjectType].enable.forEach(function(a){-1!==l.indexOf(a)?c.warn("This event "+a+" is already enabled"):-1===n.getAvailableEvents().indexOf(a)?c.warn("This event "+a+" does not exist"):l.push(a)}):(l=this.getAvailableEvents(),i.eventBroadcast[n.lObjectType].disable.forEach(function(a){var b=l.indexOf(a);-1===b?c.warn("This event "+a+" does not exist or has been already disabled"):l.splice(b,1)})):c.warn("must enable or disable events")}else c.warn("event-broadcast."+[n.lObjectType]+" must be an object check your model.");else l=this.getAvailableEvents();else c.error("event-broadcast must be an object check your model.");else l=this.getAvailableEvents();return l.forEach(function(c){b.on(c,n.genDispatchEvent(a,c,m,i,b,d,e,j,k))}),m},i}]).service("leafletEventsHelpers",["LeafletEventsHelpersFactory",function(a){return new a}]),angular.module("leaflet-directive").factory("leafletGeoJsonEvents",["$rootScope","$q","leafletLogger","leafletHelpers","LeafletEventsHelpersFactory","leafletData",function(a,b,c,d,e,f){var g=d.safeApply,h=e,i=function(){h.call(this,"leafletDirectiveGeoJson","geojson")};return i.prototype=new h,i.prototype.genDispatchEvent=function(b,c,d,e,i,j,k,l,m){var n=h.prototype.genDispatchEvent.call(this,b,c,d,e,i,j,k,l),o=this;return function(b){"mouseout"===c&&(m.resetStyleOnMouseout&&f.getGeoJSON(m.mapId).then(function(a){var c=l?a[l]:a;c.resetStyle(b.target)}),g(e,function(){a.$broadcast(o.rootBroadcastName+".mouseout",b)})),n(b)}},i.prototype.getAvailableEvents=function(){return["click","dblclick","mouseover","mouseout"]},new i}]),angular.module("leaflet-directive").factory("leafletLabelEvents",["$rootScope","$q","leafletLogger","leafletHelpers","LeafletEventsHelpersFactory",function(a,b,c,d,e){var f=d,g=e,h=function(){g.call(this,"leafletDirectiveLabel","markers")};return h.prototype=new g,h.prototype.genDispatchEvent=function(a,b,c,d,e,f,h,i){var j=f.replace("markers.","");return g.prototype.genDispatchEvent.call(this,a,b,c,d,e,j,h,i)},h.prototype.getAvailableEvents=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu"]},h.prototype.genEvents=function(a,b,c,d,e,g,h,i){var j=this,k=this.getAvailableEvents(),l=f.getObjectArrayPath("markers."+g);k.forEach(function(b){e.label.on(b,j.genDispatchEvent(a,b,c,d,e.label,l,h,i))})},h.prototype.bindEvents=function(){},new h}]),angular.module("leaflet-directive").factory("leafletMapEvents",["$rootScope","$q","leafletLogger","leafletHelpers","leafletEventsHelpers","leafletIterators",function(a,b,c,d,e,f){var g=d.isDefined,h=e.fire,i=function(){return["click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","contextmenu","focus","blur","preclick","load","unload","viewreset","movestart","move","moveend","dragstart","drag","dragend","zoomstart","zoomanim","zoomend","zoomlevelschange","resize","autopanstart","layeradd","layerremove","baselayerchange","overlayadd","overlayremove","locationfound","locationerror","popupopen","popupclose","draw:created","draw:edited","draw:deleted","draw:drawstart","draw:drawstop","draw:editstart","draw:editstop","draw:deletestart","draw:deletestop"]},j=function(a,b,c,d){return d&&(d+="."),function(e){var f="leafletDirectiveMap."+d+b;h(a,f,c,e,e.target,a)}},k=function(a){a.$broadcast("boundsChanged")},l=function(a,b,c){var d=b.getCenter(),e=d.lat.toFixed(4)+":"+d.lng.toFixed(4)+":"+b.getZoom();g(c.c)&&c.c===e||a.$emit("centerUrlHash",e)},m=function(a,b,c,d,e){f.each(b,function(b){var f={};f[c]=b,a.on(b,j(d,b,e,a._container.id||""),f)})};return{getAvailableMapEvents:i,genDispatchMapEvent:j,notifyCenterChangedToBounds:k,notifyCenterUrlHashChanged:l,addEvents:m}}]),angular.module("leaflet-directive").factory("leafletMarkerEvents",["$rootScope","$q","leafletLogger","leafletHelpers","LeafletEventsHelpersFactory","leafletLabelEvents",function(a,b,c,d,e,f){var g=d.safeApply,h=d.isDefined,i=d,j=f,k=e,l=function(){k.call(this,"leafletDirectiveMarker","markers")};return l.prototype=new k,l.prototype.genDispatchEvent=function(b,c,d,e,f,h,i,j){var l=k.prototype.genDispatchEvent.call(this,b,c,d,e,f,h,i,j);return function(b){"click"===c?g(e,function(){a.$broadcast("leafletDirectiveMarkersClick",h)}):"dragend"===c&&(g(e,function(){i.lat=f.getLatLng().lat,i.lng=f.getLatLng().lng}),i.message&&i.focus===!0&&f.openPopup()),l(b)}},l.prototype.getAvailableEvents=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu","dragstart","drag","dragend","move","remove","popupopen","popupclose","touchend","touchstart","touchmove","touchcancel","touchleave"]},l.prototype.bindEvents=function(a,b,c,d,e,f){var g=k.prototype.bindEvents.call(this,a,b,c,d,e,f);i.LabelPlugin.isLoaded()&&h(b.label)&&j.genEvents(a,c,g,e,b,d,f)},new l}]),angular.module("leaflet-directive").factory("leafletPathEvents",["$rootScope","$q","leafletLogger","leafletHelpers","leafletLabelEvents","leafletEventsHelpers",function(a,b,c,d,e,f){var g=d.isDefined,h=d.isObject,i=d,j=e,k=f.fire,l=function(a,b,c,d,e,f,g,h){return a=a||"",a&&(a="."+a),function(i){var j="leafletDirectivePath"+a+"."+b;k(d,j,c,i,i.target||e,g,f,h)}},m=function(a,b,d,e,f){var k,m,o=[],p="broadcast";if(g(f.eventBroadcast))if(h(f.eventBroadcast))if(g(f.eventBroadcast.path))if(h(f.eventBroadcast.paths))c.warn("event-broadcast.path must be an object check your model.");else{void 0!==f.eventBroadcast.path.logic&&null!==f.eventBroadcast.path.logic&&("emit"!==f.eventBroadcast.path.logic&&"broadcast"!==f.eventBroadcast.path.logic?c.warn("Available event propagation logic are: 'emit' or 'broadcast'."):"emit"===f.eventBroadcast.path.logic&&(p="emit"));var q=!1,r=!1;if(void 0!==f.eventBroadcast.path.enable&&null!==f.eventBroadcast.path.enable&&"object"==typeof f.eventBroadcast.path.enable&&(q=!0),void 0!==f.eventBroadcast.path.disable&&null!==f.eventBroadcast.path.disable&&"object"==typeof f.eventBroadcast.path.disable&&(r=!0),q&&r)c.warn("can not enable and disable events at the same time");else if(q||r)if(q)for(k=0;k 0) {
var resolve = function() {
@@ -2174,6 +2196,38 @@ angular.module('leaflet-directive').factory('leafletLegendHelpers', function() {
};
});
+angular.module('leaflet-directive').service('leafletLogger', ["$log", function($log) {
+ var prefix = '[angular-leaflet] ';
+
+ return {
+ log: function(msg, section) {
+ section = section ? '[' + section + '] ' : '';
+ $log.log(prefix + section + msg);
+ },
+
+ debug: function(msg, section) {
+ section = section ? '[' + section + '] ' : '';
+ $log.debug(prefix + section + msg);
+ },
+
+ info: function(msg, section) {
+ section = section ? '[' + section + '] ' : '';
+ $log.info(prefix + section + msg);
+ },
+
+ warn: function(msg, section) {
+ section = section ? '[' + section + '] ' : '';
+ $log.warn(prefix + section + msg);
+ },
+
+ error: function(msg, section) {
+ section = section ? '[' + section + '] ' : '';
+ $log.error(prefix + section + msg);
+ },
+
+ };
+}]);
+
angular.module('leaflet-directive').factory('leafletMapDefaults', ["$q", "leafletHelpers", function($q, leafletHelpers) {
function _getDefaults() {
return {
@@ -2349,7 +2403,7 @@ angular.module('leaflet-directive').factory('leafletMapDefaults', ["$q", "leafle
};
}]);
-angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScope", "$timeout", "leafletHelpers", "$log", "$compile", "leafletGeoJsonHelpers", function($rootScope, $timeout, leafletHelpers, $log, $compile, leafletGeoJsonHelpers) {
+angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScope", "$timeout", "leafletHelpers", "leafletLogger", "$compile", "leafletGeoJsonHelpers", function($rootScope, $timeout, leafletHelpers, leafletLogger, $compile, leafletGeoJsonHelpers) {
var isDefined = leafletHelpers.isDefined;
var defaultTo = leafletHelpers.defaultTo;
var MarkerClusterPlugin = leafletHelpers.MarkerClusterPlugin;
@@ -2365,7 +2419,6 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
var isObject = leafletHelpers.isObject;
var groups = {};
var geoHlp = leafletGeoJsonHelpers;
- var errorHeader = leafletHelpers.errorHeader;
var _string = function(marker) {
//this exists since JSON.stringify barfs on cyclic
@@ -2377,15 +2430,10 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
return '[leafletMarker] : \n' + retStr;
};
- var _log = function(marker, useConsole) {
- var logger = useConsole ? console : $log;
- logger.debug(_string(marker));
- };
-
var createLeafletIcon = function(iconData) {
if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'awesomeMarker') {
if (!AwesomeMarkersPlugin.isLoaded()) {
- $log.error(errorHeader + ' The AwesomeMarkers Plugin is not loaded.');
+ leafletLogger.error('The AwesomeMarkers Plugin is not loaded.');
}
return new L.AwesomeMarkers.icon(iconData);
@@ -2393,7 +2441,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'vectorMarker') {
if (!VectorMarkersPlugin.isLoaded()) {
- $log.error(errorHeader + ' The VectorMarkers Plugin is not loaded.');
+ leafletLogger.error('The VectorMarkers Plugin is not loaded.');
}
return new L.VectorMarkers.icon(iconData);
@@ -2401,7 +2449,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'makiMarker') {
if (!MakiMarkersPlugin.isLoaded()) {
- $log.error(errorHeader + 'The MakiMarkers Plugin is not loaded.');
+ leafletLogger.error('The MakiMarkers Plugin is not loaded.');
}
return new L.MakiMarkers.icon(iconData);
@@ -2409,7 +2457,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'extraMarker') {
if (!ExtraMarkersPlugin.isLoaded()) {
- $log.error(errorHeader + 'The ExtraMarkers Plugin is not loaded.');
+ leafletLogger.error('The ExtraMarkers Plugin is not loaded.');
}
return new L.ExtraMarkers.icon(iconData);
@@ -2421,7 +2469,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'dom') {
if (!DomMarkersPlugin.isLoaded()) {
- $log.error(errorHeader + 'The DomMarkers Plugin is not loaded.');
+ leafletLogger.error('The DomMarkers Plugin is not loaded.');
}
var markerScope = angular.isFunction(iconData.getMarkerScope) ? iconData.getMarkerScope() : $rootScope;
@@ -2539,7 +2587,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
if (compileMessage) {
if (!isDefined(marker._popup) || !isDefined(marker._popup._contentNode)) {
- $log.error(errorHeader + 'Popup is invalid or does not have any content.');
+ leafletLogger.error('Popup is invalid or does not have any content.');
return false;
}
@@ -2571,7 +2619,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
// Update the lat-lng property (always present in marker properties)
if (!geoHlp.validateCoords(markerData)) {
- $log.warn('There are problems with lat-lng data, please verify your marker model');
+ leafletLogger.warn('There are problems with lat-lng data, please verify your marker model');
_deleteMarker(marker, map, layers);
return;
}
@@ -2622,14 +2670,14 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
// The markerData.layer is defined so we add the marker to the layer if it is different from the old data
if (!isDefined(layers.overlays[markerData.layer])) {
- $log.error(errorHeader + 'You must use a name of an existing layer');
+ leafletLogger.error('You must use a name of an existing layer');
return;
}
// Is a group layer?
var layerGroup = layers.overlays[markerData.layer];
if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {
- $log.error(errorHeader + 'A marker can only be added to a layer of type "group" or "featureGroup"');
+ leafletLogger.error('A marker can only be added to a layer of type "group" or "featureGroup"');
return;
}
@@ -2742,7 +2790,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
}
// The markerData.focus property must be true so we update if there wasn't a previous value or it wasn't true
- if (markerData.focus === true && (!isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) {
+ if (markerData.focus === true && (markerData.lat !== oldMarkerData.lat || markerData.lng !== oldMarkerData.lng || !isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) {
// Reopen the popup when focus is still true
marker.openPopup();
updatedFocus = true;
@@ -2804,14 +2852,14 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
createMarker: function(markerData) {
if (!isDefined(markerData) || !geoHlp.validateCoords(markerData)) {
- $log.error(errorHeader + 'The marker definition is not valid.');
+ leafletLogger.error('The marker definition is not valid.');
return;
}
var coords = geoHlp.getCoords(markerData);
if (!isDefined(coords)) {
- $log.error(errorHeader + 'Unable to get coordinates from markerData.');
+ leafletLogger.error('Unable to get coordinates from markerData.');
return;
}
@@ -2843,12 +2891,12 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
addMarkerToGroup: function(marker, groupName, groupOptions, map) {
if (!isString(groupName)) {
- $log.error(errorHeader + 'The marker group you have specified is invalid.');
+ leafletLogger.error('The marker group you have specified is invalid.');
return;
}
if (!MarkerClusterPlugin.isLoaded()) {
- $log.error(errorHeader + 'The MarkerCluster plugin is not loaded.');
+ leafletLogger.error('The MarkerCluster plugin is not loaded.');
return;
}
@@ -2878,8 +2926,9 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
marker.on('add', function(/* event */) {
safeApply(leafletScope, function() {
- if ('label' in markerData)
- _manageOpenLabel(marker, markerData);
+ if ('label' in markerData) {
+ _manageOpenLabel(marker, markerData);
+ }
});
});
},
@@ -2902,11 +2951,10 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop
},
string: _string,
- log: _log,
};
}]);
-angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope", "$log", "leafletHelpers", function($rootScope, $log, leafletHelpers) {
+angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope", "leafletLogger", "leafletHelpers", function($rootScope, leafletLogger, leafletHelpers) {
var isDefined = leafletHelpers.isDefined;
var isArray = leafletHelpers.isArray;
var isNumber = leafletHelpers.isNumber;
@@ -3173,7 +3221,7 @@ angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope"
var pathData = _getPathData(path);
if (!pathTypes[path.type].isValid(pathData)) {
- $log.error('[AngularJS - Leaflet] Invalid data passed to the ' + path.type + ' path');
+ leafletLogger.error('Invalid data passed to the ' + path.type + ' path');
return;
}
@@ -3189,8 +3237,9 @@ angular.module('leaflet-directive')
//watchOptions.isDeep is/should be ignored in $watchCollection
var unWatch = scope[watchFunctionName](thingToWatchStr, function(newValue, oldValue) {
initCb(newValue, oldValue);
- if (!watchOptions.doWatch)
- unWatch();
+ if (!watchOptions.doWatch) {
+ unWatch();
+ }
}, watchOptions.isDeep);
return unWatch;
@@ -3246,7 +3295,7 @@ angular.module('leaflet-directive').factory('nominatimService', ["$q", "$http",
};
}]);
-angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$http", "leafletHelpers", "nominatimService", "leafletBoundsHelpers", function($log, $timeout, $http, leafletHelpers, nominatimService, leafletBoundsHelpers) {
+angular.module('leaflet-directive').directive('lfBounds', ["leafletLogger", "$timeout", "$http", "leafletHelpers", "nominatimService", "leafletBoundsHelpers", function(leafletLogger, $timeout, $http, leafletHelpers, nominatimService, leafletBoundsHelpers) {
return {
restrict: 'A',
@@ -3259,7 +3308,6 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h
var createLeafletBounds = leafletBoundsHelpers.createLeafletBounds;
var leafletScope = controller[0].getLeafletScope();
var mapController = controller[0];
- var errorHeader = leafletHelpers.errorHeader + ' [Bounds] ';
var emptyBounds = function(bounds) {
return (bounds._southWest.lat === 0 && bounds._southWest.lng === 0 &&
@@ -3298,8 +3346,10 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h
var lastNominatimQuery;
leafletScope.$watch('bounds', function(bounds) {
- if (scope.settingBoundsFromLeaflet)
- return;
+ if (scope.settingBoundsFromLeaflet) {
+ return;
+ }
+
if (isDefined(bounds.address) && bounds.address !== lastNominatimQuery) {
scope.settingBoundsFromScope = true;
nominatimService.query(bounds.address, attrs.id).then(function(data) {
@@ -3308,7 +3358,7 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h
map.fitBounds(newBounds);
}, function(errMsg) {
- $log.error(errorHeader + ' ' + errMsg + '.');
+ leafletLogger.error(errMsg, 'bounds');
});
lastNominatimQuery = bounds.address;
@@ -3333,239 +3383,224 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h
};
}]);
-var centerDirectiveTypes = ['center', 'lfCenter'];
-var centerDirectives = {};
-
-centerDirectiveTypes.forEach(function(directiveName) {
- centerDirectives[directiveName] = ['$log', '$q', '$location', '$timeout', 'leafletMapDefaults', 'leafletHelpers',
- 'leafletBoundsHelpers', 'leafletMapEvents',
- function($log, $q, $location, $timeout, leafletMapDefaults, leafletHelpers,
- leafletBoundsHelpers, leafletMapEvents) {
+angular.module('leaflet-directive').directive('lfCenter', ["leafletLogger", "$q", "$location", "$timeout", "leafletMapDefaults", "leafletHelpers", "leafletBoundsHelpers", "leafletMapEvents", function(leafletLogger, $q, $location, $timeout, leafletMapDefaults, leafletHelpers, leafletBoundsHelpers, leafletMapEvents) {
+ var isDefined = leafletHelpers.isDefined;
+ var isNumber = leafletHelpers.isNumber;
+ var isSameCenterOnMap = leafletHelpers.isSameCenterOnMap;
+ var safeApply = leafletHelpers.safeApply;
+ var isValidCenter = leafletHelpers.isValidCenter;
+ var isValidBounds = leafletBoundsHelpers.isValidBounds;
+ var isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty;
- var isDefined = leafletHelpers.isDefined;
- var isNumber = leafletHelpers.isNumber;
- var isSameCenterOnMap = leafletHelpers.isSameCenterOnMap;
- var safeApply = leafletHelpers.safeApply;
- var isValidCenter = leafletHelpers.isValidCenter;
- var isValidBounds = leafletBoundsHelpers.isValidBounds;
- var isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty;
- var errorHeader = leafletHelpers.errorHeader;
+ var shouldInitializeMapWithBounds = function(bounds, center) {
+ return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center);
+ };
- var shouldInitializeMapWithBounds = function(bounds, center) {
- return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center);
+ var _leafletCenter;
+ return {
+ restrict: 'A',
+ scope: false,
+ replace: false,
+ require: 'leaflet',
+ controller: function() {
+ _leafletCenter = $q.defer();
+ this.getCenter = function() {
+ return _leafletCenter.promise;
};
+ },
- var _leafletCenter;
- return {
- restrict: 'A',
- scope: false,
- replace: false,
- require: 'leaflet',
- controller: function() {
- _leafletCenter = $q.defer();
- this.getCenter = function() {
- return _leafletCenter.promise;
- };
- },
+ link: function(scope, element, attrs, controller) {
+ var leafletScope = controller.getLeafletScope();
- link: function(scope, element, attrs, controller) {
- var leafletScope = controller.getLeafletScope();
- var centerModel = leafletScope[directiveName];
+ if (!isDefined(leafletScope.center)) {
+ leafletLogger.error('The scope "center" variable is not defined', 'center');
+ leafletScope.center = {};
+ }
- controller.getMap().then(function(map) {
- var defaults = leafletMapDefaults.getDefaults(attrs.id);
+ var centerModel = leafletScope.center;
+ controller.getMap().then(function(map) {
+ var defaults = leafletMapDefaults.getDefaults(attrs.id);
- if (attrs[directiveName].search('-') !== -1) {
- $log.error(errorHeader + ' The "center" variable can\'t use a "-" on its key name: "' + attrs[directiveName] + '".');
- map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
- return;
- } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) {
- map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds), leafletScope.bounds.options);
- centerModel = map.getCenter();
- safeApply(leafletScope, function(scope) {
- angular.extend(scope[directiveName], {
- lat: map.getCenter().lat,
- lng: map.getCenter().lng,
- zoom: map.getZoom(),
- autoDiscover: false,
- });
- });
+ if (attrs.lfCenter.search('-') !== -1) {
+ leafletLogger.error('The "center" variable can\'t use a "-" on its key name: "' + attrs.lfCenter, 'center');
+ map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
+ return;
+ } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) {
+ map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds), leafletScope.bounds.options);
+ safeApply(leafletScope, function(scope) {
+ angular.extend(scope.center, {
+ lat: map.getCenter().lat,
+ lng: map.getCenter().lng,
+ zoom: map.getZoom(),
+ autoDiscover: false,
+ });
+ });
- safeApply(leafletScope, function(scope) {
- var mapBounds = map.getBounds();
- scope.bounds = {
- northEast: {
- lat: mapBounds._northEast.lat,
- lng: mapBounds._northEast.lng,
- },
- southWest: {
- lat: mapBounds._southWest.lat,
- lng: mapBounds._southWest.lng,
- },
+ safeApply(leafletScope, function(scope) {
+ var mapBounds = map.getBounds();
+ scope.bounds = {
+ northEast: {
+ lat: mapBounds._northEast.lat,
+ lng: mapBounds._northEast.lng,
+ },
+ southWest: {
+ lat: mapBounds._southWest.lat,
+ lng: mapBounds._southWest.lng,
+ },
+ };
+ });
+ } else if (!isDefined(centerModel)) {
+ leafletLogger.error('The "center" property is not defined in the main scope', 'center');
+ map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
+ return;
+ } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) {
+ angular.copy(defaults.center, centerModel);
+ }
+
+ var urlCenterHash;
+ var mapReady;
+ if (centerModel.allowUrlHashCenter === true) {
+ var extractCenterFromUrl = function() {
+ var search = $location.search();
+ var centerParam;
+ if (isDefined(search.c)) {
+ var cParam = search.c.split(':');
+ if (cParam.length === 3) {
+ centerParam = {
+ lat: parseFloat(cParam[0]),
+ lng: parseFloat(cParam[1]),
+ zoom: parseInt(cParam[2], 10),
+ allowUrlHashCenter: centerModel.allowUrlHashCenter,
};
- });
- } else if (!isDefined(centerModel)) {
- $log.error(errorHeader + ' The "center" property is not defined in the main scope');
- map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
- return;
- } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) {
- angular.copy(defaults.center, centerModel);
+ }
}
- var urlCenterHash;
- var mapReady;
- if (attrs.urlHashCenter === 'yes') {
- var extractCenterFromUrl = function() {
- var search = $location.search();
- var centerParam;
- if (isDefined(search.c)) {
- var cParam = search.c.split(':');
- if (cParam.length === 3) {
- centerParam = {
- lat: parseFloat(cParam[0]),
- lng: parseFloat(cParam[1]),
- zoom: parseInt(cParam[2], 10),
- };
- }
- }
-
- return centerParam;
- };
+ return centerParam;
+ };
- urlCenterHash = extractCenterFromUrl();
+ urlCenterHash = extractCenterFromUrl();
- leafletScope.$on('$locationChangeSuccess', function(event) {
- var scope = event.currentScope;
+ leafletScope.$on('$locationChangeSuccess', function(event) {
+ var scope = event.currentScope;
- //$log.debug("updated location...");
- var urlCenter = extractCenterFromUrl();
- if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) {
- //$log.debug("updating center model...", urlCenter);
- angular.extend(scope[directiveName], {
- lat: urlCenter.lat,
- lng: urlCenter.lng,
- zoom: urlCenter.zoom,
- });
- }
+ var urlCenter = extractCenterFromUrl();
+ if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) {
+ angular.extend(scope.center, {
+ lat: urlCenter.lat,
+ lng: urlCenter.lng,
+ zoom: urlCenter.zoom,
+ allowUrlHashCenter: centerModel.allowUrlHashCenter,
});
}
+ });
+ }
- leafletScope.$watch(directiveName, function(center) {
- if (leafletScope.settingCenterFromLeaflet)
- return;
+ leafletScope.$watch('center', function(center) {
+ if (leafletScope.settingCenterFromLeaflet) {
+ return;
+ }
- //$log.debug("updated center model...");
- // The center from the URL has priority
- if (isDefined(urlCenterHash)) {
- angular.copy(urlCenterHash, center);
- urlCenterHash = undefined;
- }
+ // The center from the URL has priority
+ if (isDefined(urlCenterHash)) {
+ angular.copy(urlCenterHash, center);
+ urlCenterHash = undefined;
+ }
- if (!isValidCenter(center) && center.autoDiscover !== true) {
- $log.warn(errorHeader + ' invalid \'center\'');
+ if (!isValidCenter(center) && center.autoDiscover !== true) {
+ leafletLogger.warn(' invalid \'center\'', 'center');
- //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
- return;
- }
+ //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
+ return;
+ }
- if (center.autoDiscover === true) {
- if (!isNumber(center.zoom)) {
- map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
- }
+ if (center.autoDiscover === true) {
+ if (!isNumber(center.zoom)) {
+ map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
+ }
- if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) {
- map.locate({
- setView: true,
- maxZoom: center.zoom,
- });
- } else if (isDefined(defaults.maxZoom)) {
- map.locate({
- setView: true,
- maxZoom: defaults.maxZoom,
- });
- } else {
- map.locate({
- setView: true,
- });
- }
+ if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) {
+ map.locate({
+ setView: true,
+ maxZoom: center.zoom,
+ });
+ } else if (isDefined(defaults.maxZoom)) {
+ map.locate({
+ setView: true,
+ maxZoom: defaults.maxZoom,
+ });
+ } else {
+ map.locate({
+ setView: true,
+ });
+ }
- return;
- }
+ return;
+ }
- if (mapReady && isSameCenterOnMap(center, map)) {
- //$log.debug("no need to update map again.");
- return;
- }
+ if (mapReady && isSameCenterOnMap(center, map)) {
+ return;
+ }
- //$log.debug("updating map center...", center);
- leafletScope.settingCenterFromScope = true;
- map.setView([center.lat, center.lng], center.zoom);
- leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
- $timeout(function() {
+ leafletScope.settingCenterFromScope = true;
+ map.setView([center.lat, center.lng], center.zoom);
+ leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
+ $timeout(function() {
leafletScope.settingCenterFromScope = false;
-
- //$log.debug("allow center scope updates");
});
- }, true);
+ }, true);
- map.whenReady(function() {
- mapReady = true;
- });
+ map.whenReady(function() {
+ mapReady = true;
+ });
- map.on('moveend', function(/* event */) {
- // Resolve the center after the first map position
- _leafletCenter.resolve();
- leafletMapEvents.notifyCenterUrlHashChanged(leafletScope, map, attrs, $location.search());
+ map.on('moveend', function(/* event */) {
+ // Resolve the center after the first map position
+ _leafletCenter.resolve();
- //$log.debug("updated center on map...");
- if (isSameCenterOnMap(centerModel, map) || leafletScope.settingCenterFromScope) {
- //$log.debug("same center in model, no need to update again.");
- return;
- }
+ if (centerModel.allowUrlHashCenter === true) {
+ leafletMapEvents.notifyCenterUrlHashChanged(leafletScope, map, $location.search());
+ }
- leafletScope.settingCenterFromLeaflet = true;
- safeApply(leafletScope, function(scope) {
- if (!leafletScope.settingCenterFromScope) {
- //$log.debug("updating center model...", map.getCenter(), map.getZoom());
- angular.extend(scope[directiveName], {
- lat: map.getCenter().lat,
- lng: map.getCenter().lng,
- zoom: map.getZoom(),
- autoDiscover: false,
- });
- }
+ if (isSameCenterOnMap(centerModel, map) || leafletScope.settingCenterFromScope) {
+ return;
+ }
- leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
- $timeout(function() {
- leafletScope.settingCenterFromLeaflet = false;
- });
+ leafletScope.settingCenterFromLeaflet = true;
+ safeApply(leafletScope, function(scope) {
+ if (!leafletScope.settingCenterFromScope) {
+ angular.extend(scope.center, {
+ lat: map.getCenter().lat,
+ lng: map.getCenter().lng,
+ zoom: map.getZoom(),
+ autoDiscover: false,
});
+ }
+
+ leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
+ $timeout(function() {
+ leafletScope.settingCenterFromLeaflet = false;
});
+ });
+ });
- if (centerModel.autoDiscover === true) {
- map.on('locationerror', function() {
- $log.warn(errorHeader + ' The Geolocation API is unauthorized on this page.');
- if (isValidCenter(centerModel)) {
- map.setView([centerModel.lat, centerModel.lng], centerModel.zoom);
- leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
- } else {
- map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
- leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
- }
- });
+ if (centerModel.autoDiscover === true) {
+ map.on('locationerror', function() {
+ leafletLogger.warn('The Geolocation API is unauthorized on this page.', 'center');
+ if (isValidCenter(centerModel)) {
+ map.setView([centerModel.lat, centerModel.lng], centerModel.zoom);
+ leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
+ } else {
+ map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);
+ leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map);
}
});
- },
- };
+ }
+ });
},
- ];
-});
-
-centerDirectiveTypes.forEach(function(dirType) {
- angular.module('leaflet-directive').directive(dirType, centerDirectives[dirType]);
-});
+ };
+}]);
-angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpers", "leafletControlHelpers", function($log, leafletHelpers, leafletControlHelpers) {
+angular.module('leaflet-directive').directive('lfControls', ["leafletLogger", "leafletHelpers", "leafletControlHelpers", function(leafletLogger, leafletHelpers, leafletControlHelpers) {
return {
restrict: 'A',
@@ -3584,7 +3619,6 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe
var isDefined = leafletHelpers.isDefined;
var isArray = leafletHelpers.isArray;
var leafletControls = {};
- var errorHeader = leafletHelpers.errorHeader + ' [Controls] ';
controller.getMap().then(function(map) {
@@ -3607,7 +3641,7 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe
var controlType = isDefined(newControls[newName].type) ? newControls[newName].type : newName;
if (!isValidControlType(controlType)) {
- $log.error(errorHeader + ' Invalid control type: ' + controlType + '.');
+ leafletLogger.error(' Invalid control type: ' + controlType, 'controls');
return;
}
@@ -3637,7 +3671,16 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe
};
}]);
-angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHelpers", function($log, leafletHelpers) {
+angular.module('leaflet-directive').directive('decorations', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "decorations" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-decorations" markup attributes.', 'decorations');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('lfDecorations', ["leafletLogger", "leafletHelpers", function(leafletLogger, leafletHelpers) {
return {
restrict: 'A',
@@ -3655,7 +3698,7 @@ angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHe
function createDecoration(options) {
if (isDefined(options) && isDefined(options.coordinates)) {
if (!PolylineDecoratorPlugin.isLoaded()) {
- $log.error('[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.');
+ leafletLogger.error('The PolylineDecorator Plugin is not loaded.', 'decorations');
}
}
@@ -3698,7 +3741,115 @@ angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHe
};
}]);
-angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootScope", "leafletHelpers", "leafletMapEvents", "leafletIterators", function($log, $rootScope, leafletHelpers, leafletMapEvents, leafletIterators) {
+angular.module('leaflet-directive').directive('maxbounds', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "maxbounds" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-maxbounds" markup attributes.', 'maxbounds');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('defaults', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "defaults" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-defaults" markup attributes.', 'defaults');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('bounds', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "bounds" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-bounds" markup attributes.', 'bounds');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('controls', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "controls" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-controls" markup attributes.', 'controls');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('center', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "center" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-center" markup attributes.', 'center');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('paths', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "paths" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-paths" markup attributes.', 'paths');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('tiles', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "tiles" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-tiles" markup attributes.', 'tiles');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('markers', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "markers" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-markers" markup attributes.', 'markers');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('eventBroadcast', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "event-broadcast" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-events" markup attributes.', 'events');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('geojson', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "geojson" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-geojson" markup attributes.', 'geojson');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('layers', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "layers" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-layers" markup attributes.', 'layers');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('markers', ["leafletLogger", function(leafletLogger) {
+ return {
+ link: function() {
+ leafletLogger.error('The "markers" markup code is deprecated now. Please ' +
+ 'update your HTML with "lf-markers" markup attributes.', 'markers');
+ },
+ };
+}]);
+
+angular.module('leaflet-directive').directive('lfEvents', ["leafletLogger", "$rootScope", "leafletHelpers", "leafletMapEvents", "leafletIterators", function(leafletLogger, $rootScope, leafletHelpers, leafletMapEvents, leafletIterators) {
return {
restrict: 'A',
@@ -3710,7 +3861,7 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS
var isObject = leafletHelpers.isObject;
var isDefined = leafletHelpers.isDefined;
var leafletScope = controller.getLeafletScope();
- var eventBroadcast = leafletScope.eventBroadcast;
+ var eventBroadcast = leafletScope.lfEvents;
var availableMapEvents = leafletMapEvents.getAvailableMapEvents();
var addEvents = leafletMapEvents.addEvents;
@@ -3720,24 +3871,24 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS
var logic = 'broadcast';
// We have a possible valid object
- if (!isDefined(eventBroadcast.map)) {
+ if (!isDefined(eventBroadcast) || !isDefined(eventBroadcast.map)) {
// We do not have events enable/disable do we do nothing (all enabled by default)
mapEvents = availableMapEvents;
} else if (!isObject(eventBroadcast.map)) {
// Not a valid object
- $log.warn('[AngularJS - Leaflet] event-broadcast.map must be an object check your model.');
+ leafletLogger.warn('event-broadcast.map must be an object check your model.', 'events');
} else {
// We have a possible valid map object
// Event propadation logic
if (eventBroadcast.map.logic !== 'emit' && eventBroadcast.map.logic !== 'broadcast') {
// This is an error
- $log.warn('[AngularJS - Leaflet] Available event propagation logic are: \'emit\' or \'broadcast\'.');
+ leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.', 'events');
} else {
logic = eventBroadcast.map.logic;
}
if (!(isObject(eventBroadcast.map.enable) && eventBroadcast.map.enable.length >= 0)) {
- $log.warn('[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.');
+ leafletLogger.warn('[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.', 'events');
} else {
// Enable events
leafletIterators.each(eventBroadcast.map.enable, function(eventName) {
@@ -3759,7 +3910,7 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS
}]);
angular.module('leaflet-directive')
-.directive('geojson', ["$log", "$rootScope", "leafletData", "leafletHelpers", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", "leafletIterators", "leafletGeoJsonEvents", function($log, $rootScope, leafletData, leafletHelpers,
+.directive('lfGeojson', ["leafletLogger", "$rootScope", "leafletData", "leafletHelpers", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", "leafletIterators", "leafletGeoJsonEvents", function(leafletLogger, $rootScope, leafletData, leafletHelpers,
leafletWatchHelpers, leafletDirectiveControlsHelpers, leafletIterators, leafletGeoJsonEvents) {
var _maybeWatch = leafletWatchHelpers.maybeWatch;
var _watchOptions = leafletHelpers.watchOptions;
@@ -3807,8 +3958,10 @@ angular.module('leaflet-directive')
hlp.isTruthy(attrs.geojsonNested));
var _clean = function() {
- if (!leafletGeoJSON)
- return;
+ if (!leafletGeoJSON) {
+ return;
+ }
+
var _remove = function(lObject) {
if (isDefined(lObject) && map.hasLayer(lObject)) {
map.removeLayer(lObject);
@@ -3865,8 +4018,10 @@ angular.module('leaflet-directive')
var _create = function(model) {
_clean();
if (isNested) {
- if (!model || !Object.keys(model).length)
- return;
+ if (!model || !Object.keys(model).length) {
+ return;
+ }
+
$it.each(model, function(m, name) {
//name could be layerName and or groupName
//for now it is not tied to a layer
@@ -3889,7 +4044,7 @@ angular.module('leaflet-directive')
};
}]);
-angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log", "leafletData", "leafletHelpers", function($filter, $log, leafletData, leafletHelpers) {
+angular.module('leaflet-directive').directive('layercontrol', ["$filter", "leafletLogger", "leafletData", "leafletHelpers", function($filter, leafletLogger, leafletData, leafletHelpers) {
return {
restrict: 'E',
@@ -3905,7 +4060,6 @@ angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log"
transclude: false,
require: '^leaflet',
controller: ["$scope", "$element", "$sce", function($scope, $element, $sce) {
- $log.debug('[Angular Directive - Layers] layers', $scope, $element);
var safeApply = leafletHelpers.safeApply;
var isDefined = leafletHelpers.isDefined;
angular.extend($scope, {
@@ -4203,7 +4357,7 @@ angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log"
};
}]);
-angular.module('leaflet-directive').directive('layers', ["$log", "$q", "leafletData", "leafletHelpers", "leafletLayerHelpers", "leafletControlHelpers", function($log, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) {
+angular.module('leaflet-directive').directive('lfLayers', ["leafletLogger", "$q", "leafletData", "leafletHelpers", "leafletLayerHelpers", "leafletControlHelpers", function(leafletLogger, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) {
return {
restrict: 'A',
@@ -4412,7 +4566,7 @@ angular.module('leaflet-directive').directive('layers', ["$log", "$q", "leafletD
};
}]);
-angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafletHelpers", "leafletLegendHelpers", function($log, $http, leafletHelpers, leafletLegendHelpers) {
+angular.module('leaflet-directive').directive('lfLegend', ["leafletLogger", "$http", "leafletHelpers", "leafletLegendHelpers", function(leafletLogger, $http, leafletHelpers, leafletLegendHelpers) {
return {
restrict: 'A',
@@ -4452,7 +4606,6 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl
leafletScope.$watch('legend', function(newLegend) {
if (!isDefined(newLegend)) {
-
if (isDefined(leafletLegend)) {
leafletLegend.removeFrom(map);
leafletLegend = null;
@@ -4462,16 +4615,12 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl
}
if (!isDefined(newLegend.url) && (type === 'arcgis') && (!isArray(newLegend.colors) || !isArray(newLegend.labels) || newLegend.colors.length !== newLegend.labels.length)) {
-
- $log.warn('[AngularJS - Leaflet] legend.colors and legend.labels must be set.');
-
+ leafletLogger.warn('legend.colors and legend.labels must be set.', 'legend');
return;
}
if (isDefined(newLegend.url)) {
-
- $log.info('[AngularJS - Leaflet] loading legend service.');
-
+ leafletLogger.info('loading legend service.', 'legend');
return;
}
@@ -4483,12 +4632,12 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl
leafletLegend = L.control({
position: position,
});
+
if (type === 'arcgis') {
leafletLegend.onAdd = leafletLegendHelpers.getOnAddArrayLegend(newLegend, legendClass);
}
leafletLegend.addTo(map);
-
});
leafletScope.$watch('legend.url', function(newURL) {
@@ -4497,187 +4646,184 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl
return;
}
- $http.get(newURL)
- .success(function(legendData) {
-
- if (isDefined(leafletLegend)) {
-
- leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL);
-
- } else {
-
- leafletLegend = L.control({
- position: position,
- });
- leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL);
- leafletLegend.addTo(map);
- }
+ $http.get(newURL).success(function(legendData) {
+ if (isDefined(leafletLegend)) {
+ leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL);
+ } else {
+ leafletLegend = L.control({ position: position, });
+ leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL);
+ leafletLegend.addTo(map);
+ }
- if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) {
- legend.loadedData();
- }
- })
- .error(function() {
- $log.warn('[AngularJS - Leaflet] legend.url not loaded.');
- });
+ if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) {
+ legend.loadedData();
+ }
+ }).error(function() {
+ leafletLogger.warn('legend.url not loaded.', 'legend');
+ });
});
-
});
},
};
}]);
-angular.module('leaflet-directive').directive('markers',
- ["$log", "$rootScope", "$q", "leafletData", "leafletHelpers", "leafletMapDefaults", "leafletMarkersHelpers", "leafletMarkerEvents", "leafletIterators", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", function($log, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults,
- leafletMarkersHelpers, leafletMarkerEvents, leafletIterators, leafletWatchHelpers,
- leafletDirectiveControlsHelpers) {
- //less terse vars to helpers
- var isDefined = leafletHelpers.isDefined;
- var errorHeader = leafletHelpers.errorHeader;
- var Helpers = leafletHelpers;
- var isString = leafletHelpers.isString;
- var addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher;
- var updateMarker = leafletMarkersHelpers.updateMarker;
- var listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents;
- var addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup;
- var createMarker = leafletMarkersHelpers.createMarker;
- var deleteMarker = leafletMarkersHelpers.deleteMarker;
- var $it = leafletIterators;
- var _markersWatchOptions = leafletHelpers.watchOptions;
- var maybeWatch = leafletWatchHelpers.maybeWatch;
- var extendDirectiveControls = leafletDirectiveControlsHelpers.extend;
-
- var _getLMarker = function(leafletMarkers, name, maybeLayerName) {
- if (!Object.keys(leafletMarkers).length) return;
- if (maybeLayerName && isString(maybeLayerName)) {
- if (!leafletMarkers[maybeLayerName] || !Object.keys(leafletMarkers[maybeLayerName]).length)
- return;
- return leafletMarkers[maybeLayerName][name];
- }
+angular.module('leaflet-directive').directive('lfMarkers', ["leafletLogger", "$rootScope", "$q", "leafletData", "leafletHelpers", "leafletMapDefaults", "leafletMarkersHelpers", "leafletMarkerEvents", "leafletIterators", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", function(leafletLogger, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, leafletMarkersHelpers, leafletMarkerEvents, leafletIterators, leafletWatchHelpers, leafletDirectiveControlsHelpers) {
+ var isDefined = leafletHelpers.isDefined;
+ var Helpers = leafletHelpers;
+ var isString = leafletHelpers.isString;
+ var addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher;
+ var updateMarker = leafletMarkersHelpers.updateMarker;
+ var listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents;
+ var addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup;
+ var createMarker = leafletMarkersHelpers.createMarker;
+ var deleteMarker = leafletMarkersHelpers.deleteMarker;
+ var $it = leafletIterators;
+ var _markersWatchOptions = leafletHelpers.watchOptions;
+ var maybeWatch = leafletWatchHelpers.maybeWatch;
+ var extendDirectiveControls = leafletDirectiveControlsHelpers.extend;
- return leafletMarkers[name];
- };
+ var _getLMarker = function(leafletMarkers, name, maybeLayerName) {
+ if (!Object.keys(leafletMarkers).length) {
+ return;
+ }
+
+ if (maybeLayerName && isString(maybeLayerName)) {
+ if (!leafletMarkers[maybeLayerName] || !Object.keys(leafletMarkers[maybeLayerName]).length) {
+ return;
+ }
- var _setLMarker = function(lObject, leafletMarkers, name, maybeLayerName) {
+ return leafletMarkers[maybeLayerName][name];
+ }
+
+ return leafletMarkers[name];
+ };
+
+ var _setLMarker = function(lObject, leafletMarkers, name, maybeLayerName) {
if (maybeLayerName && isString(maybeLayerName)) {
- if (!isDefined(leafletMarkers[maybeLayerName]))
- leafletMarkers[maybeLayerName] = {};
+ if (!isDefined(leafletMarkers[maybeLayerName])) {
+ leafletMarkers[maybeLayerName] = {};
+ }
+
leafletMarkers[maybeLayerName][name] = lObject;
- } else
- leafletMarkers[name] = lObject;
+ } else {
+ leafletMarkers[name] = lObject;
+ }
+
return lObject;
};
- var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map) {
-
- if (!isString(layerName)) {
- $log.error(errorHeader + ' A layername must be a string');
- return false;
- }
+ var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map) {
- if (!isDefined(layers)) {
- $log.error(errorHeader + ' You must add layers to the directive if the markers are going to use this functionality.');
- return false;
- }
+ if (!isString(layerName)) {
+ leafletLogger.error('A layername must be a string', 'markers');
+ return false;
+ }
- if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) {
- $log.error(errorHeader + ' A marker can only be added to a layer of type "group"');
- return false;
- }
+ if (!isDefined(layers)) {
+ leafletLogger.error('You must add layers to the directive if the markers are going to use this functionality.', 'markers');
+ return false;
+ }
- var layerGroup = layers.overlays[layerName];
- if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {
- $log.error(errorHeader + ' Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"');
- return false;
- }
+ if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) {
+ leafletLogger.error('A marker can only be added to a layer of type "group"', 'markers');
+ return false;
+ }
- // The marker goes to a correct layer group, so first of all we add it
- layerGroup.addLayer(marker);
+ var layerGroup = layers.overlays[layerName];
+ if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {
+ leafletLogger.error('Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"', 'markers');
+ return false;
+ }
- // The marker is automatically added to the map depending on the visibility
- // of the layer, so we only have to open the popup if the marker is in the map
- if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) {
- marker.openPopup();
- }
+ // The marker goes to a correct layer group, so first of all we add it
+ layerGroup.addLayer(marker);
- return true;
- };
+ // The marker is automatically added to the map depending on the visibility
+ // of the layer, so we only have to open the popup if the marker is in the map
+ if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) {
+ marker.openPopup();
+ }
- //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already)
- var _addMarkers = function(mapId, markersToRender, oldModels, map, layers, leafletMarkers, leafletScope,
- watchOptions, maybeLayerName, skips) {
- for (var newName in markersToRender) {
- if (skips[newName])
- continue;
+ return true;
+ };
- if (newName.search('-') !== -1) {
- $log.error('The marker can\'t use a "-" on his key name: "' + newName + '".');
- continue;
- }
+ //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already)
+ var _addMarkers = function(mapId, markersToRender, oldModels, map, layers, leafletMarkers, leafletScope,
+ watchOptions, maybeLayerName, skips) {
+ for (var newName in markersToRender) {
+ if (skips[newName]) {
+ continue;
+ }
- var model = Helpers.copy(markersToRender[newName]);
- var pathToMarker = Helpers.getObjectDotPath(maybeLayerName ? [maybeLayerName, newName] : [newName]);
- var maybeLMarker = _getLMarker(leafletMarkers, newName, maybeLayerName);
- if (!isDefined(maybeLMarker)) {
- //(nmccready) very important to not have model changes when lObject is changed
- //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal
- //if it is left as the reference then all changes from oldModel vs newModel are ignored
- //see _destroy (where modelDiff becomes meaningless if we do not copy here)
- var marker = createMarker(model);
- var layerName = (model ? model.layer : undefined) || maybeLayerName; //original way takes pref
- if (!isDefined(marker)) {
- $log.error(errorHeader + ' Received invalid data on the marker ' + newName + '.');
- continue;
- }
+ if (newName.search('-') !== -1) {
+ leafletLogger.error('The marker can\'t use a "-" on his key name: "' + newName + '".', 'markers');
+ continue;
+ }
- _setLMarker(marker, leafletMarkers, newName, maybeLayerName);
+ var model = Helpers.copy(markersToRender[newName]);
+ var pathToMarker = Helpers.getObjectDotPath(maybeLayerName ? [maybeLayerName, newName] : [newName]);
+ var maybeLMarker = _getLMarker(leafletMarkers, newName, maybeLayerName);
+ if (!isDefined(maybeLMarker)) {
+ //(nmccready) very important to not have model changes when lObject is changed
+ //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal
+ //if it is left as the reference then all changes from oldModel vs newModel are ignored
+ //see _destroy (where modelDiff becomes meaningless if we do not copy here)
+ var marker = createMarker(model);
+ var layerName = (model ? model.layer : undefined) || maybeLayerName; //original way takes pref
+ if (!isDefined(marker)) {
+ leafletLogger.error('Received invalid data on the marker ' + newName, 'markers');
+ continue;
+ }
- // Bind message
- if (isDefined(model.message)) {
- marker.bindPopup(model.message, model.popupOptions);
- }
+ _setLMarker(marker, leafletMarkers, newName, maybeLayerName);
- // Add the marker to a cluster group if needed
- if (isDefined(model.group)) {
- var groupOptions = isDefined(model.groupOption) ? model.groupOption : null;
- addMarkerToGroup(marker, model.group, groupOptions, map);
- }
+ // Bind message
+ if (isDefined(model.message)) {
+ marker.bindPopup(model.message, model.popupOptions);
+ }
- // Show label if defined
- if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) {
- marker.bindLabel(model.label.message, model.label.options);
- }
+ // Add the marker to a cluster group if needed
+ if (isDefined(model.group)) {
+ var groupOptions = isDefined(model.groupOption) ? model.groupOption : null;
+ addMarkerToGroup(marker, model.group, groupOptions, map);
+ }
- // Check if the marker should be added to a layer
- if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))) {
-
- var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker,
- watchOptions.individual.doWatch, map);
- if (!pass)
- continue; //something went wrong move on in the loop
- } else if (!isDefined(model.group)) {
- // We do not have a layer attr, so the marker goes to the map layer
- map.addLayer(marker);
- if (!watchOptions.individual.doWatch && model.focus === true) {
- marker.openPopup();
- }
- }
+ // Show label if defined
+ if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) {
+ marker.bindLabel(model.label.message, model.label.options);
+ }
- if (watchOptions.individual.doWatch) {
- addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map,
- watchOptions.individual.isDeep);
- }
+ // Check if the marker should be added to a layer
+ if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))) {
- listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch, map);
- leafletMarkerEvents.bindEvents(mapId, marker, pathToMarker, model, leafletScope, layerName);
- } else {
- var oldModel = isDefined(oldModel) ? oldModels[newName] : undefined;
- updateMarker(model, oldModel, maybeLMarker, pathToMarker, leafletScope, layers, map);
+ var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker,
+ watchOptions.individual.doWatch, map);
+ if (!pass) {
+ continue; //something went wrong move on in the loop
+ }
+ } else if (!isDefined(model.group)) {
+ // We do not have a layer attr, so the marker goes to the map layer
+ map.addLayer(marker);
+ if (!watchOptions.individual.doWatch && model.focus === true) {
+ marker.openPopup();
}
}
- };
- var _seeWhatWeAlreadyHave = function(markerModels, oldMarkerModels, lMarkers, isEqual, cb) {
+ if (watchOptions.individual.doWatch) {
+ addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map,
+ watchOptions.individual.isDeep);
+ }
+
+ listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch, map);
+ leafletMarkerEvents.bindEvents(mapId, marker, pathToMarker, model, leafletScope, layerName);
+ } else {
+ var oldModel = isDefined(oldModel) ? oldModels[newName] : undefined;
+ updateMarker(model, oldModel, maybeLMarker, pathToMarker, leafletScope, layers, map);
+ }
+ }
+ };
+
+ var _seeWhatWeAlreadyHave = function(markerModels, oldMarkerModels, lMarkers, isEqual, cb) {
var hasLogged = false;
var equals = false;
var oldMarker;
@@ -4686,7 +4832,6 @@ angular.module('leaflet-directive').directive('markers',
var doCheckOldModel = isDefined(oldMarkerModels);
for (var name in lMarkers) {
if (!hasLogged) {
- $log.debug(errorHeader + '[markers] destroy: ');
hasLogged = true;
}
@@ -4703,37 +4848,38 @@ angular.module('leaflet-directive').directive('markers',
!isDefined(markerModels[name]) ||
!Object.keys(markerModels[name]).length ||
equals) {
- if (cb && Helpers.isFunction(cb))
- cb(newMarker, oldMarker, name);
+ if (cb && Helpers.isFunction(cb)) {
+ cb(newMarker, oldMarker, name);
+ }
}
}
};
- var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers) {
+ var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers) {
_seeWhatWeAlreadyHave(markerModels, oldMarkerModels, lMarkers, false,
function(newMarker, oldMarker, lMarkerName) {
- $log.debug(errorHeader + '[marker] is deleting marker: ' + lMarkerName);
+ leafletLogger.debug('Deleting marker: ' + lMarkerName, 'markers');
deleteMarker(lMarkers[lMarkerName], map, layers);
delete lMarkers[lMarkerName];
});
};
- var _getNewModelsToSkipp = function(newModels, oldModels, lMarkers) {
+ var _getNewModelsToSkipp = function(newModels, oldModels, lMarkers) {
var skips = {};
_seeWhatWeAlreadyHave(newModels, oldModels, lMarkers, true,
function(newMarker, oldMarker, lMarkerName) {
- $log.debug(errorHeader + '[marker] is already rendered, marker: ' + lMarkerName);
+ leafletLogger.debug('Already rendered marker: ' + lMarkerName, 'markers');
skips[lMarkerName] = newMarker;
});
return skips;
};
- return {
+ return {
restrict: 'A',
scope: false,
replace: false,
- require: ['leaflet', '?layers'],
+ require: ['leaflet', '?lfLayers'],
link: function(scope, element, attrs, controller) {
var mapController = controller[0];
@@ -4757,9 +4903,10 @@ angular.module('leaflet-directive').directive('markers',
var watchOptions = leafletScope.markersWatchOptions || _markersWatchOptions;
// backwards compat
- if (isDefined(attrs.watchMarkers))
- watchOptions.doWatch = watchOptions.individual.doWatch =
- (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers));
+ if (isDefined(attrs.watchMarkers)) {
+ watchOptions.doWatch = watchOptions.individual.doWatch =
+ (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers));
+ }
var isNested = (isDefined(attrs.markersNested) && Helpers.isTruthy(attrs.markersNested));
@@ -4806,9 +4953,9 @@ angular.module('leaflet-directive').directive('markers',
});
},
};
- }]);
+}]);
-angular.module('leaflet-directive').directive('maxbounds', ["$log", "leafletMapDefaults", "leafletBoundsHelpers", "leafletHelpers", function($log, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) {
+angular.module('leaflet-directive').directive('lfMaxbounds', ["leafletLogger", "leafletMapDefaults", "leafletBoundsHelpers", "leafletHelpers", function(leafletLogger, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) {
return {
restrict: 'A',
@@ -4844,13 +4991,13 @@ angular.module('leaflet-directive').directive('maxbounds', ["$log", "leafletMapD
};
}]);
-angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletPathsHelpers", "leafletPathEvents", function($log, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletPathEvents) {
+angular.module('leaflet-directive').directive('lfPaths', ["leafletLogger", "$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletPathsHelpers", "leafletPathEvents", function(leafletLogger, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletPathEvents) {
return {
restrict: 'A',
scope: false,
replace: false,
- require: ['leaflet', '?layers'],
+ require: ['leaflet', '?lfLayers'],
link: function(scope, element, attrs, controller) {
var mapController = controller[0];
@@ -4926,7 +5073,7 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa
}
if (newName.search('-') !== -1) {
- $log.error('[AngularJS - Leaflet] The path name "' + newName + '" is not valid. It must not include "-" and a number.');
+ leafletLogger.error('The path name "' + newName + '" is not valid. It must not include "-" and a number.', 'paths');
continue;
}
@@ -4948,23 +5095,23 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa
if (isDefined(pathData) && isDefined(pathData.layer)) {
if (!isString(pathData.layer)) {
- $log.error('[AngularJS - Leaflet] A layername must be a string');
+ leafletLogger.error('A layername must be a string', 'paths');
continue;
}
if (!isDefined(layers)) {
- $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.');
+ leafletLogger.error('You must add layers to the directive if the markers are going to use this functionality', 'paths');
continue;
}
if (!isDefined(layers.overlays) || !isDefined(layers.overlays[pathData.layer])) {
- $log.error('[AngularJS - Leaflet] A path can only be added to a layer of type "group"');
+ leafletLogger.error('A path can only be added to a layer of type "group"', 'paths');
continue;
}
var layerGroup = layers.overlays[pathData.layer];
if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {
- $log.error('[AngularJS - Leaflet] Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"');
+ leafletLogger.error('Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"', 'paths');
continue;
}
@@ -5001,7 +5148,7 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa
};
}]);
-angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "leafletMapDefaults", "leafletHelpers", function($log, leafletData, leafletMapDefaults, leafletHelpers) {
+angular.module('leaflet-directive').directive('lfTiles', ["leafletLogger", "leafletData", "leafletMapDefaults", "leafletHelpers", function(leafletLogger, leafletData, leafletMapDefaults, leafletHelpers) {
return {
restrict: 'A',
@@ -5015,14 +5162,16 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "
var tiles = leafletScope.tiles;
if (!isDefined(tiles) || !isDefined(tiles.url)) {
- $log.warn('[AngularJS - Leaflet] The \'tiles\' definition doesn\'t have the \'url\' property.');
+ leafletLogger.warn('[AngularJS - Leaflet] The \'tiles\' definition doesn\'t have the \'url\' property.', 'tiles');
return;
}
controller.getMap().then(function(map) {
var defaults = leafletMapDefaults.getDefaults(attrs.id);
var tileLayerObj;
+
leafletScope.$watch('tiles', function(tiles, oldtiles) {
+
var tileLayerOptions = defaults.tileLayerOptions;
var tileLayerUrl = defaults.tileLayer;
@@ -5053,7 +5202,7 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "
return;
}
- // If the options of the tilelayer is changed, we need to redraw the layer
+ // If the options of the tilelayer are changed, we need to redraw the layer
if (isDefined(tiles.url) && isDefined(tiles.options) &&
(tiles.type !== oldtiles.type || !angular.equals(tiles.options, tileLayerOptions))) {
map.removeLayer(tileLayerObj);
@@ -5089,13 +5238,12 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "
*/
['markers', 'geojson'].forEach(function(name) {
angular.module('leaflet-directive').directive(name + 'WatchOptions', [
- '$log', '$rootScope', '$q', 'leafletData', 'leafletHelpers',
- function($log, $rootScope, $q, leafletData, leafletHelpers) {
+ 'leafletLogger', '$rootScope', '$q', 'leafletData', 'leafletHelpers',
+ function(leafletLogger, $rootScope, $q, leafletData, leafletHelpers) {
- var isDefined = leafletHelpers.isDefined,
- errorHeader = leafletHelpers.errorHeader,
- isObject = leafletHelpers.isObject,
- _watchOptions = leafletHelpers.watchOptions;
+ var isDefined = leafletHelpers.isDefined;
+ var isObject = leafletHelpers.isObject;
+ var _watchOptions = leafletHelpers.watchOptions;
return {
restrict: 'A',
@@ -5112,26 +5260,24 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "
if (isObject(scope[name + 'WatchOptions']))
angular.extend(_watchOptions, scope[name + 'WatchOptions']);
else
- $log.error(errorHeader + '[' + name + 'WatchOptions] is not an object');
+ leafletLogger.error('is not an object', 'watch options');
leafletScope[name + 'WatchOptions'] = _watchOptions;
}
});
},
};
- },]);
+ }, ]);
});
angular.module('leaflet-directive')
-.factory('LeafletEventsHelpersFactory', ["$rootScope", "$q", "$log", "leafletHelpers", function($rootScope, $q, $log, leafletHelpers) {
+.factory('LeafletEventsHelpersFactory', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", function($rootScope, $q, leafletLogger, leafletHelpers) {
var safeApply = leafletHelpers.safeApply;
var isDefined = leafletHelpers.isDefined;
var isObject = leafletHelpers.isObject;
var isArray = leafletHelpers.isArray;
- var errorHeader = leafletHelpers.errorHeader;
var EventsHelper = function(rootBroadcastName, lObjectType) {
this.rootBroadcastName = rootBroadcastName;
- $log.debug('LeafletEventsHelpersFactory: lObjectType: ' + lObjectType + 'rootBroadcastName: ' + rootBroadcastName);
//used to path/key out certain properties based on the type , "markers", "geojson"
this.lObjectType = lObjectType;
@@ -5161,12 +5307,12 @@ angular.module('leaflet-directive')
var _this = this;
maybeMapId = maybeMapId || '';
- if (maybeMapId)
+ if (maybeMapId) {
maybeMapId = '.' + maybeMapId;
+ }
return function(e) {
var broadcastName = _this.rootBroadcastName + maybeMapId + '.' + eventName;
- $log.debug(broadcastName);
_this.fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName, extra);
};
};
@@ -5180,8 +5326,9 @@ angular.module('leaflet-directive')
modelName: modelName,
model: model,
};
- if (isDefined(layerName))
- angular.extend(toSend, {layerName: layerName});
+ if (isDefined(layerName)) {
+ angular.extend(toSend, {layerName: layerName});
+ }
if (logic === 'emit') {
scope.$emit(broadcastName, toSend);
@@ -5201,7 +5348,7 @@ angular.module('leaflet-directive')
events = this.getAvailableEvents();
} else if (!isObject(leafletScope.eventBroadcast)) {
// Not a valid object
- $log.error(errorHeader + 'event-broadcast must be an object check your model.');
+ leafletLogger.error('event-broadcast must be an object check your model.');
} else {
// We have a possible valid object
if (!isDefined(leafletScope.eventBroadcast[_this.lObjectType])) {
@@ -5209,33 +5356,37 @@ angular.module('leaflet-directive')
events = this.getAvailableEvents();
} else if (!isObject(leafletScope.eventBroadcast[_this.lObjectType])) {
// Not a valid object
- $log.warn(errorHeader + 'event-broadcast.' + [_this.lObjectType] + ' must be an object check your model.');
+ leafletLogger.warn('event-broadcast.' + [_this.lObjectType] + ' must be an object check your model.');
} else {
// We have a possible valid map object
// Event propadation logic
if (isDefined(leafletScope.eventBroadcast[this.lObjectType].logic)) {
// We take care of possible propagation logic
if (leafletScope.eventBroadcast[_this.lObjectType].logic !== 'emit' &&
- leafletScope.eventBroadcast[_this.lObjectType].logic !== 'broadcast')
- $log.warn(errorHeader + 'Available event propagation logic are: \'emit\' or \'broadcast\'.');
+ leafletScope.eventBroadcast[_this.lObjectType].logic !== 'broadcast') {
+ leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.');
+ }
}
// Enable / Disable
var eventsEnable = false;
var eventsDisable = false;
if (isDefined(leafletScope.eventBroadcast[_this.lObjectType].enable) &&
- isArray(leafletScope.eventBroadcast[_this.lObjectType].enable))
- eventsEnable = true;
+ isArray(leafletScope.eventBroadcast[_this.lObjectType].enable)) {
+ eventsEnable = true;
+ }
+
if (isDefined(leafletScope.eventBroadcast[_this.lObjectType].disable) &&
- isArray(leafletScope.eventBroadcast[_this.lObjectType].disable))
- eventsDisable = true;
+ isArray(leafletScope.eventBroadcast[_this.lObjectType].disable)) {
+ eventsDisable = true;
+ }
if (eventsEnable && eventsDisable) {
// Both are active, this is an error
- $log.warn(errorHeader + 'can not enable and disable events at the same time');
+ leafletLogger.warn('can not enable and disable events at the same time');
} else if (!eventsEnable && !eventsDisable) {
// Both are inactive, this is an error
- $log.warn(errorHeader + 'must enable or disable events');
+ leafletLogger.warn('must enable or disable events');
} else {
// At this point the object is OK, lets enable or disable events
if (eventsEnable) {
@@ -5244,12 +5395,12 @@ angular.module('leaflet-directive')
// Do we have already the event enabled?
if (events.indexOf(eventName) !== -1) {
// Repeated event, this is an error
- $log.warn(errorHeader + 'This event ' + eventName + ' is already enabled');
+ leafletLogger.warn('This event ' + eventName + ' is already enabled');
} else {
// Does the event exists?
if (_this.getAvailableEvents().indexOf(eventName) === -1) {
// The event does not exists, this is an error
- $log.warn(errorHeader + 'This event ' + eventName + ' does not exist');
+ leafletLogger.warn('This event ' + eventName + ' does not exist');
} else {
// All ok enable the event
events.push(eventName);
@@ -5263,7 +5414,7 @@ angular.module('leaflet-directive')
var index = events.indexOf(eventName);
if (index === -1) {
// The event does not exist
- $log.warn(errorHeader + 'This event ' + eventName + ' does not exist or has been already disabled');
+ leafletLogger.warn('This event ' + eventName + ' does not exist or has been already disabled');
} else {
events.splice(index, 1);
@@ -5288,7 +5439,7 @@ angular.module('leaflet-directive')
}]);
angular.module('leaflet-directive')
-.factory('leafletGeoJsonEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletData", function($rootScope, $q, $log, leafletHelpers,
+.factory('leafletGeoJsonEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletData", function($rootScope, $q, leafletLogger, leafletHelpers,
LeafletEventsHelpersFactory, leafletData) {
var safeApply = leafletHelpers.safeApply;
var EventsHelper = LeafletEventsHelpersFactory;
@@ -5336,7 +5487,7 @@ angular.module('leaflet-directive')
}]);
angular.module('leaflet-directive')
-.factory('leafletLabelEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory) {
+.factory('leafletLabelEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory) {
var Helpers = leafletHelpers;
var EventsHelper = LeafletEventsHelpersFactory;
@@ -5379,7 +5530,7 @@ angular.module('leaflet-directive')
}]);
angular.module('leaflet-directive')
-.factory('leafletMapEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletEventsHelpers", "leafletIterators", function($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers, leafletIterators) {
+.factory('leafletMapEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "leafletEventsHelpers", "leafletIterators", function($rootScope, $q, leafletLogger, leafletHelpers, leafletEventsHelpers, leafletIterators) {
var isDefined = leafletHelpers.isDefined;
var fire = leafletEventsHelpers.fire;
@@ -5433,12 +5584,13 @@ angular.module('leaflet-directive')
};
var _genDispatchMapEvent = function(scope, eventName, logic, maybeMapId) {
- if (maybeMapId)
+ if (maybeMapId) {
maybeMapId = maybeMapId + '.';
+ }
+
return function(e) {
// Put together broadcast name
var broadcastName = 'leafletDirectiveMap.' + maybeMapId + eventName;
- $log.debug(broadcastName);
// Safely broadcast the event
fire(scope, broadcastName, logic, e, e.target, scope);
@@ -5449,15 +5601,10 @@ angular.module('leaflet-directive')
scope.$broadcast('boundsChanged');
};
- var _notifyCenterUrlHashChanged = function(scope, map, attrs, search) {
- if (!isDefined(attrs.urlHashCenter)) {
- return;
- }
-
+ var _notifyCenterUrlHashChanged = function(scope, map, search) {
var center = map.getCenter();
var centerUrlHash = (center.lat).toFixed(4) + ':' + (center.lng).toFixed(4) + ':' + map.getZoom();
if (!isDefined(search.c) || search.c !== centerUrlHash) {
- //$log.debug("notified new center...");
scope.$emit('centerUrlHash', centerUrlHash);
}
};
@@ -5480,7 +5627,7 @@ angular.module('leaflet-directive')
}]);
angular.module('leaflet-directive')
-.factory('leafletMarkerEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletLabelEvents", function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory, leafletLabelEvents) {
+.factory('leafletMarkerEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletLabelEvents", function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory, leafletLabelEvents) {
var safeApply = leafletHelpers.safeApply;
var isDefined = leafletHelpers.isDefined;
var Helpers = leafletHelpers;
@@ -5551,11 +5698,10 @@ angular.module('leaflet-directive')
}]);
angular.module('leaflet-directive')
-.factory('leafletPathEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletLabelEvents", "leafletEventsHelpers", function($rootScope, $q, $log, leafletHelpers, leafletLabelEvents, leafletEventsHelpers) {
+.factory('leafletPathEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "leafletLabelEvents", "leafletEventsHelpers", function($rootScope, $q, leafletLogger, leafletHelpers, leafletLabelEvents, leafletEventsHelpers) {
var isDefined = leafletHelpers.isDefined;
var isObject = leafletHelpers.isObject;
var Helpers = leafletHelpers;
- var errorHeader = leafletHelpers.errorHeader;
var lblHelp = leafletLabelEvents;
var fire = leafletEventsHelpers.fire;
@@ -5566,12 +5712,12 @@ angular.module('leaflet-directive')
var _genDispatchPathEvent = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName) {
maybeMapId = maybeMapId || '';
- if (maybeMapId)
+ if (maybeMapId) {
maybeMapId = '.' + maybeMapId;
+ }
return function(e) {
var broadcastName = 'leafletDirectivePath' + maybeMapId + '.' + eventName;
- $log.debug(broadcastName);
fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName);
};
};
@@ -5587,7 +5733,7 @@ angular.module('leaflet-directive')
pathEvents = _getAvailablePathEvents();
} else if (!isObject(leafletScope.eventBroadcast)) {
// Not a valid object
- $log.error(errorHeader + 'event-broadcast must be an object check your model.');
+ leafletLogger.error('event-broadcast must be an object check your model.');
} else {
// We have a possible valid object
if (!isDefined(leafletScope.eventBroadcast.path)) {
@@ -5595,7 +5741,7 @@ angular.module('leaflet-directive')
pathEvents = _getAvailablePathEvents();
} else if (isObject(leafletScope.eventBroadcast.paths)) {
// Not a valid object
- $log.warn(errorHeader + 'event-broadcast.path must be an object check your model.');
+ leafletLogger.warn('event-broadcast.path must be an object check your model.');
} else {
// We have a possible valid map object
// Event propadation logic
@@ -5603,7 +5749,7 @@ angular.module('leaflet-directive')
// We take care of possible propagation logic
if (leafletScope.eventBroadcast.path.logic !== 'emit' && leafletScope.eventBroadcast.path.logic !== 'broadcast') {
// This is an error
- $log.warn(errorHeader + 'Available event propagation logic are: \'emit\' or \'broadcast\'.');
+ leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.');
} else if (leafletScope.eventBroadcast.path.logic === 'emit') {
logic = 'emit';
}
@@ -5626,10 +5772,10 @@ angular.module('leaflet-directive')
if (pathEventsEnable && pathEventsDisable) {
// Both are active, this is an error
- $log.warn(errorHeader + 'can not enable and disable events at the same time');
+ leafletLogger.warn('can not enable and disable events at the same time');
} else if (!pathEventsEnable && !pathEventsDisable) {
// Both are inactive, this is an error
- $log.warn(errorHeader + 'must enable or disable events');
+ leafletLogger.warn('must enable or disable events');
} else {
// At this point the path object is OK, lets enable or disable events
if (pathEventsEnable) {
@@ -5640,12 +5786,12 @@ angular.module('leaflet-directive')
// Do we have already the event enabled?
if (pathEvents.indexOf(eventName) !== -1) {
// Repeated event, this is an error
- $log.warn(errorHeader + 'This event ' + eventName + ' is already enabled');
+ leafletLogger.warn('This event ' + eventName + ' is already enabled');
} else {
// Does the event exists?
if (_getAvailablePathEvents().indexOf(eventName) === -1) {
// The event does not exists, this is an error
- $log.warn(errorHeader + 'This event ' + eventName + ' does not exist');
+ leafletLogger.warn('This event ' + eventName + ' does not exist');
} else {
// All ok enable the event
pathEvents.push(eventName);
@@ -5660,7 +5806,7 @@ angular.module('leaflet-directive')
var index = pathEvents.indexOf(eventName);
if (index === -1) {
// The event does not exist
- $log.warn(errorHeader + 'This event ' + eventName + ' does not exist or has been already disabled');
+ leafletLogger.warn('This event ' + eventName + ' does not exist or has been already disabled');
} else {
pathEvents.splice(index, 1);
diff --git a/doc/defaults-attribute.md b/doc/defaults.md
similarity index 88%
rename from doc/defaults-attribute.md
rename to doc/defaults.md
index 3a4209fa..6330f758 100644
--- a/doc/defaults-attribute.md
+++ b/doc/defaults.md
@@ -1,10 +1,10 @@
-'defaults' Attribute Documentation
+'defaults' Documentation
==================================
-This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this:
+This attribute is used with the the **leaflet** main directive, like this:
```
-
+<leaflet defaults="defaults"></leaflet>
```
It will define the default parameters from which we want to initialize our map. It's not used as a bi-directional attribute, so it will only apply the initial map parameters and nothing more. Let's see the possibilities.
@@ -43,7 +43,7 @@ angular.extend($scope, {
And after that, in our HTML code we will define our leaflet directive like this:
```
-
+<leaflet defaults="defaults"></leaflet>
```
-And that's all. A full example of using this attribute can be found [here](http://tombatossals.github.io/angular-leaflet-directive/examples/custom-parameters-example.html).
+And that's all. An example of how to use this attribute can be found [here](http://tombatossals.github.io/angular-leaflet-directive/examples/0104-basic-custom-parameters-example.html).
diff --git a/doc/leaflet-directive.md b/doc/leaflet-directive.md
deleted file mode 100644
index 64ca4017..00000000
--- a/doc/leaflet-directive.md
+++ /dev/null
@@ -1,95 +0,0 @@
-Leaflet directive Documentation
-===============================
-
-This directive acts as an intermediary between the AngularJS framework and the Leaflet map management library. It's composed of a main directive **<leaflet>** and attributes (coded as sub-directives) of the main directive. For example, we could add to our HTML code:
-
-```
-
-```
-
-Here we have the main **leaflet** directive, with the attribute **center** and two more attributes (without bi-directional binding) **width** and **height**.
-
-Before detailing how to use the directive and its attributes, let's talk about initializing our web page to be able to work with the directive. We must load the required JS libraries and CSS in our HTML:
-
-```
-
-
-
-
-
-
-
-
-```
-
-After loading the required libraries, we only need to define our AngularJS application (depending on 'openlayers-library') and an application controller to be able to load our map. Showing the map on screen will require that we set the width and height CSS properties of the div including the Leaflet map. We have a lot of alternatives for this, let's see the main ones.
-
-* We can add *height* and *width* attributes to our *leaflet* directive inline. Example:
-```
-
-```
-
-* We can set the *width* and *height* of the common CSS class '*angular-leaflet-map*' applied to all maps. Beware this will be applied to all maps rendered on your application. Example:
-```
-
-```
-
-* We can set and *id* to our map, and set the CSS properties to this specifid id. Example:
-```
-
-...
-
-```
-
-
-Great, let's see now the complete HTML and inline javascript code needed to load our first map:
-
-```
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-You can see this example in action on the [simple-example.html demo file](http://tombatossals.github.io/angular-leaflet-directive/examples/simple-example.html).
-
-Take a look at the [AnguarJS controller documentation](http://docs.angularjs.org/guide/controller) if you want to learn more about Angular controller definition, or to the [AngularJS ngApp](http://docs.angularjs.org/api/ng.directive:ngApp) to know how to bootstrap an Angular application.
-
-
-Attributes Documentation
-========================
-
-We have much more possibilities than showing a simple map, but this will need that we take a closer look at the attributes, listed below:
-
-* [_defaults_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/defaults-attribute.md)
-* [_center_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/center-attribute.md)
-* [_bounds_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/bounds-attribute.md)
-* [_maxbounds_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/maxbounds-attribute.md)
-* [_tiles_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/tiles-attribute.md)
-* [_layers_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/layers-attribute.md)
-* [_paths_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/paths-attribute.md)
diff --git a/doc/leaflet.md b/doc/leaflet.md
new file mode 100644
index 00000000..91aa5758
--- /dev/null
+++ b/doc/leaflet.md
@@ -0,0 +1,87 @@
+Leaflet directive Documentation
+===============================
+
+This directive acts as an intermediary between the AngularJS framework and the Leaflet map management library. It's composed of a main directive "**leaflet**" and attributes which gives us the required functionality. For example, we could add to our HTML code:
+
+```
+<leaflet lf-center="center" width="640px" height="480px">
+```
+
+Here we have the main "**leaflet**" directive, with the sub-direcitve "**lf-center**" and two more attributes (without bi-directional binding) **width** and **height**.
+
+Before detailing how to use the directive and its attributes, let's talk about initializing our web page to be able to work with the directive. We must load the required JS libraries and CSS in our HTML:
+
+```
+<html>
+ <head>
+ <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.min.js">
+ <script src="http://cdn.leafletjs.com/leaflet-0.7.7/leaflet.js">
+ <script src="http://tombatossals.github.io/angular-leaflet-directive/dist/angular-leaflet-directive.min.js">
+ <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.7/leaflet.css" />
+ </head>
+</html>
+```
+
+After loading the required libraries, we only need to define our AngularJS application (depending on 'angular-leaflet') and an application controller to be able to load our map. Showing the map on screen will require that we set the width and height CSS properties of the div including the Leaflet map. We have a lot of alternatives for this, let's see the main ones.
+
+* We can add *height* and *width* attributes to our *leaflet* directive inline. Example:
+```
+<leaflet width="640px" height="480px"></leaflet>
+```
+
+* We can set the *width* and *height* of the common CSS class '*angular-leaflet-map*' applied to all maps. Beware this will be applied to all maps rendered in your application. Example:
+```
+<style>
+ .angular-leaflet-map {
+ width: 640px;
+ height: 480px;
+ }
+</style>
+```
+
+* We can set and *id* to our map, and set the CSS properties to this specifid id. Example:
+```
+<style>
+ #main {
+ width: 640px;
+ height: 480px;
+ }
+</style>
+...
+<leaflet id="main">
+```
+
+
+Great, let's see now the complete HTML and inline javascript code needed to load our first map:
+
+```
+<!DOCTYPE html>
+<html ng-app="demoapp">
+ <head>
+ <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.min.js">
+ <script src="http://cdn.leafletjs.com/leaflet-0.7.7/leaflet.js">
+ <script src="http://tombatossals.github.io/angular-leaflet-directive/dist/angular-leaflet-directive.min.js">
+ <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.7/leaflet.css" />
+ <script>
+ var app = angular.module("demoapp", ['leaflet-directive']);
+ app.controller("DemoController", [ "$scope", function($scope) {
+ // Nothing here!
+ }]);
+ </script>
+ </head>
+ <body ng-controller="DemoController">
+ <leaflet width="640px" height="480px">
+ </body>
+</html>
+
+```
+
+You can see this example in action on the [basic-first-example demo file](http://tombatossals.github.io/angular-leaflet-directive/examples/0100-basic-first-example.html).
+
+Take a look at the [AnguarJS controller documentation](http://docs.angularjs.org/guide/controller) if you want to learn more about Angular controller definition, or to the [AngularJS ngApp](http://docs.angularjs.org/api/ng.directive:ngApp) to know how to bootstrap an Angular application.
+
+
+Attributes and subdirectives documentation
+==========================================
+
+We have much more possibilities than showing a simple map, but we will need to take a closer look at the attributes and subdirectives documentation&examples you can find in the upper links.
diff --git a/doc/bounds-attribute.md b/doc/lf-bounds.md
similarity index 75%
rename from doc/bounds-attribute.md
rename to doc/lf-bounds.md
index 6e87d2d9..8a16c901 100644
--- a/doc/bounds-attribute.md
+++ b/doc/lf-bounds.md
@@ -1,10 +1,10 @@
-'bounds' Attribute Documentation
-==================================
+'lf-bounds' Documentation
+=========================
This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this:
```
-
+<leaflet lf-bounds="bounds" lf-center="center"></leaflet>
```
It will map an object _bounds_ of our controller scope with the corresponding object on our leaflet directive isolated scope. It's a bidirectional relationship, so a change in this object on the controller scope object will affect the map bounds, or an interaction on the map which changes the map position will update our _bounds_ values. Let's define the bounds model with an example:
@@ -23,7 +23,7 @@ $scope.bounds = {
}
```
-Defining the bounds is a little complex, so we have a helper which will allow us to be more concise on the definition making use of and array with two arrays with to values inside (lat, lng). To use it, we must make use of the _leafletBoundsHelpers_ service on our controller. For example:
+Full bounds definition is a little complex, so we have a helper which will allow us to be more concise on the definition making use of and array with two arrays with to values inside (lat, lng). To use it, we must make use of the _leafletBoundsHelpers_ service on our controller. For example:
```
app.controller("DemoController", [ "$scope", "leafletBoundsHelpers", function($scope, leafletBoundsHelpers) {
diff --git a/doc/center-attribute.md b/doc/lf-center.md
similarity index 59%
rename from doc/center-attribute.md
rename to doc/lf-center.md
index 7cef0ed2..d4d40b33 100644
--- a/doc/center-attribute.md
+++ b/doc/lf-center.md
@@ -1,13 +1,13 @@
-'center' Attribute Documentation
-==================================
+'lf-center' Documentation
+================================
This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this:
```
-
+<leaflet lf-center="center"></leaflet>
```
-It will map an object _center_ of our controller scope with the corresponding object on our directive isolated scope. It's a bidirectional relationship, so a change in this object on the controller scope will affect the map center position, or an interaction on the map which changes the map center will update our _center_ values. Let's define the center model with an example:
+It will map an object _center_ of our controller scope with the corresponding object on our directive isolated scope. It's a bidirectional relationship, so a change in this object on the controller scope will affect the map center position, or an interaction on the map which changes the map center will update our _center_ values. Let's define the basic center model with an example:
```
$scope.center = {
@@ -34,10 +34,12 @@ angular.extend($scope, {
And after that, in our HTML code we will define our leaflet directive like this:
```
-
+<leaflet lf-center="center"></leaflet>
```
-And that's all. A full example of using this attribute can be found [here](http://tombatossals.github.io/angular-leaflet-directive/examples/center-example.html).
+And that's all. A full example of using this attribute can be found [here](http://tombatossals.github.io/angular-leaflet-directive/examples/0101-basic-center-example.html).
+
+Let's see more properties we can use with the center sub-directive.
Autodiscover
------------
@@ -56,21 +58,27 @@ angular.extend($scope, {
});
```
-We can see an example of how to use it [here](http://tombatossals.github.io/angular-leaflet-directive/examples/center-autodiscover-example.html).
+We can see an example of how to use it [here](http://tombatossals.github.io/angular-leaflet-directive/examples/0102-basic-center-autodiscover-example.html).
Center position coded on a hash URL param
------------------------------------------
-We can use a special feature of the center attribute which allow us to synchronize the center position of the map with the URL, adding to it a special GET parameter where the center is coded. Then we can persist the map position on the browser URL.
+We can use a special feature of the center attribute which allow us to synchronize the center position of the map with a URL hash. This feature is inspired in the project [leaflet-hash](https://github.com/mlevans/leaflet-hash).
+
```
-
+angular.extend($scope, {
+ center: {
+ lat: 51.505,
+ lng: -0.09,
+ zoom: 4,
+ allowUrlHashCenter: true
+ }
```
-Adding that attribute will synchronize the center with a GET parameter on the URL of this form `?c=lat:lng:zoom`. Furthermore, whenever the map center is changed a new event `urlCenterHash` will be emitted to the parent scope so you can update your `$location.search` with the new info (if you want).
-
-You can take a look of this feature on this [demo](http://tombatossals.github.io/angular-leaflet-directive/examples/url-hash-center-example.html).
+Adding the attribute _allowUrlHashCenter_ will synchronize the map center with a GET parameter on the URL of this form `?c=lat:lng:zoom`. Furthermore, whenever the map center is changed a new event `urlCenterHash` will be emitted to the parent scope so you can update your `$location.search` with the new info (if you want).
-Development information
------------------------
-Each change to our scope defined _center_ object will update the map, or vice versa. This is accomplished via an angularJS watcher, defined [here](https://github.com/tombatossals/angular-leaflet-directive/blob/v0.7.0/src/directives/center.js#L34) in our code. When we change our map center or zoom, our _center_ object will be updated, these events are defined [here](https://github.com/tombatossals/angular-leaflet-directive/blob/v0.7.0/src/directives/center.js#L47) in our code.
+You can take a look of this feature on this [demo](http://tombatossals.github.io/angular-leaflet-directive/examples/0103-basic-center-url-hash-example.html).
+More useful examples
+--------------------
+ * [center the map based in the IP of the client](http://tombatossals.github.io/angular-leaflet-directive/examples/0109-basic-center-geoip-example.html).
diff --git a/doc/lf-layers.md b/doc/lf-layers.md
new file mode 100644
index 00000000..801cd60f
--- /dev/null
+++ b/doc/lf-layers.md
@@ -0,0 +1,52 @@
+'layers' Attribute Documentation
+==================================
+
+This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this:
+
+```
+
+```
+
+It will map an object _layers_ of our controller scope with the corresponding object on our directive isolated scope. It's not a bidirectional relationship, so only the changes made in this object on the controller scope will affect the layers definition in
+our leaflet map. Let's define the layers model with an example:
+
+```
+$scope.layers = {
+ baselayers: {
+ osm: {
+ name: 'OpenStreetMap',
+ url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
+ type: 'xyz'
+ },
+ cloudmade: {
+ name: 'Cloudmade Tourist',
+ type: 'xyz',
+ url: 'http://{s}.tile.cloudmade.com/{key}/{styleId}/256/{z}/{x}/{y}.png',
+ layerParams: {
+ key: '007b9471b4c74da4a6ec7ff43552b16f',
+ styleId: 7
+ }
+ }
+ }
+}
+```
+
+We can see that the _layers_ definition is conformed by lot attributes that we are going to describe below. When we associate that object with our _leaflet-directive_ the unidirectional relation will start, and the first layer will be shown on the map and a new layer-switcher-control will appear on our map.
+
+The layer-switcher-control will only appear if there are more than one layer (baselayer or overlay) that could be changed interactively by the user, if there's only one layer, no control will be visible.
+
+BaseLayers are the main tiles shown in the map, they could be interactively changed by the user on the switch control if more than one is visible, but only one can be active at the time (input radio buttons on the control). Overlays are tiles that can be shown on the map overlapped to the main baselayer (normally they use transparency) and more than one can be active at the time (input checkbox buttons). More about these types of layers [here](http://leafletjs.com/reference.html#control-layers).
+
+* [Baselayer simple demo](http://tombatossals.github.io/angular-leaflet-directive/examples/layers-simple-example.html).
+* [Overlays simple demo](http://tombatossals.github.io/angular-leaflet-directive/examples/overlays-simple-example.html).
+
+Types of layers
+---------------
+We are not limited to one type of layers, we can define other types:
+
+* XYZ Layer.
+* WMS Layer.
+* WFS Layer.
+* GoogleMaps Layer.
+* MarkerCluster Layer.
+* GeoJSON Layer.
diff --git a/doc/markers-attribute.md b/doc/lf-markers.md
similarity index 100%
rename from doc/markers-attribute.md
rename to doc/lf-markers.md
diff --git a/doc/maxbounds-attribute.md b/doc/lf-maxbounds.md
similarity index 70%
rename from doc/maxbounds-attribute.md
rename to doc/lf-maxbounds.md
index 802455ed..e8b3b576 100644
--- a/doc/maxbounds-attribute.md
+++ b/doc/lf-maxbounds.md
@@ -1,13 +1,13 @@
-'maxbounds' Attribute Documentation
-===================================
+'lf-maxbounds' Documentation
+============================
This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this:
```
-
+<leaflet lf-maxbounds="maxbounds"></leaflet>
```
-It will map an object _maxbounds_ of our controller scope with the corresponding object on our leaflet directive isolated scope. It's not a bidirectional relationship, only the changes made to our _maxbounds_ object on the controller scope will affect the map, but no vice versa.
+The functionality will be to limit the panning of the rendered map to the bounds set inside the _maxbounds_ object. It's not a bidirectional relationship, only the changes made to our _maxbounds_ object on the controller scope will affect the map, but no vice versa.
```
$scope.maxbounds = {
@@ -37,4 +37,4 @@ app.controller("DemoController", [ "$scope", "leafletBoundsHelpers", function($s
});
```
-And that's all, we can see how the map is affected when we change the _maxbounds_ scope values, like [this example](http://tombatossals.github.io/angular-leaflet-directive/examples/maxbounds-example.html).
+And that's all, we can see how the map is affected when we change the _maxbounds_ scope values, like [this example](http://tombatossals.github.io/angular-leaflet-directive/examples/0106-basic-maxbounds-example.html).
diff --git a/doc/paths-attribute.md b/doc/lf-paths.md
similarity index 100%
rename from doc/paths-attribute.md
rename to doc/lf-paths.md
diff --git a/doc/lf-tiles.md b/doc/lf-tiles.md
new file mode 100644
index 00000000..2918db28
--- /dev/null
+++ b/doc/lf-tiles.md
@@ -0,0 +1,28 @@
+'lf-tiles' Documentation
+========================
+
+This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this:
+
+```
+<leaflet lf-tiles="tiles"></leaflet>
+```
+
+We will use this object to set the basic tiles of our map. If you need more complex functionality you need to take a look at the _lf-layers_ sub-directive. It's not a bi-directional object. Changes to the scope object will affect the map tiles rendered on screen.
+
+Take a look first at the [leaflet tilelayer API call](http://leafletjs.com/reference.html#tilelayer) if you don't know nothing about it, but let's see its basic properties.
+
+```
+$scope.tiles = {
+ url: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png",
+ options: {
+ attribution: '© OpenStreetMap contributors'
+ }
+}
+```
+
+The options passed to this object can be set with a lot of attributes, and are the same passed to the leaflet tile object, documented [here](http://leafletjs.com/reference.html#tilelayer-options).
+
+And that's all, we can see how the map is affected when we change the _tiles_ scope object values in these examples:
+
+* [Tiles basic example](http://tombatossals.github.io/angular-leaflet-directive/examples/0107-basic-tiles-example.html).
+* [Change tiles with zoom example](http://tombatossals.github.io/angular-leaflet-directive/examples/0108-basic-tiles-zoom-changer-example.html).
diff --git a/doc/tiles-attribute.md b/doc/tiles-attribute.md
deleted file mode 100644
index 7bc34d70..00000000
--- a/doc/tiles-attribute.md
+++ /dev/null
@@ -1,28 +0,0 @@
-'tiles' Attribute Documentation
-===================================
-
-This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this:
-
-```
-
-```
-
-It will map an object _tiles_ of our controller scope with the corresponding object on our leaflet directive isolated scope. It's not a bidirectional relationship, only the changes made to our _tiles_ object on the controller scope will affect the map, but no vice versa.
-
-This object is basically composed of two attributes: **url** and **options**. Let's see them in an example definition:
-```
-$scope.tiles = {
- url: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png",
- options: {
- attribution: '© OpenStreetMap contributors'
- }
-}
-```
-
-The options passed to this object could have a lot of attributes, and are the same passed to the leaflet tile object, documented [here](http://leafletjs.com/reference.html#tilelayer-options).
-
-
-And that's all, we can see how the map is affected when we change the _tiles_ scope object values, like these examples:
-
-* [tiles-example.html](http://tombatossals.github.io/angular-leaflet-directive/examples/tiles-example.html).
-* [tiles-zoom-changer-example.html](http://tombatossals.github.io/angular-leaflet-directive/examples/tiles-zoom-changer-example.html).
diff --git a/examples/0101-basic-lf-center-example.html b/examples/0101-basic-lf-center-example.html
deleted file mode 100644
index e8fcfb76..00000000
--- a/examples/0101-basic-lf-center-example.html
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- Center map example
-
-
-
diff --git a/examples/0103-basic-center-url-hash-example.html b/examples/0103-basic-center-url-hash-example.html
index 28f6ee6f..3b1097af 100644
--- a/examples/0103-basic-center-url-hash-example.html
+++ b/examples/0103-basic-center-url-hash-example.html
@@ -13,7 +13,8 @@
london: {
lat: 51.505,
lng: -0.09,
- zoom: 4
+ zoom: 4,
+ allowUrlHashCenter: true
}
});
$scope.$on("centerUrlHash", function(event, centerHash) {
@@ -35,7 +36,7 @@
-
+
Center map with URL synchronization example
This demo syncs the map center position with the URL, and vice versa, using the center-url-params property.
diff --git a/examples/0104-basic-custom-parameters-example.html b/examples/0104-basic-custom-parameters-example.html
index fccceba6..fa8693d3 100644
--- a/examples/0104-basic-custom-parameters-example.html
+++ b/examples/0104-basic-custom-parameters-example.html
@@ -30,7 +30,7 @@
-
+
Using custom default parameters