diff options
| author | Antonin Bourguignon <abo@openerp.com> | 2012-10-02 12:29:15 +0200 |
|---|---|---|
| committer | Antonin Bourguignon <abo@openerp.com> | 2012-10-02 12:29:15 +0200 |
| commit | 165333208000e7f8b2a61fd99c0a5b1f1d242976 (patch) | |
| tree | 150c1a7d2f30b4043b1cd565c40324b773fec3d5 /addons/google_map/static/src/js/google_map.js | |
| parent | 2d2a44dcf2e3b29e4fef4000792a064862967769 (diff) | |
| parent | f285c0e481d12edfc2aa9aa1fd3baeb334bc39c6 (diff) | |
[MERGE] trunk
bzr revid: abo@openerp.com-20121002102915-424prxd74izb1szw
Diffstat (limited to 'addons/google_map/static/src/js/google_map.js')
| -rw-r--r-- | addons/google_map/static/src/js/google_map.js | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/addons/google_map/static/src/js/google_map.js b/addons/google_map/static/src/js/google_map.js new file mode 100644 index 00000000000..23b70f5f6c3 --- /dev/null +++ b/addons/google_map/static/src/js/google_map.js @@ -0,0 +1,75 @@ +openerp.event = function(instance, mod) { + instance.web.form.widgets.add('many2one_address_google_map', 'instance.google_map.Many2OneAddress'); + + var googleMapsLoaded = null; + + instance.google_map.GoogleMapConnector = instance.web.Class.extend({ + map_load: function() { + var self = this; + if(googleMapsLoaded === null) { + googleMapsLoaded = $.Deferred(); + // global + openerp_googleMapsCallback = googleMapsLoaded.resolve; + $.ajax({ + url: "https://maps.googleapis.com/maps/api/js?v=3&callback=openerp_googleMapsCallback&sensor=false", + dataType: "script" + }).fail(googleMapsLoaded.reject); + } + return googleMapsLoaded; + }, + render_map: function(address,element) { + this.map_load().then(function() { + var geocoder = new google.maps.Geocoder(); + geocoder.geocode({'address': address}, function(results, status) { + if (status == google.maps.GeocoderStatus.OK) { + var lat = results[0].geometry.location.lat(); + var lng = results[0].geometry.location.lng(); + var myOptions = { + zoom: 17, + center: new google.maps.LatLng(lat,lng), + mapTypeId: google.maps.MapTypeId.ROADMAP + }; + var map = new google.maps.Map(element,myOptions); + var position = new google.maps.LatLng(lat,lng); + var marker = new google.maps.Marker({ map: map, position: position }); + return marker; + } + }); + }); + }, + }); + + instance.google_map.Many2OneAddress = instance.web.form.FieldMany2One.extend({ + init: function(field_manager, node){ + this._super(field_manager, node); + this.map = new instance.google_map.GoogleMapConnector(); + }, + get_address:function(value){ + var self = this; + if (!value || value.length == 0){ + return $.Deferred().reject(); + } + (value instanceof Array)?value = parseInt(value[0]):false; + var data = new instance.web.DataSet(this,this.field.relation, this.build_context()); + data.read_ids(value,["street","city","zip","country_id"]).done(function(value){ + var address; + if (value['country_id']) { + address = _.str.sprintf('%(street)s, %(zip)s %(city)s, %(country_id[1])s', value); + } else { + address = _.str.sprintf('%(street)s, %(zip)s %(city)s', value); + } + // TODO repalce by widget_option selector self.options.selector + var el = self.view.$el.find(".oe_google_map")[0]; + self.map.render_map(address,el); + }); + }, + set_value:function(value){ + this._super(value); + this.get_address(value); + }, + render_value:function(no_recurse){ + this.get_address(this.get("value")); + this._super(no_recurse); + } + }); +}; |
