112 lines
3.7 KiB
JavaScript
112 lines
3.7 KiB
JavaScript
(function() {
|
||
(function(jQuery) {
|
||
return jQuery.widget('Yavsc.geocode', {
|
||
geocoder:null,
|
||
gmap:null,
|
||
combo:null,
|
||
inputLatitude:null,
|
||
inputLongitude:null,
|
||
marker:null,
|
||
options: {
|
||
disabled: false,
|
||
map: 'map',
|
||
start: { lat: -34.397, lng: 150.644 },
|
||
zoom: 16,
|
||
btngeoloc: null,
|
||
combo: 'Location_combo',
|
||
inputLatitude: 'Location_Longitude',
|
||
inputLongitude: 'Location_Latitude',
|
||
onValidated: null,
|
||
onProposalClicked: null
|
||
},
|
||
onBlur: function()
|
||
{
|
||
this.geocodeAddress();
|
||
},
|
||
geocodeAddress: function () {
|
||
var validation = this.options.onValidated;
|
||
var _this = this;
|
||
var $input = $(this.element);
|
||
var address = $input.val();
|
||
$input.data("isRequesting", true);
|
||
$input.data("validPlaceId", false);
|
||
_this.geocoder.geocode({'address': address}, function(results, status) {
|
||
if (status === google.maps.GeocoderStatus.OK) {
|
||
var firstres = results[0];
|
||
var pos = firstres.geometry.location;
|
||
if (_this.combo) {
|
||
var $combo = $(_this.combo);
|
||
$combo.html("");
|
||
if (results.length>1) {
|
||
results.forEach(function(element) {
|
||
$('<li>'+element.formatted_address+'</li>')
|
||
.click( function() {
|
||
$(_this.element).val($(this).text());
|
||
if (_this.options.onProposalClicked)
|
||
_this.options.onProposalClicked();
|
||
} )
|
||
.appendTo($combo);
|
||
},this);
|
||
}
|
||
}
|
||
if (_this.marker) {
|
||
_this.marker.setMap(null);
|
||
_this.marker = null;
|
||
}
|
||
if (results.length==1) {
|
||
$(_this.element).val(firstres.formatted_address);
|
||
_this.gmap.setCenter(pos);
|
||
_this.marker = new google.maps.Marker({
|
||
map: _this.gmap,
|
||
draggable: true,
|
||
animation: google.maps.Animation.DROP,
|
||
position: pos
|
||
});
|
||
|
||
if (_this.inputLatitude) _this.inputLatitude.value=pos.lat;
|
||
if (_this.inputLongitude) _this.inputLongitude.value = pos.lng;
|
||
if (validation) validation({results:results,success:true});
|
||
$input.data("validPlaceId", true);
|
||
$input.data("isRequesting", false);
|
||
if (validation) validation({success:true,status: status});
|
||
return;
|
||
} }
|
||
if (validation) validation({success:false,status: status});
|
||
$input.data("isRequesting", false);
|
||
} );
|
||
},
|
||
_create: function() {
|
||
var _this = this;
|
||
var $input = $(this.element);
|
||
if (!_this.options.disabled) {
|
||
_this.combo = document.getElementById(this.options.combo);
|
||
_this.gmap = new google.maps.Map(document.getElementById(_this.options.map), {
|
||
zoom: _this.options.zoom,
|
||
center: _this.options.start
|
||
});
|
||
if (_this.options.inputLatitude)
|
||
_this.inputLatitude = document.getElementById(_this.options.inputLatitude);
|
||
if (_this.options.inputLongitude)
|
||
_this.inputLongitude = document.getElementById(_this.options.inputLongitude);
|
||
|
||
this.geocoder = new google.maps.Geocoder();
|
||
var btn = document.getElementById(_this.options.btngeoloc);
|
||
if (btn) {
|
||
btn.click( function() {
|
||
_this.geocodeAddress();
|
||
});
|
||
btn.disabled = false;
|
||
}
|
||
$input.on('blur',function() {_this.onBlur(); });
|
||
}},
|
||
getDistance: function(lat1,lon1,lat2,lon2){
|
||
var R = 6371; // Earth's radius in Km
|
||
return Math.acos(Math.sin(lat1)*Math.sin(lat2) +
|
||
Math.cos(lat1)*Math.cos(lat2) *
|
||
Math.cos(lon2-lon1)) * R;
|
||
}
|
||
});
|
||
})(jQuery);
|
||
|
||
}).call(this);
|