angular.module('MapService', ["AjaxService"]).service('Map', function (Ajax, $q) { this.place = function (term) { var defer = $q.defer(); if (term && term.trim() !== "" && term.trim().length >= 5) { Ajax.post("Map", "search", {term: term}, function (data) { defer.resolve(data); }); } else { defer.resolve([]); } return defer.promise; }; this.geocode = function (placeId) { var defer = $q.defer(); var geocoder = new google.maps.Geocoder(); geocoder.geocode({'placeId': placeId}, function (results, status) { if (status === 'OK' && results && results[0]) { defer.resolve(results[0]); } else { defer.reject(null); } }); return defer.promise; }; this.checkPlace = function(term, address_number) { var that = this; var defer = $q.defer(); this.place(term).then(function (results) { if (results && results.length > 0) { var result = results[0]; if (result && result.place_id) { that.geocode(result.place_id).then(function (address) { var real_address = that.decodeAddress(address, address_number); if (real_address) { if (real_address.valid) { defer.resolve({place_id: result.place_id, address: real_address}); } else { defer.reject({place_id: result.place_id, address: real_address}); } } else { defer.reject({place_id: result.place_id}); } }, function() { defer.reject({place_id: result.place_id}); }); } else { defer.reject(null); } } else { defer.reject(null); } }, function () { defer.reject(null); }); return defer.promise; }; this.decodeAddress = function (address, street_number) { var real_address = { valid: false, valid_nonumber: false, full: null, route: null, street_number: null, manual_number: false, postal_code: null, country: null, place_id: null, version: 2 }; if (address && address.address_components) { real_address.full = address.formatted_address; real_address.place_id = address.place_id; angular.forEach(address.address_components, function (value) { if (value.types.indexOf("street_number") !== -1) { real_address.street_number = value.short_name; } else if (value.types.indexOf("route") !== -1) { real_address.route = value.short_name; } else if (value.types.indexOf("country") !== -1) { real_address.country = value.short_name; } else if (value.types.indexOf("postal_code") !== -1) { real_address.postal_code = value.short_name; } else if (value.types.indexOf("locality") !== -1) { real_address.locality = value.short_name; } }); if (real_address.street_number === null && street_number) { real_address.street_number = street_number; real_address.manual_number = true; } if (real_address.country && real_address.postal_code && real_address.route) { if (real_address.country.trim() !== "" && real_address.postal_code.trim() !== "" && real_address.route.trim() !== "") { if (real_address.country === "IT") { if (real_address.street_number && real_address.street_number.trim() !== "") { real_address.valid = true; } else { real_address.valid_nonumber = true; } } } } } return real_address; }; });