geo-targeting-component
Version:
Geo targeting component
1 lines • 10 kB
JavaScript
;angular.module("yaMap",[]).constant("GEOMETRY_TYPES",{POINT:"Point",LINESTRING:"LineString",RECTANGLE:"Rectangle",POLYGON:"Polygon",CIRCLE:"Circle"}).provider("yaMapSettings",function(){var e={version:"2.1",lang:"ru_RU",order:"longlat"};this.setLanguage=function(t){return e.lang=t,this},this.setOrder=function(t){return e.order=t,this},this.$get=[function(){return e}]}).factory("mapApiLoad",["yaMapSettings",function(e){var t=!1,n=[],o=function(){for(;n.length;)n.splice(0,1)[0]()},a="//api-maps.yandex.ru/"+e.version+"/?load=package.full&lang="+e.lang+"&coordorder="+e.order,r=!1,i=function(e,t){if(!r){r=!0;var n=document.createElement("script");n.type="text/javascript",n.readyState?n.onreadystatechange=function(){("loaded"==n.readyState||"complete"==n.readyState)&&(n.onreadystatechange=null,t())}:n.onload=function(){t()},n.src=e,document.getElementsByTagName("head")[0].appendChild(n)}};return function(e){n.push(e),t?o():r||i(a,function(){ymaps.ready(function(){t=!0,o()})})}}]).service("yaLayer",[function(){this.create=function(e,t){return new ymaps.Layer(e,t)}}]).service("yaMapType",[function(){this.create=function(e,t){return new ymaps.MapType(e,t)}}]).service("layerStorage",["mapApiLoad",function(e){this.get=function(t){if(this._storage)t(this._storage);else{var n=this;e(function(){n._storage=ymaps.layer.storage,t(n._storage)})}}}]).service("mapTypeStorage",["mapApiLoad",function(e){this.get=function(t){if(this._storage)t(this._storage);else{var n=this;e(function(){n._storage=ymaps.mapType.storage,t(n._storage)})}}}]).service("yaSubscriber",function(){var e=/^yaEvent(\w*)?([A-Z]{1}[a-z]+)$/;this.subscribe=function(t,n,o,a){var r=e.exec(o),i=r[2].toLowerCase(),c=r[1]?r[1][1].toLowerCase()+r[1].substring(1):void 0;a[o]=function(e){return n(a.$parent||a,e)},(c?t[c].events:t.events).add(i,function(e){setTimeout(function(){a.$apply(function(){a[o]({$event:e})})})})}}).service("templateLayoutFactory",["mapApiLoad",function(e){this._cache={},this.get=function(e){return this._cache[e]||e},this.create=function(t,n,o){if(!this._cache[t]){var a=this;e(function(){a._cache[t]=ymaps.templateLayoutFactory.createClass(n,o)})}}}]).directive("yaTemplateLayout",["templateLayoutFactory",function(e){return{restrict:"E",priority:1001,scope:{overrides:"=yaOverrides"},compile:function(t){var n=t.html();return t.children().remove(),function(t,o,a){if(!a.yaKey)throw new Error('not require attribute "key"');var r=a.yaKey;e.create(r,n,t.overrides)}}}}]).controller("YaMapCtrl",["$scope","mapApiLoad",function(e,t){var n=this;t(function(){n.addGeoObjects=function(t){e.map.geoObjects.add(t)},n.removeGeoObjects=function(t){e.map.geoObjects.remove(t)},n.addControl=function(t,n){e.map.controls.add(t,n)},n.getMap=function(){return e.map},n.addImageLayer=function(t,n){var o=new ymaps.Layer(t,n);e.map.layers.add(o)},n.addHotspotLayer=function(t,n,o){var a=new ymaps.hotspot.ObjectSource(t,n),r=new ymaps.hotspot.Layer(a,o);e.map.layers.add(r)}})}]).directive("yaMap",["$compile","mapApiLoad","yaMapSettings","$window","yaSubscriber","$parse","$q","$timeout",function(e,t,n,o,a,r,i,c){return{restrict:"E",scope:{yaCenter:"@",yaType:"@",yaBeforeInit:"&",yaAfterInit:"&"},compile:function(n){var o=n.children(),s=null;return n.children().remove(),function(n,u,l){var y=function(e){try{return n.$eval(e)}catch(t){return e}},p=function(e){return s&&s.reject(),s=i.defer(),e?angular.isArray(e)?c(function(){s.resolve(e)}):angular.isString(e)&&t(function(){ymaps.geocode(e,{results:1}).then(function(e){var t=e.geoObjects.get(0);n.$apply(function(){s.resolve(t.geometry.getCoordinates())})},function(e){n.$apply(function(){s.reject(e)})})}):t(function(){ymaps.geolocation.get({provider:"yandex"}).then(function(e){c(function(){s.resolve(e.geoObjects.position)})})}),s.promise},f=Number(l.yaZoom),d=l.yaBehaviors?l.yaBehaviors.split(" "):["default"],v=["default"];l.yaControls?v=l.yaControls.split(" "):angular.isDefined(l.yaControls)&&(v=[]);for(var m,g=[],h=[],b=0,$=d.length;$>b;b++)"-"===(m=d[b])[0]?g.push(m.substring(1)):h.push(m);0>f?f=0:f>23&&(f=23);var O,L=function(c){var s=i.defer();return t(function(){n.yaBeforeInit();var t=l.yaOptions?n.$eval(l.yaOptions):void 0;t&&t.projection&&(t.projection=new ymaps.projection[t.projection.type](t.projection.bounds)),n.map=new ymaps.Map(u[0],{center:c,zoom:f,controls:v,type:l.yaType||"yandex#map",behaviors:h},t),n.map.behaviors.disable(g);for(var i in l)if(0===i.indexOf("yaEvent")){var y=r(l[i]);a.subscribe(n.map,y,i,n)}s.resolve(n.map),n.yaAfterInit({$target:n.map}),u.append(o),setTimeout(function(){n.$apply(function(){e(u.children())(n.$parent)})})}),s.promise};n.$watch("yaCenter",function(e){var t=y(e);p(t).then(function(e){if(!O){O=L(e);var t=!0}O.then(function(n){t||n.setCenter(e)})})}),n.$watch("yaType",function(e){e&&O&&O.then(function(t){t.setType(e)})}),n.$on("$destroy",function(){n.map&&n.map.destroy()})}},controller:"YaMapCtrl"}}]).directive("yaControl",["yaSubscriber","templateLayoutFactory","$parse",function(e,t,n){return{restrict:"E",require:"^yaMap",scope:{yaAfterInit:"&"},link:function(o,a,r,i){var c=r.yaType[0].toUpperCase()+r.yaType.substring(1),s=function(e){try{return o.$eval(e)}catch(t){return e}}(r.yaParams),u=r.yaOptions?o.$eval(r.yaOptions):void 0;if(u&&u.layout&&(u.layout=t.get(u.layout)),u&&u.itemLayout&&(u.itemLayout=t.get(u.itemLayout)),s&&s.items){for(var l,y=[],p=0,f=s.items.length;f>p;p++)l=s.items[p],y.push(new ymaps.control.ListBoxItem(l));s.items=y}var d=new ymaps.control[c](s);for(var v in u)u.hasOwnProperty(v)&&d.options.set(v,u[v]);for(v in r)if(0===v.indexOf("yaEvent")){var m=n(r[v]);e.subscribe(d,m,v,o)}i.addControl(d,u),o.yaAfterInit({$target:d})}}}]).controller("CollectionCtrl",["$scope",function(e){this.addGeoObjects=function(t){e.collection.add(t)},this.removeGeoObjects=function(t){e.collection.remove(t)}}]).directive("yaCollection",["$compile","yaMapSettings","$timeout","yaSubscriber","$parse",function(e,t,n,o,a){return{require:"^yaMap",restrict:"E",scope:{yaAfterInit:"&"},compile:function(t){var r=t.contents();return t.children().remove(),function(t,i,c,s){var u=c.yaOptions?t.$eval(c.yaOptions):{};if(angular.isDefined(c.showAll)&&"false"!=c.showAll){var l,y=s.getMap(),p=function(){l&&n.cancel(l),l=n(function(){y.geoObjects.events.remove("add",p);var e=y.geoObjects.getBounds();e&&y.setBounds(e)},300)};y.geoObjects.events.add("add",p)}t.collection=new ymaps.GeoObjectCollection({},u);for(var f in c)if(0===f.indexOf("yaEvent")){var d=a(c[f]);o.subscribe(t.collection,d,f,t)}s.addGeoObjects(t.collection),t.yaAfterInit({$target:t.collection}),t.$on("$destroy",function(){t.collection&&s.removeGeoObjects(t.collection)}),i.append(r),e(i.children())(t.$parent)}},controller:"CollectionCtrl"}}]).directive("yaCluster",["yaMapSettings","yaSubscriber","$compile","templateLayoutFactory","$parse",function(e,t,n,o,a){return{require:"^yaMap",restrict:"E",scope:{yaAfterInit:"&"},compile:function(e){var r=e.contents();return e.children().remove(),function(e,i,c,s){var u=c.yaOptions?e.$eval(c.yaOptions):{};u&&u.clusterBalloonItemContentLayout&&(u.clusterBalloonItemContentLayout=o.get(u.clusterBalloonItemContentLayout)),u&&u.clusterBalloonContentLayout&&(u.clusterBalloonContentLayout=o.get(u.clusterBalloonContentLayout)),e.collection=new ymaps.Clusterer(u);for(var l in c)if(0===l.indexOf("yaEvent")){var y=a(c[l]);t.subscribe(e.collection,y,l,e)}s.addGeoObjects(e.collection),e.yaAfterInit({$target:e.collection}),e.$on("$destroy",function(){e.collection&&s.removeGeoObjects(e.collection)}),i.append(r),n(i.children())(e.$parent)}},controller:"CollectionCtrl"}}]).directive("yaGeoObject",["GEOMETRY_TYPES","yaSubscriber","templateLayoutFactory","$parse",function(e,t,n,o){return{restrict:"E",require:["^yaMap","?^yaCollection","?^yaCluster"],scope:{yaSource:"=",yaShowBalloon:"=",yaAfterInit:"&"},link:function(a,r,i,c){var s,u=c[2]||c[1]||c[0],l=i.yaOptions?a.$eval(i.yaOptions):void 0;l&&l.balloonContentLayout&&(l.balloonContentLayout=n.get(l.balloonContentLayout)),l&&l.iconLayout&&(l.iconLayout=n.get(l.iconLayout));var y=function(e,n){s=new ymaps.GeoObject(e,n);for(var r in i)if(0===r.indexOf("yaEvent")){var c=o(i[r]);t.subscribe(s,c,r,a)}u.addGeoObjects(s),a.yaAfterInit({$target:s}),p(i.yaEdit),f(i.yaDraw),d(a.yaShowBalloon)};a.$watch("yaSource",function(t){if(t)if(s){s.geometry.setCoordinates(t.geometry.coordinates),s.geometry.getType()===e.CIRCLE&&s.geometry.setRadius(t.geometry.radius);var n=t.properties;for(var o in n)n.hasOwnProperty(o)&&s.properties.set(o,n[o])}else y(t,l);else s&&u.removeGeoObjects(s)},angular.equals);var p=function(e){angular.isDefined(e)&&"false"!==e?s&&s.editor.startEditing():angular.isDefined(e)&&s&&s.editor.stopEditing()},f=function(e){angular.isDefined(e)&&"false"!==e?s&&s.editor.startDrawing():angular.isDefined(e)&&s&&s.editor.stopDrawing()},d=function(e){e?s&&s.balloon.open():s&&s.balloon.close()};i.$observe("yaEdit",p),i.$observe("yaDraw",f),a.$watch("yaShowBalloon",d),a.$on("$destroy",function(){s&&u.removeGeoObjects(s)})}}}]).directive("yaHotspotLayer",[function(){return{restrict:"E",require:"^yaMap",link:function(e,t,n,o){if(!n.yaUrlTemplate)throw new Error('not exists required attribute "url-template"');if(!n.yaKeyTemplate)throw new Error('not exists required attribute "key-template"');var a=n.yaOptions?e.$eval(n.yaOptions):void 0;o.addHotspotLayer(n.yaUrlTemplate,n.yaKeyTemplate,a)}}}]).directive("yaImageLayer",[function(){return{restrict:"E",require:"^yaMap",link:function(e,t,n,o){if(!n.yaUrlTemplate)throw new Error('not exists required attribute "url-template"');var a=n.yaOptions?e.$eval(n.yaOptions):void 0;o.addImageLayer(n.yaUrlTemplate,a)}}}]).directive("yaDragger",["yaSubscriber","$parse","mapApiLoad",function(e,t,n){return{restrict:"EA",scope:{yaAfterInit:"&"},link:function(o,a,r){var i=r.yaOptions?o.$eval(r.yaOptions):{};n(function(){i.autoStartElement=a[0];var n=new ymaps.util.Dragger(i);for(var c in r)if(0===c.indexOf("yaEvent")){var s=t(r[c]);e.subscribe(n,s,c,o)}o.yaAfterInit({$target:n})})}}}]);