From 66247908448f964139a3b96b5cc2b659cf382e23 Mon Sep 17 00:00:00 2001 From: afabiani Date: Tue, 24 Mar 2020 18:56:18 +0100 Subject: [PATCH] - Fix lgtm issues and Giovanni review issues --- geonode/api/resourcebase_api.py | 29 +- geonode/base/models.py | 69 +- geonode/base/templatetags/base_tags.py | 19 +- geonode/security/views.py | 41 + geonode/static/geonode/js/jszip/preprocess.js | 4 +- .../message_recipients_autocomplete_es5.js | 12 +- ...message_recipients_autocomplete_es5.js.map | 2 +- geonode/static/geonode/js/search/search.js | 63 +- geonode/static/gruntfile.js | 19 +- geonode/static/lib/css/L.Control.Locate.css | 33 - geonode/static/lib/css/assets.min.css | 2 +- .../static/lib/css/leaflet-plugins.min.css | 2 +- geonode/static/lib/css/ol.css | 1 + .../static/lib/css/openlayers-plugins.min.css | 1 + geonode/static/lib/css/tagify.css | 2 +- .../lib/js/angular-leaflet-directive.js | 5734 ----------------- .../lib/js/angular-leaflet-directive.min.js | 40 + .../js/angular-openlayers-directive.min.js | 32 + geonode/static/lib/js/angular-sanitize.min.js | 18 + geonode/static/lib/js/assets.min.js | 4 +- geonode/static/lib/js/leaflet-plugins.min.js | 2 +- geonode/static/lib/js/ol.js | 1053 +++ .../static/lib/js/openlayers-plugins.min.js | 3 + geonode/static/lib/js/tagify.min.js | 4 +- geonode/static/package.json | 3 + geonode/static/static_dependencies.json | 35 +- geonode/templates/_permissions_form.html | 71 +- geonode/templates/base.html | 4 +- geonode/templates/search/_extent_filter.html | 4 +- geonode/templates/search/_spatial_tags.html | 4 - geonode/templates/search/search_scripts.html | 6 +- geonode/views.py | 2 +- 32 files changed, 1421 insertions(+), 5897 deletions(-) delete mode 100644 geonode/static/lib/css/L.Control.Locate.css create mode 100644 geonode/static/lib/css/ol.css create mode 100644 geonode/static/lib/css/openlayers-plugins.min.css delete mode 100644 geonode/static/lib/js/angular-leaflet-directive.js create mode 100644 geonode/static/lib/js/angular-leaflet-directive.min.js create mode 100644 geonode/static/lib/js/angular-openlayers-directive.min.js create mode 100644 geonode/static/lib/js/angular-sanitize.min.js create mode 100644 geonode/static/lib/js/ol.js create mode 100644 geonode/static/lib/js/openlayers-plugins.min.js delete mode 100644 geonode/templates/search/_spatial_tags.html diff --git a/geonode/api/resourcebase_api.py b/geonode/api/resourcebase_api.py index 9fdd2fc8c3e..550f039e8a9 100644 --- a/geonode/api/resourcebase_api.py +++ b/geonode/api/resourcebase_api.py @@ -262,19 +262,22 @@ def filter_h_keywords(self, queryset, keywords): filtered = queryset.filter(Q(keywords__in=treeqs)) return filtered - def filter_bbox(self, queryset, bbox): - """ - modify the queryset q to limit to data that intersects with the - provided bbox - - bbox - 4 tuple of floats representing 'southwest_lng,southwest_lat, - northeast_lng,northeast_lat' - returns the modified query - """ - bbox = bbox.split(',') # TODO: Why is this different when done through haystack? - bbox = list(map(str, bbox)) # 2.6 compat - float to decimal conversion - intersects = ~(Q(bbox_x0__gt=bbox[2]) | Q(bbox_x1__lt=bbox[0]) | - Q(bbox_y0__gt=bbox[3]) | Q(bbox_y1__lt=bbox[1])) + def filter_bbox(self, queryset, extent_filter): + from geonode.utils import bbox_to_projection + bbox = extent_filter.split(',') + bbox = list(map(str, bbox)) + + intersects = (Q(bbox_x0__gte=bbox[0]) & Q(bbox_x1__lte=bbox[2]) & + Q(bbox_y0__gte=bbox[1]) & Q(bbox_y1__lte=bbox[3])) + + for proj in Layer.objects.order_by('srid').values('srid').distinct(): + if proj['srid'] != 'EPSG:4326': + proj_bbox = bbox_to_projection(bbox + ['4326', ], + target_srid=int(proj['srid'][5:])) + + if proj_bbox[-1] != 4326: + intersects = intersects | (Q(bbox_x0__gte=proj_bbox[0]) & Q(bbox_x1__lte=proj_bbox[2]) & Q( + bbox_y0__gte=proj_bbox[1]) & Q(bbox_y1__lte=proj_bbox[3])) return queryset.filter(intersects) diff --git a/geonode/base/models.py b/geonode/base/models.py index b0f406b6d87..5e763d6c73c 100644 --- a/geonode/base/models.py +++ b/geonode/base/models.py @@ -326,43 +326,52 @@ class HierarchicalKeyword(TagBase, MP_Node): objects = HierarchicalKeywordManager() @classmethod - def dump_bulk_tree(cls, parent=None, keep_ids=True): + def dump_bulk_tree(cls, parent=None, keep_ids=True, type=None): """Dumps a tree branch to a python data structure.""" qset = cls._get_serializable_model().get_tree(parent) ret, lnk = [], {} try: - for pyobj in qset: + for pyobj in qset.order_by('name'): serobj = serializers.serialize('python', [pyobj])[0] # django's serializer stores the attributes in 'fields' fields = serobj['fields'] - depth = fields['depth'] or 1 - fields['text'] = fields['name'] - fields['href'] = fields['slug'] - del fields['name'] - del fields['slug'] - del fields['path'] - del fields['numchild'] - del fields['depth'] - if 'id' in fields: - # this happens immediately after a load_bulk - del fields['id'] - - newobj = {} - for field in fields: - newobj[field] = fields[field] - if keep_ids: - newobj['id'] = serobj['pk'] - - if (not parent and depth == 1) or\ - (parent and depth == parent.depth): - ret.append(newobj) - else: - parentobj = pyobj.get_parent() - parentser = lnk[parentobj.pk] - if 'nodes' not in parentser: - parentser['nodes'] = [] - parentser['nodes'].append(newobj) - lnk[pyobj.pk] = newobj + tags_count = 0 + try: + tags_count = TaggedContentItem.objects.filter( + content_object__polymorphic_ctype__model=type, + tag=HierarchicalKeyword.objects.get(slug=fields['slug'])).count() + except Exception: + pass + if tags_count > 0: + depth = fields['depth'] or 1 + fields['text'] = fields['name'] + fields['href'] = fields['slug'] + fields['tags'] = [tags_count] + del fields['name'] + del fields['slug'] + del fields['path'] + del fields['numchild'] + del fields['depth'] + if 'id' in fields: + # this happens immediately after a load_bulk + del fields['id'] + + newobj = {} + for field in fields: + newobj[field] = fields[field] + if keep_ids: + newobj['id'] = serobj['pk'] + + if (not parent and depth == 1) or\ + (parent and depth == parent.depth): + ret.append(newobj) + else: + parentobj = pyobj.get_parent() + parentser = lnk[parentobj.pk] + if 'nodes' not in parentser: + parentser['nodes'] = [] + parentser['nodes'].append(newobj) + lnk[pyobj.pk] = newobj except Exception: pass return ret diff --git a/geonode/base/templatetags/base_tags.py b/geonode/base/templatetags/base_tags.py index fc9bcbf355d..aa899b981e5 100644 --- a/geonode/base/templatetags/base_tags.py +++ b/geonode/base/templatetags/base_tags.py @@ -144,11 +144,20 @@ def facets(context): private_groups_not_visibile=settings.GROUP_PRIVATE_RESOURCES) if extent_filter: - bbox = extent_filter.split( - ',') # TODO: Why is this different when done through haystack? - bbox = list(map(str, bbox)) # 2.6 compat - float to decimal conversion - intersects = ~(Q(bbox_x0__gt=bbox[2]) | Q(bbox_x1__lt=bbox[0]) | - Q(bbox_y0__gt=bbox[3]) | Q(bbox_y1__lt=bbox[1])) + from geonode.utils import bbox_to_projection + bbox = extent_filter.split(',') + bbox = list(map(str, bbox)) + + intersects = (Q(bbox_x0__gt=bbox[0]) & Q(bbox_x1__lt=bbox[2]) & + Q(bbox_y0__gt=bbox[1]) & Q(bbox_y1__lt=bbox[3])) + + for proj in Layer.objects.order_by('srid').values('srid').distinct(): + if proj['srid'] != 'EPSG:4326': + proj_bbox = bbox_to_projection(bbox + ['4326', ], + target_srid=int(proj['srid'][5:])) + if proj_bbox[-1] != 4326: + intersects = intersects | (Q(bbox_x0__gt=proj_bbox[0]) & Q(bbox_x1__lt=proj_bbox[2]) & Q( + bbox_y0__gt=proj_bbox[1]) & Q(bbox_y1__lt=proj_bbox[3])) layers = layers.filter(intersects) diff --git a/geonode/security/views.py b/geonode/security/views.py index 618e2d03f40..eb7157f368f 100644 --- a/geonode/security/views.py +++ b/geonode/security/views.py @@ -204,6 +204,47 @@ def resource_geolimits(request, resource_id): }), content_type="application/json" ) + elif request.method == 'DELETE': + if user_id: + try: + geo_limits = UserGeoLimit.objects.filter( + user=get_user_model().objects.get(id=user_id), + resource=resource + ) + for geo_limit in geo_limits: + resource.users_geolimits.remove(geo_limit) + geo_limits.delete() + return HttpResponse( + json.dumps({ + 'user': user_id + }), + content_type="application/json" + ) + except Exception as e: + return HttpResponse( + str(e), + status=400, + content_type='text/plain') + elif group_id: + try: + geo_limits = GroupGeoLimit.objects.filter( + group=GroupProfile.objects.get(id=group_id), + resource=resource + ) + for geo_limit in geo_limits: + resource.groups_geolimits.remove(geo_limit) + geo_limits.delete() + return HttpResponse( + json.dumps({ + 'group': group_id + }), + content_type="application/json" + ) + except Exception as e: + return HttpResponse( + str(e), + status=400, + content_type='text/plain') elif request.method == 'GET': if user_id: try: diff --git a/geonode/static/geonode/js/jszip/preprocess.js b/geonode/static/geonode/js/jszip/preprocess.js index e10400d4819..f406f2eb204 100644 --- a/geonode/static/geonode/js/jszip/preprocess.js +++ b/geonode/static/geonode/js/jszip/preprocess.js @@ -236,8 +236,8 @@ DBFParser.prototype.parse = function(arrayBuffer,src,response,encoding) { var charString = [], count = 0, index = 0, - z = 0, - /* sum = (responseHeader.length+1)/32 */; + z = 0; + /* var sum = (responseHeader.length+1)/32 */ while(responseHeader.length > 0) { while(count < 10) { diff --git a/geonode/static/geonode/js/messages/message_recipients_autocomplete_es5.js b/geonode/static/geonode/js/messages/message_recipients_autocomplete_es5.js index 145433a21c4..e33fc087f0f 100644 --- a/geonode/static/geonode/js/messages/message_recipients_autocomplete_es5.js +++ b/geonode/static/geonode/js/messages/message_recipients_autocomplete_es5.js @@ -1,12 +1,16 @@ "use strict"; -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } diff --git a/geonode/static/geonode/js/messages/message_recipients_autocomplete_es5.js.map b/geonode/static/geonode/js/messages/message_recipients_autocomplete_es5.js.map index c7be510c078..2f3231b7c19 100644 --- a/geonode/static/geonode/js/messages/message_recipients_autocomplete_es5.js.map +++ b/geonode/static/geonode/js/messages/message_recipients_autocomplete_es5.js.map @@ -1 +1 @@ -{"version":3,"sources":["message_recipients_autocomplete.js"],"names":["get_users_data","data","objects","map","elem","value","username","id","get_groups_data","title","MessageRecipientsTags","input","data_extract_func","url","blacklist","tagName","type","Error","tagify","controller","Tagify","whitelist","on","_onInputHandler","bind","event","detail","settings","length","loading","dropdown","hide","call","fetch","then","response","json","res","filter","includes","splice","show","JSON","parse","forEach","$","attr","name","appendTo","disabled"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAASA,cAAT,CAAwBC,IAAxB,EAA8B;AAC1B,SAAOA,IAAI,CAACC,OAAL,CAAaC,GAAb,CAAiB,UAACC,IAAD,EAAU;AAC9B,WAAO;AAACC,MAAAA,KAAK,EAAED,IAAI,CAACE,QAAb;AAAuBC,MAAAA,EAAE,EAAEH,IAAI,CAACG;AAAhC,KAAP;AACH,GAFM,CAAP;AAGH;;AAED,SAASC,eAAT,CAAyBP,IAAzB,EAA+B;AAC3B,SAAOA,IAAI,CAACC,OAAL,CAAaC,GAAb,CAAiB,UAACC,IAAD,EAAU;AAC9B,WAAO;AAACC,MAAAA,KAAK,EAAED,IAAI,CAACK,KAAb;AAAoBF,MAAAA,EAAE,EAAEH,IAAI,CAACG;AAA7B,KAAP;AACH,GAFM,CAAP;AAGH;;IAEKG,qB;AACF,iCAAYC,KAAZ,EAAmBC,iBAAnB,EAAsCC,GAAtC,EAAyD;AAAA,QAAdC,SAAc,uEAAJ,EAAI;;AAAA;;AACrD,QAAIH,KAAK,CAACI,OAAN,KAAkB,OAAlB,IAA6BJ,KAAK,CAACK,IAAN,KAAe,MAAhD,EAAwD;AACpD,YAAMC,KAAK,CAAC,4CAAD,CAAX;AACH;;AACD,SAAKN,KAAL,GAAaA,KAAb;AACA,SAAKO,MAAL,GAAc,IAAd;AACA,SAAKC,UAAL,GAAkB,IAAlB;AACA,SAAKP,iBAAL,GAAyBA,iBAAzB;AACA,SAAKC,GAAL,GAAWA,GAAX;AACA,SAAKC,SAAL,GAAiBA,SAAjB;AACH;;;;2BAEM;AACH,WAAKI,MAAL,GAAc,IAAIE,MAAJ,CAAW,KAAKT,KAAhB,EAAuB;AAACU,QAAAA,SAAS,EAAE,EAAZ;AAAgBP,QAAAA,SAAS,EAAE,KAAKA;AAAhC,OAAvB,CAAd;AACA,WAAKI,MAAL,CAAYI,EAAZ,CAAe,OAAf,EAAwB,KAAKC,eAAL,CAAqBC,IAArB,CAA0B,IAA1B,CAAxB;AACH;;;oCAGeC,K,EAAO;AAAA;;AACnB,UAAMpB,KAAK,GAAGoB,KAAK,CAACC,MAAN,CAAarB,KAA3B;AACA,WAAKa,MAAL,CAAYS,QAAZ,CAAqBN,SAArB,CAA+BO,MAA/B,GAAwC,CAAxC;AAEA,WAAKV,MAAL,CAAYW,OAAZ,CAAoB,IAApB,EAA0BC,QAA1B,CAAmCC,IAAnC,CAAwCC,IAAxC,CAA6C,KAAKd,MAAlD;AAEAe,MAAAA,KAAK,CAAC,KAAKpB,GAAL,GAAWR,KAAZ,CAAL,CAAwB6B,IAAxB,CAA6B,UAAAC,QAAQ;AAAA,eACjCA,QAAQ,CAACC,IAAT,GACKF,IADL,CACU,KAAI,CAACtB,iBADf,EAEKsB,IAFL,CAEU,UAAAG,GAAG,EAAI;AAAA;;AACTA,UAAAA,GAAG,GAAGA,GAAG,CAACC,MAAJ,CAAW,UAAAlC,IAAI,EAAI;AACrB,gBAAI,CAAE,KAAI,CAACU,SAAL,CAAeyB,QAAf,CAAwBnC,IAAI,CAACC,KAA7B,CAAN,EAA4C;AACxC,qBAAOD,IAAP;AACH;AACJ,WAJK,CAAN;;AAKA,mCAAA,KAAI,CAACc,MAAL,CAAYS,QAAZ,CAAqBN,SAArB,EAA+BmB,MAA/B,+BAAsC,CAAtC,EAAyCH,GAAG,CAACT,MAA7C,4BAAwDS,GAAxD;;AACA,UAAA,KAAI,CAACnB,MAAL,CAAYW,OAAZ,CAAoB,KAApB,EAA2BC,QAA3B,CAAoCW,IAApC,CAAyCT,IAAzC,CAA8C,KAAI,CAACd,MAAnD,EAA2Db,KAA3D;AACH,SAVL,CADiC;AAAA,OAArC;AAYH;;;qCAEgB;AAAA;;AACb,UAAI,KAAKM,KAAL,CAAWN,KAAX,KAAqB,EAAzB,EAA6B;AACzBqC,QAAAA,IAAI,CAACC,KAAL,CAAW,KAAKhC,KAAL,CAAWN,KAAtB,EAA6BiC,MAA7B,CAAoC,UAAAlC,IAAI;AAAA,iBAAI,QAAQA,IAAZ;AAAA,SAAxC,EAA0DwC,OAA1D,CAAkE,UAACxC,IAAD,EAAU;AACxEyC,UAAAA,CAAC,CAAC,SAAD,CAAD,CAAaC,IAAb,CAAkB;AACd9B,YAAAA,IAAI,EAAE,QADQ;AAEdT,YAAAA,EAAE,EAAE,KAFU;AAGdwC,YAAAA,IAAI,EAAE,MAAI,CAACpC,KAAL,CAAWoC,IAHH;AAId1C,YAAAA,KAAK,EAAED,IAAI,CAACG;AAJE,WAAlB,EAKGyC,QALH,CAKY,MALZ;AAMH,SAPD;AAQH;;AACD,WAAKrC,KAAL,CAAWsC,QAAX,GAAsB,IAAtB;AACH","sourcesContent":["function get_users_data(data) {\n return data.objects.map((elem) => {\n return {value: elem.username, id: elem.id};\n });\n}\n\nfunction get_groups_data(data) {\n return data.objects.map((elem) => {\n return {value: elem.title, id: elem.id};\n });\n}\n\nclass MessageRecipientsTags {\n constructor(input, data_extract_func, url, blacklist=[]) {\n if (input.tagName !== 'INPUT' || input.type !== 'text') {\n throw Error('Base element should be ');\n }\n this.input = input;\n this.tagify = null;\n this.controller = null;\n this.data_extract_func = data_extract_func;\n this.url = url;\n this.blacklist = blacklist;\n }\n\n init() {\n this.tagify = new Tagify(this.input, {whitelist: [], blacklist: this.blacklist});\n this.tagify.on('input', this._onInputHandler.bind(this));\n }\n\n\n _onInputHandler(event) {\n const value = event.detail.value;\n this.tagify.settings.whitelist.length = 0;\n\n this.tagify.loading(true).dropdown.hide.call(this.tagify);\n\n fetch(this.url + value).then(response =>\n response.json()\n .then(this.data_extract_func)\n .then(res => {\n res = res.filter(elem => {\n if (!(this.blacklist.includes(elem.value))) {\n return elem;\n }\n });\n this.tagify.settings.whitelist.splice(0, res.length, ...res);\n this.tagify.loading(false).dropdown.show.call(this.tagify, value);\n }));\n }\n\n fixOutputValue() {\n if (this.input.value !== '') {\n JSON.parse(this.input.value).filter(elem => 'id' in elem).forEach((elem) => {\n $('').attr({\n type: 'hidden',\n id: 'foo',\n name: this.input.name,\n value: elem.id\n }).appendTo('form');\n });\n }\n this.input.disabled = true;\n }\n}\n\n"],"file":"message_recipients_autocomplete_es5.js"} \ No newline at end of file +{"version":3,"sources":["message_recipients_autocomplete.js"],"names":["get_users_data","data","objects","map","elem","value","username","id","get_groups_data","title","MessageRecipientsTags","input","data_extract_func","url","blacklist","tagName","type","Error","tagify","controller","Tagify","whitelist","on","_onInputHandler","bind","event","detail","settings","length","loading","dropdown","hide","call","fetch","then","response","json","res","filter","includes","splice","show","JSON","parse","forEach","$","attr","name","appendTo","disabled"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAASA,cAAT,CAAwBC,IAAxB,EAA8B;AAC1B,SAAOA,IAAI,CAACC,OAAL,CAAaC,GAAb,CAAiB,UAACC,IAAD,EAAU;AAC9B,WAAO;AAACC,MAAAA,KAAK,EAAED,IAAI,CAACE,QAAb;AAAuBC,MAAAA,EAAE,EAAEH,IAAI,CAACG;AAAhC,KAAP;AACH,GAFM,CAAP;AAGH;;AAED,SAASC,eAAT,CAAyBP,IAAzB,EAA+B;AAC3B,SAAOA,IAAI,CAACC,OAAL,CAAaC,GAAb,CAAiB,UAACC,IAAD,EAAU;AAC9B,WAAO;AAACC,MAAAA,KAAK,EAAED,IAAI,CAACK,KAAb;AAAoBF,MAAAA,EAAE,EAAEH,IAAI,CAACG;AAA7B,KAAP;AACH,GAFM,CAAP;AAGH;;IAEKG,qB;AACF,iCAAYC,KAAZ,EAAmBC,iBAAnB,EAAsCC,GAAtC,EAAyD;AAAA,QAAdC,SAAc,uEAAJ,EAAI;;AAAA;;AACrD,QAAIH,KAAK,CAACI,OAAN,KAAkB,OAAlB,IAA6BJ,KAAK,CAACK,IAAN,KAAe,MAAhD,EAAwD;AACpD,YAAMC,KAAK,CAAC,4CAAD,CAAX;AACH;;AACD,SAAKN,KAAL,GAAaA,KAAb;AACA,SAAKO,MAAL,GAAc,IAAd;AACA,SAAKC,UAAL,GAAkB,IAAlB;AACA,SAAKP,iBAAL,GAAyBA,iBAAzB;AACA,SAAKC,GAAL,GAAWA,GAAX;AACA,SAAKC,SAAL,GAAiBA,SAAjB;AACH;;;;2BAEM;AACH,WAAKI,MAAL,GAAc,IAAIE,MAAJ,CAAW,KAAKT,KAAhB,EAAuB;AAACU,QAAAA,SAAS,EAAE,EAAZ;AAAgBP,QAAAA,SAAS,EAAE,KAAKA;AAAhC,OAAvB,CAAd;AACA,WAAKI,MAAL,CAAYI,EAAZ,CAAe,OAAf,EAAwB,KAAKC,eAAL,CAAqBC,IAArB,CAA0B,IAA1B,CAAxB;AACH;;;oCAGeC,K,EAAO;AAAA;;AACnB,UAAMpB,KAAK,GAAGoB,KAAK,CAACC,MAAN,CAAarB,KAA3B;AACA,WAAKa,MAAL,CAAYS,QAAZ,CAAqBN,SAArB,CAA+BO,MAA/B,GAAwC,CAAxC;AAEA,WAAKV,MAAL,CAAYW,OAAZ,CAAoB,IAApB,EAA0BC,QAA1B,CAAmCC,IAAnC,CAAwCC,IAAxC,CAA6C,KAAKd,MAAlD;AAEAe,MAAAA,KAAK,CAAC,KAAKpB,GAAL,GAAWR,KAAZ,CAAL,CAAwB6B,IAAxB,CAA6B,UAAAC,QAAQ;AAAA,eACjCA,QAAQ,CAACC,IAAT,GACKF,IADL,CACU,KAAI,CAACtB,iBADf,EAEKsB,IAFL,CAEU,UAAAG,GAAG,EAAI;AAAA;;AACTA,UAAAA,GAAG,GAAGA,GAAG,CAACC,MAAJ,CAAW,UAAAlC,IAAI,EAAI;AACrB,gBAAI,CAAE,KAAI,CAACU,SAAL,CAAeyB,QAAf,CAAwBnC,IAAI,CAACC,KAA7B,CAAN,EAA4C;AACxC,qBAAOD,IAAP;AACH;AACJ,WAJK,CAAN;;AAKA,mCAAA,KAAI,CAACc,MAAL,CAAYS,QAAZ,CAAqBN,SAArB,EAA+BmB,MAA/B,+BAAsC,CAAtC,EAAyCH,GAAG,CAACT,MAA7C,4BAAwDS,GAAxD;;AACA,UAAA,KAAI,CAACnB,MAAL,CAAYW,OAAZ,CAAoB,KAApB,EAA2BC,QAA3B,CAAoCW,IAApC,CAAyCT,IAAzC,CAA8C,KAAI,CAACd,MAAnD,EAA2Db,KAA3D;AACH,SAVL,CADiC;AAAA,OAArC;AAYH;;;qCAEgB;AAAA;;AACb,UAAI,KAAKM,KAAL,CAAWN,KAAX,KAAqB,EAAzB,EAA6B;AACzBqC,QAAAA,IAAI,CAACC,KAAL,CAAW,KAAKhC,KAAL,CAAWN,KAAtB,EAA6BiC,MAA7B,CAAoC,UAAAlC,IAAI;AAAA,iBAAI,QAAQA,IAAZ;AAAA,SAAxC,EAA0DwC,OAA1D,CAAkE,UAACxC,IAAD,EAAU;AACxEyC,UAAAA,CAAC,CAAC,SAAD,CAAD,CAAaC,IAAb,CAAkB;AACd9B,YAAAA,IAAI,EAAE,QADQ;AAEdT,YAAAA,EAAE,EAAE,KAFU;AAGdwC,YAAAA,IAAI,EAAE,MAAI,CAACpC,KAAL,CAAWoC,IAHH;AAId1C,YAAAA,KAAK,EAAED,IAAI,CAACG;AAJE,WAAlB,EAKGyC,QALH,CAKY,MALZ;AAMH,SAPD;AAQH;;AACD,WAAKrC,KAAL,CAAWsC,QAAX,GAAsB,IAAtB;AACH","sourcesContent":["function get_users_data(data) {\n return data.objects.map((elem) => {\n return {value: elem.username, id: elem.id};\n });\n}\n\nfunction get_groups_data(data) {\n return data.objects.map((elem) => {\n return {value: elem.title, id: elem.id};\n });\n}\n\nclass MessageRecipientsTags {\n constructor(input, data_extract_func, url, blacklist=[]) {\n if (input.tagName !== 'INPUT' || input.type !== 'text') {\n throw Error('Base element should be ');\n }\n this.input = input;\n this.tagify = null;\n this.controller = null;\n this.data_extract_func = data_extract_func;\n this.url = url;\n this.blacklist = blacklist;\n }\n\n init() {\n this.tagify = new Tagify(this.input, {whitelist: [], blacklist: this.blacklist});\n this.tagify.on('input', this._onInputHandler.bind(this));\n }\n\n\n _onInputHandler(event) {\n const value = event.detail.value;\n this.tagify.settings.whitelist.length = 0;\n\n this.tagify.loading(true).dropdown.hide.call(this.tagify);\n\n fetch(this.url + value).then(response =>\n response.json()\n .then(this.data_extract_func)\n .then(res => {\n res = res.filter(elem => {\n if (!(this.blacklist.includes(elem.value))) {\n return elem;\n }\n });\n this.tagify.settings.whitelist.splice(0, res.length, ...res);\n this.tagify.loading(false).dropdown.show.call(this.tagify, value);\n }));\n }\n\n fixOutputValue() {\n if (this.input.value !== '') {\n JSON.parse(this.input.value).filter(elem => 'id' in elem).forEach((elem) => {\n $('').attr({\n type: 'hidden',\n id: 'foo',\n name: this.input.name,\n value: elem.id\n }).appendTo('form');\n });\n }\n this.input.disabled = true;\n }\n}\n\n"],"file":"message_recipients_autocomplete_es5.js"} \ No newline at end of file diff --git a/geonode/static/geonode/js/search/search.js b/geonode/static/geonode/js/search/search.js index 06969b009bf..22498913b31 100644 --- a/geonode/static/geonode/js/search/search.js +++ b/geonode/static/geonode/js/search/search.js @@ -104,6 +104,10 @@ $('#treeview').treeview({ data: data.data, multiSelect: true, + showIcon: true, + showCheckbox: false, + showTags: true, + tagsClass: 'badge', onNodeSelected: function($event, node) { $rootScope.$broadcast('select_h_keyword', node); if(node.nodes){ @@ -694,41 +698,44 @@ }, true); /* - * Spatial search - */ + * Spatial search + */ if ($('.leaflet_map').length > 0) { angular.extend($scope, { - layers: { - baselayers: { - stamen: { - name: 'OpenStreetMap Mapnik', - type: 'xyz', - url: '//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - layerOptions: { - subdomains: ['a', 'b', 'c'], - attribution: '© OpenStreetMap', - continuousWorld: true + layers: [ + { + name: 'OpenStreetMap', + active: true, + source: { + type: 'OSM' } - } } - }, - map_center: { - lat: 5.6, - lng: 3.9, - zoom: 0 + ], + center: { + lat: 0.0, + lon: 0.0, + zoom: 1 }, defaults: { - zoomControl: false + interactions: { + mouseWheelZoom: true + }, + controls: { + zoom: { + position: 'topleft' + } + } } }); - - var leafletData = $injector.get('leafletData'), - map = leafletData.getMap('filter-map'); - - map.then(function(map){ - map.on('moveend', function(){ - $scope.query['extent'] = map.getBounds().toBBoxString(); + var olData = $injector.get('olData'), + map = olData.getMap('filter-map'); + + map.then(function(map) { + map.on('moveend', function () { + var glbox = map.getView().calculateExtent(map.getSize()); // doesn't look as expected. + var box = ol.proj.transformExtent(glbox, 'EPSG:3857', 'EPSG:4326'); + $scope.query['extent'] = box.toString(); query_api($scope.query); }); }); @@ -737,8 +744,8 @@ $('#_extent_filter').click(function(evt) { showMap = !showMap if (showMap){ - leafletData.getMap().then(function(map) { - map.invalidateSize(); + olData.getMap().then(function(map) { + map.updateSize(); }); } }); diff --git a/geonode/static/gruntfile.js b/geonode/static/gruntfile.js index 8691f55adac..6f8bf2a8cbb 100644 --- a/geonode/static/gruntfile.js +++ b/geonode/static/gruntfile.js @@ -11,12 +11,18 @@ module.exports = function(grunt) { let leafletPluginsMinifiedJs = fileHandling["leaflet-plugins.min.js"].map ( fileSegment => 'lib/js/' + fileSegment.substring(fileSegment.lastIndexOf('/')+1) ); + let openlayersPluginsMinifiedJs = fileHandling["openlayers-plugins.min.js"].map( + fileSegment => 'lib/js/' + fileSegment.substring(fileSegment.lastIndexOf('/') + 1) + ); let assetsMinifiedCss = fileHandling["assets.min.css"].map ( fileSegment => 'lib/css/' + fileSegment.substring(fileSegment.lastIndexOf('/')+1) ); let leafletMinifiedCss = fileHandling["leaflet.plugins.min.css"].map ( fileSegment => 'lib/css/' + fileSegment.substring(fileSegment.lastIndexOf('/')+1) ); + let openlayersMinifiedCss = fileHandling["openlayers.plugins.min.css"].map( + fileSegment => 'lib/css/' + fileSegment.substring(fileSegment.lastIndexOf('/') + 1) + ); grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), @@ -89,7 +95,7 @@ module.exports = function(grunt) { nonull: true, cwd: 'node_modules', dest: 'lib/css', - src: [fileHandling["assets.min.css"], fileHandling["leaflet.plugins.min.css"]] + src: [fileHandling["assets.min.css"], fileHandling["leaflet.plugins.min.css"], fileHandling["openlayers.plugins.min.css"]] }, { expand: true, flatten: true, @@ -132,7 +138,7 @@ module.exports = function(grunt) { nonull: true, cwd: 'node_modules', dest: 'lib/js', - src: [fileHandling["assets.min.js"], fileHandling.other_dependencies, fileHandling["leaflet-plugins.min.js"]] + src: [fileHandling["assets.min.js"], fileHandling.other_dependencies, fileHandling["leaflet-plugins.min.js"], fileHandling["openlayers-plugins.min.js"]] }] } }, @@ -215,7 +221,8 @@ module.exports = function(grunt) { }, files: { 'lib/css/assets.min.css': assetsMinifiedCss, - 'lib/css/leaflet-plugins.min.css': leafletMinifiedCss + 'lib/css/leaflet-plugins.min.css': leafletMinifiedCss, + 'lib/css/openlayers-plugins.min.css': openlayersMinifiedCss } } }, @@ -246,7 +253,8 @@ module.exports = function(grunt) { }, files: { 'lib/js/assets.min.js': assetsMinifiedJs, - 'lib/js/leaflet-plugins.min.js': leafletPluginsMinifiedJs + 'lib/js/leaflet-plugins.min.js': leafletPluginsMinifiedJs, + 'lib/js/openlayers-plugins.min.js': openlayersPluginsMinifiedJs } }, production: { @@ -257,7 +265,8 @@ module.exports = function(grunt) { }, files: { 'lib/js/assets.min.js': assetsMinifiedJs, - 'lib/js/leaflet-plugins.min.js': leafletPluginsMinifiedJs + 'lib/js/leaflet-plugins.min.js': leafletPluginsMinifiedJs, + 'lib/js/openlayers-plugins.min.js': openlayersPluginsMinifiedJs } } }, diff --git a/geonode/static/lib/css/L.Control.Locate.css b/geonode/static/lib/css/L.Control.Locate.css deleted file mode 100644 index 0d79ba4749c..00000000000 --- a/geonode/static/lib/css/L.Control.Locate.css +++ /dev/null @@ -1,33 +0,0 @@ -/* Compatible with Leaflet 0.7 */ -.leaflet-control-locate a { - font-size: 1.4em; - color: #444; - cursor: pointer; -} -.leaflet-control-locate.active a { - color: #2074B6; -} -.leaflet-control-locate.active.following a { - color: #FC8428; -} - -.leaflet-control-locate-location circle { - animation: leaflet-control-locate-throb 4s ease infinite; -} - -@keyframes leaflet-control-locate-throb { - 0% { - r: 9; - stroke-width: 1; - } - 50% { - r: 7; - stroke-width: 3; - } - 100% { - r: 9; - stroke-width: 1; - } -} - -/*# sourceMappingURL=L.Control.Locate.css.map */ diff --git a/geonode/static/lib/css/assets.min.css b/geonode/static/lib/css/assets.min.css index 182fd5e3236..3ffd7614061 100644 --- a/geonode/static/lib/css/assets.min.css +++ b/geonode/static/lib/css/assets.min.css @@ -33,4 +33,4 @@ table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;bor * Released under the MIT license * * Date: 2019-10-04T04:33:44.164Z - */.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:calc(100% / 3);left:0;top:calc(100% / 3);width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:calc(100% / 3);top:0;width:calc(100% / 3)}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center::after,.cropper-center::before{background-color:#eee;content:' ';display:block;position:absolute}.cropper-center::before{height:1px;left:-3px;top:0;width:7px}.cropper-center::after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se::before{background-color:#39f;bottom:-50%;content:' ';display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}:root{--tagify-dd-color-primary:rgb(53,149,246);--tagify-dd-bg-color:white}.tagify{--tags-border-color:#DDD;--tag-bg:#E5E5E5;--tag-hover:#D3E2E2;--tag-text-color:black;--tag-text-color--edit:black;--tag-pad:0.3em 0.5em;--tag-inset-shadow-size:1.1em;--tag-invalid-color:#D39494;--tag-invalid-bg:rgba(211, 148, 148, 0.5);--tag-remove-bg:rgba(211, 148, 148, 0.3);--tag-remove-btn-bg:none;--tag-remove-btn-bg--hover:#c77777;--tag--min-width:1ch;--tag--max-width:auto;--tag-hide-transition:.3s;--placeholder-color:black;--loader-size:.8em;display:flex;align-items:flex-start;flex-wrap:wrap;border:1px solid #ddd;border:1px solid var(--tags-border-color);padding:0;line-height:1.1;cursor:text;outline:0;position:relative;transition:.1s}@keyframes tags--bump{30%{transform:scale(1.2)}}@keyframes rotateLoader{to{transform:rotate(1turn)}}.tagify:hover{border-color:#ccc}.tagify.tagify--focus{transition:0s;border-color:#3595f6}.tagify[readonly]{cursor:default}.tagify[readonly]>.tagify__input{visibility:hidden;width:0;margin:5px 0}.tagify[readonly] .tagify__tag__removeBtn{display:none}.tagify[readonly] .tagify__tag>div{padding:.3em .5em;padding:var(--tag-pad)}.tagify[readonly] .tagify__tag>div::before{background:linear-gradient(45deg,var(--tag-bg) 25%,transparent 25%,transparent 50%,var(--tag-bg) 50%,var(--tag-bg) 75%,transparent 75%,transparent) 0/5px 5px;box-shadow:none;filter:brightness(.95)}.tagify--loading .tagify__input::before{content:none}.tagify--loading .tagify__input::after{content:'';vertical-align:middle;margin:-2px 0 -2px .5em;opacity:1;width:.7em;height:.7em;width:var(--loader-size);height:var(--loader-size);border:3px solid;border-color:#eee #bbb #888 transparent;border-radius:50%;animation:rotateLoader .4s infinite linear}.tagify--loading .tagify__input:empty::after{margin-left:0}.tagify+input,.tagify+textarea{display:none!important}.tagify__tag{display:inline-flex;align-items:center;margin:5px 0 5px 5px;position:relative;z-index:1;outline:0;cursor:default;transition:.13s ease-out}.tagify__tag>div{vertical-align:top;box-sizing:border-box;max-width:100%;padding:.3em .5em;padding:var(--tag-pad);color:#000;color:var(--tag-text-color);line-height:inherit;border-radius:3px;-webkit-user-select:none;user-select:none;transition:.13s ease-out}.tagify__tag>div>*{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;vertical-align:top;min-width:var(--tag--min-width);max-width:var(--tag--max-width);transition:.8s ease,.1s color}.tagify__tag>div>[contenteditable]{outline:0;-webkit-user-select:text;user-select:text;cursor:text;margin:-2px;padding:2px;max-width:350px}.tagify__tag>div::before{content:'';position:absolute;border-radius:inherit;left:0;top:0;right:0;bottom:0;z-index:-1;pointer-events:none;transition:120ms ease;animation:tags--bump .3s ease-out 1;box-shadow:0 0 0 1.1em #e5e5e5 inset;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-bg) inset}.tagify__tag:hover:not([readonly]) div::before{top:-2px;right:-2px;bottom:-2px;left:-2px;box-shadow:0 0 0 1.1em #d3e2e2 inset;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-hover) inset}.tagify__tag.tagify--noAnim>div::before{animation:none}.tagify__tag.tagify--hide{width:0!important;padding-left:0;padding-right:0;margin-left:0;margin-right:0;opacity:0;transform:scale(0);transition:.3s;transition:var(--tag-hide-transition);pointer-events:none}.tagify__tag.tagify--mark div::before{animation:none}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div>span{opacity:.5}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div::before{box-shadow:0 0 0 1.1em rgba(211,148,148,.5) inset!important;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-invalid-bg) inset!important;transition:.2s}.tagify__tag[readonly] .tagify__tag__removeBtn{display:none}.tagify__tag[readonly]>div::before{background:linear-gradient(45deg,var(--tag-bg) 25%,transparent 25%,transparent 50%,var(--tag-bg) 50%,var(--tag-bg) 75%,transparent 75%,transparent) 0/5px 5px;box-shadow:none;filter:brightness(.95)}.tagify__tag--editable>div{color:#000;color:var(--tag-text-color--edit)}.tagify__tag--editable>div::before{box-shadow:0 0 0 2px #d3e2e2 inset!important;box-shadow:0 0 0 2px var(--tag-hover) inset!important}.tagify__tag--editable.tagify--invalid>div::before{box-shadow:0 0 0 2px #d39494 inset!important;box-shadow:0 0 0 2px var(--tag-invalid-color) inset!important}.tagify__tag__removeBtn{order:5;display:inline-flex;align-items:center;justify-content:center;border-radius:50px;cursor:pointer;font:14px Serif;background:0 0;background:var(--tag-remove-btn-bg);color:#000;color:var(--tag-text-color);width:14px;height:14px;margin-right:4.66667px;margin-left:-4.66667px;transition:.2s ease-out}.tagify__tag__removeBtn::after{content:"\00D7"}.tagify__tag__removeBtn:hover{color:#fff;background:#c77777;background:var(--tag-remove-btn-bg--hover)}.tagify__tag__removeBtn:hover+div>span{opacity:.5}.tagify__tag__removeBtn:hover+div::before{box-shadow:0 0 0 1.1em rgba(211,148,148,.3) inset!important;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-remove-bg) inset!important;transition:.2s}.tagify:not(.tagify--mix) .tagify__input br{display:none}.tagify:not(.tagify--mix) .tagify__input *{display:inline;white-space:nowrap}.tagify__input{display:block;min-width:110px;margin:5px;padding:.3em .5em;padding:var(--tag-pad,.3em .5em);line-height:inherit;position:relative;white-space:pre-line}.tagify__input::before{display:inline-block;width:0}.tagify__input:empty{display:flex}.tagify__input:empty::before{transition:.2s ease-out;opacity:.5;transform:none;width:auto}.tagify__input:focus{outline:0}.tagify__input:focus::before{transition:.2s ease-out;opacity:0;transform:translatex(6px)}@supports (-moz-appearance:none){.tagify__input:focus::before{display:none}}.tagify__input:focus:empty::before{transition:.2s ease-out;opacity:.3;transform:none}@supports (-moz-appearance:none){.tagify__input:focus:empty::before{display:inline-block}}.tagify__input::before{content:attr(data-placeholder);line-height:1.8;position:absolute;top:0;z-index:1;color:#000;color:var(--placeholder-color);white-space:nowrap;pointer-events:none;opacity:0}.tagify--mix .tagify__input::before{position:static;line-height:inherit}@supports (-moz-appearance:none){.tagify__input::before{line-height:inherit;position:relative}}.tagify__input::after{content:attr(data-suggest);display:inline-block;white-space:pre;color:#000;opacity:.3;pointer-events:none;max-width:100px}.tagify__input .tagify__tag{margin:0}.tagify__input .tagify__tag>div{padding-top:0;padding-bottom:0}.tagify--mix{line-height:1.7}.tagify--mix .tagify__input{padding:5px;margin:0;width:100%;height:100%;line-height:inherit}.tagify--mix .tagify__input::after{content:none}.tagify--select::after{content:'>';opacity:.5;position:absolute;top:50%;right:0;bottom:0;font:16px monospace;line-height:8px;height:8px;pointer-events:none;transform:translate(-150%,-50%) scaleX(1.2) rotate(90deg);transition:.2s ease-in-out}.tagify--select[aria-expanded=true]::after{transform:translate(-150%,-50%) rotate(270deg) scaleY(1.2)}.tagify--select .tagify__tag{position:absolute;top:0;right:1.8em;bottom:0}.tagify--select .tagify__tag div{display:none}.tagify--select .tagify__input{width:100%}.tagify--invalid{--tags-border-color:#D39494}.tagify__dropdown{position:absolute;z-index:9999;transform:translateY(1px);overflow:hidden}.tagify__dropdown[placement=top]{margin-top:0;transform:translateY(-2px)}.tagify__dropdown[placement=top] .tagify__dropdown__wrapper{border-top-width:1px;border-bottom-width:0}.tagify__dropdown--text{box-shadow:0 0 0 3px rgba(var(--tagify-dd-color-primary),.1);font-size:.9em}.tagify__dropdown--text .tagify__dropdown__wrapper{border-width:1px}.tagify__dropdown__wrapper{max-height:300px;overflow:hidden;background:#fff;background:var(--tagify-dd-bg-color);border:1px solid #3595f6;border-color:var(--tagify-dd-color-primary);border-top-width:0;box-shadow:0 2px 4px -2px rgba(0,0,0,.2);transition:.25s cubic-bezier(0,1,.5,1)}.tagify__dropdown__wrapper:hover{overflow:auto}.tagify__dropdown--initial .tagify__dropdown__wrapper{max-height:20px;transform:translateY(-1em)}.tagify__dropdown--initial[placement=top] .tagify__dropdown__wrapper{transform:translateY(2em)}.tagify__dropdown__item{box-sizing:inherit;padding:.3em .5em;margin:1px;cursor:pointer;border-radius:2px;position:relative;outline:0}.tagify__dropdown__item--active{background:#3595f6;background:var(--tagify-dd-color-primary);color:#fff}.tagify__dropdown__item:active{filter:brightness(105%)}.tagify__dropdown__createTagBtn{width:100%;background:#3595f6;background:var(--tagify-dd-color-primary);color:#fff;color:var(--tagify-dd-bg-color);border:none} \ No newline at end of file + */.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:calc(100% / 3);left:0;top:calc(100% / 3);width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:calc(100% / 3);top:0;width:calc(100% / 3)}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center::after,.cropper-center::before{background-color:#eee;content:' ';display:block;position:absolute}.cropper-center::before{height:1px;left:-3px;top:0;width:7px}.cropper-center::after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se::before{background-color:#39f;bottom:-50%;content:' ';display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}:root{--tagify-dd-color-primary:rgb(53,149,246);--tagify-dd-bg-color:white}.tagify{--tags-border-color:#DDD;--tag-bg:#E5E5E5;--tag-hover:#D3E2E2;--tag-text-color:black;--tag-text-color--edit:black;--tag-pad:0.3em 0.5em;--tag-inset-shadow-size:1.1em;--tag-invalid-color:#D39494;--tag-invalid-bg:rgba(211, 148, 148, 0.5);--tag-remove-bg:rgba(211, 148, 148, 0.3);--tag-remove-btn-bg:none;--tag-remove-btn-bg--hover:#c77777;--tag--min-width:1ch;--tag--max-width:auto;--tag-hide-transition:.3s;--placeholder-color:black;--loader-size:.8em;display:flex;align-items:flex-start;flex-wrap:wrap;border:1px solid #ddd;border:1px solid var(--tags-border-color);padding:0;line-height:1.1;cursor:text;outline:0;position:relative;transition:.1s}@keyframes tags--bump{30%{transform:scale(1.2)}}@keyframes rotateLoader{to{transform:rotate(1turn)}}.tagify:hover{border-color:#ccc}.tagify.tagify--focus{transition:0s;border-color:#3595f6}.tagify[readonly]{cursor:default}.tagify[readonly]>.tagify__input{visibility:hidden;width:0;margin:5px 0}.tagify[readonly] .tagify__tag__removeBtn{display:none}.tagify[readonly] .tagify__tag>div{padding:.3em .5em;padding:var(--tag-pad)}.tagify[readonly] .tagify__tag>div::before{background:linear-gradient(45deg,var(--tag-bg) 25%,transparent 25%,transparent 50%,var(--tag-bg) 50%,var(--tag-bg) 75%,transparent 75%,transparent) 0/5px 5px;box-shadow:none;filter:brightness(.95)}.tagify--loading .tagify__input::before{content:none}.tagify--loading .tagify__input::after{content:'';vertical-align:middle;margin:-2px 0 -2px .5em;opacity:1;width:.7em;height:.7em;width:var(--loader-size);height:var(--loader-size);border:3px solid;border-color:#eee #bbb #888 transparent;border-radius:50%;animation:rotateLoader .4s infinite linear}.tagify--loading .tagify__input:empty::after{margin-left:0}.tagify+input,.tagify+textarea{display:none!important}.tagify__tag{display:inline-flex;align-items:center;margin:5px 0 5px 5px;position:relative;z-index:1;outline:0;cursor:default;transition:.13s ease-out}.tagify__tag>div{vertical-align:top;box-sizing:border-box;max-width:100%;padding:.3em .5em;padding:var(--tag-pad);color:#000;color:var(--tag-text-color);line-height:inherit;border-radius:3px;-webkit-user-select:none;user-select:none;transition:.13s ease-out}.tagify__tag>div>*{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;vertical-align:top;min-width:var(--tag--min-width);max-width:var(--tag--max-width);transition:.8s ease,.1s color}.tagify__tag>div>[contenteditable]{outline:0;-webkit-user-select:text;user-select:text;cursor:text;margin:-2px;padding:2px;max-width:350px}.tagify__tag>div::before{content:'';position:absolute;border-radius:inherit;left:0;top:0;right:0;bottom:0;z-index:-1;pointer-events:none;transition:120ms ease;animation:tags--bump .3s ease-out 1;box-shadow:0 0 0 1.1em #e5e5e5 inset;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-bg) inset}.tagify__tag:hover:not([readonly]) div::before{top:-2px;right:-2px;bottom:-2px;left:-2px;box-shadow:0 0 0 1.1em #d3e2e2 inset;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-hover) inset}.tagify__tag.tagify--noAnim>div::before{animation:none}.tagify__tag.tagify--hide{width:0!important;padding-left:0;padding-right:0;margin-left:0;margin-right:0;opacity:0;transform:scale(0);transition:.3s;transition:var(--tag-hide-transition);pointer-events:none}.tagify__tag.tagify--mark div::before{animation:none}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div>span{opacity:.5}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div::before{box-shadow:0 0 0 1.1em rgba(211,148,148,.5) inset!important;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-invalid-bg) inset!important;transition:.2s}.tagify__tag[readonly] .tagify__tag__removeBtn{display:none}.tagify__tag[readonly]>div::before{background:linear-gradient(45deg,var(--tag-bg) 25%,transparent 25%,transparent 50%,var(--tag-bg) 50%,var(--tag-bg) 75%,transparent 75%,transparent) 0/5px 5px;box-shadow:none;filter:brightness(.95)}.tagify__tag--editable>div{color:#000;color:var(--tag-text-color--edit)}.tagify__tag--editable>div::before{box-shadow:0 0 0 2px #d3e2e2 inset!important;box-shadow:0 0 0 2px var(--tag-hover) inset!important}.tagify__tag--editable.tagify--invalid>div::before{box-shadow:0 0 0 2px #d39494 inset!important;box-shadow:0 0 0 2px var(--tag-invalid-color) inset!important}.tagify__tag__removeBtn{order:5;display:inline-flex;align-items:center;justify-content:center;border-radius:50px;cursor:pointer;font:14px Serif;background:0 0;background:var(--tag-remove-btn-bg);color:#000;color:var(--tag-text-color);width:14px;height:14px;margin-right:4.66667px;margin-left:-4.66667px;transition:.2s ease-out}.tagify__tag__removeBtn::after{content:"\00D7"}.tagify__tag__removeBtn:hover{color:#fff;background:#c77777;background:var(--tag-remove-btn-bg--hover)}.tagify__tag__removeBtn:hover+div>span{opacity:.5}.tagify__tag__removeBtn:hover+div::before{box-shadow:0 0 0 1.1em rgba(211,148,148,.3) inset!important;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-remove-bg) inset!important;transition:.2s}.tagify:not(.tagify--mix) .tagify__input br{display:none}.tagify:not(.tagify--mix) .tagify__input *{display:inline;white-space:nowrap}.tagify__input{display:block;min-width:110px;margin:5px;padding:.3em .5em;padding:var(--tag-pad,.3em .5em);line-height:inherit;position:relative;white-space:pre-line}.tagify__input::before{display:inline-block;width:0}@supports (-moz-appearance:none){.tagify__input:empty{display:flex}}.tagify__input:empty::before{transition:.2s ease-out;opacity:.5;transform:none;width:auto}.tagify__input:focus{outline:0}.tagify__input:focus::before{transition:.2s ease-out;opacity:0;transform:translatex(6px)}@supports (-moz-appearance:none){.tagify__input:focus::before{display:none}}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.tagify__input:focus::before{display:none}}@supports (-ms-ime-align:auto){.tagify__input:focus::before{display:none}}.tagify__input:focus:empty::before{transition:.2s ease-out;opacity:.3;transform:none}@supports (-moz-appearance:none){.tagify__input:focus:empty::before{display:inline-block}}.tagify__input::before{content:attr(data-placeholder);line-height:1.8;position:absolute;top:0;z-index:1;color:#000;color:var(--placeholder-color);white-space:nowrap;pointer-events:none;opacity:0}.tagify--mix .tagify__input::before{position:static;line-height:inherit}@supports (-moz-appearance:none){.tagify__input::before{line-height:inherit;position:relative}}.tagify__input::after{content:attr(data-suggest);display:inline-block;white-space:pre;color:#000;opacity:.3;pointer-events:none;max-width:100px}.tagify__input .tagify__tag{margin:0}.tagify__input .tagify__tag>div{padding-top:0;padding-bottom:0}.tagify--mix{line-height:1.7}.tagify--mix .tagify__input{padding:5px;margin:0;width:100%;height:100%;line-height:inherit}.tagify--mix .tagify__input::after{content:none}.tagify--select::after{content:'>';opacity:.5;position:absolute;top:50%;right:0;bottom:0;font:16px monospace;line-height:8px;height:8px;pointer-events:none;transform:translate(-150%,-50%) scaleX(1.2) rotate(90deg);transition:.2s ease-in-out}.tagify--select[aria-expanded=true]::after{transform:translate(-150%,-50%) rotate(270deg) scaleY(1.2)}.tagify--select .tagify__tag{position:absolute;top:0;right:1.8em;bottom:0}.tagify--select .tagify__tag div{display:none}.tagify--select .tagify__input{width:100%}.tagify--invalid{--tags-border-color:#D39494}.tagify__dropdown{position:absolute;z-index:9999;transform:translateY(1px);overflow:hidden}.tagify__dropdown[placement=top]{margin-top:0;transform:translateY(-2px)}.tagify__dropdown[placement=top] .tagify__dropdown__wrapper{border-top-width:1px;border-bottom-width:0}.tagify__dropdown--text{box-shadow:0 0 0 3px rgba(var(--tagify-dd-color-primary),.1);font-size:.9em}.tagify__dropdown--text .tagify__dropdown__wrapper{border-width:1px}.tagify__dropdown__wrapper{max-height:300px;overflow:hidden;background:#fff;background:var(--tagify-dd-bg-color);border:1px solid #3595f6;border-color:var(--tagify-dd-color-primary);border-top-width:0;box-shadow:0 2px 4px -2px rgba(0,0,0,.2);transition:.25s cubic-bezier(0,1,.5,1)}.tagify__dropdown__wrapper:hover{overflow:auto}.tagify__dropdown--initial .tagify__dropdown__wrapper{max-height:20px;transform:translateY(-1em)}.tagify__dropdown--initial[placement=top] .tagify__dropdown__wrapper{transform:translateY(2em)}.tagify__dropdown__item{box-sizing:inherit;padding:.3em .5em;margin:1px;cursor:pointer;border-radius:2px;position:relative;outline:0}.tagify__dropdown__item--active{background:#3595f6;background:var(--tagify-dd-color-primary);color:#fff}.tagify__dropdown__item:active{filter:brightness(105%)}.tagify__dropdown__createTagBtn{width:100%;background:#3595f6;background:var(--tagify-dd-color-primary);color:#fff;color:var(--tagify-dd-bg-color);border:none} \ No newline at end of file diff --git a/geonode/static/lib/css/leaflet-plugins.min.css b/geonode/static/lib/css/leaflet-plugins.min.css index 8ef415e89cb..5066cdd0708 100644 --- a/geonode/static/lib/css/leaflet-plugins.min.css +++ b/geonode/static/lib/css/leaflet-plugins.min.css @@ -1 +1 @@ -.leaflet-image-layer,.leaflet-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane,.leaflet-pane>canvas,.leaflet-pane>svg,.leaflet-tile,.leaflet-tile-container,.leaflet-zoom-box{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:0 0}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important;max-height:none!important}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-bottom,.leaflet-top{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-tile{will-change:opacity}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.leaflet-zoom-anim .leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-pan-anim .leaflet-tile,.leaflet-zoom-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-control,.leaflet-popup-pane{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-image-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-image-layer.leaflet-interactive,.leaflet-marker-icon.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline:0}.leaflet-container a{color:#0078a8}.leaflet-container a.leaflet-active{outline:2px solid orange}.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,.5)}.leaflet-container{font:12px/1.5 "Helvetica Neue",Arial,Helvetica,sans-serif}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:bold 18px 'Lucida Console',Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(../img/layers.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(../img/layers-2x.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(../img/marker-icon.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,.7);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;background:rgba(255,255,255,.5)}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers{box-shadow:none}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-layers{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 19px;line-height:1.4}.leaflet-popup-content p{margin:18px 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;border:none;text-align:center;width:18px;height:14px;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;font-weight:700;background:0 0}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}.leaflet-oldie .leaflet-popup-content-wrapper{zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-clickable{cursor:pointer;pointer-events:auto}.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before,.leaflet-tooltip-top:before{position:absolute;pointer-events:none;border:6px solid transparent;background:0 0;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}.leaflet-bar button,.leaflet-bar button:hover{background-color:#fff;border:none;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar button{background-position:50% 50%;background-repeat:no-repeat;overflow:hidden;display:block}.leaflet-bar button:hover{background-color:#f4f4f4}.leaflet-bar button:first-of-type{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar button:last-of-type{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar button.disabled,.leaflet-bar.disabled{cursor:default;pointer-events:none;opacity:.4}.easy-button-button .button-state{display:block;width:100%;height:100%;position:relative}.leaflet-touch .leaflet-bar button{width:30px;height:30px;line-height:30px}.leaflet-control-locate a{font-size:1.4em;color:#444;cursor:pointer}.leaflet-control-locate.active a{color:#2074b6}.leaflet-control-locate.active.following a{color:#fc8428}.leaflet-control-locate-location circle{animation:leaflet-control-locate-throb 4s ease infinite}@keyframes leaflet-control-locate-throb{0%{stroke-width:1}50%{stroke-width:3}100%{stroke-width:1}}.leaflet-left.has-leaflet-pan-control .leaflet-control-zoom{position:relative;left:24px}.leaflet-right.has-leaflet-pan-control .leaflet-control-zoom{position:relative;right:24px}.leaflet-left.has-leaflet-pan-control .leaflet-control-zoomslider{position:relative;left:22px}.leaflet-right.has-leaflet-pan-control .leaflet-control-zoomslider{position:relative;right:22px}.leaflet-control-pan{width:76px;height:76px}.leaflet-control-pan>div{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}.leaflet-control-pan>div{box-shadow:0 1px 7px rgba(0,0,0,.65)}.leaflet-control-pan a{background-color:#fff}.leaflet-control-pan a{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-control-pan a{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;width:23px;height:23px}.leaflet-control-pan a:hover{background-color:#f4f4f4}.leaflet-control-pan-up-wrap{position:absolute;left:26px}.leaflet-control-pan-left-wrap{position:absolute;top:26px}.leaflet-control-pan-right-wrap{position:absolute;left:52px;top:26px}.leaflet-control-pan-down-wrap{position:absolute;left:26px;top:52px}.leaflet-control-pan-up{background-image:url(../img/pan-up.png)}.leaflet-control-pan-left{background-image:url(../img/pan-left.png)}.leaflet-control-pan-right{background-image:url(../img/pan-right.png)}.leaflet-control-pan-down{background-image:url(../img/pan-down.png)}.leaflet-touch .leaflet-control-pan div{border:2px solid rgba(0,0,0,.2);box-shadow:none;border-radius:4px}.leaflet-touch .leaflet-control-pan{width:89px;height:119px;margin-left:8px}.leaflet-touch .leaflet-right .leaflet-control-pan{margin-left:0;margin-right:5px}.leaflet-touch .leaflet-control-pan a{width:30px;height:30px;border-radius:4px}.leaflet-touch .leaflet-control-pan-up-wrap{left:26px}.leaflet-touch .leaflet-control-pan-left-wrap{top:40px}.leaflet-touch .leaflet-control-pan-right-wrap{left:52px;top:40px}.leaflet-touch .leaflet-control-pan-down-wrap{left:26px;top:80px}.leaflet-control-fullscreen a{background:#fff url(fullscreen.png) no-repeat 0 0;background-size:26px 52px}.leaflet-touch .leaflet-control-fullscreen a{background-position:2px 2px}.leaflet-fullscreen-on .leaflet-control-fullscreen a{background-position:0 -26px}.leaflet-touch.leaflet-fullscreen-on .leaflet-control-fullscreen a{background-position:2px -24px}.leaflet-container:-webkit-full-screen{width:100%!important;height:100%!important}.leaflet-container.leaflet-fullscreen-on{width:100%!important;height:100%!important}.leaflet-pseudo-fullscreen{position:fixed!important;width:100%!important;height:100%!important;top:0!important;left:0!important;z-index:99999}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.leaflet-control-fullscreen a{background-image:url(fullscreen@2x.png)}}input[type=range]{-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);width:110px;height:10px;margin:0;border:none;padding:1px 2px;border-radius:30px;background:#f1f0ee;outline:0}input[type=range]::-ms-track{border:inherit;color:transparent;background:0 0}input[type=range]::-ms-fill-lower,input[type=range]::-ms-fill-upper{background:0 0}input[type=range]::-ms-tooltip{display:none}input[type=range]::-ms-thumb{width:15px;height:18px;border-radius:12px;border:0;background-image:linear-gradient(to bottom,#1253a4 0,#1253a4 100%)}.leaflet-control-layers-label{margin:0 0 8px 1px}.leaflet-control-measure h3,.leaflet-measure-resultpopup h3{margin:0 0 12px;padding-bottom:10px;border-bottom:1px solid #ddd}.leaflet-control-measure p,.leaflet-measure-resultpopup p{margin:10px 0 0;line-height:1.5em}.leaflet-control-measure p:first-child,.leaflet-measure-resultpopup p:first-child{margin-top:0}.leaflet-control-measure .tasks,.leaflet-measure-resultpopup .tasks{margin:12px 0 0;padding:10px 0 0;border-top:1px solid #ddd;text-align:right;list-style:none;list-style-image:none}.leaflet-control-measure .tasks li,.leaflet-measure-resultpopup .tasks li{display:inline;margin:0 10px 0 0}.leaflet-control-measure .tasks li:last-child,.leaflet-measure-resultpopup .tasks li:last-child{margin-right:0}.leaflet-control-measure .coorddivider,.leaflet-measure-resultpopup .coorddivider{color:#999}.leaflet-control-measure{max-width:280px;background:#fff}.leaflet-control-measure .leaflet-control-measure-toggle,.leaflet-control-measure .leaflet-control-measure-toggle:hover{background-size:14px 14px;background-image:url(assets/rulers.png);border:0;border-radius:4px;text-indent:100%;white-space:nowrap;overflow:hidden}.leaflet-touch .leaflet-control-measure .leaflet-control-measure-toggle,.leaflet-touch .leaflet-control-measure .leaflet-control-measure-toggle:hover{border-radius:2px}.leaflet-retina .leaflet-control-measure .leaflet-control-measure-toggle,.leaflet-retina .leaflet-control-measure .leaflet-control-measure-toggle:hover{background-image:url(assets/rulers_@2X.png)}.leaflet-touch .leaflet-control-measure .leaflet-control-measure-toggle,.leaflet-touch .leaflet-control-measure .leaflet-control-measure-toggle:hover{background-size:16px 16px}.leaflet-control-measure .startprompt h3{margin-bottom:10px}.leaflet-control-measure .startprompt .tasks{margin-top:0;padding-top:0;border-top:0;text-align:left}.leaflet-control-measure .leaflet-control-measure-interaction{padding:10px 12px}.leaflet-control-measure .results .group{margin-top:10px;padding-top:10px;border-top:1px dotted #eaeaea}.leaflet-control-measure .results .group:first-child{margin-top:0;padding-top:0;border-top:0}.leaflet-control-measure .results .heading{margin-right:5px;color:#999}.leaflet-control-measure a.start{display:inline;width:auto;height:auto;padding-left:20px;margin-right:4px;line-height:1em;border:0;text-align:left;background-image:url(assets/start.png);background-repeat:no-repeat;background-position:0 50%;background-size:12px 12px;color:#5e66cc;text-decoration:none}.leaflet-control-measure a.start,.leaflet-control-measure a.start:hover{background-color:transparent}.leaflet-retina .leaflet-control-measure a.start{background-image:url(assets/start_@2X.png)}.leaflet-control-measure a.start:hover{opacity:.5;text-decoration:none}.leaflet-control-measure a.cancel{display:inline;width:auto;height:auto;padding-left:20px;margin-right:4px;line-height:1em;border:0;text-align:left;background-image:url(assets/cancel.png);background-repeat:no-repeat;background-position:0 50%;background-size:12px 12px;color:#5e66cc;text-decoration:none}.leaflet-control-measure a.cancel,.leaflet-control-measure a.cancel:hover{background-color:transparent}.leaflet-retina .leaflet-control-measure a.cancel{background-image:url(assets/cancel_@2X.png)}.leaflet-control-measure a.cancel:hover{opacity:.5;text-decoration:none}.leaflet-control-measure a.finish{display:inline;width:auto;height:auto;padding-left:20px;margin-right:4px;line-height:1em;border:0;text-align:left;background-image:url(assets/check.png);background-repeat:no-repeat;background-position:0 50%;background-size:12px 12px;color:#5e66cc;text-decoration:none}.leaflet-control-measure a.finish,.leaflet-control-measure a.finish:hover{background-color:transparent}.leaflet-retina .leaflet-control-measure a.finish{background-image:url(assets/check_@2X.png)}.leaflet-control-measure a.finish:hover{opacity:.5;text-decoration:none}.leaflet-measure-resultpopup a.zoomto{display:inline;width:auto;height:auto;padding-left:20px;margin-right:4px;line-height:1em;border:0;text-align:left;background-image:url(assets/focus.png);background-repeat:no-repeat;background-position:0 50%;background-size:12px 12px;color:#5e66cc;text-decoration:none}.leaflet-measure-resultpopup a.zoomto,.leaflet-measure-resultpopup a.zoomto:hover{background-color:transparent}.leaflet-retina .leaflet-measure-resultpopup a.zoomto{background-image:url(assets/focus_@2X.png)}.leaflet-measure-resultpopup a.zoomto:hover{opacity:.5;text-decoration:none}.leaflet-measure-resultpopup a.deletemarkup{display:inline;width:auto;height:auto;padding-left:20px;margin-right:4px;line-height:1em;border:0;text-align:left;background-image:url(assets/trash.png);background-repeat:no-repeat;background-position:0 50%;background-size:12px 12px;color:#5e66cc;text-decoration:none}.leaflet-measure-resultpopup a.deletemarkup,.leaflet-measure-resultpopup a.deletemarkup:hover{background-color:transparent}.leaflet-retina .leaflet-measure-resultpopup a.deletemarkup{background-image:url(assets/trash_@2X.png)}.leaflet-measure-resultpopup a.deletemarkup:hover{opacity:.5;text-decoration:none}.leaflet-control-navbar-fwd{background-image:url(../img/arrow-right_000000_14.png)}.leaflet-control-navbar-back{background-image:url(../img/arrow-left_000000_14.png)}.leaflet-control-navbar-home{background-image:url(../img/home_000000_14.png)}.leaflet-control-navbar-fwd-disabled{background-image:url(../img/arrow-right_bbbbbb_14.png)}.leaflet-control-navbar-back-disabled{background-image:url(../img/arrow-left_bbbbbb_14.png)}.leaflet-control-navbar-home-disabled{background-image:url(../img/home_bbbbbb_14.png)} \ No newline at end of file +.leaflet-image-layer,.leaflet-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane,.leaflet-pane>canvas,.leaflet-pane>svg,.leaflet-tile,.leaflet-tile-container,.leaflet-zoom-box{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:0 0}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important;max-height:none!important}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-bottom,.leaflet-top{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-tile{will-change:opacity}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.leaflet-zoom-anim .leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-pan-anim .leaflet-tile,.leaflet-zoom-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-control,.leaflet-popup-pane{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-image-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-image-layer.leaflet-interactive,.leaflet-marker-icon.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline:0}.leaflet-container a{color:#0078a8}.leaflet-container a.leaflet-active{outline:2px solid orange}.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,.5)}.leaflet-container{font:12px/1.5 "Helvetica Neue",Arial,Helvetica,sans-serif}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:bold 18px 'Lucida Console',Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(../img/layers.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(../img/layers-2x.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(../img/marker-icon.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,.7);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;background:rgba(255,255,255,.5)}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers{box-shadow:none}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-layers{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 19px;line-height:1.4}.leaflet-popup-content p{margin:18px 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;border:none;text-align:center;width:18px;height:14px;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;font-weight:700;background:0 0}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}.leaflet-oldie .leaflet-popup-content-wrapper{zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-clickable{cursor:pointer;pointer-events:auto}.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before,.leaflet-tooltip-top:before{position:absolute;pointer-events:none;border:6px solid transparent;background:0 0;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}.leaflet-bar button,.leaflet-bar button:hover{background-color:#fff;border:none;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar button{background-position:50% 50%;background-repeat:no-repeat;overflow:hidden;display:block}.leaflet-bar button:hover{background-color:#f4f4f4}.leaflet-bar button:first-of-type{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar button:last-of-type{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar button.disabled,.leaflet-bar.disabled{cursor:default;pointer-events:none;opacity:.4}.easy-button-button .button-state{display:block;width:100%;height:100%;position:relative}.leaflet-touch .leaflet-bar button{width:30px;height:30px;line-height:30px}.leaflet-left.has-leaflet-pan-control .leaflet-control-zoom{position:relative;left:24px}.leaflet-right.has-leaflet-pan-control .leaflet-control-zoom{position:relative;right:24px}.leaflet-left.has-leaflet-pan-control .leaflet-control-zoomslider{position:relative;left:22px}.leaflet-right.has-leaflet-pan-control .leaflet-control-zoomslider{position:relative;right:22px}.leaflet-control-pan{width:76px;height:76px}.leaflet-control-pan>div{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}.leaflet-control-pan>div{box-shadow:0 1px 7px rgba(0,0,0,.65)}.leaflet-control-pan a{background-color:#fff}.leaflet-control-pan a{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-control-pan a{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;width:23px;height:23px}.leaflet-control-pan a:hover{background-color:#f4f4f4}.leaflet-control-pan-up-wrap{position:absolute;left:26px}.leaflet-control-pan-left-wrap{position:absolute;top:26px}.leaflet-control-pan-right-wrap{position:absolute;left:52px;top:26px}.leaflet-control-pan-down-wrap{position:absolute;left:26px;top:52px}.leaflet-control-pan-up{background-image:url(../img/pan-up.png)}.leaflet-control-pan-left{background-image:url(../img/pan-left.png)}.leaflet-control-pan-right{background-image:url(../img/pan-right.png)}.leaflet-control-pan-down{background-image:url(../img/pan-down.png)}.leaflet-touch .leaflet-control-pan div{border:2px solid rgba(0,0,0,.2);box-shadow:none;border-radius:4px}.leaflet-touch .leaflet-control-pan{width:89px;height:119px;margin-left:8px}.leaflet-touch .leaflet-right .leaflet-control-pan{margin-left:0;margin-right:5px}.leaflet-touch .leaflet-control-pan a{width:30px;height:30px;border-radius:4px}.leaflet-touch .leaflet-control-pan-up-wrap{left:26px}.leaflet-touch .leaflet-control-pan-left-wrap{top:40px}.leaflet-touch .leaflet-control-pan-right-wrap{left:52px;top:40px}.leaflet-touch .leaflet-control-pan-down-wrap{left:26px;top:80px}.leaflet-control-fullscreen a{background:#fff url(fullscreen.png) no-repeat 0 0;background-size:26px 52px}.leaflet-touch .leaflet-control-fullscreen a{background-position:2px 2px}.leaflet-fullscreen-on .leaflet-control-fullscreen a{background-position:0 -26px}.leaflet-touch.leaflet-fullscreen-on .leaflet-control-fullscreen a{background-position:2px -24px}.leaflet-container:-webkit-full-screen{width:100%!important;height:100%!important}.leaflet-container.leaflet-fullscreen-on{width:100%!important;height:100%!important}.leaflet-pseudo-fullscreen{position:fixed!important;width:100%!important;height:100%!important;top:0!important;left:0!important;z-index:99999}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.leaflet-control-fullscreen a{background-image:url(fullscreen@2x.png)}}input[type=range]{-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);width:110px;height:10px;margin:0;border:none;padding:1px 2px;border-radius:30px;background:#f1f0ee;outline:0}input[type=range]::-ms-track{border:inherit;color:transparent;background:0 0}input[type=range]::-ms-fill-lower,input[type=range]::-ms-fill-upper{background:0 0}input[type=range]::-ms-tooltip{display:none}input[type=range]::-ms-thumb{width:15px;height:18px;border-radius:12px;border:0;background-image:linear-gradient(to bottom,#1253a4 0,#1253a4 100%)}.leaflet-control-layers-label{margin:0 0 8px 1px}.leaflet-control-measure h3,.leaflet-measure-resultpopup h3{margin:0 0 12px;padding-bottom:10px;border-bottom:1px solid #ddd}.leaflet-control-measure p,.leaflet-measure-resultpopup p{margin:10px 0 0;line-height:1.5em}.leaflet-control-measure p:first-child,.leaflet-measure-resultpopup p:first-child{margin-top:0}.leaflet-control-measure .tasks,.leaflet-measure-resultpopup .tasks{margin:12px 0 0;padding:10px 0 0;border-top:1px solid #ddd;text-align:right;list-style:none;list-style-image:none}.leaflet-control-measure .tasks li,.leaflet-measure-resultpopup .tasks li{display:inline;margin:0 10px 0 0}.leaflet-control-measure .tasks li:last-child,.leaflet-measure-resultpopup .tasks li:last-child{margin-right:0}.leaflet-control-measure .coorddivider,.leaflet-measure-resultpopup .coorddivider{color:#999}.leaflet-control-measure{max-width:280px;background:#fff}.leaflet-control-measure .leaflet-control-measure-toggle,.leaflet-control-measure .leaflet-control-measure-toggle:hover{background-size:14px 14px;background-image:url(assets/rulers.png);border:0;border-radius:4px;text-indent:100%;white-space:nowrap;overflow:hidden}.leaflet-touch .leaflet-control-measure .leaflet-control-measure-toggle,.leaflet-touch .leaflet-control-measure .leaflet-control-measure-toggle:hover{border-radius:2px}.leaflet-retina .leaflet-control-measure .leaflet-control-measure-toggle,.leaflet-retina .leaflet-control-measure .leaflet-control-measure-toggle:hover{background-image:url(assets/rulers_@2X.png)}.leaflet-touch .leaflet-control-measure .leaflet-control-measure-toggle,.leaflet-touch .leaflet-control-measure .leaflet-control-measure-toggle:hover{background-size:16px 16px}.leaflet-control-measure .startprompt h3{margin-bottom:10px}.leaflet-control-measure .startprompt .tasks{margin-top:0;padding-top:0;border-top:0;text-align:left}.leaflet-control-measure .leaflet-control-measure-interaction{padding:10px 12px}.leaflet-control-measure .results .group{margin-top:10px;padding-top:10px;border-top:1px dotted #eaeaea}.leaflet-control-measure .results .group:first-child{margin-top:0;padding-top:0;border-top:0}.leaflet-control-measure .results .heading{margin-right:5px;color:#999}.leaflet-control-measure a.start{display:inline;width:auto;height:auto;padding-left:20px;margin-right:4px;line-height:1em;border:0;text-align:left;background-image:url(assets/start.png);background-repeat:no-repeat;background-position:0 50%;background-size:12px 12px;color:#5e66cc;text-decoration:none}.leaflet-control-measure a.start,.leaflet-control-measure a.start:hover{background-color:transparent}.leaflet-retina .leaflet-control-measure a.start{background-image:url(assets/start_@2X.png)}.leaflet-control-measure a.start:hover{opacity:.5;text-decoration:none}.leaflet-control-measure a.cancel{display:inline;width:auto;height:auto;padding-left:20px;margin-right:4px;line-height:1em;border:0;text-align:left;background-image:url(assets/cancel.png);background-repeat:no-repeat;background-position:0 50%;background-size:12px 12px;color:#5e66cc;text-decoration:none}.leaflet-control-measure a.cancel,.leaflet-control-measure a.cancel:hover{background-color:transparent}.leaflet-retina .leaflet-control-measure a.cancel{background-image:url(assets/cancel_@2X.png)}.leaflet-control-measure a.cancel:hover{opacity:.5;text-decoration:none}.leaflet-control-measure a.finish{display:inline;width:auto;height:auto;padding-left:20px;margin-right:4px;line-height:1em;border:0;text-align:left;background-image:url(assets/check.png);background-repeat:no-repeat;background-position:0 50%;background-size:12px 12px;color:#5e66cc;text-decoration:none}.leaflet-control-measure a.finish,.leaflet-control-measure a.finish:hover{background-color:transparent}.leaflet-retina .leaflet-control-measure a.finish{background-image:url(assets/check_@2X.png)}.leaflet-control-measure a.finish:hover{opacity:.5;text-decoration:none}.leaflet-measure-resultpopup a.zoomto{display:inline;width:auto;height:auto;padding-left:20px;margin-right:4px;line-height:1em;border:0;text-align:left;background-image:url(assets/focus.png);background-repeat:no-repeat;background-position:0 50%;background-size:12px 12px;color:#5e66cc;text-decoration:none}.leaflet-measure-resultpopup a.zoomto,.leaflet-measure-resultpopup a.zoomto:hover{background-color:transparent}.leaflet-retina .leaflet-measure-resultpopup a.zoomto{background-image:url(assets/focus_@2X.png)}.leaflet-measure-resultpopup a.zoomto:hover{opacity:.5;text-decoration:none}.leaflet-measure-resultpopup a.deletemarkup{display:inline;width:auto;height:auto;padding-left:20px;margin-right:4px;line-height:1em;border:0;text-align:left;background-image:url(assets/trash.png);background-repeat:no-repeat;background-position:0 50%;background-size:12px 12px;color:#5e66cc;text-decoration:none}.leaflet-measure-resultpopup a.deletemarkup,.leaflet-measure-resultpopup a.deletemarkup:hover{background-color:transparent}.leaflet-retina .leaflet-measure-resultpopup a.deletemarkup{background-image:url(assets/trash_@2X.png)}.leaflet-measure-resultpopup a.deletemarkup:hover{opacity:.5;text-decoration:none}.leaflet-control-navbar-fwd{background-image:url(../img/arrow-right_000000_14.png)}.leaflet-control-navbar-back{background-image:url(../img/arrow-left_000000_14.png)}.leaflet-control-navbar-home{background-image:url(../img/home_000000_14.png)}.leaflet-control-navbar-fwd-disabled{background-image:url(../img/arrow-right_bbbbbb_14.png)}.leaflet-control-navbar-back-disabled{background-image:url(../img/arrow-left_bbbbbb_14.png)}.leaflet-control-navbar-home-disabled{background-image:url(../img/home_bbbbbb_14.png)} \ No newline at end of file diff --git a/geonode/static/lib/css/ol.css b/geonode/static/lib/css/ol.css new file mode 100644 index 00000000000..17197261d9d --- /dev/null +++ b/geonode/static/lib/css/ol.css @@ -0,0 +1 @@ +.ol-box{box-sizing:border-box;border-radius:2px;border:2px solid #00f}.ol-mouse-position{top:8px;right:8px;position:absolute}.ol-scale-line{background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width}.ol-overlay-container{will-change:left,right,top,bottom}.ol-unsupported{display:none}.ol-unselectable,.ol-viewport{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.ol-control{position:absolute;background-color:rgba(255,255,255,.4);border-radius:4px;padding:2px}.ol-control:hover{background-color:rgba(255,255,255,.6)}.ol-zoom{top:.5em;left:.5em}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s}.ol-zoom-extent{top:4.643em;left:.5em}.ol-full-screen{right:.5em;top:.5em}@media print{.ol-control{display:none}}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-size:1.14em;font-weight:700;text-decoration:none;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:rgba(0,60,136,.5);border:none;border-radius:2px}.ol-control button::-moz-focus-inner{border:none;padding:0}.ol-zoom-extent button{line-height:1.4em}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform}.ol-touch .ol-control button{font-size:1.5em}.ol-touch .ol-zoom-extent{top:5.5em}.ol-control button:focus,.ol-control button:hover{text-decoration:none;background-color:rgba(0,60,136,.7)}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em)}.ol-attribution ul{margin:0;padding:0 .5em;font-size:.7rem;line-height:1.375em;color:#000;text-shadow:0 0 2px #fff}.ol-attribution li{display:inline;list-style:none;line-height:inherit}.ol-attribution li:not(:last-child):after{content:" "}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.ol-attribution button,.ol-attribution ul{display:inline-block}.ol-attribution.ol-collapsed ul{display:none}.ol-attribution.ol-logo-only ul{display:block}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0;height:1.1em;line-height:1em}.ol-attribution.ol-logo-only{background:0 0;bottom:.4em;height:1.1em;line-height:1em}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.ol-attribution.ol-logo-only button,.ol-attribution.ol-uncollapsible button{display:none}.ol-zoomslider{top:4.5em;left:.5em;height:200px}.ol-zoomslider button{position:relative;height:10px}.ol-touch .ol-zoomslider{top:5.5em}.ol-overviewmap{left:.5em;bottom:.5em}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0}.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button{display:inline-block}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px}.ol-overviewmap:not(.ol-collapsed) button{bottom:1px;left:2px;position:absolute}.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button{display:none}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7)}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move} \ No newline at end of file diff --git a/geonode/static/lib/css/openlayers-plugins.min.css b/geonode/static/lib/css/openlayers-plugins.min.css new file mode 100644 index 00000000000..17197261d9d --- /dev/null +++ b/geonode/static/lib/css/openlayers-plugins.min.css @@ -0,0 +1 @@ +.ol-box{box-sizing:border-box;border-radius:2px;border:2px solid #00f}.ol-mouse-position{top:8px;right:8px;position:absolute}.ol-scale-line{background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width}.ol-overlay-container{will-change:left,right,top,bottom}.ol-unsupported{display:none}.ol-unselectable,.ol-viewport{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.ol-control{position:absolute;background-color:rgba(255,255,255,.4);border-radius:4px;padding:2px}.ol-control:hover{background-color:rgba(255,255,255,.6)}.ol-zoom{top:.5em;left:.5em}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s}.ol-zoom-extent{top:4.643em;left:.5em}.ol-full-screen{right:.5em;top:.5em}@media print{.ol-control{display:none}}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-size:1.14em;font-weight:700;text-decoration:none;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:rgba(0,60,136,.5);border:none;border-radius:2px}.ol-control button::-moz-focus-inner{border:none;padding:0}.ol-zoom-extent button{line-height:1.4em}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform}.ol-touch .ol-control button{font-size:1.5em}.ol-touch .ol-zoom-extent{top:5.5em}.ol-control button:focus,.ol-control button:hover{text-decoration:none;background-color:rgba(0,60,136,.7)}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em)}.ol-attribution ul{margin:0;padding:0 .5em;font-size:.7rem;line-height:1.375em;color:#000;text-shadow:0 0 2px #fff}.ol-attribution li{display:inline;list-style:none;line-height:inherit}.ol-attribution li:not(:last-child):after{content:" "}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.ol-attribution button,.ol-attribution ul{display:inline-block}.ol-attribution.ol-collapsed ul{display:none}.ol-attribution.ol-logo-only ul{display:block}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0;height:1.1em;line-height:1em}.ol-attribution.ol-logo-only{background:0 0;bottom:.4em;height:1.1em;line-height:1em}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.ol-attribution.ol-logo-only button,.ol-attribution.ol-uncollapsible button{display:none}.ol-zoomslider{top:4.5em;left:.5em;height:200px}.ol-zoomslider button{position:relative;height:10px}.ol-touch .ol-zoomslider{top:5.5em}.ol-overviewmap{left:.5em;bottom:.5em}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0}.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button{display:inline-block}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px}.ol-overviewmap:not(.ol-collapsed) button{bottom:1px;left:2px;position:absolute}.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button{display:none}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7)}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move} \ No newline at end of file diff --git a/geonode/static/lib/css/tagify.css b/geonode/static/lib/css/tagify.css index 22dee8f3198..20fe6a017c7 100644 --- a/geonode/static/lib/css/tagify.css +++ b/geonode/static/lib/css/tagify.css @@ -1 +1 @@ -:root{--tagify-dd-color-primary:rgb(53,149,246);--tagify-dd-bg-color:white}.tagify{--tags-border-color:#DDD;--tag-bg:#E5E5E5;--tag-hover:#D3E2E2;--tag-text-color:black;--tag-text-color--edit:black;--tag-pad:0.3em 0.5em;--tag-inset-shadow-size:1.1em;--tag-invalid-color:#D39494;--tag-invalid-bg:rgba(211, 148, 148, 0.5);--tag-remove-bg:rgba(211, 148, 148, 0.3);--tag-remove-btn-bg:none;--tag-remove-btn-bg--hover:#c77777;--tag--min-width:1ch;--tag--max-width:auto;--tag-hide-transition:.3s;--placeholder-color:black;--loader-size:.8em;display:flex;align-items:flex-start;flex-wrap:wrap;border:1px solid #ddd;border:1px solid var(--tags-border-color);padding:0;line-height:1.1;cursor:text;outline:0;position:relative;transition:.1s}@keyframes tags--bump{30%{transform:scale(1.2)}}@keyframes rotateLoader{to{transform:rotate(1turn)}}.tagify:hover{border-color:#ccc}.tagify.tagify--focus{transition:0s;border-color:#3595f6}.tagify[readonly]{cursor:default}.tagify[readonly]>.tagify__input{visibility:hidden;width:0;margin:5px 0}.tagify[readonly] .tagify__tag__removeBtn{display:none}.tagify[readonly] .tagify__tag>div{padding:.3em .5em;padding:var(--tag-pad)}.tagify[readonly] .tagify__tag>div::before{background:linear-gradient(45deg,var(--tag-bg) 25%,transparent 25%,transparent 50%,var(--tag-bg) 50%,var(--tag-bg) 75%,transparent 75%,transparent) 0/5px 5px;box-shadow:none;filter:brightness(.95)}.tagify--loading .tagify__input::before{content:none}.tagify--loading .tagify__input::after{content:'';vertical-align:middle;margin:-2px 0 -2px .5em;opacity:1;width:.7em;height:.7em;width:var(--loader-size);height:var(--loader-size);border:3px solid;border-color:#eee #bbb #888 transparent;border-radius:50%;animation:rotateLoader .4s infinite linear}.tagify--loading .tagify__input:empty::after{margin-left:0}.tagify+input,.tagify+textarea{display:none!important}.tagify__tag{display:inline-flex;align-items:center;margin:5px 0 5px 5px;position:relative;z-index:1;outline:0;cursor:default;transition:.13s ease-out}.tagify__tag>div{vertical-align:top;box-sizing:border-box;max-width:100%;padding:.3em .5em;padding:var(--tag-pad);color:#000;color:var(--tag-text-color);line-height:inherit;border-radius:3px;-webkit-user-select:none;user-select:none;transition:.13s ease-out}.tagify__tag>div>*{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;vertical-align:top;min-width:var(--tag--min-width);max-width:var(--tag--max-width);transition:.8s ease,.1s color}.tagify__tag>div>[contenteditable]{outline:0;-webkit-user-select:text;user-select:text;cursor:text;margin:-2px;padding:2px;max-width:350px}.tagify__tag>div::before{content:'';position:absolute;border-radius:inherit;left:0;top:0;right:0;bottom:0;z-index:-1;pointer-events:none;transition:120ms ease;animation:tags--bump .3s ease-out 1;box-shadow:0 0 0 1.1em #e5e5e5 inset;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-bg) inset}.tagify__tag:hover:not([readonly]) div::before{top:-2px;right:-2px;bottom:-2px;left:-2px;box-shadow:0 0 0 1.1em #d3e2e2 inset;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-hover) inset}.tagify__tag.tagify--noAnim>div::before{animation:none}.tagify__tag.tagify--hide{width:0!important;padding-left:0;padding-right:0;margin-left:0;margin-right:0;opacity:0;transform:scale(0);transition:.3s;transition:var(--tag-hide-transition);pointer-events:none}.tagify__tag.tagify--mark div::before{animation:none}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div>span{opacity:.5}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div::before{box-shadow:0 0 0 1.1em rgba(211,148,148,.5) inset!important;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-invalid-bg) inset!important;transition:.2s}.tagify__tag[readonly] .tagify__tag__removeBtn{display:none}.tagify__tag[readonly]>div::before{background:linear-gradient(45deg,var(--tag-bg) 25%,transparent 25%,transparent 50%,var(--tag-bg) 50%,var(--tag-bg) 75%,transparent 75%,transparent) 0/5px 5px;box-shadow:none;filter:brightness(.95)}.tagify__tag--editable>div{color:#000;color:var(--tag-text-color--edit)}.tagify__tag--editable>div::before{box-shadow:0 0 0 2px #d3e2e2 inset!important;box-shadow:0 0 0 2px var(--tag-hover) inset!important}.tagify__tag--editable.tagify--invalid>div::before{box-shadow:0 0 0 2px #d39494 inset!important;box-shadow:0 0 0 2px var(--tag-invalid-color) inset!important}.tagify__tag__removeBtn{order:5;display:inline-flex;align-items:center;justify-content:center;border-radius:50px;cursor:pointer;font:14px Serif;background:0 0;background:var(--tag-remove-btn-bg);color:#000;color:var(--tag-text-color);width:14px;height:14px;margin-right:4.66667px;margin-left:-4.66667px;transition:.2s ease-out}.tagify__tag__removeBtn::after{content:"\00D7"}.tagify__tag__removeBtn:hover{color:#fff;background:#c77777;background:var(--tag-remove-btn-bg--hover)}.tagify__tag__removeBtn:hover+div>span{opacity:.5}.tagify__tag__removeBtn:hover+div::before{box-shadow:0 0 0 1.1em rgba(211,148,148,.3) inset!important;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-remove-bg) inset!important;transition:.2s}.tagify:not(.tagify--mix) .tagify__input br{display:none}.tagify:not(.tagify--mix) .tagify__input *{display:inline;white-space:nowrap}.tagify__input{display:block;min-width:110px;margin:5px;padding:.3em .5em;padding:var(--tag-pad,.3em .5em);line-height:inherit;position:relative;white-space:pre-line}.tagify__input::before{display:inline-block;width:0}.tagify__input:empty{display:flex}.tagify__input:empty::before{transition:.2s ease-out;opacity:.5;transform:none;width:auto}.tagify__input:focus{outline:0}.tagify__input:focus::before{transition:.2s ease-out;opacity:0;transform:translatex(6px)}@supports (-moz-appearance:none){.tagify__input:focus::before{display:none}}.tagify__input:focus:empty::before{transition:.2s ease-out;opacity:.3;transform:none}@supports (-moz-appearance:none){.tagify__input:focus:empty::before{display:inline-block}}.tagify__input::before{content:attr(data-placeholder);line-height:1.8;position:absolute;top:0;z-index:1;color:#000;color:var(--placeholder-color);white-space:nowrap;pointer-events:none;opacity:0}.tagify--mix .tagify__input::before{position:static;line-height:inherit}@supports (-moz-appearance:none){.tagify__input::before{line-height:inherit;position:relative}}.tagify__input::after{content:attr(data-suggest);display:inline-block;white-space:pre;color:#000;opacity:.3;pointer-events:none;max-width:100px}.tagify__input .tagify__tag{margin:0}.tagify__input .tagify__tag>div{padding-top:0;padding-bottom:0}.tagify--mix{line-height:1.7}.tagify--mix .tagify__input{padding:5px;margin:0;width:100%;height:100%;line-height:inherit}.tagify--mix .tagify__input::after{content:none}.tagify--select::after{content:'>';opacity:.5;position:absolute;top:50%;right:0;bottom:0;font:16px monospace;line-height:8px;height:8px;pointer-events:none;transform:translate(-150%,-50%) scaleX(1.2) rotate(90deg);transition:.2s ease-in-out}.tagify--select[aria-expanded=true]::after{transform:translate(-150%,-50%) rotate(270deg) scaleY(1.2)}.tagify--select .tagify__tag{position:absolute;top:0;right:1.8em;bottom:0}.tagify--select .tagify__tag div{display:none}.tagify--select .tagify__input{width:100%}.tagify--invalid{--tags-border-color:#D39494}.tagify__dropdown{position:absolute;z-index:9999;transform:translateY(1px);overflow:hidden}.tagify__dropdown[placement=top]{margin-top:0;transform:translateY(-2px)}.tagify__dropdown[placement=top] .tagify__dropdown__wrapper{border-top-width:1px;border-bottom-width:0}.tagify__dropdown--text{box-shadow:0 0 0 3px rgba(var(--tagify-dd-color-primary),.1);font-size:.9em}.tagify__dropdown--text .tagify__dropdown__wrapper{border-width:1px}.tagify__dropdown__wrapper{max-height:300px;overflow:hidden;background:#fff;background:var(--tagify-dd-bg-color);border:1px solid #3595f6;border-color:var(--tagify-dd-color-primary);border-top-width:0;box-shadow:0 2px 4px -2px rgba(0,0,0,.2);transition:.25s cubic-bezier(0,1,.5,1)}.tagify__dropdown__wrapper:hover{overflow:auto}.tagify__dropdown--initial .tagify__dropdown__wrapper{max-height:20px;transform:translateY(-1em)}.tagify__dropdown--initial[placement=top] .tagify__dropdown__wrapper{transform:translateY(2em)}.tagify__dropdown__item{box-sizing:inherit;padding:.3em .5em;margin:1px;cursor:pointer;border-radius:2px;position:relative;outline:0}.tagify__dropdown__item--active{background:#3595f6;background:var(--tagify-dd-color-primary);color:#fff}.tagify__dropdown__item:active{filter:brightness(105%)}.tagify__dropdown__createTagBtn{width:100%;background:#3595f6;background:var(--tagify-dd-color-primary);color:#fff;color:var(--tagify-dd-bg-color);border:none} \ No newline at end of file +:root{--tagify-dd-color-primary:rgb(53,149,246);--tagify-dd-bg-color:white}.tagify{--tags-border-color:#DDD;--tag-bg:#E5E5E5;--tag-hover:#D3E2E2;--tag-text-color:black;--tag-text-color--edit:black;--tag-pad:0.3em 0.5em;--tag-inset-shadow-size:1.1em;--tag-invalid-color:#D39494;--tag-invalid-bg:rgba(211, 148, 148, 0.5);--tag-remove-bg:rgba(211, 148, 148, 0.3);--tag-remove-btn-bg:none;--tag-remove-btn-bg--hover:#c77777;--tag--min-width:1ch;--tag--max-width:auto;--tag-hide-transition:.3s;--placeholder-color:black;--loader-size:.8em;display:flex;align-items:flex-start;flex-wrap:wrap;border:1px solid #ddd;border:1px solid var(--tags-border-color);padding:0;line-height:1.1;cursor:text;outline:0;position:relative;transition:.1s}@keyframes tags--bump{30%{transform:scale(1.2)}}@keyframes rotateLoader{to{transform:rotate(1turn)}}.tagify:hover{border-color:#ccc}.tagify.tagify--focus{transition:0s;border-color:#3595f6}.tagify[readonly]{cursor:default}.tagify[readonly]>.tagify__input{visibility:hidden;width:0;margin:5px 0}.tagify[readonly] .tagify__tag__removeBtn{display:none}.tagify[readonly] .tagify__tag>div{padding:.3em .5em;padding:var(--tag-pad)}.tagify[readonly] .tagify__tag>div::before{background:linear-gradient(45deg,var(--tag-bg) 25%,transparent 25%,transparent 50%,var(--tag-bg) 50%,var(--tag-bg) 75%,transparent 75%,transparent) 0/5px 5px;box-shadow:none;filter:brightness(.95)}.tagify--loading .tagify__input::before{content:none}.tagify--loading .tagify__input::after{content:'';vertical-align:middle;margin:-2px 0 -2px .5em;opacity:1;width:.7em;height:.7em;width:var(--loader-size);height:var(--loader-size);border:3px solid;border-color:#eee #bbb #888 transparent;border-radius:50%;animation:rotateLoader .4s infinite linear}.tagify--loading .tagify__input:empty::after{margin-left:0}.tagify+input,.tagify+textarea{display:none!important}.tagify__tag{display:inline-flex;align-items:center;margin:5px 0 5px 5px;position:relative;z-index:1;outline:0;cursor:default;transition:.13s ease-out}.tagify__tag>div{vertical-align:top;box-sizing:border-box;max-width:100%;padding:.3em .5em;padding:var(--tag-pad);color:#000;color:var(--tag-text-color);line-height:inherit;border-radius:3px;-webkit-user-select:none;user-select:none;transition:.13s ease-out}.tagify__tag>div>*{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;vertical-align:top;min-width:var(--tag--min-width);max-width:var(--tag--max-width);transition:.8s ease,.1s color}.tagify__tag>div>[contenteditable]{outline:0;-webkit-user-select:text;user-select:text;cursor:text;margin:-2px;padding:2px;max-width:350px}.tagify__tag>div::before{content:'';position:absolute;border-radius:inherit;left:0;top:0;right:0;bottom:0;z-index:-1;pointer-events:none;transition:120ms ease;animation:tags--bump .3s ease-out 1;box-shadow:0 0 0 1.1em #e5e5e5 inset;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-bg) inset}.tagify__tag:hover:not([readonly]) div::before{top:-2px;right:-2px;bottom:-2px;left:-2px;box-shadow:0 0 0 1.1em #d3e2e2 inset;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-hover) inset}.tagify__tag.tagify--noAnim>div::before{animation:none}.tagify__tag.tagify--hide{width:0!important;padding-left:0;padding-right:0;margin-left:0;margin-right:0;opacity:0;transform:scale(0);transition:.3s;transition:var(--tag-hide-transition);pointer-events:none}.tagify__tag.tagify--mark div::before{animation:none}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div>span{opacity:.5}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div::before{box-shadow:0 0 0 1.1em rgba(211,148,148,.5) inset!important;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-invalid-bg) inset!important;transition:.2s}.tagify__tag[readonly] .tagify__tag__removeBtn{display:none}.tagify__tag[readonly]>div::before{background:linear-gradient(45deg,var(--tag-bg) 25%,transparent 25%,transparent 50%,var(--tag-bg) 50%,var(--tag-bg) 75%,transparent 75%,transparent) 0/5px 5px;box-shadow:none;filter:brightness(.95)}.tagify__tag--editable>div{color:#000;color:var(--tag-text-color--edit)}.tagify__tag--editable>div::before{box-shadow:0 0 0 2px #d3e2e2 inset!important;box-shadow:0 0 0 2px var(--tag-hover) inset!important}.tagify__tag--editable.tagify--invalid>div::before{box-shadow:0 0 0 2px #d39494 inset!important;box-shadow:0 0 0 2px var(--tag-invalid-color) inset!important}.tagify__tag__removeBtn{order:5;display:inline-flex;align-items:center;justify-content:center;border-radius:50px;cursor:pointer;font:14px Serif;background:0 0;background:var(--tag-remove-btn-bg);color:#000;color:var(--tag-text-color);width:14px;height:14px;margin-right:4.66667px;margin-left:-4.66667px;transition:.2s ease-out}.tagify__tag__removeBtn::after{content:"\00D7"}.tagify__tag__removeBtn:hover{color:#fff;background:#c77777;background:var(--tag-remove-btn-bg--hover)}.tagify__tag__removeBtn:hover+div>span{opacity:.5}.tagify__tag__removeBtn:hover+div::before{box-shadow:0 0 0 1.1em rgba(211,148,148,.3) inset!important;box-shadow:0 0 0 var(--tag-inset-shadow-size) var(--tag-remove-bg) inset!important;transition:.2s}.tagify:not(.tagify--mix) .tagify__input br{display:none}.tagify:not(.tagify--mix) .tagify__input *{display:inline;white-space:nowrap}.tagify__input{display:block;min-width:110px;margin:5px;padding:.3em .5em;padding:var(--tag-pad,.3em .5em);line-height:inherit;position:relative;white-space:pre-line}.tagify__input::before{display:inline-block;width:0}@supports (-moz-appearance:none){.tagify__input:empty{display:flex}}.tagify__input:empty::before{transition:.2s ease-out;opacity:.5;transform:none;width:auto}.tagify__input:focus{outline:0}.tagify__input:focus::before{transition:.2s ease-out;opacity:0;transform:translatex(6px)}@supports (-moz-appearance:none){.tagify__input:focus::before{display:none}}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.tagify__input:focus::before{display:none}}@supports (-ms-ime-align:auto){.tagify__input:focus::before{display:none}}.tagify__input:focus:empty::before{transition:.2s ease-out;opacity:.3;transform:none}@supports (-moz-appearance:none){.tagify__input:focus:empty::before{display:inline-block}}.tagify__input::before{content:attr(data-placeholder);line-height:1.8;position:absolute;top:0;z-index:1;color:#000;color:var(--placeholder-color);white-space:nowrap;pointer-events:none;opacity:0}.tagify--mix .tagify__input::before{position:static;line-height:inherit}@supports (-moz-appearance:none){.tagify__input::before{line-height:inherit;position:relative}}.tagify__input::after{content:attr(data-suggest);display:inline-block;white-space:pre;color:#000;opacity:.3;pointer-events:none;max-width:100px}.tagify__input .tagify__tag{margin:0}.tagify__input .tagify__tag>div{padding-top:0;padding-bottom:0}.tagify--mix{line-height:1.7}.tagify--mix .tagify__input{padding:5px;margin:0;width:100%;height:100%;line-height:inherit}.tagify--mix .tagify__input::after{content:none}.tagify--select::after{content:'>';opacity:.5;position:absolute;top:50%;right:0;bottom:0;font:16px monospace;line-height:8px;height:8px;pointer-events:none;transform:translate(-150%,-50%) scaleX(1.2) rotate(90deg);transition:.2s ease-in-out}.tagify--select[aria-expanded=true]::after{transform:translate(-150%,-50%) rotate(270deg) scaleY(1.2)}.tagify--select .tagify__tag{position:absolute;top:0;right:1.8em;bottom:0}.tagify--select .tagify__tag div{display:none}.tagify--select .tagify__input{width:100%}.tagify--invalid{--tags-border-color:#D39494}.tagify__dropdown{position:absolute;z-index:9999;transform:translateY(1px);overflow:hidden}.tagify__dropdown[placement=top]{margin-top:0;transform:translateY(-2px)}.tagify__dropdown[placement=top] .tagify__dropdown__wrapper{border-top-width:1px;border-bottom-width:0}.tagify__dropdown--text{box-shadow:0 0 0 3px rgba(var(--tagify-dd-color-primary),.1);font-size:.9em}.tagify__dropdown--text .tagify__dropdown__wrapper{border-width:1px}.tagify__dropdown__wrapper{max-height:300px;overflow:hidden;background:#fff;background:var(--tagify-dd-bg-color);border:1px solid #3595f6;border-color:var(--tagify-dd-color-primary);border-top-width:0;box-shadow:0 2px 4px -2px rgba(0,0,0,.2);transition:.25s cubic-bezier(0,1,.5,1)}.tagify__dropdown__wrapper:hover{overflow:auto}.tagify__dropdown--initial .tagify__dropdown__wrapper{max-height:20px;transform:translateY(-1em)}.tagify__dropdown--initial[placement=top] .tagify__dropdown__wrapper{transform:translateY(2em)}.tagify__dropdown__item{box-sizing:inherit;padding:.3em .5em;margin:1px;cursor:pointer;border-radius:2px;position:relative;outline:0}.tagify__dropdown__item--active{background:#3595f6;background:var(--tagify-dd-color-primary);color:#fff}.tagify__dropdown__item:active{filter:brightness(105%)}.tagify__dropdown__createTagBtn{width:100%;background:#3595f6;background:var(--tagify-dd-color-primary);color:#fff;color:var(--tagify-dd-bg-color);border:none} \ No newline at end of file diff --git a/geonode/static/lib/js/angular-leaflet-directive.js b/geonode/static/lib/js/angular-leaflet-directive.js deleted file mode 100644 index 04f86203d58..00000000000 --- a/geonode/static/lib/js/angular-leaflet-directive.js +++ /dev/null @@ -1,5734 +0,0 @@ -/**! - * The MIT License - * - * Copyright (c) 2013 the angular-leaflet-directive Team, http://tombatossals.github.io/angular-leaflet-directive - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * angular-leaflet-directive - * https://github.com/tombatossals/angular-leaflet-directive - * - * @authors https://github.com/tombatossals/angular-leaflet-directive/graphs/contributors - */ - -/*! -* angular-leaflet-directive 2015-11-06 -* angular-leaflet-directive - An AngularJS directive to easily interact with Leaflet maps -* git: https://github.com/tombatossals/angular-leaflet-directive -*/ -(function(angular){ -'use strict'; -angular.module('leaflet-directive', []).directive('leaflet', ["$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletMapEvents", function($q, leafletData, leafletMapDefaults, leafletHelpers, leafletMapEvents) { - return { - restrict: 'EA', - replace: true, - scope: { - center: '=', - lfCenter: '=', - defaults: '=', - maxbounds: '=', - bounds: '=', - markers: '=', - legend: '=', - geojson: '=', - paths: '=', - tiles: '=', - layers: '=', - controls: '=', - decorations: '=', - eventBroadcast: '=', - markersWatchOptions: '=', - geojsonWatchOptions: '=', - }, - transclude: true, - template: '
', - controller: ["$scope", function($scope) { - this._leafletMap = $q.defer(); - this.getMap = function() { - return this._leafletMap.promise; - }; - - this.getLeafletScope = function() { - return $scope; - }; - }], - - link: function(scope, element, attrs, ctrl) { - var isDefined = leafletHelpers.isDefined; - var defaults = leafletMapDefaults.setDefaults(scope.defaults, attrs.id); - var mapEvents = leafletMapEvents.getAvailableMapEvents(); - var addEvents = leafletMapEvents.addEvents; - - scope.mapId = attrs.id; - leafletData.setDirectiveControls({}, attrs.id); - - // Set width and height utility functions - function updateWidth() { - if (isNaN(attrs.width)) { - element.css('width', attrs.width); - } else { - element.css('width', attrs.width + 'px'); - } - } - - function updateHeight() { - if (isNaN(attrs.height)) { - element.css('height', attrs.height); - } else { - element.css('height', attrs.height + 'px'); - } - } - - // If the width attribute defined update css - // Then watch if bound property changes and update css - if (isDefined(attrs.width)) { - updateWidth(); - - scope.$watch( - function() { - return element[0].getAttribute('width'); - }, - - function() { - updateWidth(); - map.invalidateSize(); - }); - } - - // If the height attribute defined update css - // Then watch if bound property changes and update css - if (isDefined(attrs.height)) { - updateHeight(); - - scope.$watch( - function() { - return element[0].getAttribute('height'); - }, - - function() { - updateHeight(); - map.invalidateSize(); - }); - } - - // Create the Leaflet Map Object with the options - var map = new L.Map(element[0], leafletMapDefaults.getMapCreationDefaults(attrs.id)); - ctrl._leafletMap.resolve(map); - - if (!isDefined(attrs.center) && !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))) { - var tileLayerObj = L.tileLayer(defaults.tileLayer, defaults.tileLayerOptions); - tileLayerObj.addTo(map); - leafletData.setTiles(tileLayerObj, attrs.id); - } - - // Set zoom control configuration - if (isDefined(map.zoomControl) && - isDefined(defaults.zoomControlPosition)) { - map.zoomControl.setPosition(defaults.zoomControlPosition); - } - - if (isDefined(map.zoomControl) && defaults.zoomControl === false) { - map.zoomControl.removeFrom(map); - } - - if (isDefined(map.zoomsliderControl) && - isDefined(defaults.zoomsliderControl) && - defaults.zoomsliderControl === false) { - map.zoomsliderControl.removeFrom(map); - } - - // if no event-broadcast attribute, all events are broadcasted - if (!isDefined(attrs.eventBroadcast)) { - var logic = 'broadcast'; - addEvents(map, mapEvents, 'eventName', scope, logic); - } - - // Resolve the map object to the promises - map.whenReady(function() { - leafletData.setMap(map, attrs.id); - }); - - scope.$on('$destroy', function() { - leafletMapDefaults.reset(); - map.remove(); - leafletData.unresolveMap(attrs.id); - }); - - //Handle request to invalidate the map size - //Up scope using $scope.$emit('invalidateSize') - //Down scope using $scope.$broadcast('invalidateSize') - scope.$on('invalidateSize', function() { - map.invalidateSize(); - }); - }, - }; -}]); - -angular.module('leaflet-directive').factory('leafletBoundsHelpers', ["$log", "leafletHelpers", function($log, leafletHelpers) { - - var isArray = leafletHelpers.isArray; - var isNumber = leafletHelpers.isNumber; - var isFunction = leafletHelpers.isFunction; - var isDefined = leafletHelpers.isDefined; - - function _isValidBounds(bounds) { - return angular.isDefined(bounds) && angular.isDefined(bounds.southWest) && - angular.isDefined(bounds.northEast) && angular.isNumber(bounds.southWest.lat) && - angular.isNumber(bounds.southWest.lng) && angular.isNumber(bounds.northEast.lat) && - angular.isNumber(bounds.northEast.lng); - } - - return { - createLeafletBounds: function(bounds) { - if (_isValidBounds(bounds)) { - return L.latLngBounds([bounds.southWest.lat, bounds.southWest.lng], - [bounds.northEast.lat, bounds.northEast.lng]); - } - }, - - isValidBounds: _isValidBounds, - - createBoundsFromArray: function(boundsArray) { - if (!(isArray(boundsArray) && boundsArray.length === 2 && - isArray(boundsArray[0]) && isArray(boundsArray[1]) && - 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.'); - return; - } - - return { - northEast: { - lat: boundsArray[0][0], - lng: boundsArray[0][1], - }, - southWest: { - lat: boundsArray[1][0], - lng: boundsArray[1][1], - }, - }; - }, - - createBoundsFromLeaflet: function(lfBounds) { - if (!(isDefined(lfBounds) && isFunction(lfBounds.getNorthEast) && isFunction(lfBounds.getSouthWest))) { - $log.error('[AngularJS - Leaflet] The leaflet bounds is not valid object.'); - return; - } - - var northEast = lfBounds.getNorthEast(); - var southWest = lfBounds.getSouthWest(); - - return { - northEast: { - lat: northEast.lat, - lng: northEast.lng, - }, - southWest: { - lat: southWest.lat, - lng: southWest.lng, - }, - }; - }, - }; -}]); - -angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScope", "$log", "leafletHelpers", "leafletLayerHelpers", "leafletMapDefaults", function($rootScope, $log, 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); - if (!defaults.controls.layers.visible) { - return false; - } - - var atLeastOneControlItemMustBeShown = false; - - if (isObject(baselayers)) { - Object.keys(baselayers).forEach(function(key) { - var layer = baselayers[key]; - if (!isDefined(layer.layerOptions) || layer.layerOptions.showOnSelector !== false) { - atLeastOneControlItemMustBeShown = true; - } - }); - } - - if (isObject(overlays)) { - Object.keys(overlays).forEach(function(key) { - var layer = overlays[key]; - if (!isDefined(layer.layerParams) || layer.layerParams.showOnSelector !== false) { - atLeastOneControlItemMustBeShown = true; - } - }); - } - - return atLeastOneControlItemMustBeShown; - }; - - var _createLayersControl = function(mapId) { - var defaults = leafletMapDefaults.getDefaults(mapId); - var controlOptions = { - collapsed: defaults.controls.layers.collapsed, - position: defaults.controls.layers.position, - autoZIndex: false, - }; - - angular.extend(controlOptions, defaults.controls.layers.options); - - var control; - if (defaults.controls.layers && isDefined(defaults.controls.layers.control)) { - control = defaults.controls.layers.control.apply(this, [[], [], controlOptions]); - } else { - control = new L.control.layers([], [], controlOptions); - } - - return control; - }; - - var controlTypes = { - draw: { - isPluginLoaded: function() { - if (!angular.isDefined(L.Control.Draw)) { - $log.error(errorHeader + ' Draw plugin is not loaded.'); - return false; - } - - return true; - }, - - checkValidParams: function(/* params */) { - return true; - }, - - createControl: function(params) { - return new L.Control.Draw(params); - }, - }, - scale: { - isPluginLoaded: function() { - return true; - }, - - checkValidParams: function(/* params */) { - return true; - }, - - createControl: function(params) { - return new L.control.scale(params); - }, - }, - fullscreen: { - isPluginLoaded: function() { - if (!angular.isDefined(L.Control.Fullscreen)) { - $log.error(errorHeader + ' Fullscreen plugin is not loaded.'); - return false; - } - - return true; - }, - - checkValidParams: function(/* params */) { - return true; - }, - - createControl: function(params) { - return new L.Control.Fullscreen(params); - }, - }, - search: { - isPluginLoaded: function() { - if (!angular.isDefined(L.Control.Search)) { - $log.error(errorHeader + ' Search plugin is not loaded.'); - return false; - } - - return true; - }, - - checkValidParams: function(/* params */) { - return true; - }, - - createControl: function(params) { - return new L.Control.Search(params); - }, - }, - custom: {}, - minimap: { - isPluginLoaded: function() { - if (!angular.isDefined(L.Control.MiniMap)) { - $log.error(errorHeader + ' Minimap plugin is not loaded.'); - return false; - } - - return true; - }, - - checkValidParams: function(params) { - if (!isDefined(params.layer)) { - $log.warn(errorHeader + ' minimap "layer" option should be defined.'); - return false; - } - - return true; - }, - - createControl: function(params) { - var layer = createLayer(params.layer); - - if (!isDefined(layer)) { - $log.warn(errorHeader + ' minimap control "layer" could not be created.'); - return; - } - - return new L.Control.MiniMap(layer, params); - }, - }, - }; - - return { - layersControlMustBeVisible: _controlLayersMustBeVisible, - - isValidControlType: function(type) { - return Object.keys(controlTypes).indexOf(type) !== -1; - }, - - createControl: function(type, params) { - if (!controlTypes[type].checkValidParams(params)) { - return; - } - - return controlTypes[type].createControl(params); - }, - - updateLayersControl: function(map, mapId, loaded, baselayers, overlays, leafletLayers) { - var i; - var _layersControl = _controls[mapId]; - var mustBeLoaded = _controlLayersMustBeVisible(baselayers, overlays, mapId); - - if (isDefined(_layersControl) && loaded) { - for (i in leafletLayers.baselayers) { - _layersControl.removeLayer(leafletLayers.baselayers[i]); - } - - for (i in leafletLayers.overlays) { - _layersControl.removeLayer(leafletLayers.overlays[i]); - } - - map.removeControl(_layersControl); - delete _controls[mapId]; - } - - if (mustBeLoaded) { - _layersControl = _createLayersControl(mapId); - _controls[mapId] = _layersControl; - for (i in baselayers) { - var hideOnSelector = isDefined(baselayers[i].layerOptions) && - baselayers[i].layerOptions.showOnSelector === false; - if (!hideOnSelector && isDefined(leafletLayers.baselayers[i])) { - _layersControl.addBaseLayer(leafletLayers.baselayers[i], baselayers[i].name); - } - } - - for (i in overlays) { - var hideOverlayOnSelector = isDefined(overlays[i].layerParams) && - overlays[i].layerParams.showOnSelector === false; - if (!hideOverlayOnSelector && isDefined(leafletLayers.overlays[i])) { - _layersControl.addOverlay(leafletLayers.overlays[i], overlays[i].name); - } - } - - map.addControl(_layersControl); - } - - return mustBeLoaded; - }, - }; -}]); - -angular.module('leaflet-directive').service('leafletData', ["$log", "$q", "leafletHelpers", function($log, $q, leafletHelpers) { - var getDefer = leafletHelpers.getDefer, - getUnresolvedDefer = leafletHelpers.getUnresolvedDefer, - setResolvedDefer = leafletHelpers.setResolvedDefer; - - var _private = {}; - var self = this; - - var upperFirst = function(string) { - return string.charAt(0).toUpperCase() + string.slice(1); - }; - - var _privateItems = [ - 'map', - 'tiles', - 'layers', - 'paths', - 'markers', - 'geoJSON', - 'UTFGrid', //odd ball on naming convention keeping to not break - 'decorations', - 'directiveControls', ]; - - //init - _privateItems.forEach(function(itemName) { - _private[itemName] = {}; - }); - - this.unresolveMap = function(scopeId) { - var id = leafletHelpers.obtainEffectiveMapId(_private.map, scopeId); - _privateItems.forEach(function(itemName) { - _private[itemName][id] = undefined; - }); - }; - - //int repetitive stuff (get and sets) - _privateItems.forEach(function(itemName) { - var name = upperFirst(itemName); - self['set' + name] = function(lObject, scopeId) { - var defer = getUnresolvedDefer(_private[itemName], scopeId); - defer.resolve(lObject); - setResolvedDefer(_private[itemName], scopeId); - }; - - self['get' + name] = function(scopeId) { - var defer = getDefer(_private[itemName], scopeId); - return defer.promise; - }; - }); -}]); - -angular.module('leaflet-directive') -.service('leafletDirectiveControlsHelpers', ["$log", "leafletData", "leafletHelpers", function($log, 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'); - return; - } - - if (_isString(thingToAddName) && _isDefined(createFn) && _isDefined(cleanFn)) { - extender[thingToAddName] = { - create: createFn, - clean: cleanFn, - }; - } else if (_isObject(thingToAddName) && !_isDefined(createFn) && !_isDefined(cleanFn)) { - extender = thingToAddName; - } else { - $log.error(_fnHeader + 'incorrect arguments'); - return; - } - - //add external control to create / destroy markers without a watch - leafletData.getDirectiveControls().then(function(controls) { - angular.extend(controls, extender); - leafletData.setDirectiveControls(controls, id); - }); - }; - - return { - extend: _extend, - }; -}]); - -angular.module('leaflet-directive') -.service('leafletGeoJsonHelpers', ["leafletHelpers", "leafletIterators", function(leafletHelpers, leafletIterators) { - var lHlp = leafletHelpers; - var lIt = leafletIterators; - var Point = function(lat, lng) { - this.lat = lat; - this.lng = lng; - return this; - }; - - var _getLat = function(value) { - if (Array.isArray(value) && value.length === 2) { - return value[1]; - } else if (lHlp.isDefined(value.type) && value.type === 'Point') { - return +value.coordinates[1]; - } else { - return +value.lat; - } - }; - - var _getLng = function(value) { - if (Array.isArray(value) && value.length === 2) { - return value[0]; - } else if (lHlp.isDefined(value.type) && value.type === 'Point') { - return +value.coordinates[0]; - } else { - return +value.lng; - } - }; - - var _validateCoords = function(coords) { - if (lHlp.isUndefined(coords)) { - return false; - } - - if (lHlp.isArray(coords)) { - if (coords.length === 2 && lHlp.isNumber(coords[0]) && lHlp.isNumber(coords[1])) { - return true; - } - } else if (lHlp.isDefined(coords.type)) { - if ( - coords.type === 'Point' && lHlp.isArray(coords.coordinates) && - coords.coordinates.length === 2 && - lHlp.isNumber(coords.coordinates[0]) && - lHlp.isNumber(coords.coordinates[1])) { - return true; - } - } - - var ret = lIt.all(['lat', 'lng'], function(pos) { - return lHlp.isDefined(coords[pos]) && lHlp.isNumber(coords[pos]); - }); - - return ret; - }; - - var _getCoords = function(value) { - if (!value || !_validateCoords(value)) { - return; - } - - var p = null; - if (Array.isArray(value) && value.length === 2) { - p = new Point(value[1], value[0]); - } else if (lHlp.isDefined(value.type) && value.type === 'Point') { - p = new Point(value.coordinates[1], value.coordinates[0]); - } else { - return value; - } - - //note angular.merge is avail in angular 1.4.X we might want to fill it here - return angular.extend(value, p);//tap on lat, lng if it doesnt exist - }; - - return { - getLat: _getLat, - getLng: _getLng, - validateCoords: _validateCoords, - getCoords: _getCoords, - }; -}]); - -angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", function($q, $log) { - var _errorHeader = '[AngularJS - Leaflet] '; - var _copy = angular.copy; - var _clone = _copy; - /* - For parsing paths to a field in an object - - Example: - var obj = { - bike:{ - 1: 'hi' - 2: 'foo' - } - }; - _getObjectValue(obj,"bike.1") returns 'hi' - this is getPath in ui-gmap - */ - var _getObjectValue = function(object, pathStr) { - var obj; - 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)) { - return pathStr; - } - - obj = object; - pathStr.split('.').forEach(function(value) { - if (obj) { - obj = obj[value]; - } - }); - - return obj; - }; - - /* - Object Array Notation - _getObjectArrayPath("bike.one.two") - returns: - 'bike["one"]["two"]' - */ - var _getObjectArrayPath = function(pathStr) { - return pathStr.split('.').reduce(function(previous, current) { - return previous + '["' + current + '"]'; - }); - }; - - /* Object Dot Notation - _getObjectPath(["bike","one","two"]) - returns: - "bike.one.two" - */ - var _getObjectDotPath = function(arrayOfStrings) { - return arrayOfStrings.reduce(function(previous, current) { - return previous + '.' + current; - }); - }; - - function _obtainEffectiveMapId(d, mapId) { - var id; - var i; - if (!angular.isDefined(mapId)) { - if (Object.keys(d).length === 0) { - id = 'main'; - } else if (Object.keys(d).length >= 1) { - for (i in d) { - if (d.hasOwnProperty(i)) { - id = i; - } - } - } else { - $log.error(_errorHeader + '- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call'); - } - } else { - id = mapId; - } - - return id; - } - - function _getUnresolvedDefer(d, mapId) { - var id = _obtainEffectiveMapId(d, mapId); - var defer; - - if (!angular.isDefined(d[id]) || d[id].resolvedDefer === true) { - defer = $q.defer(); - d[id] = { - defer: defer, - resolvedDefer: false, - }; - } else { - defer = d[id].defer; - } - - return defer; - } - - var _isDefined = function(value) { - return angular.isDefined(value) && value !== null; - }; - - var _isUndefined = function(value) { - return !_isDefined(value); - }; - - // BEGIN DIRECT PORT FROM AngularJS code base - - var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; - - var MOZ_HACK_REGEXP = /^moz([A-Z])/; - - var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i; - - /** - Converts snake_case to camelCase. - Also there is special case for Moz prefix starting with upper case letter. - @param name Name to normalize - */ - - var camelCase = function(name) { - return name.replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { - if (offset) { - return letter.toUpperCase(); - } else { - return letter; - } - }).replace(MOZ_HACK_REGEXP, 'Moz$1'); - }; - - /** - Converts all accepted directives format into proper directive name. - @param name Name to normalize - */ - - var directiveNormalize = function(name) { - return camelCase(name.replace(PREFIX_REGEXP, '')); - }; - - // END AngularJS port - - return { - camelCase: camelCase, - directiveNormalize: directiveNormalize, - copy:_copy, - clone:_clone, - errorHeader: _errorHeader, - getObjectValue: _getObjectValue, - getObjectArrayPath:_getObjectArrayPath, - getObjectDotPath: _getObjectDotPath, - defaultTo: function(val, _default) { - return _isDefined(val) ? val : _default; - }, - - //mainly for checking attributes of directives lets keep this minimal (on what we accept) - isTruthy: function(val) { - return val === 'true' || val === true; - }, - - //Determine if a reference is {} - isEmpty: function(value) { - return Object.keys(value).length === 0; - }, - - //Determine if a reference is undefined or {} - isUndefinedOrEmpty: function(value) { - return (angular.isUndefined(value) || value === null) || Object.keys(value).length === 0; - }, - - // Determine if a reference is defined - isDefined: _isDefined, - isUndefined:_isUndefined, - isNumber: angular.isNumber, - isString: angular.isString, - isArray: angular.isArray, - isObject: angular.isObject, - isFunction: angular.isFunction, - equals: angular.equals, - - isValidCenter: function(center) { - return angular.isDefined(center) && angular.isNumber(center.lat) && - angular.isNumber(center.lng) && angular.isNumber(center.zoom); - }, - - isValidPoint: function(point) { - if (!angular.isDefined(point)) { - return false; - } - - if (angular.isArray(point)) { - return point.length === 2 && angular.isNumber(point[0]) && angular.isNumber(point[1]); - } - - return angular.isNumber(point.lat) && angular.isNumber(point.lng); - }, - - isSameCenterOnMap: function(centerModel, map) { - var mapCenter = map.getCenter(); - var zoom = map.getZoom(); - if (centerModel.lat && centerModel.lng && - mapCenter.lat.toFixed(4) === centerModel.lat.toFixed(4) && - mapCenter.lng.toFixed(4) === centerModel.lng.toFixed(4) && - zoom === centerModel.zoom) { - return true; - } - - return false; - }, - - safeApply: function($scope, fn) { - var phase = $scope.$root.$$phase; - if (phase === '$apply' || phase === '$digest') { - $scope.$eval(fn); - } else { - $scope.$evalAsync(fn); - } - }, - - obtainEffectiveMapId: _obtainEffectiveMapId, - - getDefer: function(d, mapId) { - var id = _obtainEffectiveMapId(d, mapId); - var defer; - if (!angular.isDefined(d[id]) || d[id].resolvedDefer === false) { - defer = _getUnresolvedDefer(d, mapId); - } else { - defer = d[id].defer; - } - - return defer; - }, - - getUnresolvedDefer: _getUnresolvedDefer, - - setResolvedDefer: function(d, mapId) { - var id = _obtainEffectiveMapId(d, mapId); - d[id].resolvedDefer = true; - }, - - rangeIsSupported: function() { - var testrange = document.createElement('input'); - testrange.setAttribute('type', 'range'); - return testrange.type === 'range'; - }, - - 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(icon) { - if (this.isLoaded()) { - return icon instanceof L.AwesomeMarkers.Icon; - } else { - return false; - } - }, - - equal: function(iconA, iconB) { - if (!this.isLoaded()) { - return false; - } - - if (this.is(iconA)) { - return angular.equals(iconA, iconB); - } else { - return false; - } - }, - }, - - VectorMarkersPlugin: { - isLoaded: function() { - return angular.isDefined(L.VectorMarkers) && angular.isDefined(L.VectorMarkers.Icon); - }, - - is: function(icon) { - if (this.isLoaded()) { - return icon instanceof L.VectorMarkers.Icon; - } else { - return false; - } - }, - - equal: function(iconA, iconB) { - if (!this.isLoaded()) { - return false; - } - - if (this.is(iconA)) { - return angular.equals(iconA, iconB); - } else { - return false; - } - }, - }, - - DomMarkersPlugin: { - isLoaded: function() { - if (angular.isDefined(L.DomMarkers) && angular.isDefined(L.DomMarkers.Icon)) { - return true; - } else { - return false; - } - }, - - is: function(icon) { - if (this.isLoaded()) { - return icon instanceof L.DomMarkers.Icon; - } else { - return false; - } - }, - - equal: function(iconA, iconB) { - if (!this.isLoaded()) { - return false; - } - - if (this.is(iconA)) { - return angular.equals(iconA, iconB); - } else { - return false; - } - }, - }, - - PolylineDecoratorPlugin: { - isLoaded: function() { - if (angular.isDefined(L.PolylineDecorator)) { - return true; - } else { - return false; - } - }, - - is: function(decoration) { - if (this.isLoaded()) { - return decoration instanceof L.PolylineDecorator; - } else { - return false; - } - }, - - equal: function(decorationA, decorationB) { - if (!this.isLoaded()) { - return false; - } - - if (this.is(decorationA)) { - return angular.equals(decorationA, decorationB); - } else { - return false; - } - }, - }, - - MakiMarkersPlugin: { - isLoaded: function() { - if (angular.isDefined(L.MakiMarkers) && angular.isDefined(L.MakiMarkers.Icon)) { - return true; - } else { - return false; - } - }, - - is: function(icon) { - if (this.isLoaded()) { - return icon instanceof L.MakiMarkers.Icon; - } else { - return false; - } - }, - - equal: function(iconA, iconB) { - if (!this.isLoaded()) { - return false; - } - - if (this.is(iconA)) { - return angular.equals(iconA, iconB); - } else { - return false; - } - }, - }, - ExtraMarkersPlugin: { - isLoaded: function() { - if (angular.isDefined(L.ExtraMarkers) && angular.isDefined(L.ExtraMarkers.Icon)) { - return true; - } else { - return false; - } - }, - - is: function(icon) { - if (this.isLoaded()) { - return icon instanceof L.ExtraMarkers.Icon; - } else { - return false; - } - }, - - equal: function(iconA, iconB) { - if (!this.isLoaded()) { - return false; - } - - if (this.is(iconA)) { - return angular.equals(iconA, iconB); - } else { - return false; - } - }, - }, - LabelPlugin: { - isLoaded: function() { - return angular.isDefined(L.Label); - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.MarkerClusterGroup; - } else { - return false; - } - }, - }, - MarkerClusterPlugin: { - isLoaded: function() { - return angular.isDefined(L.MarkerClusterGroup); - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.MarkerClusterGroup; - } else { - return false; - } - }, - }, - GoogleLayerPlugin: { - isLoaded: function() { - return angular.isDefined(L.Google); - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.Google; - } else { - return false; - } - }, - }, - LeafletProviderPlugin: { - isLoaded: function() { - return angular.isDefined(L.TileLayer.Provider); - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.TileLayer.Provider; - } else { - return false; - } - }, - }, - 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(layer) { - if (this.isLoaded()) { - return layer instanceof L.BingLayer; - } else { - return false; - } - }, - }, - WFSLayerPlugin: { - isLoaded: function() { - return L.GeoJSON.WFS !== undefined; - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.GeoJSON.WFS; - } else { - return false; - } - }, - }, - AGSBaseLayerPlugin: { - isLoaded: function() { - return L.esri !== undefined && L.esri.basemapLayer !== undefined; - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.esri.basemapLayer; - } else { - return false; - } - }, - }, - AGSLayerPlugin: { - isLoaded: function() { - return lvector !== undefined && lvector.AGS !== undefined; - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof lvector.AGS; - } else { - return false; - } - }, - }, - AGSFeatureLayerPlugin: { - isLoaded: function() { - return L.esri !== undefined && L.esri.featureLayer !== undefined; - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.esri.featureLayer; - } else { - return false; - } - }, - }, - AGSTiledMapLayerPlugin: { - isLoaded: function() { - return L.esri !== undefined && L.esri.tiledMapLayer !== undefined; - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.esri.tiledMapLayer; - } else { - return false; - } - }, - }, - AGSDynamicMapLayerPlugin: { - isLoaded: function() { - return L.esri !== undefined && L.esri.dynamicMapLayer !== undefined; - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.esri.dynamicMapLayer; - } else { - return false; - } - }, - }, - AGSImageMapLayerPlugin: { - isLoaded: function() { - return L.esri !== undefined && L.esri.imageMapLayer !== undefined; - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.esri.imageMapLayer; - } else { - return false; - } - }, - }, - AGSClusteredLayerPlugin: { - isLoaded: function() { - return L.esri !== undefined && L.esri.clusteredFeatureLayer !== undefined; - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.esri.clusteredFeatureLayer; - } else { - return false; - } - }, - }, - AGSHeatmapLayerPlugin: { - isLoaded: function() { - return L.esri !== undefined && L.esri.heatmapFeatureLayer !== undefined; - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.esri.heatmapFeatureLayer; - } else { - return false; - } - }, - }, - YandexLayerPlugin: { - isLoaded: function() { - return angular.isDefined(L.Yandex); - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.Yandex; - } else { - return false; - } - }, - }, - GeoJSONPlugin: { - isLoaded: function() { - return angular.isDefined(L.TileLayer.GeoJSON); - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.TileLayer.GeoJSON; - } else { - return false; - } - }, - }, - UTFGridPlugin: { - isLoaded: function() { - return angular.isDefined(L.UtfGrid); - }, - - is: function(layer) { - if (this.isLoaded()) { - return layer instanceof L.UtfGrid; - } else { - $log.error('[AngularJS - Leaflet] No UtfGrid plugin found.'); - return false; - } - }, - }, - CartoDB: { - isLoaded: function() { - return cartodb; - }, - - is: function(/*layer*/) { - return true; - /* - if (this.isLoaded()) { - return layer instanceof L.TileLayer.GeoJSON; - } else { - return false; - }*/ - }, - }, - Leaflet: { - DivIcon: { - is: function(icon) { - return icon instanceof L.DivIcon; - }, - - equal: function(iconA, iconB) { - if (this.is(iconA)) { - return angular.equals(iconA, iconB); - } else { - return false; - } - }, - }, - Icon: { - is: function(icon) { - return icon instanceof L.Icon; - }, - - equal: function(iconA, iconB) { - if (this.is(iconA)) { - return angular.equals(iconA, iconB); - } else { - return false; - } - }, - }, - }, - /* - watchOptions - object to set deep nested watches and turn off watches all together - (rely on control / functional updates) - watchOptions - Object - doWatch:boolean - isDeep:boolean (sets $watch(function,isDeep)) - individual - doWatch:boolean - isDeep:boolean - */ - - //legacy defaults - watchOptions: { - doWatch:true, - isDeep: true, - individual:{ - doWatch:true, - isDeep: true, - }, - }, - }; -}]); - -angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafletHelpers", function($log, leafletHelpers) { - - var lHlp = leafletHelpers; - var errorHeader = leafletHelpers.errorHeader + 'leafletIterators: '; - - //BEGIN COPY from underscore - var _keys = Object.keys; - var _isFunction = lHlp.isFunction; - var _isObject = lHlp.isObject; - - // Helper for collection methods to determine whether a collection - // should be iterated as an array or as an object - // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength - var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; - - var _isArrayLike = function(collection) { - var length = collection !== null && collection.length; - return lHlp.isNumber(length) && length >= 0 && length <= MAX_ARRAY_INDEX; - }; - - // Keep the identity function around for default iteratees. - var _identity = function(value) { - return value; - }; - - var _property = function(key) { - return function(obj) { - return obj === null ? void 0 : obj[key]; - }; - }; - - // Internal function that returns an efficient (for current engines) version - // 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; - switch (argCount === null ? 3 : argCount) { - case 1: return function(value) { - return func.call(context, value); - }; - - 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 4: return function(accumulator, value, index, collection) { - return func.call(context, accumulator, value, index, collection); - }; - } - return function() { - return func.apply(context, arguments); - }; - }; - - // An internal function for creating assigner functions. - var createAssigner = function(keysFunc, undefinedOnly) { - return function(obj) { - var length = arguments.length; - if (length < 2 || obj === null) return obj; - for (var index = 1; index < length; index++) { - var source = arguments[index]; - var keys = keysFunc(source); - var l = keys.length; - - for (var i = 0; i < l; i++) { - var key = keys[i]; - if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; - } - } - - return obj; - }; - }; - - // Assigns a given object with all the own properties in the passed-in object(s) - // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) - var _extendOwn; - var _assign = null; - _extendOwn = _assign = createAssigner(_keys); - - // Returns whether an object has a given set of `key:value` pairs. - var _isMatch = function(object, attrs) { - var keys = _keys(attrs); - var length = keys.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; - } - - return true; - }; - - // Returns a predicate for checking whether an object has a given set of - // `key:value` pairs. - var _matcher; - var _matches = null; - _matcher = _matches = function(attrs) { - attrs = _extendOwn({}, attrs); - return function(obj) { - return _isMatch(obj, attrs); - }; - }; - - // A mostly-internal function to generate callbacks that can be applied - // 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); - return _property(value); - }; - - var _every; - var _all = null; - _every = _all = function(obj, predicate, context) { - predicate = cb(predicate, context); - var keys = !_isArrayLike(obj) && _keys(obj); - 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; - } - - return true; - }; - - //END COPY fron underscore - - var _hasErrors = function(collection, cb, ignoreCollection, cbName) { - if (!ignoreCollection) { - if (!lHlp.isDefined(collection) || !lHlp.isDefined(cb)) { - return true; - } - } - - if (!lHlp.isFunction(cb)) { - cbName = lHlp.defaultTo(cb, 'cb'); - $log.error(errorHeader + cbName + ' is not a function'); - return true; - } - - return false; - }; - - var _iterate = function(collection, externalCb, internalCb) { - if (_hasErrors(undefined, internalCb, true, 'internalCb')) { - return; - } - - if (!_hasErrors(collection, externalCb)) { - for (var key in collection) { - if (collection.hasOwnProperty(key)) { - internalCb(collection[key], key); - } - } - } - }; - - //see http://jsperf.com/iterators/3 - //utilizing for in is way faster - var _each = function(collection, cb) { - _iterate(collection, cb, function(val, key) { - cb(val, key); - }); - }; - - return { - each:_each, - forEach: _each, - every: _every, - all: _all, - }; -}]); - -angular.module('leaflet-directive') -.factory('leafletLayerHelpers', ["$rootScope", "$log", "$q", "leafletHelpers", "leafletIterators", function($rootScope, $log, $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.'); - return; - } - - var utfgrid = new L.UtfGrid(params.url, params.pluginOptions); - - utfgrid.on('mouseover', function(e) { - $rootScope.$broadcast('leafletDirectiveMap.utfgridMouseover', e); - }); - - utfgrid.on('mouseout', function(e) { - $rootScope.$broadcast('leafletDirectiveMap.utfgridMouseout', e); - }); - - utfgrid.on('click', function(e) { - $rootScope.$broadcast('leafletDirectiveMap.utfgridClick', e); - }); - - utfgrid.on('mousemove', function(e) { - $rootScope.$broadcast('leafletDirectiveMap.utfgridMousemove', e); - }); - - return utfgrid; - }; - - var layerTypes = { - xyz: { - mustHaveUrl: true, - createLayer: function(params) { - return L.tileLayer(params.url, params.options); - }, - }, - mapbox: { - mustHaveKey: true, - createLayer: function(params) { - var version = 3; - if (isDefined(params.options.version) && params.options.version === 4) { - version = params.options.version; - } - - var url = version === 3 ? - '//{s}.tiles.mapbox.com/v3/' + params.key + '/{z}/{x}/{y}.png' : - '//api.tiles.mapbox.com/v4/' + params.key + '/{z}/{x}/{y}.png?access_token=' + params.apiKey; - return L.tileLayer(url, params.options); - }, - }, - geoJSON: { - mustHaveUrl: true, - createLayer: function(params) { - if (!Helpers.GeoJSONPlugin.isLoaded()) { - return; - } - - return new L.TileLayer.GeoJSON(params.url, params.pluginOptions, params.options); - }, - }, - geoJSONShape: { - mustHaveUrl: false, - createLayer: function(params) { - return new L.GeoJSON(params.data, - params.options); - }, - }, - geoJSONAwesomeMarker: { - mustHaveUrl: false, - createLayer: function(params) { - return new L.geoJson(params.data, { - pointToLayer: function(feature, latlng) { - return L.marker(latlng, {icon: L.AwesomeMarkers.icon(params.icon)}); - }, - }); - }, - }, - geoJSONVectorMarker: { - mustHaveUrl: false, - createLayer: function(params) { - return new L.geoJson(params.data, { - pointToLayer: function(feature, latlng) { - return L.marker(latlng, {icon: L.VectorMarkers.icon(params.icon)}); - }, - }); - }, - }, - utfGrid: { - mustHaveUrl: true, - createLayer: utfGridCreateLayer, - }, - cartodbTiles: { - mustHaveKey: true, - createLayer: function(params) { - var url = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/{z}/{x}/{y}.png'; - return L.tileLayer(url, params.options); - }, - }, - cartodbUTFGrid: { - mustHaveKey: true, - mustHaveLayer: true, - createLayer: function(params) { - params.url = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/' + params.layer + '/{z}/{x}/{y}.grid.json'; - return utfGridCreateLayer(params); - }, - }, - cartodbInteractive: { - mustHaveKey: true, - mustHaveLayer: true, - createLayer: function(params) { - var tilesURL = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/{z}/{x}/{y}.png'; - var tileLayer = L.tileLayer(tilesURL, params.options); - params.url = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/' + params.layer + '/{z}/{x}/{y}.grid.json'; - var utfLayer = utfGridCreateLayer(params); - return L.layerGroup([tileLayer, utfLayer]); - }, - }, - wms: { - mustHaveUrl: true, - createLayer: function(params) { - return L.tileLayer.wms(params.url, params.options); - }, - }, - wmts: { - mustHaveUrl: true, - createLayer: function(params) { - return L.tileLayer.wmts(params.url, params.options); - }, - }, - wfs: { - mustHaveUrl: true, - mustHaveLayer: true, - createLayer: function(params) { - if (!Helpers.WFSLayerPlugin.isLoaded()) { - return; - } - - var options = angular.copy(params.options); - if (options.crs && typeof options.crs === 'string') { - /*jshint -W061 */ - options.crs = eval(options.crs); - } - - return new L.GeoJSON.WFS(params.url, params.layer, options); - }, - }, - group: { - mustHaveUrl: false, - createLayer: function(params) { - var lyrs = []; - $it.each(params.options.layers, function(l) { - lyrs.push(createLayer(l)); - }); - - params.options.loadedDefer = function() { - var defers = []; - if (isDefined(params.options.layers)) { - for (var i = 0; i < params.options.layers.length; i++) { - var d = params.options.layers[i].layerOptions.loadedDefer; - if (isDefined(d)) { - defers.push(d); - } - } - } - - return defers; - }; - - return L.layerGroup(lyrs); - }, - }, - featureGroup: { - mustHaveUrl: false, - createLayer: function() { - return L.featureGroup(); - }, - }, - google: { - mustHaveUrl: false, - createLayer: function(params) { - var type = params.type || 'SATELLITE'; - if (!Helpers.GoogleLayerPlugin.isLoaded()) { - return; - } - - return new L.Google(type, params.options); - }, - }, - here: { - mustHaveUrl: false, - createLayer: function(params) { - var provider = params.provider || 'HERE.terrainDay'; - if (!Helpers.LeafletProviderPlugin.isLoaded()) { - return; - } - - return new L.TileLayer.Provider(provider, params.options); - }, - }, - china:{ - mustHaveUrl:false, - createLayer:function(params) { - var type = params.type || ''; - if (!Helpers.ChinaLayerPlugin.isLoaded()) { - return; - } - - return L.tileLayer.chinaProvider(type, params.options); - }, - }, - agsBase: { - mustHaveLayer: true, - createLayer: function(params) { - if (!Helpers.AGSBaseLayerPlugin.isLoaded()) { - return; - } - - return L.esri.basemapLayer(params.layer, params.options); - }, - }, - ags: { - mustHaveUrl: true, - createLayer: function(params) { - if (!Helpers.AGSLayerPlugin.isLoaded()) { - return; - } - - var options = angular.copy(params.options); - angular.extend(options, { - url: params.url, - }); - var layer = new lvector.AGS(options); - layer.onAdd = function(map) { - this.setMap(map); - }; - - layer.onRemove = function() { - this.setMap(null); - }; - - return layer; - }, - }, - agsFeature: { - mustHaveUrl: true, - createLayer: function(params) { - if (!Helpers.AGSFeatureLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); - return; - } - - params.options.url = params.url; - - var layer = L.esri.featureLayer(params.options); - var load = function() { - if (isDefined(params.options.loadedDefer)) { - params.options.loadedDefer.resolve(); - } - }; - - layer.on('loading', function() { - params.options.loadedDefer = $q.defer(); - layer.off('load', load); - layer.on('load', load); - }); - - return layer; - }, - }, - agsTiled: { - mustHaveUrl: true, - createLayer: function(params) { - if (!Helpers.AGSTiledMapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); - return; - } - - params.options.url = params.url; - - return L.esri.tiledMapLayer(params.options); - }, - }, - agsDynamic: { - mustHaveUrl: true, - createLayer: function(params) { - if (!Helpers.AGSDynamicMapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); - return; - } - - params.options.url = params.url; - - return L.esri.dynamicMapLayer(params.options); - }, - }, - agsImage: { - mustHaveUrl: true, - createLayer: function(params) { - if (!Helpers.AGSImageMapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); - return; - } - - params.options.url = params.url; - - return L.esri.imageMapLayer(params.options); - }, - }, - agsClustered: { - mustHaveUrl: true, - createLayer: function(params) { - if (!Helpers.AGSClusteredLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri clustered layer plugin is not loaded.'); - return; - } - - if (!Helpers.MarkerClusterPlugin.isLoaded()) { - $log.warn(errorHeader + ' The markercluster plugin is not loaded.'); - return; - } - - return L.esri.clusteredFeatureLayer(params.url, params.options); - }, - }, - agsHeatmap: { - mustHaveUrl: true, - createLayer: function(params) { - if (!Helpers.AGSHeatmapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri heatmap layer plugin is not loaded.'); - return; - } - - if (!Helpers.HeatLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The heatlayer plugin is not loaded.'); - return; - } - - return L.esri.heatmapFeatureLayer(params.url, params.options); - }, - }, - markercluster: { - mustHaveUrl: false, - createLayer: function(params) { - if (!Helpers.MarkerClusterPlugin.isLoaded()) { - $log.warn(errorHeader + ' The markercluster plugin is not loaded.'); - return; - } - - return new L.MarkerClusterGroup(params.options); - }, - }, - bing: { - mustHaveUrl: false, - createLayer: function(params) { - if (!Helpers.BingLayerPlugin.isLoaded()) { - return; - } - - return new L.BingLayer(params.key, params.options); - }, - }, - webGLHeatmap: { - mustHaveUrl: false, - mustHaveData: true, - createLayer: function(params) { - if (!Helpers.WebGLHeatMapLayerPlugin.isLoaded()) { - return; - } - - var layer = new L.TileLayer.WebGLHeatMap(params.options); - if (isDefined(params.data)) { - layer.setData(params.data); - } - - return layer; - }, - }, - heat: { - mustHaveUrl: false, - mustHaveData: true, - createLayer: function(params) { - if (!Helpers.HeatLayerPlugin.isLoaded()) { - return; - } - - var layer = new L.heatLayer(); - - if (isArray(params.data)) { - layer.setLatLngs(params.data); - } - - if (isObject(params.options)) { - layer.setOptions(params.options); - } - - return layer; - }, - }, - yandex: { - mustHaveUrl: false, - createLayer: function(params) { - var type = params.type || 'map'; - if (!Helpers.YandexLayerPlugin.isLoaded()) { - return; - } - - return new L.Yandex(type, params.options); - }, - }, - imageOverlay: { - mustHaveUrl: true, - mustHaveBounds: true, - createLayer: function(params) { - return L.imageOverlay(params.url, params.bounds, params.options); - }, - }, - iip: { - mustHaveUrl: true, - createLayer: function(params) { - return L.tileLayer.iip(params.url, params.options); - }, - }, - - // This "custom" type is used to accept every layer that user want to define himself. - // We can wrap these custom layers like heatmap or yandex, but it means a lot of work/code to wrap the world, - // so we let user to define their own layer outside the directive, - // and pass it on "createLayer" result for next processes - custom: { - createLayer: function(params) { - if (params.layer instanceof L.Class) { - return angular.copy(params.layer); - } else { - $log.error('[AngularJS - Leaflet] A custom layer must be a leaflet Class'); - } - }, - }, - cartodb: { - mustHaveUrl: true, - createLayer: function(params) { - return cartodb.createLayer(params.map, params.url); - }, - }, - }; - - 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.'); - return false; - } - - if (Object.keys(layerTypes).indexOf(layerDefinition.type) === -1) { - $log.error('[AngularJS - Leaflet] 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'); - return false; - } - - if (layerTypes[layerDefinition.type].mustHaveData && !isDefined(layerDefinition.data)) { - $log.error('[AngularJS - Leaflet] 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'); - return false; - } - - if (layerTypes[layerDefinition.type].mustHaveBounds && !isDefined(layerDefinition.bounds)) { - $log.error('[AngularJS - Leaflet] 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'); - return false; - } - - return true; - } - - function createLayer(layerDefinition) { - if (!isValidLayerType(layerDefinition)) { - return; - } - - if (!isString(layerDefinition.name)) { - $log.error('[AngularJS - Leaflet] A base layer must have a name'); - return; - } - - if (!isObject(layerDefinition.layerParams)) { - layerDefinition.layerParams = {}; - } - - if (!isObject(layerDefinition.layerOptions)) { - layerDefinition.layerOptions = {}; - } - - // Mix the layer specific parameters with the general Leaflet options. Although this is an overhead - // the definition of a base layers is more 'clean' if the two types of parameters are differentiated - for (var attrname in layerDefinition.layerParams) { - layerDefinition.layerOptions[attrname] = layerDefinition.layerParams[attrname]; - } - - var params = { - url: layerDefinition.url, - data: layerDefinition.data, - options: layerDefinition.layerOptions, - layer: layerDefinition.layer, - icon: layerDefinition.icon, - type: layerDefinition.layerType, - bounds: layerDefinition.bounds, - key: layerDefinition.key, - apiKey: layerDefinition.apiKey, - pluginOptions: layerDefinition.pluginOptions, - user: layerDefinition.user, - }; - - //TODO Add $watch to the layer properties - return layerTypes[layerDefinition.type].createLayer(params); - } - - function safeAddLayer(map, layer) { - if (layer && typeof layer.addTo === 'function') { - layer.addTo(map); - } else { - map.addLayer(layer); - } - } - - function safeRemoveLayer(map, layer, layerOptions) { - 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() { - count--; - if (count === 0) { - map.removeLayer(layer); - } - }; - - for (var i = 0; i < defers.length; i++) { - defers[i].promise.then(resolve); - } - } else { - map.removeLayer(layer); - } - } else { - layerOptions.loadedDefer.promise.then(function() { - map.removeLayer(layer); - }); - } - } else { - map.removeLayer(layer); - } - } - - return { - createLayer: createLayer, - safeAddLayer: safeAddLayer, - safeRemoveLayer: safeRemoveLayer, - }; -}]); - -angular.module('leaflet-directive').factory('leafletLegendHelpers', function() { - var _updateLegend = function(div, legendData, type, url) { - div.innerHTML = ''; - if (legendData.error) { - div.innerHTML += '
' + legendData.error.message + '
'; - } else { - if (type === 'arcgis') { - for (var i = 0; i < legendData.layers.length; i++) { - var layer = legendData.layers[i]; - div.innerHTML += '
' + layer.layerName + '
'; - for (var j = 0; j < layer.legend.length; j++) { - var leg = layer.legend[j]; - div.innerHTML += - '
' + - '
' + leg.label + '
'; - } - } - } else if (type === 'image') { - div.innerHTML = ''; - } - } - }; - - var _getOnAddLegend = function(legendData, legendClass, type, url) { - return function(/*map*/) { - var div = L.DomUtil.create('div', legendClass); - - if (!L.Browser.touch) { - L.DomEvent.disableClickPropagation(div); - L.DomEvent.on(div, 'mousewheel', L.DomEvent.stopPropagation); - } else { - L.DomEvent.on(div, 'click', L.DomEvent.stopPropagation); - } - - _updateLegend(div, legendData, type, url); - return div; - }; - }; - - var _getOnAddArrayLegend = function(legend, legendClass) { - return function(/*map*/) { - var div = L.DomUtil.create('div', legendClass); - for (var i = 0; i < legend.colors.length; i++) { - div.innerHTML += - '
' + - '
' + legend.labels[i] + '
'; - } - - if (!L.Browser.touch) { - L.DomEvent.disableClickPropagation(div); - L.DomEvent.on(div, 'mousewheel', L.DomEvent.stopPropagation); - } else { - L.DomEvent.on(div, 'click', L.DomEvent.stopPropagation); - } - - return div; - }; - }; - - return { - getOnAddLegend: _getOnAddLegend, - getOnAddArrayLegend: _getOnAddArrayLegend, - updateLegend: _updateLegend, - }; -}); - -angular.module('leaflet-directive').factory('leafletMapDefaults', ["$q", "leafletHelpers", function($q, leafletHelpers) { - function _getDefaults() { - return { - keyboard: true, - dragging: true, - worldCopyJump: false, - doubleClickZoom: true, - scrollWheelZoom: true, - tap: true, - touchZoom: true, - zoomControl: true, - zoomsliderControl: false, - zoomControlPosition: 'topleft', - attributionControl: true, - controls: { - layers: { - visible: true, - position: 'topright', - collapsed: true, - }, - }, - 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 isDefined = leafletHelpers.isDefined; - var isObject = leafletHelpers.isObject; - var obtainEffectiveMapId = leafletHelpers.obtainEffectiveMapId; - var defaults = {}; - - // Get the _defaults dictionary, and override the properties defined by the user - return { - reset: function() { - defaults = {}; - }, - - getDefaults: function(scopeId) { - var mapId = obtainEffectiveMapId(defaults, scopeId); - return defaults[mapId]; - }, - - getMapCreationDefaults: function(scopeId) { - var mapId = obtainEffectiveMapId(defaults, scopeId); - var d = defaults[mapId]; - - var mapDefaults = { - maxZoom: d.maxZoom, - keyboard: d.keyboard, - dragging: d.dragging, - zoomControl: d.zoomControl, - doubleClickZoom: d.doubleClickZoom, - scrollWheelZoom: d.scrollWheelZoom, - tap: d.tap, - touchZoom: d.touchZoom, - attributionControl: d.attributionControl, - worldCopyJump: d.worldCopyJump, - crs: d.crs, - }; - - if (isDefined(d.minZoom)) { - mapDefaults.minZoom = d.minZoom; - } - - if (isDefined(d.zoomAnimation)) { - mapDefaults.zoomAnimation = d.zoomAnimation; - } - - if (isDefined(d.fadeAnimation)) { - mapDefaults.fadeAnimation = d.fadeAnimation; - } - - if (isDefined(d.markerZoomAnimation)) { - mapDefaults.markerZoomAnimation = d.markerZoomAnimation; - } - - if (d.map) { - for (var option in d.map) { - mapDefaults[option] = d.map[option]; - } - } - - return mapDefaults; - }, - - setDefaults: function(userDefaults, scopeId) { - var newDefaults = _getDefaults(); - - if (isDefined(userDefaults)) { - newDefaults.doubleClickZoom = isDefined(userDefaults.doubleClickZoom) ? userDefaults.doubleClickZoom : newDefaults.doubleClickZoom; - newDefaults.scrollWheelZoom = isDefined(userDefaults.scrollWheelZoom) ? userDefaults.scrollWheelZoom : newDefaults.doubleClickZoom; - newDefaults.tap = isDefined(userDefaults.tap) ? userDefaults.tap : newDefaults.tap; - newDefaults.touchZoom = isDefined(userDefaults.touchZoom) ? userDefaults.touchZoom : newDefaults.doubleClickZoom; - newDefaults.zoomControl = isDefined(userDefaults.zoomControl) ? userDefaults.zoomControl : newDefaults.zoomControl; - newDefaults.zoomsliderControl = isDefined(userDefaults.zoomsliderControl) ? userDefaults.zoomsliderControl : newDefaults.zoomsliderControl; - newDefaults.attributionControl = isDefined(userDefaults.attributionControl) ? userDefaults.attributionControl : newDefaults.attributionControl; - newDefaults.tileLayer = isDefined(userDefaults.tileLayer) ? userDefaults.tileLayer : newDefaults.tileLayer; - newDefaults.zoomControlPosition = isDefined(userDefaults.zoomControlPosition) ? userDefaults.zoomControlPosition : newDefaults.zoomControlPosition; - newDefaults.keyboard = isDefined(userDefaults.keyboard) ? userDefaults.keyboard : newDefaults.keyboard; - newDefaults.dragging = isDefined(userDefaults.dragging) ? userDefaults.dragging : newDefaults.dragging; - - if (isDefined(userDefaults.controls)) { - angular.extend(newDefaults.controls, userDefaults.controls); - } - - if (isObject(userDefaults.crs)) { - newDefaults.crs = userDefaults.crs; - } else if (isDefined(L.CRS[userDefaults.crs])) { - newDefaults.crs = L.CRS[userDefaults.crs]; - } - - if (isDefined(userDefaults.center)) { - angular.copy(userDefaults.center, newDefaults.center); - } - - if (isDefined(userDefaults.tileLayerOptions)) { - angular.copy(userDefaults.tileLayerOptions, newDefaults.tileLayerOptions); - } - - if (isDefined(userDefaults.maxZoom)) { - newDefaults.maxZoom = userDefaults.maxZoom; - } - - if (isDefined(userDefaults.minZoom)) { - newDefaults.minZoom = userDefaults.minZoom; - } - - if (isDefined(userDefaults.zoomAnimation)) { - newDefaults.zoomAnimation = userDefaults.zoomAnimation; - } - - if (isDefined(userDefaults.fadeAnimation)) { - newDefaults.fadeAnimation = userDefaults.fadeAnimation; - } - - if (isDefined(userDefaults.markerZoomAnimation)) { - newDefaults.markerZoomAnimation = userDefaults.markerZoomAnimation; - } - - if (isDefined(userDefaults.worldCopyJump)) { - newDefaults.worldCopyJump = userDefaults.worldCopyJump; - } - - if (isDefined(userDefaults.map)) { - newDefaults.map = userDefaults.map; - } - - if (isDefined(userDefaults.path)) { - newDefaults.path = userDefaults.path; - } - } - - var mapId = obtainEffectiveMapId(defaults, scopeId); - defaults[mapId] = newDefaults; - return newDefaults; - }, - }; -}]); - -angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScope", "$timeout", "leafletHelpers", "$log", "$compile", "leafletGeoJsonHelpers", function($rootScope, $timeout, leafletHelpers, $log, $compile, leafletGeoJsonHelpers) { - var isDefined = leafletHelpers.isDefined; - var defaultTo = leafletHelpers.defaultTo; - var MarkerClusterPlugin = leafletHelpers.MarkerClusterPlugin; - var AwesomeMarkersPlugin = leafletHelpers.AwesomeMarkersPlugin; - var VectorMarkersPlugin = leafletHelpers.VectorMarkersPlugin; - var MakiMarkersPlugin = leafletHelpers.MakiMarkersPlugin; - var ExtraMarkersPlugin = leafletHelpers.ExtraMarkersPlugin; - var DomMarkersPlugin = leafletHelpers.DomMarkersPlugin; - var safeApply = leafletHelpers.safeApply; - var Helpers = leafletHelpers; - var isString = leafletHelpers.isString; - var isNumber = leafletHelpers.isNumber; - 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 - var retStr = ''; - ['_icon', '_latlng', '_leaflet_id', '_map', '_shadow'].forEach(function(prop) { - retStr += prop + ': ' + defaultTo(marker[prop], 'undefined') + ' \n'; - }); - - 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.'); - } - - return new L.AwesomeMarkers.icon(iconData); - } - - if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'vectorMarker') { - if (!VectorMarkersPlugin.isLoaded()) { - $log.error(errorHeader + ' The VectorMarkers Plugin is not loaded.'); - } - - return new L.VectorMarkers.icon(iconData); - } - - if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'makiMarker') { - if (!MakiMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The MakiMarkers Plugin is not loaded.'); - } - - return new L.MakiMarkers.icon(iconData); - } - - if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'extraMarker') { - if (!ExtraMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The ExtraMarkers Plugin is not loaded.'); - } - - return new L.ExtraMarkers.icon(iconData); - } - - if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'div') { - return new L.divIcon(iconData); - } - - if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'dom') { - if (!DomMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The DomMarkers Plugin is not loaded.'); - } - - var markerScope = angular.isFunction(iconData.getMarkerScope) ? iconData.getMarkerScope() : $rootScope; - var template = $compile(iconData.template)(markerScope); - var iconDataCopy = angular.copy(iconData); - iconDataCopy.element = template[0]; - return new L.DomMarkers.icon(iconDataCopy); - } - - // allow for any custom icon to be used... assumes the icon has already been initialized - if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'icon') { - return iconData.icon; - } - - var base64icon = '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=='; - var base64shadow = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII='; - - if (!isDefined(iconData) || !isDefined(iconData.iconUrl)) { - return new L.Icon.Default({ - iconUrl: base64icon, - shadowUrl: base64shadow, - iconSize: [25, 41], - iconAnchor: [12, 41], - popupAnchor: [1, -34], - shadowSize: [41, 41], - }); - } - - return new L.Icon(iconData); - }; - - var _resetMarkerGroup = function(groupName) { - if (isDefined(groups[groupName])) { - groups.splice(groupName, 1); - } - }; - - var _resetMarkerGroups = function() { - groups = {}; - }; - - var _deleteMarker = function(marker, map, layers) { - marker.closePopup(); - - // There is no easy way to know if a marker is added to a layer, so we search for it - // if there are overlays - if (isDefined(layers) && isDefined(layers.overlays)) { - for (var key in layers.overlays) { - if (layers.overlays[key] instanceof L.LayerGroup || layers.overlays[key] instanceof L.FeatureGroup) { - if (layers.overlays[key].hasLayer(marker)) { - layers.overlays[key].removeLayer(marker); - return; - } - } - } - } - - if (isDefined(groups)) { - for (var groupKey in groups) { - if (groups[groupKey].hasLayer(marker)) { - groups[groupKey].removeLayer(marker); - } - } - } - - if (map.hasLayer(marker)) { - map.removeLayer(marker); - } - }; - - var adjustPopupPan = function(marker, map) { - var containerHeight = marker._popup._container.offsetHeight; - var layerPos = new L.Point(marker._popup._containerLeft, -containerHeight - marker._popup._containerBottom); - var containerPos = map.layerPointToContainerPoint(layerPos); - if (containerPos !== null) { - marker._popup._adjustPan(); - } - }; - - var compilePopup = function(marker, markerScope) { - $compile(marker._popup._contentNode)(markerScope); - }; - - var updatePopup = function(marker, markerScope, map) { - //The innerText should be more than 1 once angular has compiled. - //We need to keep trying until angular has compiled before we _updateLayout and _updatePosition - //This should take care of any scenario , eg ngincludes, whatever. - //Is there a better way to check for this? - var innerText = marker._popup._contentNode.innerText || marker._popup._contentNode.textContent; - if (innerText.length < 1) { - $timeout(function() { - updatePopup(marker, markerScope, map); - }); - } - - //cause a reflow - this is also very important - if we don't do this then the widths are from before $compile - var reflow = marker._popup._contentNode.offsetWidth; - - marker._popup._updateLayout(); - marker._popup._updatePosition(); - - if (marker._popup.options.autoPan) { - adjustPopupPan(marker, map); - } - - //using / returning reflow so jshint doesn't moan - return reflow; - }; - - var _manageOpenPopup = function(marker, markerData, map) { - // The marker may provide a scope returning function used to compile the message - // default to $rootScope otherwise - var markerScope = angular.isFunction(markerData.getMessageScope) ? markerData.getMessageScope() : $rootScope; - var compileMessage = isDefined(markerData.compileMessage) ? markerData.compileMessage : true; - - if (compileMessage) { - if (!isDefined(marker._popup) || !isDefined(marker._popup._contentNode)) { - $log.error(errorHeader + 'Popup is invalid or does not have any content.'); - return false; - } - - compilePopup(marker, markerScope); - updatePopup(marker, markerData, map); - } - }; - - var _manageOpenLabel = function(marker, markerData) { - var markerScope = angular.isFunction(markerData.getMessageScope) ? markerData.getMessageScope() : $rootScope; - var labelScope = angular.isFunction(markerData.getLabelScope) ? markerData.getLabelScope() : markerScope; - var compileMessage = isDefined(markerData.compileMessage) ? markerData.compileMessage : true; - - if (Helpers.LabelPlugin.isLoaded() && isDefined(markerData.label)) { - if (isDefined(markerData.label.options) && markerData.label.options.noHide === true) { - marker.showLabel(); - } - - if (compileMessage && isDefined(marker.label)) { - $compile(marker.label._container)(labelScope); - } - } - }; - - var _updateMarker = function(markerData, oldMarkerData, marker, name, leafletScope, layers, map) { - if (!isDefined(oldMarkerData)) { - return; - } - - // 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'); - _deleteMarker(marker, map, layers); - return; - } - - // watch is being initialized if old and new object is the same - var isInitializing = markerData === oldMarkerData; - - // Update marker rotation - if (isDefined(markerData.iconAngle) && oldMarkerData.iconAngle !== markerData.iconAngle) { - marker.setIconAngle(markerData.iconAngle); - } - - // It is possible that the layer has been removed or the layer marker does not exist - // Update the layer group if present or move it to the map if not - if (!isString(markerData.layer)) { - // There is no layer information, we move the marker to the map if it was in a layer group - if (isString(oldMarkerData.layer)) { - // Remove from the layer group that is supposed to be - if (isDefined(layers.overlays[oldMarkerData.layer]) && layers.overlays[oldMarkerData.layer].hasLayer(marker)) { - layers.overlays[oldMarkerData.layer].removeLayer(marker); - marker.closePopup(); - } - - // Test if it is not on the map and add it - if (!map.hasLayer(marker)) { - map.addLayer(marker); - } - } - } - - if ((isNumber(markerData.opacity) || isNumber(parseFloat(markerData.opacity))) && markerData.opacity !== oldMarkerData.opacity) { - // There was a different opacity so we update it - marker.setOpacity(markerData.opacity); - } - - if (isString(markerData.layer) && oldMarkerData.layer !== markerData.layer) { - // If it was on a layer group we have to remove it - if (isString(oldMarkerData.layer) && isDefined(layers.overlays[oldMarkerData.layer]) && layers.overlays[oldMarkerData.layer].hasLayer(marker)) { - layers.overlays[oldMarkerData.layer].removeLayer(marker); - } - - marker.closePopup(); - - // Remove it from the map in case the new layer is hidden or there is an error in the new layer - if (map.hasLayer(marker)) { - map.removeLayer(marker); - } - - // 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'); - 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"'); - return; - } - - // The marker goes to a correct layer group, so first of all we add it - layerGroup.addLayer(marker); - - // 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 (map.hasLayer(marker) && markerData.focus === true) { - marker.openPopup(); - } - } - - // Update the draggable property - if (markerData.draggable !== true && oldMarkerData.draggable === true && (isDefined(marker.dragging))) { - marker.dragging.disable(); - } - - if (markerData.draggable === true && oldMarkerData.draggable !== true) { - // The markerData.draggable property must be true so we update if there wasn't a previous value or it wasn't true - if (marker.dragging) { - marker.dragging.enable(); - } else { - if (L.Handler.MarkerDrag) { - marker.dragging = new L.Handler.MarkerDrag(marker); - marker.options.draggable = true; - marker.dragging.enable(); - } - } - } - - // Update the icon property - if (!isObject(markerData.icon)) { - // If there is no icon property or it's not an object - if (isObject(oldMarkerData.icon)) { - // If there was an icon before restore to the default - marker.setIcon(createLeafletIcon()); - marker.closePopup(); - marker.unbindPopup(); - if (isString(markerData.message)) { - marker.bindPopup(markerData.message, markerData.popupOptions); - } - } - } - - if (isObject(markerData.icon) && isObject(oldMarkerData.icon) && !angular.equals(markerData.icon, oldMarkerData.icon)) { - var dragG = false; - if (marker.dragging) { - dragG = marker.dragging.enabled(); - } - - marker.setIcon(createLeafletIcon(markerData.icon)); - if (dragG) { - marker.dragging.enable(); - } - - marker.closePopup(); - marker.unbindPopup(); - if (isString(markerData.message)) { - marker.bindPopup(markerData.message, markerData.popupOptions); - - // if marker has been already focused, reopen popup - if (map.hasLayer(marker) && markerData.focus === true) { - marker.openPopup(); - } - } - } - - // Update the Popup message property - if (!isString(markerData.message) && isString(oldMarkerData.message)) { - marker.closePopup(); - marker.unbindPopup(); - } - - // Update the label content or bind a new label if the old one has been removed. - if (Helpers.LabelPlugin.isLoaded()) { - if (isDefined(markerData.label) && isDefined(markerData.label.message)) { - if ('label' in oldMarkerData && 'message' in oldMarkerData.label && !angular.equals(markerData.label.message, oldMarkerData.label.message)) { - marker.updateLabelContent(markerData.label.message); - } else if (!angular.isFunction(marker.getLabel) || angular.isFunction(marker.getLabel) && !isDefined(marker.getLabel())) { - marker.bindLabel(markerData.label.message, markerData.label.options); - _manageOpenLabel(marker, markerData); - } else { - _manageOpenLabel(marker, markerData); - } - } else if (!('label' in markerData && !('message' in markerData.label))) { - if (angular.isFunction(marker.unbindLabel)) { - marker.unbindLabel(); - } - } - } - - // There is some text in the popup, so we must show the text or update existing - if (isString(markerData.message) && !isString(oldMarkerData.message)) { - // There was no message before so we create it - marker.bindPopup(markerData.message, markerData.popupOptions); - } - - if (isString(markerData.message) && isString(oldMarkerData.message) && markerData.message !== oldMarkerData.message) { - // There was a different previous message so we update it - marker.setPopupContent(markerData.message); - } - - // Update the focus property - var updatedFocus = false; - if (markerData.focus !== true && oldMarkerData.focus === true) { - // If there was a focus property and was true we turn it off - marker.closePopup(); - updatedFocus = true; - } - - // 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)) { - // Reopen the popup when focus is still true - marker.openPopup(); - updatedFocus = true; - } - - // zIndexOffset adjustment - if (oldMarkerData.zIndexOffset !== markerData.zIndexOffset) { - marker.setZIndexOffset(markerData.zIndexOffset); - } - - var markerLatLng = marker.getLatLng(); - var isCluster = (isString(markerData.layer) && Helpers.MarkerClusterPlugin.is(layers.overlays[markerData.layer])); - - // If the marker is in a cluster it has to be removed and added to the layer when the location is changed - if (isCluster) { - // The focus has changed even by a user click or programatically - if (updatedFocus) { - // We only have to update the location if it was changed programatically, because it was - // changed by a user drag the marker data has already been updated by the internal event - // listened by the directive - if ((markerData.lat !== oldMarkerData.lat) || (markerData.lng !== oldMarkerData.lng)) { - layers.overlays[markerData.layer].removeLayer(marker); - marker.setLatLng([markerData.lat, markerData.lng]); - layers.overlays[markerData.layer].addLayer(marker); - } - } else { - // The marker has possibly moved. It can be moved by a user drag (marker location and data are equal but old - // data is diferent) or programatically (marker location and data are diferent) - if ((markerLatLng.lat !== markerData.lat) || (markerLatLng.lng !== markerData.lng)) { - // The marker was moved by a user drag - layers.overlays[markerData.layer].removeLayer(marker); - marker.setLatLng([markerData.lat, markerData.lng]); - layers.overlays[markerData.layer].addLayer(marker); - } else if ((markerData.lat !== oldMarkerData.lat) || (markerData.lng !== oldMarkerData.lng)) { - // The marker was moved programatically - layers.overlays[markerData.layer].removeLayer(marker); - marker.setLatLng([markerData.lat, markerData.lng]); - layers.overlays[markerData.layer].addLayer(marker); - } else if (isObject(markerData.icon) && isObject(oldMarkerData.icon) && !angular.equals(markerData.icon, oldMarkerData.icon)) { - layers.overlays[markerData.layer].removeLayer(marker); - layers.overlays[markerData.layer].addLayer(marker); - } - } - } else if (markerLatLng.lat !== markerData.lat || markerLatLng.lng !== markerData.lng) { - marker.setLatLng([markerData.lat, markerData.lng]); - } - }; - - return { - resetMarkerGroup: _resetMarkerGroup, - - resetMarkerGroups: _resetMarkerGroups, - - deleteMarker: _deleteMarker, - - manageOpenPopup: _manageOpenPopup, - - manageOpenLabel: _manageOpenLabel, - - createMarker: function(markerData) { - if (!isDefined(markerData) || !geoHlp.validateCoords(markerData)) { - $log.error(errorHeader + 'The marker definition is not valid.'); - return; - } - - var coords = geoHlp.getCoords(markerData); - - if (!isDefined(coords)) { - $log.error(errorHeader + 'Unable to get coordinates from markerData.'); - return; - } - - var markerOptions = { - icon: createLeafletIcon(markerData.icon), - title: isDefined(markerData.title) ? markerData.title : '', - draggable: isDefined(markerData.draggable) ? markerData.draggable : false, - clickable: isDefined(markerData.clickable) ? markerData.clickable : true, - riseOnHover: isDefined(markerData.riseOnHover) ? markerData.riseOnHover : false, - zIndexOffset: isDefined(markerData.zIndexOffset) ? markerData.zIndexOffset : 0, - iconAngle: isDefined(markerData.iconAngle) ? markerData.iconAngle : 0, - }; - - // Add any other options not added above to markerOptions - for (var markerDatum in markerData) { - if (markerData.hasOwnProperty(markerDatum) && !markerOptions.hasOwnProperty(markerDatum)) { - markerOptions[markerDatum] = markerData[markerDatum]; - } - } - - var marker = new L.marker(coords, markerOptions); - - if (!isString(markerData.message)) { - marker.unbindPopup(); - } - - return marker; - }, - - addMarkerToGroup: function(marker, groupName, groupOptions, map) { - if (!isString(groupName)) { - $log.error(errorHeader + 'The marker group you have specified is invalid.'); - return; - } - - if (!MarkerClusterPlugin.isLoaded()) { - $log.error(errorHeader + 'The MarkerCluster plugin is not loaded.'); - return; - } - - if (!isDefined(groups[groupName])) { - groups[groupName] = new L.MarkerClusterGroup(groupOptions); - map.addLayer(groups[groupName]); - } - - groups[groupName].addLayer(marker); - }, - - listenMarkerEvents: function(marker, markerData, leafletScope, doWatch, map) { - marker.on('popupopen', function(/* event */) { - safeApply(leafletScope, function() { - if (isDefined(marker._popup) || isDefined(marker._popup._contentNode)) { - markerData.focus = true; - _manageOpenPopup(marker, markerData, map);//needed since markerData is now a copy - } - }); - }); - - marker.on('popupclose', function(/* event */) { - safeApply(leafletScope, function() { - markerData.focus = false; - }); - }); - - marker.on('add', function(/* event */) { - safeApply(leafletScope, function() { - if ('label' in markerData) - _manageOpenLabel(marker, markerData); - }); - }); - }, - - updateMarker: _updateMarker, - - addMarkerWatcher: function(marker, name, leafletScope, layers, map, isDeepWatch) { - var markerWatchPath = Helpers.getObjectArrayPath('markers.' + name); - isDeepWatch = defaultTo(isDeepWatch, true); - - var clearWatch = leafletScope.$watch(markerWatchPath, function(markerData, oldMarkerData) { - if (!isDefined(markerData)) { - _deleteMarker(marker, map, layers); - clearWatch(); - return; - } - - _updateMarker(markerData, oldMarkerData, marker, name, leafletScope, layers, map); - }, isDeepWatch); - }, - - string: _string, - log: _log, - }; -}]); - -angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope", "$log", "leafletHelpers", function($rootScope, $log, leafletHelpers) { - var isDefined = leafletHelpers.isDefined; - var isArray = leafletHelpers.isArray; - var isNumber = leafletHelpers.isNumber; - var isValidPoint = leafletHelpers.isValidPoint; - - var availableOptions = [ - - // Path options - 'stroke', 'weight', 'color', 'opacity', - 'fill', 'fillColor', 'fillOpacity', - 'dashArray', 'lineCap', 'lineJoin', 'clickable', - 'pointerEvents', 'className', - - // Polyline options - 'smoothFactor', 'noClip', - ]; - function _convertToLeafletLatLngs(latlngs) { - return latlngs.filter(function(latlng) { - return isValidPoint(latlng); - }).map(function(latlng) { - return _convertToLeafletLatLng(latlng); - }); - } - - function _convertToLeafletLatLng(latlng) { - if (isArray(latlng)) { - return new L.LatLng(latlng[0], latlng[1]); - } else { - return new L.LatLng(latlng.lat, latlng.lng); - } - } - - function _convertToLeafletMultiLatLngs(paths) { - return paths.map(function(latlngs) { - return _convertToLeafletLatLngs(latlngs); - }); - } - - function _getOptions(path, defaults) { - var options = {}; - for (var i = 0; i < availableOptions.length; i++) { - var optionName = availableOptions[i]; - - if (isDefined(path[optionName])) { - options[optionName] = path[optionName]; - } else if (isDefined(defaults.path[optionName])) { - options[optionName] = defaults.path[optionName]; - } - } - - return options; - } - - var _updatePathOptions = function(path, data) { - var updatedStyle = {}; - for (var i = 0; i < availableOptions.length; i++) { - var optionName = availableOptions[i]; - if (isDefined(data[optionName])) { - updatedStyle[optionName] = data[optionName]; - } - } - - path.setStyle(data); - }; - - var _isValidPolyline = function(latlngs) { - if (!isArray(latlngs)) { - return false; - } - - for (var i = 0; i < latlngs.length; i++) { - var point = latlngs[i]; - if (!isValidPoint(point)) { - return false; - } - } - - return true; - }; - - var pathTypes = { - polyline: { - isValid: function(pathData) { - var latlngs = pathData.latlngs; - return _isValidPolyline(latlngs); - }, - - createPath: function(options) { - return new L.Polyline([], options); - }, - - setPath: function(path, data) { - path.setLatLngs(_convertToLeafletLatLngs(data.latlngs)); - _updatePathOptions(path, data); - return; - }, - }, - multiPolyline: { - isValid: function(pathData) { - var latlngs = pathData.latlngs; - if (!isArray(latlngs)) { - return false; - } - - for (var i in latlngs) { - var polyline = latlngs[i]; - if (!_isValidPolyline(polyline)) { - return false; - } - } - - return true; - }, - - createPath: function(options) { - return new L.multiPolyline([[[0, 0], [1, 1]]], options); - }, - - setPath: function(path, data) { - path.setLatLngs(_convertToLeafletMultiLatLngs(data.latlngs)); - _updatePathOptions(path, data); - return; - }, - }, - polygon: { - isValid: function(pathData) { - var latlngs = pathData.latlngs; - return _isValidPolyline(latlngs); - }, - - createPath: function(options) { - return new L.Polygon([], options); - }, - - setPath: function(path, data) { - path.setLatLngs(_convertToLeafletLatLngs(data.latlngs)); - _updatePathOptions(path, data); - return; - }, - }, - multiPolygon: { - isValid: function(pathData) { - var latlngs = pathData.latlngs; - - if (!isArray(latlngs)) { - return false; - } - - for (var i in latlngs) { - var polyline = latlngs[i]; - if (!_isValidPolyline(polyline)) { - return false; - } - } - - return true; - }, - - createPath: function(options) { - return new L.MultiPolygon([[[0, 0], [1, 1], [0, 1]]], options); - }, - - setPath: function(path, data) { - path.setLatLngs(_convertToLeafletMultiLatLngs(data.latlngs)); - _updatePathOptions(path, data); - return; - }, - }, - rectangle: { - isValid: function(pathData) { - var latlngs = pathData.latlngs; - - if (!isArray(latlngs) || latlngs.length !== 2) { - return false; - } - - for (var i in latlngs) { - var point = latlngs[i]; - if (!isValidPoint(point)) { - return false; - } - } - - return true; - }, - - createPath: function(options) { - return new L.Rectangle([[0, 0], [1, 1]], options); - }, - - setPath: function(path, data) { - path.setBounds(new L.LatLngBounds(_convertToLeafletLatLngs(data.latlngs))); - _updatePathOptions(path, data); - }, - }, - circle: { - isValid: function(pathData) { - var point = pathData.latlngs; - return isValidPoint(point) && isNumber(pathData.radius); - }, - - createPath: function(options) { - return new L.Circle([0, 0], 1, options); - }, - - setPath: function(path, data) { - path.setLatLng(_convertToLeafletLatLng(data.latlngs)); - if (isDefined(data.radius)) { - path.setRadius(data.radius); - } - - _updatePathOptions(path, data); - }, - }, - circleMarker: { - isValid: function(pathData) { - var point = pathData.latlngs; - return isValidPoint(point) && isNumber(pathData.radius); - }, - - createPath: function(options) { - return new L.CircleMarker([0, 0], options); - }, - - setPath: function(path, data) { - path.setLatLng(_convertToLeafletLatLng(data.latlngs)); - if (isDefined(data.radius)) { - path.setRadius(data.radius); - } - - _updatePathOptions(path, data); - }, - }, - }; - - var _getPathData = function(path) { - var pathData = {}; - if (path.latlngs) { - pathData.latlngs = path.latlngs; - } - - if (path.radius) { - pathData.radius = path.radius; - } - - return pathData; - }; - - return { - setPathOptions: function(leafletPath, pathType, data) { - if (!isDefined(pathType)) { - pathType = 'polyline'; - } - - pathTypes[pathType].setPath(leafletPath, data); - }, - - createPath: function(name, path, defaults) { - if (!isDefined(path.type)) { - path.type = 'polyline'; - } - - var options = _getOptions(path, defaults); - var pathData = _getPathData(path); - - if (!pathTypes[path.type].isValid(pathData)) { - $log.error('[AngularJS - Leaflet] Invalid data passed to the ' + path.type + ' path'); - return; - } - - return pathTypes[path.type].createPath(options); - }, - }; -}]); - -angular.module('leaflet-directive') -.service('leafletWatchHelpers', function() { - - var _maybe = function(scope, watchFunctionName, thingToWatchStr, watchOptions, initCb) { - //watchOptions.isDeep is/should be ignored in $watchCollection - var unWatch = scope[watchFunctionName](thingToWatchStr, function(newValue, oldValue) { - initCb(newValue, oldValue); - if (!watchOptions.doWatch) - unWatch(); - }, watchOptions.isDeep); - - return unWatch; - }; - - /* - @name: maybeWatch - @description: Utility to watch something once or forever. - @returns unWatch function - @param watchOptions - see markersWatchOptions and or derrivatives. This object is used - to set watching to once and its watch depth. - */ - var _maybeWatch = function(scope, thingToWatchStr, watchOptions, initCb) { - return _maybe(scope, '$watch', thingToWatchStr, watchOptions, initCb); - }; - - /* - @name: _maybeWatchCollection - @description: Utility to watch something once or forever. - @returns unWatch function - @param watchOptions - see markersWatchOptions and or derrivatives. This object is used - to set watching to once and its watch depth. - */ - var _maybeWatchCollection = function(scope, thingToWatchStr, watchOptions, initCb) { - return _maybe(scope, '$watchCollection', thingToWatchStr, watchOptions, initCb); - }; - - return { - maybeWatch: _maybeWatch, - maybeWatchCollection: _maybeWatchCollection, - }; -}); - -angular.module('leaflet-directive').factory('nominatimService', ["$q", "$http", "leafletHelpers", "leafletMapDefaults", function($q, $http, leafletHelpers, leafletMapDefaults) { - var isDefined = leafletHelpers.isDefined; - - return { - query: function(address, mapId) { - var defaults = leafletMapDefaults.getDefaults(mapId); - var url = defaults.nominatim.server; - var df = $q.defer(); - - $http.get(url, { params: { format: 'json', limit: 1, q: address } }).success(function(data) { - if (data.length > 0 && isDefined(data[0].boundingbox)) { - df.resolve(data[0]); - } else { - df.reject('[Nominatim] Invalid address'); - } - }); - - return df.promise; - }, - }; -}]); - -angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$http", "leafletHelpers", "nominatimService", "leafletBoundsHelpers", function($log, $timeout, $http, leafletHelpers, nominatimService, leafletBoundsHelpers) { - - return { - restrict: 'A', - scope: false, - replace: false, - require: ['leaflet'], - - link: function(scope, element, attrs, controller) { - var isDefined = leafletHelpers.isDefined; - 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 && - bounds._northEast.lat === 0 && bounds._northEast.lng === 0); - }; - - mapController.getMap().then(function(map) { - leafletScope.$on('boundsChanged', function(event) { - var scope = event.currentScope; - var bounds = map.getBounds(); - - if (emptyBounds(bounds) || scope.settingBoundsFromScope) { - return; - } - - scope.settingBoundsFromLeaflet = true; - var newScopeBounds = { - northEast: { - lat: bounds._northEast.lat, - lng: bounds._northEast.lng, - }, - southWest: { - lat: bounds._southWest.lat, - lng: bounds._southWest.lng, - }, - options: bounds.options, - }; - if (!angular.equals(scope.bounds, newScopeBounds)) { - scope.bounds = newScopeBounds; - } - - $timeout(function() { - scope.settingBoundsFromLeaflet = false; - }); - }); - - var lastNominatimQuery; - leafletScope.$watch('bounds', function(bounds) { - if (scope.settingBoundsFromLeaflet) - return; - if (isDefined(bounds.address) && bounds.address !== lastNominatimQuery) { - scope.settingBoundsFromScope = true; - nominatimService.query(bounds.address, attrs.id).then(function(data) { - var b = data.boundingbox; - var newBounds = [[b[0], b[2]], [b[1], b[3]]]; - map.fitBounds(newBounds); - }, function(errMsg) { - - $log.error(errorHeader + ' ' + errMsg + '.'); - }); - - lastNominatimQuery = bounds.address; - $timeout(function() { - scope.settingBoundsFromScope = false; - }); - - return; - } - - var leafletBounds = createLeafletBounds(bounds); - if (leafletBounds && !map.getBounds().equals(leafletBounds)) { - scope.settingBoundsFromScope = true; - map.fitBounds(leafletBounds, bounds.options); - $timeout(function() { - scope.settingBoundsFromScope = false; - }); - } - }, true); - }); - }, - }; -}]); - -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) { - - 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 _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(); - var centerModel = leafletScope[directiveName]; - - 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, - }); - }); - - 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)) { - $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; - }; - - urlCenterHash = extractCenterFromUrl(); - - 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, - }); - } - }); - } - - leafletScope.$watch(directiveName, 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; - } - - if (!isValidCenter(center) && center.autoDiscover !== true) { - $log.warn(errorHeader + ' invalid \'center\''); - - //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 (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; - } - - if (mapReady && isSameCenterOnMap(center, map)) { - //$log.debug("no need to update map again."); - 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 = false; - - //$log.debug("allow center scope updates"); - }); - }, 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()); - - //$log.debug("updated center on map..."); - if (isSameCenterOnMap(centerModel, map) || leafletScope.settingCenterFromScope) { - //$log.debug("same center in model, no need to update again."); - return; - } - - 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, - }); - } - - 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); - } - }); - } - }); - }, - }; - }, - ]; -}); - -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) { - - return { - restrict: 'A', - scope: false, - replace: false, - require: '?^leaflet', - - link: function(scope, element, attrs, controller) { - if (!controller) { - return; - } - - var createControl = leafletControlHelpers.createControl; - var isValidControlType = leafletControlHelpers.isValidControlType; - var leafletScope = controller.getLeafletScope(); - var isDefined = leafletHelpers.isDefined; - var isArray = leafletHelpers.isArray; - var leafletControls = {}; - var errorHeader = leafletHelpers.errorHeader + ' [Controls] '; - - controller.getMap().then(function(map) { - - leafletScope.$watchCollection('controls', function(newControls) { - - // Delete controls from the array - for (var name in leafletControls) { - if (!isDefined(newControls[name])) { - if (map.hasControl(leafletControls[name])) { - map.removeControl(leafletControls[name]); - } - - delete leafletControls[name]; - } - } - - for (var newName in newControls) { - var control; - - var controlType = isDefined(newControls[newName].type) ? newControls[newName].type : newName; - - if (!isValidControlType(controlType)) { - $log.error(errorHeader + ' Invalid control type: ' + controlType + '.'); - return; - } - - if (controlType !== 'custom') { - control = createControl(controlType, newControls[newName]); - map.addControl(control); - leafletControls[newName] = control; - } else { - var customControlValue = newControls[newName]; - if (isArray(customControlValue)) { - for (var i in customControlValue) { - var customControl = customControlValue[i]; - map.addControl(customControl); - leafletControls[newName] = !isDefined(leafletControls[newName]) ? [customControl] : leafletControls[newName].concat([customControl]); - } - } else { - map.addControl(customControlValue); - leafletControls[newName] = customControlValue; - } - } - } - - }); - - }); - }, - }; -}]); - -angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHelpers", function($log, leafletHelpers) { - - return { - restrict: 'A', - scope: false, - replace: false, - require: 'leaflet', - - link: function(scope, element, attrs, controller) { - var leafletScope = controller.getLeafletScope(); - var PolylineDecoratorPlugin = leafletHelpers.PolylineDecoratorPlugin; - var isDefined = leafletHelpers.isDefined; - var leafletDecorations = {}; - - /* Creates an "empty" decoration with a set of coordinates, but no pattern. */ - function createDecoration(options) { - if (isDefined(options) && isDefined(options.coordinates)) { - if (!PolylineDecoratorPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.'); - } - } - - return L.polylineDecorator(options.coordinates); - } - - /* Updates the path and the patterns for the provided decoration, and returns the decoration. */ - function setDecorationOptions(decoration, options) { - if (isDefined(decoration) && isDefined(options)) { - if (isDefined(options.coordinates) && isDefined(options.patterns)) { - decoration.setPaths(options.coordinates); - decoration.setPatterns(options.patterns); - return decoration; - } - } - } - - controller.getMap().then(function(map) { - leafletScope.$watch('decorations', function(newDecorations) { - for (var name in leafletDecorations) { - if (!isDefined(newDecorations[name]) || !angular.equals(newDecorations[name], leafletDecorations)) { - map.removeLayer(leafletDecorations[name]); - delete leafletDecorations[name]; - } - } - - for (var newName in newDecorations) { - var decorationData = newDecorations[newName]; - var newDecoration = createDecoration(decorationData); - - if (isDefined(newDecoration)) { - leafletDecorations[newName] = newDecoration; - map.addLayer(newDecoration); - setDecorationOptions(newDecoration, decorationData); - } - } - }, true); - }); - }, - }; -}]); - -angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootScope", "leafletHelpers", "leafletMapEvents", "leafletIterators", function($log, $rootScope, leafletHelpers, leafletMapEvents, leafletIterators) { - - return { - restrict: 'A', - scope: false, - replace: false, - require: 'leaflet', - - link: function(scope, element, attrs, controller) { - var isObject = leafletHelpers.isObject; - var isDefined = leafletHelpers.isDefined; - var leafletScope = controller.getLeafletScope(); - var eventBroadcast = leafletScope.eventBroadcast; - var availableMapEvents = leafletMapEvents.getAvailableMapEvents(); - var addEvents = leafletMapEvents.addEvents; - - controller.getMap().then(function(map) { - - var mapEvents = []; - var logic = 'broadcast'; - - // We have a possible valid object - if (!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.'); - } 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\'.'); - } 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.'); - } else { - // Enable events - leafletIterators.each(eventBroadcast.map.enable, function(eventName) { - // Do we have already the event enabled? - if (mapEvents.indexOf(eventName) === -1 && availableMapEvents.indexOf(eventName) !== -1) { - mapEvents.push(eventName); - } - }); - } - - } - - // as long as the map is removed in the root leaflet directive we - // do not need ot clean up the events as leaflet does it itself - addEvents(map, mapEvents, 'eventName', leafletScope, logic); - }); - }, - }; -}]); - -angular.module('leaflet-directive') -.directive('geojson', ["$log", "$rootScope", "leafletData", "leafletHelpers", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", "leafletIterators", "leafletGeoJsonEvents", function($log, $rootScope, leafletData, leafletHelpers, - leafletWatchHelpers, leafletDirectiveControlsHelpers, leafletIterators, leafletGeoJsonEvents) { - var _maybeWatch = leafletWatchHelpers.maybeWatch; - var _watchOptions = leafletHelpers.watchOptions; - var _extendDirectiveControls = leafletDirectiveControlsHelpers.extend; - var hlp = leafletHelpers; - var $it = leafletIterators; - - return { - restrict: 'A', - scope: false, - replace: false, - require: 'leaflet', - - link: function(scope, element, attrs, controller) { - var isDefined = leafletHelpers.isDefined; - var leafletScope = controller.getLeafletScope(); - var leafletGeoJSON = {}; - var _hasSetLeafletData = false; - - controller.getMap().then(function(map) { - var watchOptions = leafletScope.geojsonWatchOptions || _watchOptions; - - var _hookUpEvents = function(geojson, maybeName) { - var onEachFeature; - - if (angular.isFunction(geojson.onEachFeature)) { - onEachFeature = geojson.onEachFeature; - } else { - onEachFeature = function(feature, layer) { - if (leafletHelpers.LabelPlugin.isLoaded() && isDefined(feature.properties.description)) { - layer.bindLabel(feature.properties.description); - } - - leafletGeoJsonEvents.bindEvents(attrs.id, layer, null, feature, - leafletScope, maybeName, - {resetStyleOnMouseout: geojson.resetStyleOnMouseout, - mapId: attrs.id, }); - }; - } - - return onEachFeature; - }; - - var isNested = (hlp.isDefined(attrs.geojsonNested) && - hlp.isTruthy(attrs.geojsonNested)); - - var _clean = function() { - if (!leafletGeoJSON) - return; - var _remove = function(lObject) { - if (isDefined(lObject) && map.hasLayer(lObject)) { - map.removeLayer(lObject); - } - }; - - if (isNested) { - $it.each(leafletGeoJSON, function(lObject) { - _remove(lObject); - }); - - return; - } - - _remove(leafletGeoJSON); - }; - - var _addGeojson = function(model, maybeName) { - var geojson = angular.copy(model); - if (!(isDefined(geojson) && isDefined(geojson.data))) { - return; - } - - var onEachFeature = _hookUpEvents(geojson, maybeName); - - if (!isDefined(geojson.options)) { - //right here is why we use a clone / copy (we modify and thus) - //would kick of a watcher.. we need to be more careful everywhere - //for stuff like this - geojson.options = { - style: geojson.style, - filter: geojson.filter, - onEachFeature: onEachFeature, - pointToLayer: geojson.pointToLayer, - }; - } - - var lObject = L.geoJson(geojson.data, geojson.options); - - if (maybeName && hlp.isString(maybeName)) { - leafletGeoJSON[maybeName] = lObject; - } else { - leafletGeoJSON = lObject; - } - - lObject.addTo(map); - - if (!_hasSetLeafletData) {//only do this once and play with the same ref forever - _hasSetLeafletData = true; - leafletData.setGeoJSON(leafletGeoJSON, attrs.id); - } - }; - - var _create = function(model) { - _clean(); - if (isNested) { - 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 - _addGeojson(m, name); - }); - - return; - } - - _addGeojson(model); - }; - - _extendDirectiveControls(attrs.id, 'geojson', _create, _clean); - - _maybeWatch(leafletScope, 'geojson', watchOptions, function(geojson) { - _create(geojson); - }); - }); - }, - }; -}]); - -angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log", "leafletData", "leafletHelpers", function($filter, $log, leafletData, leafletHelpers) { - - return { - restrict: 'E', - scope: { - icons: '=?', - autoHideOpacity: '=?', // Hide other opacity controls when one is activated. - showGroups: '=?', // Hide other opacity controls when one is activated. - title: '@', - baseTitle: '@', - overlaysTitle: '@', - }, - replace: true, - 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, { - baselayer: '', - oldGroup: '', - layerProperties: {}, - groupProperties: {}, - rangeIsSupported: leafletHelpers.rangeIsSupported(), - changeBaseLayer: function(key, e) { - leafletHelpers.safeApply($scope, function(scp) { - scp.baselayer = key; - leafletData.getMap().then(function(map) { - leafletData.getLayers().then(function(leafletLayers) { - if (map.hasLayer(leafletLayers.baselayers[key])) { - return; - } - - for (var i in scp.layers.baselayers) { - scp.layers.baselayers[i].icon = scp.icons.unradio; - if (map.hasLayer(leafletLayers.baselayers[i])) { - map.removeLayer(leafletLayers.baselayers[i]); - } - } - - map.addLayer(leafletLayers.baselayers[key]); - scp.layers.baselayers[key].icon = $scope.icons.radio; - }); - }); - }); - - e.preventDefault(); - }, - - moveLayer: function(ly, newIndex, e) { - var delta = Object.keys($scope.layers.baselayers).length; - if (newIndex >= (1 + delta) && newIndex <= ($scope.overlaysArray.length + delta)) { - var oldLy; - for (var key in $scope.layers.overlays) { - if ($scope.layers.overlays[key].index === newIndex) { - oldLy = $scope.layers.overlays[key]; - break; - } - } - - if (oldLy) { - safeApply($scope, function() { - oldLy.index = ly.index; - ly.index = newIndex; - }); - } - } - - e.stopPropagation(); - e.preventDefault(); - }, - - initIndex: function(layer, idx) { - var delta = Object.keys($scope.layers.baselayers).length; - layer.index = isDefined(layer.index) ? layer.index : idx + delta + 1; - }, - - initGroup: function(groupName) { - $scope.groupProperties[groupName] = $scope.groupProperties[groupName] ? $scope.groupProperties[groupName] : {}; - }, - - toggleOpacity: function(e, layer) { - if (layer.visible) { - if ($scope.autoHideOpacity && !$scope.layerProperties[layer.name].opacityControl) { - for (var k in $scope.layerProperties) { - $scope.layerProperties[k].opacityControl = false; - } - } - - $scope.layerProperties[layer.name].opacityControl = !$scope.layerProperties[layer.name].opacityControl; - } - - e.stopPropagation(); - e.preventDefault(); - }, - - toggleLegend: function(layer) { - $scope.layerProperties[layer.name].showLegend = !$scope.layerProperties[layer.name].showLegend; - }, - - showLegend: function(layer) { - return layer.legend && $scope.layerProperties[layer.name].showLegend; - }, - - unsafeHTML: function(html) { - return $sce.trustAsHtml(html); - }, - - getOpacityIcon: function(layer) { - return layer.visible && $scope.layerProperties[layer.name].opacityControl ? $scope.icons.close : $scope.icons.open; - }, - - getGroupIcon: function(group) { - return group.visible ? $scope.icons.check : $scope.icons.uncheck; - }, - - changeOpacity: function(layer) { - var op = $scope.layerProperties[layer.name].opacity; - leafletData.getMap().then(function(map) { - leafletData.getLayers().then(function(leafletLayers) { - var ly; - for (var k in $scope.layers.overlays) { - if ($scope.layers.overlays[k] === layer) { - ly = leafletLayers.overlays[k]; - break; - } - } - - if (map.hasLayer(ly)) { - if (ly.setOpacity) { - ly.setOpacity(op / 100); - } - - if (ly.getLayers && ly.eachLayer) { - ly.eachLayer(function(lay) { - if (lay.setOpacity) { - lay.setOpacity(op / 100); - } - }); - } - } - }); - }); - }, - - changeGroupVisibility: function(groupName) { - if (!isDefined($scope.groupProperties[groupName])) { - return; - } - - var visible = $scope.groupProperties[groupName].visible; - for (var k in $scope.layers.overlays) { - var layer = $scope.layers.overlays[k]; - if (layer.group === groupName) { - layer.visible = visible; - } - } - }, - }); - - var div = $element.get(0); - if (!L.Browser.touch) { - L.DomEvent.disableClickPropagation(div); - L.DomEvent.on(div, 'mousewheel', L.DomEvent.stopPropagation); - } else { - L.DomEvent.on(div, 'click', L.DomEvent.stopPropagation); - } - }], - - template: - '
' + - '

{{ title }}

' + - '
' + - '
{{ baseTitle }}
' + - '
' + - '' + - '
' + - '
' + - '
' + - '
{{ overlaysTitle }}
' + - '
' + - '
' + - '' + - '' + - '
' + - ' ' + - ' ' + - ' ' + - '' + - '
' + - '
' + - '
' + - '' + - '' + - '' + - '
Range is not supported in this browser
' + - '
' + - '
' + - '
' + - '
' + - '
', - link: function(scope, element, attrs, controller) { - var isDefined = leafletHelpers.isDefined; - var leafletScope = controller.getLeafletScope(); - var layers = leafletScope.layers; - - scope.$watch('icons', function() { - var defaultIcons = { - 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', - }; - if (isDefined(scope.icons)) { - angular.extend(defaultIcons, scope.icons); - angular.extend(scope.icons, defaultIcons); - } else { - scope.icons = defaultIcons; - } - }); - - // Setting layer stack order. - attrs.order = (isDefined(attrs.order) && (attrs.order === 'normal' || attrs.order === 'reverse')) ? attrs.order : 'normal'; - scope.order = attrs.order === 'normal'; - scope.orderNumber = attrs.order === 'normal' ? -1 : 1; - - scope.layers = layers; - controller.getMap().then(function(map) { - leafletScope.$watch('layers.baselayers', function(newBaseLayers) { - var baselayersArray = {}; - leafletData.getLayers().then(function(leafletLayers) { - var key; - for (key in newBaseLayers) { - var layer = newBaseLayers[key]; - layer.icon = scope.icons[map.hasLayer(leafletLayers.baselayers[key]) ? 'radio' : 'unradio']; - baselayersArray[key] = layer; - } - - scope.baselayersArray = baselayersArray; - }); - }); - - leafletScope.$watch('layers.overlays', function(newOverlayLayers) { - var overlaysArray = []; - var groupVisibleCount = {}; - leafletData.getLayers().then(function(leafletLayers) { - var key; - for (key in newOverlayLayers) { - var layer = newOverlayLayers[key]; - layer.icon = scope.icons[(layer.visible ? 'check' : 'uncheck')]; - overlaysArray.push(layer); - if (!isDefined(scope.layerProperties[layer.name])) { - scope.layerProperties[layer.name] = { - opacity: isDefined(layer.layerOptions.opacity) ? layer.layerOptions.opacity * 100 : 100, - opacityControl: false, - showLegend: true, - }; - } - - if (isDefined(layer.group)) { - if (!isDefined(scope.groupProperties[layer.group])) { - scope.groupProperties[layer.group] = { - visible: false, - }; - } - - groupVisibleCount[layer.group] = isDefined(groupVisibleCount[layer.group]) ? groupVisibleCount[layer.group] : { - count: 0, - visibles: 0, - }; - groupVisibleCount[layer.group].count++; - if (layer.visible) { - groupVisibleCount[layer.group].visibles++; - } - } - - if (isDefined(layer.index) && leafletLayers.overlays[key].setZIndex) { - leafletLayers.overlays[key].setZIndex(newOverlayLayers[key].index); - } - } - - for (key in groupVisibleCount) { - scope.groupProperties[key].visible = groupVisibleCount[key].visibles === groupVisibleCount[key].count; - } - - scope.overlaysArray = overlaysArray; - }); - }, true); - }); - }, - }; -}]); - -angular.module('leaflet-directive').directive('layers', ["$log", "$q", "leafletData", "leafletHelpers", "leafletLayerHelpers", "leafletControlHelpers", function($log, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) { - - return { - restrict: 'A', - scope: false, - replace: false, - require: 'leaflet', - controller: ["$scope", function($scope) { - $scope._leafletLayers = $q.defer(); - this.getLayers = function() { - return $scope._leafletLayers.promise; - }; - }], - - link: function(scope, element, attrs, controller) { - var isDefined = leafletHelpers.isDefined; - var leafletLayers = {}; - var leafletScope = controller.getLeafletScope(); - var layers = leafletScope.layers; - var createLayer = leafletLayerHelpers.createLayer; - var safeAddLayer = leafletLayerHelpers.safeAddLayer; - var safeRemoveLayer = leafletLayerHelpers.safeRemoveLayer; - var updateLayersControl = leafletControlHelpers.updateLayersControl; - var isLayersControlVisible = false; - - controller.getMap().then(function(map) { - - // We have baselayers to add to the map - scope._leafletLayers.resolve(leafletLayers); - leafletData.setLayers(leafletLayers, attrs.id); - - leafletLayers.baselayers = {}; - leafletLayers.overlays = {}; - - var mapId = attrs.id; - - // Setup all baselayers definitions - var oneVisibleLayer = false; - for (var layerName in layers.baselayers) { - var newBaseLayer = createLayer(layers.baselayers[layerName]); - if (!isDefined(newBaseLayer)) { - delete layers.baselayers[layerName]; - continue; - } - - leafletLayers.baselayers[layerName] = newBaseLayer; - - // Only add the visible layer to the map, layer control manages the addition to the map - // of layers in its control - if (layers.baselayers[layerName].top === true) { - safeAddLayer(map, leafletLayers.baselayers[layerName]); - oneVisibleLayer = true; - } - } - - // If there is no visible layer add first to the map - if (!oneVisibleLayer && Object.keys(leafletLayers.baselayers).length > 0) { - safeAddLayer(map, leafletLayers.baselayers[Object.keys(layers.baselayers)[0]]); - } - - // Setup the Overlays - for (layerName in layers.overlays) { - //if (layers.overlays[layerName].type === 'cartodb') { - // - //} - - var newOverlayLayer = createLayer(layers.overlays[layerName]); - if (!isDefined(newOverlayLayer)) { - delete layers.overlays[layerName]; - continue; - } - - leafletLayers.overlays[layerName] = newOverlayLayer; - - // Only add the visible overlays to the map - if (layers.overlays[layerName].visible === true) { - safeAddLayer(map, leafletLayers.overlays[layerName]); - } - } - - // Watch for the base layers - leafletScope.$watch('layers.baselayers', function(newBaseLayers, oldBaseLayers) { - if (angular.equals(newBaseLayers, oldBaseLayers)) { - isLayersControlVisible = updateLayersControl(map, mapId, isLayersControlVisible, newBaseLayers, layers.overlays, leafletLayers); - return true; - } - - // Delete layers from the array - for (var name in leafletLayers.baselayers) { - if (!isDefined(newBaseLayers[name]) || newBaseLayers[name].doRefresh) { - // Remove from the map if it's on it - if (map.hasLayer(leafletLayers.baselayers[name])) { - map.removeLayer(leafletLayers.baselayers[name]); - } - - delete leafletLayers.baselayers[name]; - - if (newBaseLayers[name] && newBaseLayers[name].doRefresh) { - newBaseLayers[name].doRefresh = false; - } - } - } - - // add new layers - for (var newName in newBaseLayers) { - if (!isDefined(leafletLayers.baselayers[newName])) { - var testBaseLayer = createLayer(newBaseLayers[newName]); - if (isDefined(testBaseLayer)) { - leafletLayers.baselayers[newName] = testBaseLayer; - - // Only add the visible layer to the map - if (newBaseLayers[newName].top === true) { - safeAddLayer(map, leafletLayers.baselayers[newName]); - } - } - } else { - if (newBaseLayers[newName].top === true && !map.hasLayer(leafletLayers.baselayers[newName])) { - safeAddLayer(map, leafletLayers.baselayers[newName]); - } else if (newBaseLayers[newName].top === false && map.hasLayer(leafletLayers.baselayers[newName])) { - map.removeLayer(leafletLayers.baselayers[newName]); - } - } - } - - //we have layers, so we need to make, at least, one active - var found = false; - - // search for an active layer - for (var key in leafletLayers.baselayers) { - if (map.hasLayer(leafletLayers.baselayers[key])) { - found = true; - break; - } - } - - // If there is no active layer make one active - if (!found && Object.keys(leafletLayers.baselayers).length > 0) { - safeAddLayer(map, leafletLayers.baselayers[Object.keys(leafletLayers.baselayers)[0]]); - } - - // Only show the layers switch selector control if we have more than one baselayer + overlay - isLayersControlVisible = updateLayersControl(map, mapId, isLayersControlVisible, newBaseLayers, layers.overlays, leafletLayers); - }, true); - - // Watch for the overlay layers - leafletScope.$watch('layers.overlays', function(newOverlayLayers, oldOverlayLayers) { - if (angular.equals(newOverlayLayers, oldOverlayLayers)) { - isLayersControlVisible = updateLayersControl(map, mapId, isLayersControlVisible, layers.baselayers, newOverlayLayers, leafletLayers); - return true; - } - - // Delete layers from the array - for (var name in leafletLayers.overlays) { - if (!isDefined(newOverlayLayers[name]) || newOverlayLayers[name].doRefresh) { - // Remove from the map if it's on it - if (map.hasLayer(leafletLayers.overlays[name])) { - // Safe remove when ArcGIS layers is loading. - var options = isDefined(newOverlayLayers[name]) ? - newOverlayLayers[name].layerOptions : null; - safeRemoveLayer(map, leafletLayers.overlays[name], options); - } - - // TODO: Depending on the layer type we will have to delete what's included on it - delete leafletLayers.overlays[name]; - - if (newOverlayLayers[name] && newOverlayLayers[name].doRefresh) { - newOverlayLayers[name].doRefresh = false; - } - } - } - - // add new overlays - for (var newName in newOverlayLayers) { - if (!isDefined(leafletLayers.overlays[newName])) { - var testOverlayLayer = createLayer(newOverlayLayers[newName]); - if (!isDefined(testOverlayLayer)) { - // If the layer creation fails, continue to the next overlay - continue; - } - - leafletLayers.overlays[newName] = testOverlayLayer; - if (newOverlayLayers[newName].visible === true) { - safeAddLayer(map, leafletLayers.overlays[newName]); - } - } else { - // check for the .visible property to hide/show overLayers - if (newOverlayLayers[newName].visible && !map.hasLayer(leafletLayers.overlays[newName])) { - safeAddLayer(map, leafletLayers.overlays[newName]); - } else if (newOverlayLayers[newName].visible === false && map.hasLayer(leafletLayers.overlays[newName])) { - // Safe remove when ArcGIS layers is loading. - safeRemoveLayer(map, leafletLayers.overlays[newName], newOverlayLayers[newName].layerOptions); - } - } - - //refresh heatmap data if present - if (newOverlayLayers[newName].visible && map._loaded && newOverlayLayers[newName].data && newOverlayLayers[newName].type === 'heatmap') { - leafletLayers.overlays[newName].setData(newOverlayLayers[newName].data); - leafletLayers.overlays[newName].update(); - } - } - - // Only add the layers switch selector control if we have more than one baselayer + overlay - isLayersControlVisible = updateLayersControl(map, mapId, isLayersControlVisible, layers.baselayers, newOverlayLayers, leafletLayers); - }, true); - }); - }, - }; -}]); - -angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafletHelpers", "leafletLegendHelpers", function($log, $http, leafletHelpers, leafletLegendHelpers) { - - return { - restrict: 'A', - scope: false, - replace: false, - require: 'leaflet', - - link: function(scope, element, attrs, controller) { - - var isArray = leafletHelpers.isArray; - var isDefined = leafletHelpers.isDefined; - var isFunction = leafletHelpers.isFunction; - var leafletScope = controller.getLeafletScope(); - var legend = leafletScope.legend; - - var legendClass; - var position; - var leafletLegend; - var type; - - leafletScope.$watch('legend', function(newLegend) { - - if (isDefined(newLegend)) { - - legendClass = newLegend.legendClass ? newLegend.legendClass : 'legend'; - - position = newLegend.position || 'bottomright'; - - // default to arcgis - type = newLegend.type || 'arcgis'; - } - - }, true); - - controller.getMap().then(function(map) { - - leafletScope.$watch('legend', function(newLegend) { - - if (!isDefined(newLegend)) { - - if (isDefined(leafletLegend)) { - leafletLegend.removeFrom(map); - leafletLegend = null; - } - - return; - } - - 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.'); - - return; - } - - if (isDefined(newLegend.url)) { - - $log.info('[AngularJS - Leaflet] loading legend service.'); - - return; - } - - if (isDefined(leafletLegend)) { - leafletLegend.removeFrom(map); - leafletLegend = null; - } - - leafletLegend = L.control({ - position: position, - }); - if (type === 'arcgis') { - leafletLegend.onAdd = leafletLegendHelpers.getOnAddArrayLegend(newLegend, legendClass); - } - - leafletLegend.addTo(map); - - }); - - leafletScope.$watch('legend.url', function(newURL) { - - if (!isDefined(newURL)) { - 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); - } - - if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) { - legend.loadedData(); - } - }) - .error(function() { - $log.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($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]; - } - - return leafletMarkers[name]; - }; - - var _setLMarker = function(lObject, leafletMarkers, name, maybeLayerName) { - if (maybeLayerName && isString(maybeLayerName)) { - if (!isDefined(leafletMarkers[maybeLayerName])) - leafletMarkers[maybeLayerName] = {}; - leafletMarkers[maybeLayerName][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; - } - - 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 (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) { - $log.error(errorHeader + ' A marker can only be added to a layer of type "group"'); - 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; - } - - // The marker goes to a correct layer group, so first of all we add it - layerGroup.addLayer(marker); - - // 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(); - } - - return true; - }; - - //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; - - if (newName.search('-') !== -1) { - $log.error('The marker can\'t use a "-" on his key name: "' + 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; - } - - _setLMarker(marker, leafletMarkers, newName, maybeLayerName); - - // Bind message - if (isDefined(model.message)) { - marker.bindPopup(model.message, model.popupOptions); - } - - // 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); - } - - // Show label if defined - if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) { - marker.bindLabel(model.label.message, model.label.options); - } - - // 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(); - } - } - - 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; - var newMarker; - - var doCheckOldModel = isDefined(oldMarkerModels); - for (var name in lMarkers) { - if (!hasLogged) { - $log.debug(errorHeader + '[markers] destroy: '); - hasLogged = true; - } - - if (doCheckOldModel) { - //might want to make the option (in watch options) to disable deep checking - //ie the options to only check !== (reference check) instead of angular.equals (slow) - newMarker = markerModels[name]; - oldMarker = oldMarkerModels[name]; - equals = angular.equals(newMarker, oldMarker) && isEqual; - } - - if (!isDefined(markerModels) || - !Object.keys(markerModels).length || - !isDefined(markerModels[name]) || - !Object.keys(markerModels[name]).length || - equals) { - if (cb && Helpers.isFunction(cb)) - cb(newMarker, oldMarker, name); - } - } - }; - - 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); - deleteMarker(lMarkers[lMarkerName], map, layers); - delete lMarkers[lMarkerName]; - }); - }; - - 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); - skips[lMarkerName] = newMarker; - }); - - return skips; - }; - - return { - restrict: 'A', - scope: false, - replace: false, - require: ['leaflet', '?layers'], - - link: function(scope, element, attrs, controller) { - var mapController = controller[0]; - var leafletScope = mapController.getLeafletScope(); - - mapController.getMap().then(function(map) { - var leafletMarkers = {}; - var getLayers; - - // If the layers attribute is used, we must wait until the layers are created - if (isDefined(controller[1])) { - getLayers = controller[1].getLayers; - } else { - getLayers = function() { - var deferred = $q.defer(); - deferred.resolve(); - return deferred.promise; - }; - } - - var watchOptions = leafletScope.markersWatchOptions || _markersWatchOptions; - - // backwards compat - 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)); - - getLayers().then(function(layers) { - var _clean = function(models, oldModels) { - if (isNested) { - $it.each(models, function(markerToMaybeDel, layerName) { - var oldModel = isDefined(oldModel) ? oldModels[layerName] : undefined; - _destroy(markerToMaybeDel, oldModel, leafletMarkers[layerName], map, layers); - }); - - return; - } - - _destroy(models, oldModels, leafletMarkers, map, layers); - }; - - var _create = function(models, oldModels) { - _clean(models, oldModels); - var skips = null; - if (isNested) { - $it.each(models, function(markersToAdd, layerName) { - var oldModel = isDefined(oldModel) ? oldModels[layerName] : undefined; - skips = _getNewModelsToSkipp(models[layerName], oldModel, leafletMarkers[layerName]); - _addMarkers(attrs.id, markersToAdd, oldModels, map, layers, leafletMarkers, leafletScope, - watchOptions, layerName, skips); - }); - - return; - } - - skips = _getNewModelsToSkipp(models, oldModels, leafletMarkers); - _addMarkers(attrs.id, models, oldModels, map, layers, leafletMarkers, leafletScope, - watchOptions, undefined, skips); - }; - - extendDirectiveControls(attrs.id, 'markers', _create, _clean); - leafletData.setMarkers(leafletMarkers, attrs.id); - - maybeWatch(leafletScope, 'markers', watchOptions, function(newMarkers, oldMarkers) { - _create(newMarkers, oldMarkers); - }); - }); - }); - }, - }; - }]); - -angular.module('leaflet-directive').directive('maxbounds', ["$log", "leafletMapDefaults", "leafletBoundsHelpers", "leafletHelpers", function($log, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) { - - return { - restrict: 'A', - scope: false, - replace: false, - require: 'leaflet', - - link: function(scope, element, attrs, controller) { - var leafletScope = controller.getLeafletScope(); - var isValidBounds = leafletBoundsHelpers.isValidBounds; - var isNumber = leafletHelpers.isNumber; - - controller.getMap().then(function(map) { - leafletScope.$watch('maxbounds', function(maxbounds) { - if (!isValidBounds(maxbounds)) { - // Unset any previous maxbounds - map.setMaxBounds(); - return; - } - - var leafletBounds = leafletBoundsHelpers.createLeafletBounds(maxbounds); - if (isNumber(maxbounds.pad)) { - leafletBounds = leafletBounds.pad(maxbounds.pad); - } - - map.setMaxBounds(leafletBounds); - if (!attrs.center && !attrs.lfCenter) { - map.fitBounds(leafletBounds); - } - }); - }); - }, - }; -}]); - -angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletPathsHelpers", "leafletPathEvents", function($log, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletPathEvents) { - - return { - restrict: 'A', - scope: false, - replace: false, - require: ['leaflet', '?layers'], - - link: function(scope, element, attrs, controller) { - var mapController = controller[0]; - var isDefined = leafletHelpers.isDefined; - var isString = leafletHelpers.isString; - var leafletScope = mapController.getLeafletScope(); - var paths = leafletScope.paths; - var createPath = leafletPathsHelpers.createPath; - var bindPathEvents = leafletPathEvents.bindPathEvents; - var setPathOptions = leafletPathsHelpers.setPathOptions; - - mapController.getMap().then(function(map) { - var defaults = leafletMapDefaults.getDefaults(attrs.id); - var getLayers; - - // If the layers attribute is used, we must wait until the layers are created - if (isDefined(controller[1])) { - getLayers = controller[1].getLayers; - } else { - getLayers = function() { - var deferred = $q.defer(); - deferred.resolve(); - return deferred.promise; - }; - } - - if (!isDefined(paths)) { - return; - } - - getLayers().then(function(layers) { - - var leafletPaths = {}; - leafletData.setPaths(leafletPaths, attrs.id); - - // Should we watch for every specific marker on the map? - var shouldWatch = (!isDefined(attrs.watchPaths) || attrs.watchPaths === 'true'); - - // Function for listening every single path once created - var watchPathFn = function(leafletPath, name) { - var clearWatch = leafletScope.$watch('paths["' + name + '"]', function(pathData, old) { - if (!isDefined(pathData)) { - if (isDefined(old.layer)) { - for (var i in layers.overlays) { - var overlay = layers.overlays[i]; - overlay.removeLayer(leafletPath); - } - } - - map.removeLayer(leafletPath); - clearWatch(); - return; - } - - setPathOptions(leafletPath, pathData.type, pathData); - }, true); - }; - - leafletScope.$watchCollection('paths', function(newPaths) { - - // Delete paths (by name) from the array - for (var name in leafletPaths) { - if (!isDefined(newPaths[name])) { - map.removeLayer(leafletPaths[name]); - delete leafletPaths[name]; - } - } - - // Create the new paths - for (var newName in newPaths) { - if (newName.search('\\$') === 0) { - continue; - } - - if (newName.search('-') !== -1) { - $log.error('[AngularJS - Leaflet] The path name "' + newName + '" is not valid. It must not include "-" and a number.'); - continue; - } - - if (!isDefined(leafletPaths[newName])) { - var pathData = newPaths[newName]; - var newPath = createPath(newName, newPaths[newName], defaults); - - // bind popup if defined - if (isDefined(newPath) && isDefined(pathData.message)) { - newPath.bindPopup(pathData.message, pathData.popupOptions); - } - - // Show label if defined - if (leafletHelpers.LabelPlugin.isLoaded() && isDefined(pathData.label) && isDefined(pathData.label.message)) { - newPath.bindLabel(pathData.label.message, pathData.label.options); - } - - // Check if the marker should be added to a layer - if (isDefined(pathData) && isDefined(pathData.layer)) { - - if (!isString(pathData.layer)) { - $log.error('[AngularJS - Leaflet] A layername must be a string'); - continue; - } - - if (!isDefined(layers)) { - $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.'); - 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"'); - 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"'); - continue; - } - - // Listen for changes on the new path - leafletPaths[newName] = newPath; - - // The path goes to a correct layer group, so first of all we add it - layerGroup.addLayer(newPath); - - if (shouldWatch) { - watchPathFn(newPath, newName); - } else { - setPathOptions(newPath, pathData.type, pathData); - } - } else if (isDefined(newPath)) { - // Listen for changes on the new path - leafletPaths[newName] = newPath; - map.addLayer(newPath); - - if (shouldWatch) { - watchPathFn(newPath, newName); - } else { - setPathOptions(newPath, pathData.type, pathData); - } - } - - bindPathEvents(attrs.id, newPath, newName, pathData, leafletScope); - } - } - }); - }); - }); - }, - }; -}]); - -angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "leafletMapDefaults", "leafletHelpers", function($log, leafletData, leafletMapDefaults, leafletHelpers) { - - return { - restrict: 'A', - scope: false, - replace: false, - require: 'leaflet', - - link: function(scope, element, attrs, controller) { - var isDefined = leafletHelpers.isDefined; - var leafletScope = controller.getLeafletScope(); - var tiles = leafletScope.tiles; - - if (!isDefined(tiles) || !isDefined(tiles.url)) { - $log.warn('[AngularJS - Leaflet] The \'tiles\' definition doesn\'t have the \'url\' property.'); - 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; - - // If no valid tiles are in the scope, remove the last layer - if (!isDefined(tiles.url) && isDefined(tileLayerObj)) { - map.removeLayer(tileLayerObj); - return; - } - - // No leafletTiles object defined yet - if (!isDefined(tileLayerObj)) { - if (isDefined(tiles.options)) { - angular.copy(tiles.options, tileLayerOptions); - } - - if (isDefined(tiles.url)) { - tileLayerUrl = tiles.url; - } - - if (tiles.type === 'wms') { - tileLayerObj = L.tileLayer.wms(tileLayerUrl, tileLayerOptions); - } else { - tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions); - } - - tileLayerObj.addTo(map); - leafletData.setTiles(tileLayerObj, attrs.id); - return; - } - - // If the options of the tilelayer is 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); - tileLayerOptions = defaults.tileLayerOptions; - angular.copy(tiles.options, tileLayerOptions); - tileLayerUrl = tiles.url; - - if (tiles.type === 'wms') { - tileLayerObj = L.tileLayer.wms(tileLayerUrl, tileLayerOptions); - } else { - tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions); - } - - tileLayerObj.addTo(map); - leafletData.setTiles(tileLayerObj, attrs.id); - return; - } - - // Only the URL of the layer is changed, update the tiles object - if (isDefined(tiles.url)) { - tileLayerObj.setUrl(tiles.url); - } - }, true); - }); - }, - }; -}]); - -/* - Create multiple similar directives for watchOptions to support directiveControl - instead. (when watches are disabled) - NgAnnotate does not work here due to the functional creation -*/ -['markers', 'geojson'].forEach(function(name) { - angular.module('leaflet-directive').directive(name + 'WatchOptions', [ - '$log', '$rootScope', '$q', 'leafletData', 'leafletHelpers', - function($log, $rootScope, $q, leafletData, leafletHelpers) { - - var isDefined = leafletHelpers.isDefined, - errorHeader = leafletHelpers.errorHeader, - isObject = leafletHelpers.isObject, - _watchOptions = leafletHelpers.watchOptions; - - return { - restrict: 'A', - scope: false, - replace: false, - require: ['leaflet'], - - link: function(scope, element, attrs, controller) { - var mapController = controller[0], - leafletScope = mapController.getLeafletScope(); - - mapController.getMap().then(function() { - if (isDefined(scope[name + 'WatchOptions'])) { - if (isObject(scope[name + 'WatchOptions'])) - angular.extend(_watchOptions, scope[name + 'WatchOptions']); - else - $log.error(errorHeader + '[' + name + 'WatchOptions] is not an object'); - leafletScope[name + 'WatchOptions'] = _watchOptions; - } - }); - }, - }; - }, ]); -}); - -angular.module('leaflet-directive') -.factory('LeafletEventsHelpersFactory', ["$rootScope", "$q", "$log", "leafletHelpers", function($rootScope, $q, $log, 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; - }; - - EventsHelper.prototype.getAvailableEvents = function() {return [];}; - - /* - argument: name: Note this can be a single string or dot notation - Example: - markerModel : { - m1: { lat:_, lon: _} - } - //would yield name of - name = "m1" - - If nested: - markerModel : { - cars: { - m1: { lat:_, lon: _} - } - } - //would yield name of - name = "cars.m1" - */ - EventsHelper.prototype.genDispatchEvent = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName, extra) { - var _this = this; - - maybeMapId = 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); - }; - }; - - EventsHelper.prototype.fire = function(scope, broadcastName, logic, event, lObject, model, modelName, layerName) { - // Safely broadcast the event - safeApply(scope, function() { - var toSend = { - leafletEvent: event, - leafletObject: lObject, - modelName: modelName, - model: model, - }; - if (isDefined(layerName)) - angular.extend(toSend, {layerName: layerName}); - - if (logic === 'emit') { - scope.$emit(broadcastName, toSend); - } else { - $rootScope.$broadcast(broadcastName, toSend); - } - }); - }; - - EventsHelper.prototype.bindEvents = function(maybeMapId, lObject, name, model, leafletScope, layerName, extra) { - var events = []; - var logic = 'emit'; - var _this = this; - - if (!isDefined(leafletScope.eventBroadcast)) { - // Backward compatibility, if no event-broadcast attribute, all events are broadcasted - events = this.getAvailableEvents(); - } else if (!isObject(leafletScope.eventBroadcast)) { - // Not a valid object - $log.error(errorHeader + 'event-broadcast must be an object check your model.'); - } else { - // We have a possible valid object - if (!isDefined(leafletScope.eventBroadcast[_this.lObjectType])) { - // We do not have events enable/disable do we do nothing (all enabled by default) - 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.'); - } 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\'.'); - } - - // Enable / Disable - var eventsEnable = false; - var eventsDisable = false; - if (isDefined(leafletScope.eventBroadcast[_this.lObjectType].enable) && - isArray(leafletScope.eventBroadcast[_this.lObjectType].enable)) - eventsEnable = true; - if (isDefined(leafletScope.eventBroadcast[_this.lObjectType].disable) && - 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'); - } else if (!eventsEnable && !eventsDisable) { - // Both are inactive, this is an error - $log.warn(errorHeader + 'must enable or disable events'); - } else { - // At this point the object is OK, lets enable or disable events - if (eventsEnable) { - // Enable events - leafletScope.eventBroadcast[this.lObjectType].enable.forEach(function(eventName) { - // 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'); - } 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'); - } else { - // All ok enable the event - events.push(eventName); - } - } - }); - } else { - // Disable events - events = this.getAvailableEvents(); - leafletScope.eventBroadcast[_this.lObjectType].disable.forEach(function(eventName) { - 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'); - - } else { - events.splice(index, 1); - } - }); - } - } - } - } - - events.forEach(function(eventName) { - lObject.on(eventName, _this.genDispatchEvent(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName, extra)); - }); - - return logic; - }; - - return EventsHelper; -}]) -.service('leafletEventsHelpers', ["LeafletEventsHelpersFactory", function(LeafletEventsHelpersFactory) { - return new LeafletEventsHelpersFactory(); -}]); - -angular.module('leaflet-directive') -.factory('leafletGeoJsonEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletData", function($rootScope, $q, $log, leafletHelpers, - LeafletEventsHelpersFactory, leafletData) { - var safeApply = leafletHelpers.safeApply; - var EventsHelper = LeafletEventsHelpersFactory; - - var GeoJsonEvents = function() { - EventsHelper.call(this, 'leafletDirectiveGeoJson', 'geojson'); - }; - - GeoJsonEvents.prototype = new EventsHelper(); - - GeoJsonEvents.prototype.genDispatchEvent = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName, extra) { - var base = EventsHelper.prototype.genDispatchEvent.call(this, maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName); - var _this = this; - - return function(e) { - if (eventName === 'mouseout') { - if (extra.resetStyleOnMouseout) { - leafletData.getGeoJSON(extra.mapId) - .then(function(leafletGeoJSON) { - //this is broken on nested needs to traverse or user layerName (nested) - var lobj = layerName ? leafletGeoJSON[layerName] : leafletGeoJSON; - lobj.resetStyle(e.target); - }); - - } - - safeApply(leafletScope, function() { - $rootScope.$broadcast(_this.rootBroadcastName + '.mouseout', e); - }); - } - - base(e); //common - }; - }; - - GeoJsonEvents.prototype.getAvailableEvents = function() { return [ - 'click', - 'dblclick', - 'mouseover', - 'mouseout', - ]; - }; - - return new GeoJsonEvents(); -}]); - -angular.module('leaflet-directive') -.factory('leafletLabelEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory) { - var Helpers = leafletHelpers; - var EventsHelper = LeafletEventsHelpersFactory; - - var LabelEvents = function() { - EventsHelper.call(this, 'leafletDirectiveLabel', 'markers'); - }; - - LabelEvents.prototype = new EventsHelper(); - - LabelEvents.prototype.genDispatchEvent = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName) { - var markerName = name.replace('markers.', ''); - return EventsHelper.prototype - .genDispatchEvent.call(this, maybeMapId, eventName, logic, leafletScope, lObject, markerName, model, layerName); - }; - - LabelEvents.prototype.getAvailableEvents = function() { - return [ - 'click', - 'dblclick', - 'mousedown', - 'mouseover', - 'mouseout', - 'contextmenu', - ]; - }; - - LabelEvents.prototype.genEvents = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName) { - var _this = this; - var labelEvents = this.getAvailableEvents(); - var scopeWatchName = Helpers.getObjectArrayPath('markers.' + name); - labelEvents.forEach(function(eventName) { - lObject.label.on(eventName, _this.genDispatchEvent( - maybeMapId, eventName, logic, leafletScope, lObject.label, scopeWatchName, model, layerName)); - }); - }; - - LabelEvents.prototype.bindEvents = function() {}; - - return new LabelEvents(); -}]); - -angular.module('leaflet-directive') -.factory('leafletMapEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletEventsHelpers", "leafletIterators", function($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers, leafletIterators) { - var isDefined = leafletHelpers.isDefined; - var fire = leafletEventsHelpers.fire; - - var _getAvailableMapEvents = 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', - ]; - }; - - var _genDispatchMapEvent = function(scope, eventName, logic, 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); - }; - }; - - var _notifyCenterChangedToBounds = function(scope) { - scope.$broadcast('boundsChanged'); - }; - - var _notifyCenterUrlHashChanged = function(scope, map, attrs, search) { - if (!isDefined(attrs.urlHashCenter)) { - return; - } - - 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); - } - }; - - var _addEvents = function(map, mapEvents, contextName, scope, logic) { - leafletIterators.each(mapEvents, function(eventName) { - var context = {}; - context[contextName] = eventName; - map.on(eventName, _genDispatchMapEvent(scope, eventName, logic, map._container.id || ''), context); - }); - }; - - return { - getAvailableMapEvents: _getAvailableMapEvents, - genDispatchMapEvent: _genDispatchMapEvent, - notifyCenterChangedToBounds: _notifyCenterChangedToBounds, - notifyCenterUrlHashChanged: _notifyCenterUrlHashChanged, - addEvents: _addEvents, - }; -}]); - -angular.module('leaflet-directive') -.factory('leafletMarkerEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletLabelEvents", function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory, leafletLabelEvents) { - var safeApply = leafletHelpers.safeApply; - var isDefined = leafletHelpers.isDefined; - var Helpers = leafletHelpers; - var lblHelp = leafletLabelEvents; - var EventsHelper = LeafletEventsHelpersFactory; - - var MarkerEvents = function() { - EventsHelper.call(this, 'leafletDirectiveMarker', 'markers'); - }; - - MarkerEvents.prototype = new EventsHelper(); - - MarkerEvents.prototype.genDispatchEvent = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName) { - var handle = EventsHelper.prototype - .genDispatchEvent.call(this, maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName); - return function(e) { - // Broadcast old marker click name for backwards compatibility - if (eventName === 'click') { - safeApply(leafletScope, function() { - $rootScope.$broadcast('leafletDirectiveMarkersClick', name); - }); - } else if (eventName === 'dragend') { - safeApply(leafletScope, function() { - model.lat = lObject.getLatLng().lat; - model.lng = lObject.getLatLng().lng; - }); - - if (model.message && model.focus === true) { - lObject.openPopup(); - } - } - - handle(e); //common - }; - }; - - MarkerEvents.prototype.getAvailableEvents = function() { return [ - 'click', - 'dblclick', - 'mousedown', - 'mouseover', - 'mouseout', - 'contextmenu', - 'dragstart', - 'drag', - 'dragend', - 'move', - 'remove', - 'popupopen', - 'popupclose', - 'touchend', - 'touchstart', - 'touchmove', - 'touchcancel', - 'touchleave', - ]; - }; - - MarkerEvents.prototype.bindEvents = function(maybeMapId, lObject, name, model, leafletScope, layerName) { - var logic = EventsHelper.prototype.bindEvents.call(this, maybeMapId, lObject, name, model, leafletScope, layerName); - - if (Helpers.LabelPlugin.isLoaded() && isDefined(lObject.label)) { - lblHelp.genEvents(maybeMapId, name, logic, leafletScope, lObject, model, layerName); - } - }; - - return new MarkerEvents(); -}]); - -angular.module('leaflet-directive') -.factory('leafletPathEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletLabelEvents", "leafletEventsHelpers", function($rootScope, $q, $log, 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; - - /* - TODO (nmccready) This EventsHelper needs to be derrived from leafletEventsHelpers to elminate copy and paste code. - */ - - var _genDispatchPathEvent = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName) { - maybeMapId = 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); - }; - }; - - var _bindPathEvents = function(maybeMapId, lObject, name, model, leafletScope) { - var pathEvents = []; - var i; - var eventName; - var logic = 'broadcast'; - - if (!isDefined(leafletScope.eventBroadcast)) { - // Backward compatibility, if no event-broadcast attribute, all events are broadcasted - pathEvents = _getAvailablePathEvents(); - } else if (!isObject(leafletScope.eventBroadcast)) { - // Not a valid object - $log.error(errorHeader + 'event-broadcast must be an object check your model.'); - } else { - // We have a possible valid object - if (!isDefined(leafletScope.eventBroadcast.path)) { - // We do not have events enable/disable do we do nothing (all enabled by default) - 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.'); - } else { - // We have a possible valid map object - // Event propadation logic - if (leafletScope.eventBroadcast.path.logic !== undefined && leafletScope.eventBroadcast.path.logic !== null) { - // 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\'.'); - } else if (leafletScope.eventBroadcast.path.logic === 'emit') { - logic = 'emit'; - } - } - - // Enable / Disable - var pathEventsEnable = false; - var pathEventsDisable = false; - if (leafletScope.eventBroadcast.path.enable !== undefined && leafletScope.eventBroadcast.path.enable !== null) { - if (typeof leafletScope.eventBroadcast.path.enable === 'object') { - pathEventsEnable = true; - } - } - - if (leafletScope.eventBroadcast.path.disable !== undefined && leafletScope.eventBroadcast.path.disable !== null) { - if (typeof leafletScope.eventBroadcast.path.disable === 'object') { - pathEventsDisable = true; - } - } - - if (pathEventsEnable && pathEventsDisable) { - // Both are active, this is an error - $log.warn(errorHeader + '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'); - } else { - // At this point the path object is OK, lets enable or disable events - if (pathEventsEnable) { - // Enable events - for (i = 0; i < leafletScope.eventBroadcast.path.enable.length; i++) { - eventName = leafletScope.eventBroadcast.path.enable[i]; - - // 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'); - } 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'); - } else { - // All ok enable the event - pathEvents.push(eventName); - } - } - } - } else { - // Disable events - pathEvents = _getAvailablePathEvents(); - for (i = 0; i < leafletScope.eventBroadcast.path.disable.length; i++) { - eventName = leafletScope.eventBroadcast.path.disable[i]; - 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'); - - } else { - pathEvents.splice(index, 1); - } - } - } - } - } - } - - for (i = 0; i < pathEvents.length; i++) { - eventName = pathEvents[i]; - lObject.on(eventName, _genDispatchPathEvent(maybeMapId, eventName, logic, leafletScope, pathEvents, name)); - } - - if (Helpers.LabelPlugin.isLoaded() && isDefined(lObject.label)) { - lblHelp.genEvents(maybeMapId, name, logic, leafletScope, lObject, model); - } - }; - - var _getAvailablePathEvents = function() { - return [ - 'click', - 'dblclick', - 'mousedown', - 'mouseover', - 'mouseout', - 'contextmenu', - 'add', - 'remove', - 'popupopen', - 'popupclose', - ]; - }; - - return { - getAvailablePathEvents: _getAvailablePathEvents, - bindPathEvents: _bindPathEvents, - }; -}]); - -}(angular)); \ No newline at end of file diff --git a/geonode/static/lib/js/angular-leaflet-directive.min.js b/geonode/static/lib/js/angular-leaflet-directive.min.js new file mode 100644 index 00000000000..cbcd8406be1 --- /dev/null +++ b/geonode/static/lib/js/angular-leaflet-directive.min.js @@ -0,0 +1,40 @@ +/**! + * The MIT License + * + * Copyright (c) 2013 the angular-leaflet-directive Team, http://tombatossals.github.io/angular-leaflet-directive + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * angular-leaflet-directive + * https://github.com/tombatossals/angular-leaflet-directive + * + * @authors https://github.com/tombatossals/angular-leaflet-directive/graphs/contributors + */ + +/*! +* angular-leaflet-directive 2015-11-06 +* 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:'

{{ title }}

{{ baseTitle }}
{{ overlaysTitle }}
Range is not supported in this browser
',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(a){var b=c.defer();a.getMap=function(){return b.promise},a.setMap=function(a){b.resolve(a)},this.getOpenlayersScope=function(){return a}}],link:function(b,c,d){var h=e.isDefined,i=e.createLayer,j=e.setMapEvents,k=e.setViewEvents,l=e.createView,m=f.setDefaults(b);h(d.width)&&(isNaN(d.width)?c.css("width",d.width):c.css("width",d.width+"px")),h(d.height)&&(isNaN(d.height)?c.css("height",d.height):c.css("height",d.height+"px")),h(d.lat)&&(m.center.lat=parseFloat(d.lat)),h(d.lon)&&(m.center.lon=parseFloat(d.lon)),h(d.zoom)&&(m.center.zoom=parseFloat(d.zoom));var n=a.control.defaults(m.controls),o=a.interaction.defaults(m.interactions),p=l(m.view),q=new a.Map({target:c[0],controls:n,interactions:o,renderer:m.renderer,view:p,loadTilesWhileAnimating:m.loadTilesWhileAnimating,loadTilesWhileInteracting:m.loadTilesWhileInteracting});if(b.$on("$destroy",function(){g.resetMap(d.id),q.setTarget(null),q=null}),!d.customLayers){var r={type:"Tile",source:{type:"OSM"}},s=i(r,p.getProjection(),"default");q.addLayer(s),q.set("default",!0)}if(!h(d.olCenter)){var t=a.proj.transform([m.center.lon,m.center.lat],m.center.projection,p.getProjection());p.setCenter(t),p.setZoom(m.center.zoom)}j(m.events,q,b),k(m.events,q,b),b.setMap(q),g.setMap(q,d.id)}}}]),angular.module("openlayers-directive").directive("olCenter",["$log","$location","olMapDefaults","olHelpers",function(b,c,d,e){return{restrict:"A",scope:!1,replace:!1,require:"openlayers",link:function(f,g,h,i){var j=e.safeApply,k=e.isValidCenter,l=e.isDefined,m=e.isArray,n=e.isNumber,o=e.isSameCenterOnMap,p=e.setCenter,q=e.setZoom,r=i.getOpenlayersScope();r.getMap().then(function(f){var g=d.getDefaults(r),i=f.getView(),s=r.center;if(-1!==h.olCenter.search("-"))return b.error('[AngularJS - Openlayers] The "center" variable can\'t use a "-" on his key name: "'+h.center+'".'),void p(i,g.view.projection,g.center,f);l(s)||(s={}),k(s)||(b.warn("[AngularJS - Openlayers] invalid 'center'"),s.lat=g.center.lat,s.lon=g.center.lon,s.zoom=g.center.zoom,s.projection=g.center.projection),s.projection||("pixel"!==g.view.projection?s.projection=g.center.projection:s.projection="pixel"),n(s.zoom)||(s.zoom=1),p(i,g.view.projection,s,f),i.setZoom(s.zoom);if(!0===s.centerUrlHash){var t=function(){var a,b=c.search();if(l(b.c)){var d=b.c.split(":");3===d.length&&(a={lat:parseFloat(d[0]),lon:parseFloat(d[1]),zoom:parseInt(d[2],10)})}return a};t(),r.$on("$locationChangeSuccess",function(){var a=t();a&&!o(a,f)&&j(r,function(b){b.center.lat=a.lat,b.center.lon=a.lon,b.center.zoom=a.zoom})})}var u;r.$watchCollection("center",function(c){if(c){if(c.projection||(c.projection=g.center.projection),c.autodiscover)return u||(u=new a.Geolocation({projection:a.proj.get(c.projection)}),u.on("change",function(){if(c.autodiscover){var a=u.getPosition();j(r,function(b){b.center.lat=a[1],b.center.lon=a[0],b.center.zoom=12,b.center.autodiscover=!1,u.setTracking(!1)})}})),void u.setTracking(!0);k(c)||(b.warn("[AngularJS - Openlayers] invalid 'center'"),c=g.center);var d=i.getCenter();if(d)if("pixel"===g.view.projection||"pixel"===c.projection)i.setCenter(c.coord);else{var e=a.proj.transform(d,g.view.projection,c.projection);e[1]===c.lat&&e[0]===c.lon||p(i,g.view.projection,c,f)}i.getZoom()!==c.zoom&&q(i,c.zoom,f)}});var v=f.on("moveend",function(){j(r,function(b){if(l(b.center)){var d=f.getView().getCenter();if(b.center.zoom=i.getZoom(),"pixel"===g.view.projection||"pixel"===b.center.projection)return void(b.center.coord=d);if(b.center){var h=a.proj.transform(d,g.view.projection,b.center.projection);if(b.center.lat=h[1],b.center.lon=h[0],e.notifyCenterUrlHashChanged(r,b.center,c.search()),m(b.center.bounds)){var j=i.calculateExtent(f.getSize()),k=b.center.projection,n=g.view.projection;b.center.bounds=a.proj.transformExtent(j,n,k)}}}})});r.$on("$destroy",function(){a.Observable.unByKey(v)})})}}}]),angular.module("openlayers-directive").directive("olLayer",["$log","$q","olMapDefaults","olHelpers",function(a,b,c,d){return{restrict:"E",scope:{properties:"=olLayerProperties",onLayerCreated:"&"},replace:!1,require:"^openlayers",link:function(a,b,e,f){var g=d.isDefined,h=d.equals,i=f.getOpenlayersScope(),j=d.createLayer,k=d.setVectorLayerEvents,l=d.detectLayerType,m=d.createStyle,n=d.isBoolean,o=d.addLayerBeforeMarkers,p=d.isNumber,q=d.insertLayer,r=d.removeLayer,s=d.addLayerToGroup,t=d.removeLayerFromGroup,u=d.getGroup;i.getMap().then(function(b){var d,f=b.getView().getProjection(),v=c.setDefaults(i),w=b.getLayers();if(a.$on("$destroy",function(){a.properties.group?t(w,d,a.properties.group):r(w,d.index),b.removeLayer(d)}),g(a.properties))a.$watch("properties",function(c,e){if(g(c.source)&&g(c.source.type)){if(!g(c.visible))return void(c.visible=!0);if(!g(c.opacity))return void(c.opacity=1);var i,x,y;if(g(d)){var z=function(a){return function(b){return b!==a}}(d);if(g(e)&&!h(c.source,e.source)){var A=d.index;y=w,x=d.get("group"),x&&(y=u(w,x).getLayers()),y.removeAt(A),d=j(c,f,a.onLayerCreated),d.set("group",x),g(d)&&(q(y,A,d),"Vector"===l(c)&&k(v.events,b,a,c.name))}(g(e)&&c.opacity!==e.opacity||z(d))&&(p(c.opacity)||p(parseFloat(c.opacity)))&&d.setOpacity(c.opacity),g(c.index)&&c.index!==d.index&&(y=w,x=d.get("group"),x&&(y=u(w,x).getLayers()),r(y,d.index),q(y,c.index,d)),g(c.group)&&c.group!==e.group&&(t(w,d,e.group),s(w,d,c.group)),g(e)&&n(c.visible)&&(c.visible!==e.visible||z(d)||d.getVisible()!==c.visible)&&d.setVisible(c.visible),(g(c.style)&&!h(c.style,e.style)||z(d))&&(i=angular.isFunction(c.style)?c.style:m(c.style),d.setStyle&&angular.isFunction(d.setStyle)&&d.setStyle(i)),h(c.minResolution,e.minResolution)&&!z(d)||g(c.minResolution)&&d.setMinResolution(c.minResolution),h(c.maxResolution,e.maxResolution)&&!z(d)||g(c.maxResolution)&&d.setMaxResolution(c.maxResolution)}else d=j(c,f,a.onLayerCreated),g(c.group)?s(w,d,c.group):g(c.index)?q(w,c.index,d):o(w,d),"Vector"===l(c)&&k(v.events,b,a,c.name),n(c.visible)&&d.setVisible(c.visible),c.opacity&&d.setOpacity(c.opacity),angular.isArray(c.extent)&&d.setExtent(c.extent),c.style&&(i=angular.isFunction(c.style)?c.style:m(c.style),d.setStyle&&angular.isFunction(d.setStyle)&&d.setStyle(i)),c.minResolution&&d.setMinResolution(c.minResolution),c.maxResolution&&d.setMaxResolution(c.maxResolution)}},!0);else if(g(e.sourceType)&&g(e.sourceUrl)){var x={source:{url:e.sourceUrl,type:e.sourceType}};d=j(x,f,e.layerName,a.onLayerCreated),"Vector"===l(x)&&k(v.events,b,a,e.name),o(w,d)}})}}}]),angular.module("openlayers-directive").directive("olPath",["$log","$q","olMapDefaults","olHelpers",function(a,b,c,d){return{restrict:"E",scope:{properties:"=olGeomProperties",style:"=olStyle"},require:"^openlayers",replace:!0,template:'',link:function(a,b,e,f){var g=d.isDefined,h=d.createFeature,i=d.createOverlay,j=d.createVectorLayer,k=d.insertLayer,l=d.removeLayer,m=f.getOpenlayersScope();m.getMap().then(function(d){var f=c.getDefaults(m),n=f.view.projection,o=j(),p=d.getLayers();if(k(p,p.getLength(),o),a.$on("$destroy",function(){l(p,o.index)}),g(e.coords)){var q=e.proj||"EPSG:4326",r=JSON.parse(e.coords),s={type:"Polygon",coords:r,projection:q,style:a.style?a.style:f.styles.path},t=h(s,n);if(o.getSource().addFeature(t),e.message){a.message=e.message;var u=t.getGeometry().getExtent(),v=i(b,u);d.addOverlay(v)}}else;})}}}]),angular.module("openlayers-directive").directive("olView",["$log","$q","olData","olMapDefaults","olHelpers",function(b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:"openlayers",link:function(b,c,d,g){var h=g.getOpenlayersScope(),i=f.isNumber,j=f.safeApply,k=f.createView;h.getMap().then(function(b){var c=e.getDefaults(h),d=h.view;d.projection||(d.projection=c.view.projection),d.maxZoom||(d.maxZoom=c.view.maxZoom),d.minZoom||(d.minZoom=c.view.minZoom),d.rotation||(d.rotation=c.view.rotation);var f=k(d);b.setView(f),h.$watchCollection("view",function(a){i(a.rotation)&&f.setRotation(a.rotation)});var g=f.on("change:rotation",function(){j(h,function(a){a.view.rotation=b.getView().getRotation()})});h.$on("$destroy",function(){a.Observable.unByKey(g)})})}}}]),angular.module("openlayers-directive").directive("olControl",["$log","$q","olData","olMapDefaults","olHelpers",function(a,b,c,d,e){return{restrict:"E",scope:{properties:"=olControlProperties"},replace:!1,require:"^openlayers",link:function(a,b,c,d){var f,g,h=e.isDefined,i=d.getOpenlayersScope(),j=e.getControlClasses,k=j();i.getMap().then(function(b){function d(a){a&&a.control?(f&&b.removeControl(f),f=a.control,b.addControl(f)):c.name&&(h(a)&&(g=a),f&&b.removeControl(f),f=new k[c.name](g),b.addControl(f))}a.$on("$destroy",function(){b.removeControl(f)}),a.$watch("properties",function(a){h(a)&&d(a)}),d(a.properties)})}}}]),angular.module("openlayers-directive").directive("olMarker",["$log","$q","olMapDefaults","olHelpers",function(b,c,d,e){var f=function(){return{projection:"EPSG:4326",lat:0,lon:0,coord:[],show:!0,showOnMouseOver:!1,showOnMouseClick:!1,keepOneOverlayVisible:!1}},g=function(){function a(a){return b.map(function(a){return a.map}).indexOf(a)}var b=[];return{getInst:function(c,d){var f=a(d);if(-1===f){var g=e.createVectorLayer();g.set("markers",!0),d.addLayer(g),b.push({map:d,markerLayer:g,instScopes:[]}),f=b.length-1}return b[f].instScopes.push(c),b[f].markerLayer},deregisterScope:function(c,d){var e=a(d);if(-1===e)throw Error("This map has no markers");var f=b[e].instScopes,g=f.indexOf(c);if(-1===g)throw Error("Scope wan't registered");f.splice(g,1),f.length||(d.removeLayer(b[e].markerLayer),delete b[e].markerLayer,delete b[e])}}}();return{restrict:"E",scope:{lat:"=lat",lon:"=lon",label:"=label",properties:"=olMarkerProperties",style:"=olStyle"},transclude:!0,require:"^openlayers",replace:!0,template:'',link:function(c,h,i,j){var k=e.isDefined,l=j.getOpenlayersScope(),m=e.createFeature,n=e.createOverlay,o=h.find("ng-transclude").children().length>0;l.getMap().then(function(e){function j(){c.properties&&(e.getViewport().removeEventListener("mousemove",c.properties.handleInteraction),e.getViewport().removeEventListener("click",c.properties.handleTapInteraction),e.getViewport().querySelector("canvas.ol-unselectable").removeEventListener("touchend",c.properties.handleTapInteraction),e.getViewport().removeEventListener("mousemove",c.properties.showAtLeastOneOverlay),e.getViewport().removeEventListener("click",c.properties.removeAllOverlays),e.getViewport().querySelector("canvas.ol-unselectable").removeEventListener("touchmove",c.properties.activateCooldown))}var p,q,r,s=g.getInst(c,e),t=f(),u=d.getDefaults(l),v=u.view.projection,w=null,x=null;if(c.handleDrag=function(b){var d=b.coordinate,f=e.getView().getProjection().getCode();if(d="pixel"===f?d.map(function(a){return parseInt(a,10)}):a.proj.transform(d,f,"EPSG:4326"),"pointerdown"===b.type){var g=e.forEachFeatureAtPixel(b.pixel,function(a){return a});if(!(x=g?g.get("marker"):null)||!x.draggable)return void(x=null);e.getTarget().style.cursor="pointer",w="pixel"===f?[d[0]-x.coord[0],d[1]-x.coord[1]]:[d[0]-x.lon,d[1]-x.lat],b.preventDefault()}else w&&x&&("pointerup"===b.type?(e.getTarget().style.cursor="",w=null,x=null,b.preventDefault()):"pointerdrag"===b.type&&(b.preventDefault(),c.$apply(function(){"pixel"===f?(x.coord[0]=d[0]-w[0],x.coord[1]=d[1]-w[1]):(x.lon=d[0]-w[0],x.lat=d[1]-w[1])})))},e.on("pointerdown",c.handleDrag),e.on("pointerup",c.handleDrag),e.on("pointerdrag",c.handleDrag),c.$on("$destroy",function(){s.getSource().removeFeature(r),k(p)&&e.removeOverlay(p),g.deregisterScope(c,e),e.un("pointerdown",c.handleDrag),e.un("pointerup",c.handleDrag),e.un("pointerdrag",c.handleDrag),j()}),!k(c.properties))return t.lat=c.lat?c.lat:t.lat,t.lon=c.lon?c.lon:t.lon,t.message=i.message,t.style=c.style?c.style:u.styles.marker,r=m(t,v),k(r)||b.error("[AngularJS - Openlayers] Received invalid data on the marker."),r.set("marker",c),s.getSource().addFeature(r),void((t.message||o)&&(c.message=i.message,q=a.proj.transform([t.lon,t.lat],t.projection,v),p=n(h,q),e.addOverlay(p)));c.$watch("properties",function(d){if(j(),d.handleInteraction=function(b){var c=!1;if(i.hasOwnProperty("ngClick")&&(c=!0),!d.label.show||c){var f=!1,g=e.getEventPixel(b),j=e.forEachFeatureAtPixel(g,function(a){return a}),l=!1;if(j===r){if(l=!0,f=!0,c&&("click"===b.type||"touchend"===b.type))return h.triggerHandler("click"),b.preventDefault(),void b.stopPropagation();k(p)||(q="pixel"===t.projection?d.coord:a.proj.transform([d.lon,d.lat],t.projection,v),p=n(h,q),e.addOverlay(p)),e.getTarget().style.cursor="pointer"}!f&&p&&(l=!0,e.removeOverlay(p),p=void 0,e.getTarget().style.cursor=""),l&&b.preventDefault()}},d.handleTapInteraction=function(){var a,b=!1;return d.activateCooldown=function(){b=!0,a&&clearTimeout(a),a=setTimeout(function(){b=!1,a=null},500)},d.activateCooldown&&e.getViewport().querySelector("canvas.ol-unselectable").removeEventListener("touchmove",d.activateCooldown),e.getViewport().querySelector("canvas.ol-unselectable").addEventListener("touchmove",d.activateCooldown),function(){b||(d.handleInteraction.apply(null,arguments),d.activateCooldown())}}(),d.showAtLeastOneOverlay=function(b){if(!d.label.show){var c=!1,f=e.getEventPixel(b),g=e.forEachFeatureAtPixel(f,function(a){return a}),i=!1;g===r&&(i=!0,c=!0,k(p)||(q="pixel"===t.projection?t.coord:a.proj.transform([t.lon,t.lat],t.projection,v),p=n(h,q),angular.forEach(e.getOverlays(),function(a){e.removeOverlay(a)}),e.addOverlay(p)),e.getTarget().style.cursor="pointer"),!c&&p&&(i=!0,p=void 0,e.getTarget().style.cursor=""),i&&b.preventDefault()}},d.removeAllOverlays=function(a){angular.forEach(e.getOverlays(),function(a){e.removeOverlay(a)}),a.preventDefault()},k(r)){var f;if(f="pixel"===d.projection?d.coord:a.proj.transform([d.lon,d.lat],t.projection,e.getView().getProjection()),!angular.equals(r.getGeometry().getCoordinates(),f)){var g=new a.geom.Point(f);r.setGeometry(g)}}else t.projection=d.projection?d.projection:t.projection,t.coord=d.coord?d.coord:t.coord,t.lat=d.lat?d.lat:t.lat,t.lon=d.lon?d.lon:t.lon,k(d.style)?t.style=d.style:t.style=u.styles.marker,r=m(t,v),k(r)||b.error("[AngularJS - Openlayers] Received invalid data on the marker."),r.set("marker",d),s.getSource().addFeature(r);k(p)&&e.removeOverlay(p),k(d.label)&&(c.message=d.label.message,(o||k(c.message)&&0!==c.message.length)&&(d.label&&!0===d.label.show&&(q="pixel"===t.projection?t.coord:a.proj.transform([d.lon,d.lat],t.projection,v),p=n(h,q),e.addOverlay(p)),p&&d.label&&!1===d.label.show&&(e.removeOverlay(p),p=void 0),d.label&&!1===d.label.show&&d.label.showOnMouseOver&&e.getViewport().addEventListener("mousemove",d.handleInteraction),(d.label&&!1===d.label.show&&d.label.showOnMouseClick||i.hasOwnProperty("ngClick"))&&(e.getViewport().addEventListener("click",d.handleTapInteraction),e.getViewport().querySelector("canvas.ol-unselectable").addEventListener("touchend",d.handleTapInteraction)),d.label&&!1===d.label.show&&d.label.keepOneOverlayVisible&&(e.getViewport().addEventListener("mousemove",d.showAtLeastOneOverlay),e.getViewport().addEventListener("click",d.removeAllOverlays))))},!0)})}}}]),angular.module("openlayers-directive").service("olData",["$log","$q",function(a,b){function c(b,c){var d,e;if(angular.isDefined(c))d=c;else if(1===Object.keys(b).length)for(e in b)b.hasOwnProperty(e)&&(d=e);else 0===Object.keys(b).length?d="main":a.error("[AngularJS - Openlayers] - You have more than 1 map on the DOM, you must provide the map ID to the olData.getXXX call");return d}var d={},e=function(a,b){a[c(a,b)].resolvedDefer=!0},f=function(a,d){var e,f=c(a,d);return angular.isDefined(a[f])&&!0!==a[f].resolvedDefer?e=a[f].defer:(e=b.defer(),a[f]={defer:e,resolvedDefer:!1}),e},g=function(a,b){var d=c(a,b);return angular.isDefined(a[d])&&!1!==a[d].resolvedDefer?a[d].defer:f(a,b)};this.setMap=function(a,b){f(d,b).resolve(a),e(d,b)},this.getMap=function(a){return g(d,a).promise},this.resetMap=function(a){angular.isDefined(d[a])&&delete d[a]}}]),angular.module("openlayers-directive").factory("olHelpers",["$q","$log","$http",function(b,c,d){var e=function(a){return angular.isDefined(a)},f=function(a){return angular.isDefined(a)&&null!==a},g=function(a,b,c){a.on(b,function(d){var e=d.coordinate,f=a.getView().getProjection().getCode();"pixel"===f&&(e=e.map(function(a){return parseInt(a,10)})),c.$emit("openlayers.map."+b,{coord:e,projection:f,event:d})})},h=["Road","Aerial","AerialWithLabels","collinsBart","ordnanceSurvey"],i=function(){return{attribution:a.control.Attribution,fullscreen:a.control.FullScreen,mouseposition:a.control.MousePosition,overviewmap:a.control.OverviewMap,rotate:a.control.Rotate,scaleline:a.control.ScaleLine,zoom:a.control.Zoom,zoomslider:a.control.ZoomSlider,zoomtoextent:a.control.ZoomToExtent}},j=["osm","sat","hyb"],k=["World_Imagery","World_Street_Map","World_Topo_Map","World_Physical_Map","World_Terrain_Base","Ocean_Basemap","NatGeo_World_Map"],l={style:a.style.Style,fill:a.style.Fill,stroke:a.style.Stroke,circle:a.style.Circle,icon:a.style.Icon,image:a.style.Image,regularshape:a.style.RegularShape,text:a.style.Text},m=function(a,b){return b&&a instanceof b?a:b?new b(a):a},n=function a(b,c){var d;if(c?d=b[c]:(c="style",d=b),"style"===c&&b instanceof Function)return b;if(!(d instanceof Object))return d;var e;if("[object Object]"===Object.prototype.toString.call(d)){e={};var f=l[c];if(f&&d instanceof f)return d;Object.getOwnPropertyNames(d).forEach(function(b,g,h){var i=l[b];if(f&&i&&i.prototype instanceof l[c])return console.assert(1===h.length,"Extra parameters for "+c),e=a(d,b),m(e,i);e[b]=a(d,b),"text"!==b&&"string"!=typeof e[b]&&(e[b]=m(e[b],l[b]))})}else e=d;return m(e,l[c])},o=function(a){if(a.type)return a.type;switch(a.source.type){case"ImageWMS":case"ImageStatic":return"Image";case"GeoJSON":case"JSONP":case"TopoJSON":case"KML":case"WKT":return"Vector";case"TileVector":case"MVT":return"TileVector";default:return"Tile"}},p=function(b){var d;switch(b.projection){case"pixel":if(!e(b.extent))return void c.error("[AngularJS - Openlayers] - You must provide the extent of the image if using pixel projection");d=new a.proj.Projection({code:"pixel",units:"pixels",extent:b.extent});break;default:d=new a.proj.get(b.projection)}return d},q=function(a){return-1!==["watercolor","terrain","toner"].indexOf(a)},r=function(b,f){var g,i,l,m=new a.format.GeoJSON;switch(b.type){case"MapBox":if(!b.mapId||!b.accessToken)return void c.error("[AngularJS - Openlayers] - MapBox layer requires the map id and the access token");l="https://api.tiles.mapbox.com/v4/"+b.mapId+"/{z}/{x}/{y}.png?access_token="+b.accessToken,i=window.devicePixelRatio,i>1&&(l=l.replace(".png","@2x.png")),g=new a.source.XYZ({url:l,tileLoadFunction:b.tileLoadFunction,attributions:t(b),tilePixelRatio:i>1?2:1,wrapX:void 0===b.wrapX||b.wrapX});break;case"MapBoxStudio":if(!b.mapId||!b.accessToken||!b.userId)return void c.error("[AngularJS - Openlayers] - MapBox Studio layer requires the map id, user id and the access token");l="https://api.mapbox.com/styles/v1/"+b.userId+"/"+b.mapId+"/tiles/{z}/{x}/{y}?access_token="+b.accessToken,i=window.devicePixelRatio,i>1&&(l=l.replace("{y}?access_token","{y}@2x?access_token")),g=new a.source.XYZ({url:l,tileLoadFunction:b.tileLoadFunction,attributions:t(b),tilePixelRatio:i>1?2:1,tileSize:b.tileSize||[512,512],wrapX:void 0===b.wrapX||b.wrapX});break;case"MVT":if(!b.url)return void c.error("[AngularJS - Openlayers] - MVT layer requires the source url");g=new a.source.VectorTile({attributions:b.attributions||"",format:new a.format.MVT,tileGrid:a.tilegrid.createXYZ({maxZoom:b.maxZoom||22}),tilePixelRatio:b.tilePixelRatio||16,url:b.url});break;case"ImageWMS":b.url&&b.params||c.error("[AngularJS - Openlayers] - ImageWMS Layer needs valid server url and params properties"),g=new a.source.ImageWMS({url:b.url,imageLoadFunction:b.imageLoadFunction,attributions:t(b),crossOrigin:void 0===b.crossOrigin?"anonymous":b.crossOrigin,params:s(b.params),ratio:b.ratio});break;case"TileWMS":(b.url||b.urls)&&b.params||c.error("[AngularJS - Openlayers] - TileWMS Layer needs valid url (or urls) and params properties");var n={tileLoadFunction:b.tileLoadFunction,crossOrigin:void 0===b.crossOrigin?"anonymous":b.crossOrigin,params:s(b.params),attributions:t(b),wrapX:void 0===b.wrapX||b.wrapX};b.serverType&&(n.serverType=b.serverType),b.url&&(n.url=b.url),b.urls&&(n.urls=b.urls),g=new a.source.TileWMS(n);break;case"WMTS":(b.url||b.urls)&&b.tileGrid||c.error("[AngularJS - Openlayers] - WMTS Layer needs valid url (or urls) and tileGrid properties");var o={tileLoadFunction:b.tileLoadFunction,projection:f,layer:b.layer,attributions:t(b),matrixSet:"undefined"===b.matrixSet?f:b.matrixSet,format:"undefined"===b.format?"image/jpeg":b.format,requestEncoding:"undefined"===b.requestEncoding?"KVP":b.requestEncoding,tileGrid:new a.tilegrid.WMTS({origin:b.tileGrid.origin,resolutions:b.tileGrid.resolutions,matrixIds:b.tileGrid.matrixIds}),style:"undefined"===b.style?"normal":b.style,wrapX:void 0===b.wrapX||b.wrapX};e(b.url)&&(o.url=b.url),e(b.urls)&&(o.urls=b.urls),g=new a.source.WMTS(o);break;case"OSM":g=new a.source.OSM({tileLoadFunction:b.tileLoadFunction,attributions:t(b),wrapX:void 0===b.wrapX||b.wrapX}),b.url&&g.setUrl(b.url);break;case"BingMaps":if(!b.key)return void c.error("[AngularJS - Openlayers] - You need an API key to show the Bing Maps.");var p={key:b.key,tileLoadFunction:b.tileLoadFunction,attributions:t(b),imagerySet:b.imagerySet?b.imagerySet:h[0],culture:b.culture,wrapX:void 0===b.wrapX||b.wrapX};b.maxZoom&&(p.maxZoom=b.maxZoom),g=new a.source.BingMaps(p);break;case"MapQuest":if(!b.layer||-1===j.indexOf(b.layer))return void c.error("[AngularJS - Openlayers] - MapQuest layers needs a valid 'layer' property.");g=new a.source.MapQuest({attributions:t(b),layer:b.layer,wrapX:void 0===b.wrapX||b.wrapX});break;case"EsriBaseMaps":if(!b.layer||-1===k.indexOf(b.layer))return void c.error("[AngularJS - Openlayers] - ESRI layers needs a valid 'layer' property.");var r="https://services.arcgisonline.com/ArcGIS/rest/services/",u=r+b.layer+"/MapServer/tile/{z}/{y}/{x}";g=new a.source.XYZ({attributions:t(b),tileLoadFunction:b.tileLoadFunction,url:u,wrapX:void 0===b.wrapX||b.wrapX});break;case"TileArcGISRest":b.url||c.error("[AngularJS - Openlayers] - TileArcGISRest Layer needs valid url"),g=new a.source.TileArcGISRest({attributions:t(b),tileLoadFunction:b.tileLoadFunction,url:b.url,wrapX:void 0===b.wrapX||b.wrapX});break;case"GeoJSON":if(!b.geojson&&!b.url)return void c.error("[AngularJS - Openlayers] - You need a geojson property to add a GeoJSON layer.");if(e(b.url))g=new a.source.Vector({format:new a.format.GeoJSON,url:b.url});else{g=new a.source.Vector;var v,w=f;v=e(b.geojson.projection)?new a.proj.get(b.geojson.projection):f;var x=m.readFeatures(b.geojson.object,{featureProjection:w.getCode(),dataProjection:v.getCode()});g.addFeatures(x)}break;case"WKT":if(!b.wkt&&!b.wkt.data)return void c.error("[AngularJS - Openlayers] - You need a WKT property to add a WKT format vector layer.");g=new a.source.Vector;var y,z=new a.format.WKT;y=e(b.wkt.projection)?new a.proj.get(b.wkt.projection):f;var A=z.readFeatures(b.wkt.data,{featureProjection:f.getCode(),dataProjection:y.getCode()});g.addFeatures(A);break;case"JSONP":if(!b.url)return void c.error("[AngularJS - Openlayers] - You need an url properly configured to add a JSONP layer.");e(b.url)&&(g=new a.source.ServerVector({format:m,loader:function(){var a=b.url+"&outputFormat=text/javascript&format_options=callback:JSON_CALLBACK";d.jsonp(a,{cache:b.cache}).success(function(a){g.addFeatures(m.readFeatures(a))}).error(function(a){c(a)})},projection:f}));break;case"TopoJSON":if(!b.topojson&&!b.url)return void c.error("[AngularJS - Openlayers] - You need a topojson property to add a TopoJSON layer.");g=b.url?new a.source.Vector({format:new a.format.TopoJSON,url:b.url}):new a.source.Vector(angular.extend(b.topojson,{format:new a.format.TopoJSON}));break;case"TileJSON":g=new a.source.TileJSON({url:b.url,attributions:t(b),tileLoadFunction:b.tileLoadFunction,crossOrigin:"anonymous",wrapX:void 0===b.wrapX||b.wrapX});break;case"TileVector":b.url&&b.format||c.error("[AngularJS - Openlayers] - TileVector Layer needs valid url and format properties"),g=new a.source.VectorTile({url:b.url,projection:f,attributions:t(b),tileLoadFunction:b.tileLoadFunction,format:b.format,tileGrid:new a.tilegrid.createXYZ({maxZoom:b.maxZoom||19}),wrapX:void 0===b.wrapX||b.wrapX});break;case"TileTMS":b.url&&b.tileGrid||c.error("[AngularJS - Openlayers] - TileTMS Layer needs valid url and tileGrid properties"),g=new a.source.TileImage({url:b.url,maxExtent:b.maxExtent,attributions:t(b),tileLoadFunction:b.tileLoadFunction,tileGrid:new a.tilegrid.TileGrid({origin:b.tileGrid.origin,resolutions:b.tileGrid.resolutions}),tileUrlFunction:function(a){var c=a[0],d=a[1],e=a[2];return d<0||e<0?"":b.url+c+"/"+d+"/"+e+".png"},wrapX:void 0===b.wrapX||b.wrapX});break;case"TileImage":g=new a.source.TileImage({url:b.url,attributions:t(b),tileLoadFunction:b.tileLoadFunction,tileGrid:new a.tilegrid.TileGrid({origin:b.tileGrid.origin,resolutions:b.tileGrid.resolutions}),tileUrlFunction:function(a){var c=a[0],d=a[1],e=-a[2]-1;return b.url.replace("{z}",c.toString()).replace("{x}",d.toString()).replace("{y}",e.toString())},wrapX:void 0===b.wrapX||b.wrapX});break;case"KML":var B=b.extractStyles||!1;g=new a.source.Vector({url:b.url,format:new a.format.KML,radius:b.radius,extractStyles:B});break;case"Stamen":if(!b.layer||!q(b.layer))return void c.error("[AngularJS - Openlayers] - You need a valid Stamen layer.");g=new a.source.Stamen({tileLoadFunction:b.tileLoadFunction,layer:b.layer,wrapX:void 0===b.wrapX||b.wrapX});break;case"ImageStatic":if(!b.url||!angular.isArray(b.imageSize)||2!==b.imageSize.length)return void c.error("[AngularJS - Openlayers] - You need a image URL to create a ImageStatic layer.");g=new a.source.ImageStatic({url:b.url,attributions:t(b),imageSize:b.imageSize,projection:f,imageExtent:b.imageExtent?b.imageExtent:f.getExtent(),imageLoadFunction:b.imageLoadFunction});break;case"XYZ":b.url||b.urls||b.tileUrlFunction||c.error("[AngularJS - Openlayers] - XYZ Layer needs valid url(s) or tileUrlFunction properties"),g=new a.source.XYZ({url:b.url,urls:b.urls,attributions:t(b),minZoom:b.minZoom,maxZoom:b.maxZoom,projection:b.projection,tileUrlFunction:b.tileUrlFunction,tileLoadFunction:b.tileLoadFunction,wrapX:void 0===b.wrapX||b.wrapX});break;case"Zoomify":b.url&&angular.isArray(b.imageSize)&&2===b.imageSize.length||c.error("[AngularJS - Openlayers] - Zoomify Layer needs valid url and imageSize properties"),g=new a.source.Zoomify({url:b.url,size:b.imageSize,wrapX:void 0===b.wrapX||b.wrapX})}return g||c.warn('[AngularJS - Openlayers] - No source could be found for type "'+b.type+'"'),g},s=function(a){var b=a;if(a&&"object"==typeof a){b="[object Array]"===Object.prototype.toString.call(a)?[]:{};for(var c in a)b[c]=s(a[c])}return b},t=function(b){var c=[];if(e(b.attribution))!1!==b.attribution&&c.unshift(new a.Attribution({html:b.attribution}));else{var d=u(b);d&&c.unshift(d)}return c},u=function(b){if(b&&b.type){var c=a.source[b.type];if(c)for(var d in c)if(c.hasOwnProperty(d)&&d.toLowerCase().indexOf("attribution")>-1)return a.source[b.type][d]}return null},v=function(b){var c=new a.layer.Group;return c.set("name",b),c},w=function(b,c){var d;return angular.forEach(b,function(b){if(b instanceof a.layer.Group&&b.get("name")===c)return void(d=b)}),d},x=function(a,b){for(var c,d=0;d/g,">")}function A(a){for(;a;){if(a.nodeType===s.Node.ELEMENT_NODE)for(var e=a.attributes,d=0,b=e.length;d"))},end:function(a){a=q(a);d||!0!==m[a]||!0===r[a]||(b(""));a==d&&(d=!1)},chars:function(a){d|| +b(L(a))}}};J=s.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)};var z=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,u=/([^#-~ |!])/g,r=f("area,br,col,hr,img,wbr"),x=f("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),p=f("rp,rt"),n=h({},p,x),x=h({},x,f("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul")),p=h({},p,f("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")), +l=f("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,stop,svg,switch,text,title,tspan"),w=f("script,style"),m=h({},r,x,p,n),O=f("background,cite,href,longdesc,src,xlink:href,xml:base"),n=f("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,valign,value,vspace,width"), +p=f("accent-height,accumulate,additive,alphabetic,arabic-form,ascent,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan", +!0),M=h({},O,p,n),N=function(a,e){function d(b){b=""+b;try{var d=(new a.DOMParser).parseFromString(b,"text/html").body;d.firstChild.remove();return d}catch(e){}}function b(a){c.innerHTML=a;e.documentMode&&A(c);return c}var g;if(e&&e.implementation)g=e.implementation.createHTMLDocument("inert");else throw D("noinert");var c=(g.documentElement||g.getDocumentElement()).querySelector("body");c.innerHTML='';return c.querySelector("svg")? +(c.innerHTML='

',c.querySelector("svg img")?d:b):function(b){b=""+b;try{b=encodeURI(b)}catch(d){return}var e=new a.XMLHttpRequest;e.responseType="document";e.open("GET","data:text/html;charset=utf-8,"+b,!1);e.send(null);b=e.response.body;b.firstChild.remove();return b}}(s,s.document)}).info({angularVersion:"1.7.9"});c.module("ngSanitize").filter("linky",["$sanitize",function(f){var h=/((s?ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i, +t=/^mailto:/i,q=c.$$minErr("linky"),s=c.isDefined,A=c.isFunction,v=c.isObject,y=c.isString;return function(c,z,u){function r(c){c&&l.push(P(c))}function x(c,g){var f,a=p(c);l.push("');r(g);l.push("")}if(null==c||""===c)return c;if(!y(c))throw q("notstring",c);for(var p=A(u)?u:v(u)?function(){return u}:function(){return{}},n=c,l=[],w,m;c=n.match(h);)w=c[0],c[2]|| +c[4]||(w=(c[3]?"http://":"mailto:")+w),m=c.index,r(n.substr(0,m)),x(w,c[0].replace(t,"")),n=n.substring(m+c[0].length);r(n);return f(l.join(""))}}])})(window,window.angular); +//# sourceMappingURL=angular-sanitize.min.js.map diff --git a/geonode/static/lib/js/assets.min.js b/geonode/static/lib/js/assets.min.js index bd896354251..92c3c4a7eef 100644 --- a/geonode/static/lib/js/assets.min.js +++ b/geonode/static/lib/js/assets.min.js @@ -1,3 +1,3 @@ -/*! geonode-assets 23-03-2020 */ +/*! geonode-assets 24-03-2020 */ -if(!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";function x(e){return null!=e&&e===e.window}var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0>10|55296,1023&r|56320)}function oe(){T()}var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+ +new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),N=ue(),A=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){for((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;o--;)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){for(var n=e.split("|"),r=n.length;r--;)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){for(var n,r=a([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&void 0!==e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"!==e)return o;for(;n=o[i++];)1===n.nodeType&&r.push(n);return r},b.find.CLASS=d.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v)for(n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return void 0!==k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;l--;)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){for(l=(t=(t||"").match(R)||[""]).length;l--;)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){for(f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="

",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),i=("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,r.left):(a=parseFloat(o)||0,parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===k.css(e,"position");)e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0"))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(m.inline?m.dpDiv.parent()[0]:m.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){for(var s in t.extend(e,i),i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var h=0,l=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{(s=t._data(n,"events"))&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0],l=h+"-"+(e=e.split(".")[1]);return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?void(arguments.length&&this._createWidget(t,e)):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),(a=new i).options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?void(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}()):void(r[e]=s)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n&&a.widgetEventPrefix||e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=l.call(arguments,1),o=0,a=n.length;o",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},e=(s=e.split(".")).shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||!0!==o.options.disabled&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){var s=this;return setTimeout(function(){return("string"==typeof t?s[t]:t).apply(s,arguments)},e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},(i=t.Event(i)).type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&!1===a.apply(this.element[0],[i].concat(s))||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?!0!==n&&"number"!=typeof n&&n.effect||i:e;"number"==typeof(n=n||{})&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),e===(i=o.offsetWidth)&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widtha(e+i)&&(u.horizontal="center"),fa(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?0a?0i)&&(t.left+=d+p+f):0a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,p="top"===e.my[1]?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];c<0?((s=t.top+p+f+g+e.collisionHeight-r-o)<0||a(c)>s)&&(t.top+=p+f+g):0a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}});var c="ui-effects-",u="ui-effects-style",d="ui-effects-animated",p=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:t<0?0:s.max")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=-1").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),e[0]!==o&&!t.contains(e[0],o)||t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),e[0]!==i&&!t.contains(e[0],i)||t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();1").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),float:e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(c+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=c+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);0").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return t<.5?i(2*t)/2:1-i(-2*t+2)/2}})}();t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u=u||a["top"==m?"outerHeight":"outerWidth"]()/3,l&&((n={opacity:1})[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(u/=Math.pow(2,d-1)),(n={})[m]=o;v").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,h=/([0-9]+)%/.exec(r),c=!!e.horizFirst?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;h&&(r=parseInt(h[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},"box"!==d&&"both"!==d||(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,n.to.x,v))),"content"!==d&&"both"!==d||n.from.y===n.to.y||(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),"content"!==d&&"both"!==d||(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)||"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,r=o||"hide"===n,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for(!o&&s.is(":visible")||(s.css("opacity",0).show(),c=1);u?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),(s=this.attr("id"))&&(o=(e=this.eq(0).parents().last()).add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return(!s||"static"!==e.css("position"))&&n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||0<=i)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||!1!==e.active&&null!=e.active||(e.active=0),this._processPanels(),e.active<0&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t(""),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?void this._activate(e):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||!1!==this.options.active||this._activate(0),void("icons"===t&&(this._destroyIcons(),e&&this._createIcons())))},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),!1===e.active&&!0===e.collapsible||!this.headers.length?(e.active=!1,this.active=t()):!1===e.active?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||!1===this._trigger("beforeActivate",e,u)||(n.active=!h&&this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){function d(){a._toggleComplete(i)}var s,n,o,a=this,r=0,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]))||this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var i=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=96<=e.keyCode&&e.keyCode<=105?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),(i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i).length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var i,s,n,o,a=this,r=this.options.icons.submenu,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),(i=h.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),o=(n=i.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(i=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),n<0?this.activeMenu.scrollTop(o+n):a",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))i=s=e=!0;else{i=s=e=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}}},keypress:function(s){if(e)return e=!1,void(this.isMultiLine&&!this.menu.element.is(":visible")||s.preventDefault());if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,void t.preventDefault()):void this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?void delete this.cancelBlur:(clearTimeout(this.searching),this.close(t),void this._change(t))}}),this._initSource(),this.menu=t("