blob: 6f648bca4141b13dd748cbae9bacd1c54c8944a8 [file] [log] [blame]
var $ = require('../util/jquery');
var defineClass = require('../util/define-class');
/**
* Given a Maps API address_components array, return an array of formatted
* address lines.
*
* TODO(rosswang): Is this really the best way?
*/
function formatAddress(details) {
//some maps API members are lower_underscore
/* jshint camelcase: false */
var addr = details && details.formatted_address;
/* jshint camelcase: true */
if (!addr) {
return [];
}
var parts = addr.split(', ');
switch (parts.length) {
case 1:
return [addr];
case 2:
return parts.join(', ');
case 3:
return parts[0] === details.name?
[parts[1] + ', ' + parts[2]] : [parts[0] + ', ' + parts[1]];
case 4:
var line1 = parts[0];
var line2 = parts[1] + ', ' + parts[2];
return line1 === details.name? [line2] : [line1, line2];
default:
return parts;
}
}
function render(details) {
var $info = $('<div>').addClass('destination-info');
if (details && details.name) {
$info.append($('<div>')
.addClass('title')
.text(details.name));
}
var addressLines = formatAddress(details);
if (addressLines) {
$.each(addressLines,
function(i, line) {
$info.append($('<div>')
.addClass('address-line')
.text(line));
});
}
return $info[0];
}
var DestinationInfo = defineClass({
publics: {
close: function() {
this.infoWindow.close();
},
show: function(marker) {
this.infoWindow.open(this.map, marker);
},
setDetails: function(details) {
this.infoWindow.setContent(render(details));
this.infoWindow.setPosition(details && details.geometry.location);
}
},
init: function(maps, map, details) {
this.map = map;
this.infoWindow = new maps.InfoWindow({
content: render(details),
position: details && details.geometry.location
});
}
});
module.exports = DestinationInfo;