/**
* @author Mingjin Wu, Fei Chen, Jeff Hall
* Latest update: 2008/2/16
* To control the torch relay schedule in the Frame and mark the locations and
* paths on the Map;
* Written by Mingjin Wu first, continued by Fei Chen from 2007/11/23
* Further modification by Jeff Hall 2008/2/14
*
* Changes:
* jhall - Modified code to use Google Maps API
* jhall - Added some support for locale and internationalization
* JSON data file is dynamically selected by locale.
* Modify toZhDate() for English locale
* Improve info window to display wikipedia exerpt, link, and "Learn more about ..." Google Search link.
* jhall - Move torch icon to far right side of pick list instead of bullet.
* jhall - Use larger torch icon for map marker.
* jhall - Attempt to hack in support for GMarkerManager. No support for Polylines, abandoned for now.
* jhall - Correct error in milestone date comparison
* jhall - Correct error in quickSearch algorithm which occasionally returned a city before its first date elapsed.
*
*/
/**
* The class relative to the mapplet frame in the browser, used to display and
* control the torch relay scheduler and the player.
*/
function Frame() {
var TIME_SPAN = 5000;
var currentCityId = null;
/**
* Do the real new region setup work in the frame.
* @param {int} region
*/
this.setRegion = function(region) {
var worldLink = document.getElementById("worldLink");
var chinaLink = document.getElementById("chinaLink");
var worldList = document.getElementById("worldList");
var chinaList = document.getElementById("chinaList");
if (region == TorchMgr.REGION_WORLD) {
worldLink.className = "selected";
chinaLink.className = "";
worldList.className = "show";
chinaList.className = "hide";
} else {
worldLink.className = "";
chinaLink.className = "selected";
worldList.className = "hide";
chinaList.className = "show";
}
}
/**
* Change province node to expand/collapse.
* @param {Eelment} nameNode The text node of province's name.
*/
function changeProvinceStyle(cityNode) {
var controlNode = cityNode.parentNode;
if (controlNode.className.search(/hide/) != -1) {
var result = controlNode.className.split(/\s*hide\s*/);
controlNode.className = result.join(" ") + " show";
collapseProvinces(cityNode.id);
} else if(controlNode.className.search(/show/) != -1){
var result = controlNode.className.split(/\s*show\s*/);
controlNode.className = result.join(" ") + " hide";
}
}
/**
* Collapse all province nodes except the special node.
* @param {String} opt_specialId The id of province node that needn't collapsed.
*/
function collapseProvinces(opt_specialId){
var list = TorchMgr.chinaProvinceList;
for(var i = 0, prov; prov = list[i]; i++){
if(opt_specialId && prov.id == opt_specialId){
continue;
}
var provNode = document.getElementById(prov.id).parentNode;
if (provNode.className.search(/show/) != -1) {
var result = provNode.className.split(/\s*show\s*/);
provNode.className = result.join(" ") + " hide";
}
}
}
/**
* Do the real new city setup work in the frame.
* @param {City} city City Object.
*/
function changeCity(city) {
TorchMgr.Log('[Frame#changeCity]');
var cityId = city.id;
// Restore the current city's style
var currentCity = document.getElementById(currentCityId);
if (currentCityId && currentCity) {
var result = currentCity.className.split(/\s*selected\s*/);
currentCity.className = result.join(" ");
}
// Highlight "new" current city.
currentCityId = cityId;
currentCity = document.getElementById(currentCityId);
var className = currentCity.className;
currentCity.className = className + " selected";
// Change the style of the city's province if it is collapse, only when the
// city under a province
if (cityId.search(/^c/) == 0 && cityId.search(/^cp/) != 0) {
var cityIndex = parseInt(cityId.match(/\d+/));
var provinceId = TorchMgr.chinaCityList[cityIndex-TorchMgr.CHINA_LIST_START_INDEX].parentId;
var provinceNode = document.getElementById(provinceId);
if (provinceNode.parentNode.className.search(/hide/) != -1) {
changeProvinceStyle(provinceNode);
}
}
scrollToVisible(currentCity);
}
/**
* Auto scroll the city list.
* @param {Element} cityElem
*/
function scrollToVisible(cityElem){
var topParent = document.getElementById("scrollWindow");
var height = topParent.offsetHeight;
var scrollTop = topParent.scrollTop;
var nowPosition = getPosition(cityElem, topParent)-scrollTop;
if(nowPosition > height){
TorchMgr.Log(nowPosition + ' > ' + height);
topParent.scrollTop = scrollTop + (nowPosition - height) + 2*cityElem.offsetHeight;
}else if(nowPosition < 0){
TorchMgr.Log(nowPosition + ' < 0');
topParent.scrollTop = scrollTop + nowPosition - 2*cityElem.offsetHeight;
}
function getPosition(element, topParent) {
var height = 0;
for (var e = element;e && e != topParent; e = e.offsetParent)
height += e.offsetTop;
for (e = element.parentNode;e && e != topParent; e = e.parentNode)
if (e.scrollTop)
height -= e.scrollTop;
return height;
}
}
/**
* Perform as the event listener on the event of name node click.
*/
function onCityNameClick() {
var cityId = this.parentNode.id;
var city = TorchMgr.getCityById(cityId);
if (city.type == TorchMgr.TYPE_CHINA_PROVINCE) {
changeProvinceStyle(this.parentNode);
}
if (currentCityId != cityId) {
changeCity(city);
TorchMgr.setCity(city, TorchMgr.EVENT_FROM_FRAME);
}
}
/**
* Add cityList into frame and define relative node and event.
* @param {Array} cityList The list of cities.
* @param {int} startIndex The start index indicat where should be started to
* add the city into the frame.
* @param {int} endIndex The end index indicate where should be stopped adding
* the city into the frame.
* @param {String} cityStatus Indicate all the cities's status that added into
* the frame.
* @param {String} cityType Indicate all the cities's type that added into
* the frame.
*/
this.importCity = function(cityList, startIndex, endIndex, cityStatus, cityType) {
/**
* Inner function of importCity(). Define the "li" tag to wrap the city.
* Its id equals city's id, class determined by city status to display
* relative icon.
* NOTE: If the city is province type, its default cities list is hide.
* @param {City} city
*/
function createCityNode(city, className) {
var cityNode = document.createElement("li");
cityNode.className = className;
var torchIcon = document.createElement("span");
torchIcon.className = "torch";
torchIcon.innerHTML = " ";
cityNode.appendChild(torchIcon);
var parentNode;
switch (city.type) {
case TorchMgr.TYPE_WORLD_CITY:
city.parentId = "worldList";
cityNode.setAttribute("id",city.id);
parentNode = document.getElementById("worldList");
parentNode.appendChild(cityNode);
break;
case TorchMgr.TYPE_CHINA_PROVINCE:
city.parentId = "chinaList";
cityNode.setAttribute("id",city.id);
parentNode = document.getElementById("chinaList");
// Create div wrapper first
var divWrapper = document.createElement("div");
divWrapper.className = "province hide";
parentNode.appendChild(divWrapper);
divWrapper.appendChild(cityNode);
// Create 'ul' tag
var provinceUL = document.createElement("ul");
divWrapper.appendChild(provinceUL);
break;
case TorchMgr.TYPE_CHINA_CITY:
city.parentId = "cp" + city.prtIndex;
cityNode.setAttribute("id",city.id);
parentNode = document.getElementById(city.parentId).nextSibling; // The "ul" tag node
if(city.prtAction == "before")
{
document.getElementById("chinaList").insertBefore(cityNode, document.getElementById(city.parentId).parentNode);
}
else
{
parentNode.appendChild(cityNode);
}
break;
}
return cityNode;
}
/**
* Inner function of importCity(). Define a "a" tag to wrap the city name
* and add event.
* @param {String} name City name.
* @param {Element} cityNode The "li" tag element.
*/
function createNameNode(name, cityNode) {
var nameNode = document.createElement("a");
nameNode.className = "name";
nameNode.setAttribute("href","#"); // Make the ':hover' act
cityNode.appendChild(nameNode);
nameNode.appendChild(document.createTextNode(name));
nameNode.onclick = onCityNameClick;
}
/**
* Inner function of importCity(). Define a "span" tag to wrap the city
* date.
* @param {String} date Torch relay date in the city.
* @param {Element} cityNode The "li" tag element.
*/
function createDateNode(date, cityNode) {
var dateNode = document.createElement("div");
dateNode.className = "date";
cityNode.appendChild(dateNode);
var localDate = TorchMgr.toLocaleDate(date);
dateNode.appendChild(document.createTextNode(localDate));
}
// constructor
var cityClassName = (cityStatus == TorchMgr.STATUS_NOTORCH) ? "noTorch" : "torched";
for (var i = startIndex; i <= endIndex; i++) {
var city = cityList[i];
if('undefined' == typeof(city))
{
continue;
}
city.type = cityType;
city.id = cityType + city.index;
className = (TorchMgr.torchCity == cityList[i]) ? "hasTorch torched" : cityClassName;
var cityNode = createCityNode(city, className);
createNameNode(city.name, cityNode);
createDateNode(city.date, cityNode);
}
}
/**
* Invoked by TorchMgr.setCity(), and change the current city in the frame.
* @param {City} city The target city to go to.
* @param {int} opt_region If the region is also changed, this should be given.
*/
this.setCity = function(city) {
TorchMgr.Log('[Frame.setCity]');
changeCity(city);
}
/**
* Frame initiation.
* @param {int} region Indicate which region frame should start and display.
*/
this.init = function(region) {
/**
* Creates localized region links
*/
function updateRegionLinks(){
var worldLink = document.getElementById('worldLink');
var chinaLink = document.getElementById('chinaLink');
worldLink.innerHTML = (TorchMgr.localizedText ? TorchMgr.localizedText.worldLink : worldLink.innerHTML);
chinaLink.innerHTML = (TorchMgr.localizedText ? TorchMgr.localizedText.chinaLink : chinaLink.innerHTML);
}
/**
* Inner function of init(). Define the city player in the frame.
*/
function showPlayer() {
/**
* Inner function of showPlayer().
*/
function setButton(id, clickCall) {
var button = document.getElementById(id);
button.onclick = clickCall;
}
/**
* Inner function of showPlayer().
*/
function play() {
var currentCity = TorchMgr.currentCity;
if (TorchMgr.currentCity.id.search(/^cp/) == 0) {
var cityList = TorchMgr.chinaCityList;
var firstCity = document
.getElementById(TorchMgr.currentCity.id).nextSibling.firstChild;
var cityIndex = parseInt(firstCity.id.match(/\d+/));
currentCity = TorchMgr.currentCity = cityList[cityIndex - TorchMgr.CHINA_LIST_START_INDEX];
}
TorchMgr.map.setCity(currentCity);
TorchMgr.frame.setCity(currentCity);
TorchMgr.playerIntervalId = setInterval("TorchMgr.toNext(1);",
TIME_SPAN);
document.getElementById("playButton").style.display = "none";
document.getElementById("pauseButton").style.display = "block";
}
/**
* Inner function of showPlayer().
*/
function stop() {
clearInterval(TorchMgr.playerIntervalId);
TorchMgr.playerIntervalId == null;
}
/**
* Inner function of showPlayer().
*/
function pause() {
stop();
document.getElementById("playButton").style.display = "block";
document.getElementById("pauseButton").style.display = "none";
}
/**
* Inner function of showPlayer().
*/
function previous() {
pause();
TorchMgr.toNext(0);
}
/**
* Inner function of showPlayer().
*/
function next() {
pause();
TorchMgr.toNext(1);
}
// showPlayer() constructor
setButton("prevButton", previous);
setButton("playButton", play);
setButton("pauseButton", pause);
setButton("nextButton", next);
}
function showScroll() {
var topParent = document.getElementById("boardContent");
var childHeight = getChildOffsetHeight(topParent);
if (childHeight < topParent.offsetHeight) {
document.getElementById("scrollUp").style.display = "none";
document.getElementById("scrollDown").style.display = "none";
}
function getChildOffsetHeight(elem) {
var childNodes = elem.getElementsByTagName("ul");
var height = 0;
for (var i = 0, node;node = childNodes[i]; i++) {
height += node.offsetHeight;
}
return height;
}
}
// init() constructor
var defaultCity;
switch(region)
{
case TorchMgr.REGION_WORLD:
defaultCity = TorchMgr.worldDefaultCity;
break;
case TorchMgr.REGION_CHINA:
defaultCity = TorchMgr.chinaDefaultCity;
break;
default:
}
showPlayer();
updateRegionLinks();
this.setRegion(region);
if(TorchMgr.torchCity){
this.setCity(TorchMgr.torchCity);
}
else
{
this.setCity(defaultCity);
}
showScroll();
}
}
/**
* The class relative to the map in the browser, used to display and
* control the torch relay locations and path.
*/
function Map(mapDiv) {
var TORCH_ICON_URL = TorchMgr.SITE_URL + TorchMgr.IMAGES_PATH + "olympic-torch-36.png";
var TORCH_ICON_SHADOW_URL = TorchMgr.SITE_URL + TorchMgr.IMAGES_PATH + "torchShadow.png";
var GRAY_ICON_URL = TorchMgr.SITE_URL + TorchMgr.IMAGES_PATH + "dot-gray-transparent.png";
var RED_ICON_URL = TorchMgr.SITE_URL + TorchMgr.IMAGES_PATH + "dot-red-transparent.png";
var BLUE_ICON_URL = TorchMgr.SITE_URL + TorchMgr.IMAGES_PATH + "dot-blue-transparent.png";
var grayIcon = createIcon(GRAY_ICON_URL, new google.maps.Size(12, 12), new google.maps.Point(6, 6), new google.maps.Point(6, 4));
var redIcon = createIcon(RED_ICON_URL, new google.maps.Size(12, 12), new google.maps.Point(6, 6), new google.maps.Point(6, 4));
var blueIcon = createIcon(BLUE_ICON_URL, new google.maps.Size(12, 12), new google.maps.Point(6, 6), new google.maps.Point(6, 4));
var torchIcon = createIcon(TORCH_ICON_URL, new google.maps.Size(36, 36), new google.maps.Point(5, 30), new google.maps.Point(9, 4));
torchIcon.shadow = TORCH_ICON_SHADOW_URL;
torchIcon.shadowSize = new google.maps.Size(35,22);
var grayLineColor = "#333333";
var redLineColor = "#ff0000";
var worldCenter = new google.maps.LatLng(37.633300, 21.616759);
var chinaCenter = new google.maps.LatLng(34.264915, 108.954401);
var DEFAULT_WORLD_LEVEL = 3;
var DEFAULT_CHINA_LEVEL = 4;
var DEFAULT_PROV_LEVEL = 8;
if(!mapDiv)
{
throw new Error("Can't get torch map");
}
/////////////////////////////////////////////////////////////////////////
/**
* Torch Player Map Control
* Modified from original to derive from GControl
*/
dm = function() {}
dm.TorchPlayerControl = function()
{
google.maps.Control.call(this, false, false);
}
dm.TorchPlayerControl.prototype = new google.maps.Control();
dm.TorchPlayerControl.prototype.initialize = function(map)
{
/*
*/
var containerElement = map.getContainer();
var playerContainer = document.createElement('div');
playerContainer.className = "playerControl";
var prevButton = document.createElement('a');
prevButton.className = "player prevButton";
prevButton.id = "prevButton";
prevButton.setAttribute("href", "#");
var playButton = document.createElement('a');
playButton.className = "player playButton";
playButton.id = "playButton";
playButton.setAttribute("href", "#");
var pauseButton = document.createElement('a');
pauseButton.className = "player pauseButton";
pauseButton.id = "pauseButton";
pauseButton.setAttribute("href", "#");
var nextButton = document.createElement('a');
nextButton.className = "player nextButton";
nextButton.id = "nextButton";
nextButton.setAttribute("href", "#");
playerContainer.appendChild(prevButton);
playerContainer.appendChild(playButton);
playerContainer.appendChild(pauseButton);
playerContainer.appendChild(nextButton);
containerElement.appendChild(playerContainer);
return playerContainer;
}
dm.TorchPlayerControl.prototype.getDefaultPosition = function()
{
return new google.maps.ControlPosition(google.maps.ANCHOR_TOP_RIGHT, new google.maps.Size(10, 30) );
}
dm.TorchPlayerControl.prototype.printable = function()
{
return false;
}
dm.TorchPlayerControl.prototype.selectable = function()
{
return false;
}
////////////////////////////////////////////////////////////////////
// Force init of Google Map
var gmap = new google.maps.Map2(mapDiv);
gmap.setCenter(new GLatLng(37.4419, -122.1419), 13);
gmap.addControl(new google.maps.LargeMapControl());
gmap.addControl(new google.maps.ScaleControl());
gmap.addControl(new google.maps.MapTypeControl());
gmap.addControl(new dm.TorchPlayerControl());
var overlayManager = new OverlayManager(gmap); // For backward compatability
var torchMarker = null;
var selectionMarker = null;
/**
* The manager class to manage the markers and polylines, including adding the
* overlays to map, and hiding or showing them.
* @param {GMap2} gmap
*/
function OverlayManager(gmap) {
var LEVEL_RANGE_WORLD = [1, 3];
var LEVEL_RANGE_CHINA = [4, 17];
var LEVEL_RANGE_CHINA_PROV = [4, 5];
var LEVEL_RANGE_CHINA_CITY = [6, 17];
var LEVEL_WORLD = 1;
var LEVEL_CHINA = 2;
var LEVEL_CHINA_PROV = 3;
var LEVEL_CHINA_CITY = 4;
var map = gmap;
// Hack in support for GMarkerManager
//var markerManager = new google.maps.MarkerManager(gmap);
// All overlays arrays' first elem store the flag as added or not
// and the second elem store the flag as showed or not
var worldCityMarkers = [false/*isAdded*/, false/*isShowed*/];
var chinaCityMarkers = [false, false];
var chinaProvinceMarkers = [false, false];
var worldPolylines = [false, false];
var chinaPolylines = [false, false];
/* Hack in support for GMarkerManager
var worldCityMarkers = [];
var chinaCityMarkers = [];
var chinaProvinceMarkers = [];
var worldPolylines = [];
var chinaPolylines = [];
*/
/**
* Show all the overlays in the given list.
* Note: if the overlays are not added to the map, add them.
* @param {Array} overlayList The list of overlays.
*/
function showOverlays(overlayList) {
if (!overlayList[0]) {
add(overlayList);
overlayList[0] = true;
overlayList[1] = true;
} else if (!overlayList[1]) {
show(overlayList);
overlayList[1] = true;
}
/**
* Inner function, add the overlays into map.
* @param {Array} overlayList
*/
function add(overlayList) {
for (var i = 2, overlay; overlay = overlayList[i]; i++) {
map.addOverlay(overlay);
}
}
/**
* Inner function, show the overlays.
* @param {Array} overlayList
*/
function show(overlayList) {
for (var i = 2, overlay; overlay = overlayList[i]; i++) {
overlay.show();
}
}
}
/**
* Hide all the overlays in the given list, if still not added to the map,
* do nothing.
* @param {Array} overlayList
*/
function hideOverlays(overlayList) {
if (overlayList[0] && overlayList[1]) {
hide(overlayList);
overlayList[1] = false;
}
/**
* Inner function, hide the overlays.
* @param {Array} overlayList
*/
function hide(overlayList) {
for (var i = 2, overlay; overlay = overlayList[i]; i++) {
overlay.hide();
}
}
}
/**
* Add marker into the overlayManager.
* @param {GMarker} marker
* @param {int} cityType
*/
this.addMarker = function(marker, cityType) {
switch (cityType) {
case TorchMgr.TYPE_WORLD_CITY:
worldCityMarkers.push(marker);
break;
case TorchMgr.TYPE_CHINA_CITY:
chinaCityMarkers.push(marker);
break;
case TorchMgr.TYPE_CHINA_PROVINCE:
chinaProvinceMarkers.push(marker);
}
}
/**
* Add polyline into the overlayManager.
* @param {GPolyline} polyline
* @param {int} cityType
*/
this.addPolyline = function(polyline, cityType) {
switch (cityType) {
case TorchMgr.TYPE_WORLD_CITY:
worldPolylines.push(polyline);
break;
case TorchMgr.TYPE_CHINA_CITY:
chinaPolylines.push(polyline);
}
}
/**
* Invoked when the region is changed.
* @param {int} region
*/
this.refresh = function(region) {
switch (region) {
case TorchMgr.REGION_WORLD:
map.setCenter(worldCenter, DEFAULT_WORLD_LEVEL);
break;
case TorchMgr.REGION_CHINA:
map.setCenter(chinaCenter, DEFAULT_CHINA_LEVEL);
}
// Hack in support for GMarkerManager
//markerManager.refresh();
}
/* Try to hack in support for GMarkerManager.
this.markerInitComplete = function(){
markerManager.addMarkers(worldCityMarkers, LEVEL_RANGE_WORLD[0], LEVEL_RANGE_WORLD[1]);
markerManager.addMarker(worldPolylines[0], LEVEL_RANGE_WORLD[0], LEVEL_RANGE_WORLD[1]);
markerManager.addMarkers(worldPolylines, LEVEL_RANGE_WORLD[0], LEVEL_RANGE_WORLD[1]);
markerManager.addMarkers(chinaProvinceMarkers, LEVEL_RANGE_CHINA_PROV[0], LEVEL_RANGE_CHINA_PROV[1]);
markerManager.addMarkers(chinaCityMarkers, LEVEL_RANGE_CHINA_CITY[0], LEVEL_RANGE_CHINA_CITY[1]);
markerManager.addMarkers(chinaPolylines, LEVEL_RANGE_CHINA_CITY[0], LEVEL_RANGE_CHINA_CITY[1]);
}
*/
/**
* Show special markers according to the level range.
* @param {int} levelRange
*/
function showMarkers(levelRange) {
switch (levelRange) {
case LEVEL_CHINA_PROV:
showOverlays(chinaProvinceMarkers);
break;
case LEVEL_CHINA_CITY:
showOverlays(chinaCityMarkers);
break;
case LEVEL_WORLD:
showOverlays(worldCityMarkers);
}
}
/**
* Hide special markers according to the level range.
* @param {int} levelRange
*/
function hideMarkers(levelRange) {
switch (levelRange) {
case LEVEL_CHINA_PROV:
hideOverlays(chinaProvinceMarkers);
break;
case LEVEL_CHINA_CITY:
hideOverlays(chinaCityMarkers);
break;
case LEVEL_WORLD:
hideOverlays(worldCityMarkers);
}
}
/**
* Show special polylines according to the level range.
* @param {int} levelRange
*/
function showPolylines(levelRange) {
switch (levelRange) {
case LEVEL_WORLD:
showOverlays(worldPolylines);
break;
case LEVEL_CHINA_PROV:
case LEVEL_CHINA_CITY:
showOverlays(chinaPolylines);
}
}
/**
* Hide special polylines according to the level range.
* @param {Object} levelRange
*/
function hidePolylines(levelRange) {
switch (levelRange) {
case LEVEL_WORLD:
hideOverlays(worldPolylines);
break;
case LEVEL_CHINA_PROV:
case LEVEL_CHINA_CITY:
hideOverlays(chinaPolylines);
}
}
/**
* Get level range according to the given level.
* @param {int} level The Google map's level.
*/
function getLevelRange(level) {
if (LEVEL_RANGE_CHINA_PROV[0] <= level && level <= LEVEL_RANGE_CHINA_PROV[1]) {
return LEVEL_CHINA_PROV;
}
if (LEVEL_RANGE_CHINA_CITY[0] <= level && level <= LEVEL_RANGE_CHINA_CITY[1]) {
return LEVEL_CHINA_CITY;
}
if (LEVEL_RANGE_WORLD[0] <= level && level <= LEVEL_RANGE_WORLD[1]) {
return LEVEL_WORLD;
}
}
/**
* Get region code according the the special level.
* @param {int} newLevel The Google map's level.
*/
this.getRegionByLevel = function(level) {
if ( level >= LEVEL_RANGE_CHINA[0]) {
return TorchMgr.REGION_CHINA;
} else if ( level <= LEVEL_RANGE_WORLD[1]) {
return TorchMgr.REGION_WORLD;
}
}
/**
* Control the overlays' display on the map according to the levels.
* @param {int} oldLevel The Google Map's level.
* Need to hide overlays on this level.
* @param {int} newLevel The Google Map's level.
* Need to show overlays on this level.
*/
this.changeOverlays = function(oldLevel, newLevel) {
var oldLevelRange = getLevelRange(oldLevel);
var newLevelRange = getLevelRange(newLevel);
if (oldLevelRange != newLevelRange) {
if(torchMarker)
{
gmap.removeOverlay(torchMarker);
}
if(selectionMarker)
{
gmap.removeOverlay(selectionMarker);
}
hideMarkers(oldLevelRange);
hidePolylines(oldLevelRange);
showMarkers(newLevelRange);
showPolylines(newLevelRange);
// Prevent torch marker from being underneath other markers.
if(selectionMarker)
{
gmap.addOverlay(selectionMarker);
}
if(torchMarker)
{
gmap.addOverlay(torchMarker);
}
}
}
}
/**
* Do the real new city setup work in the map.
* @param {City} city The target city to go to.
*/
function changeCity(city) {
TorchMgr.Log('[Map#changeCity] ' + city.id);
if (selectionMarker) {
gmap.removeOverlay(selectionMarker);
//torchMarker.setPoint(new google.maps.LatLng(city.lat, city.lng));
selectionMarker.setPoint(new google.maps.LatLng(city.lat, city.lng));
} else {
//torchMarker = new google.maps.Marker(new google.maps.LatLng(city.lat, city.lng), { icon : torchIcon });
selectionMarker = new google.maps.Marker(new google.maps.LatLng(city.lat, city.lng), {icon: blueIcon} );
}
if(torchMarker)
{
gmap.removeOverlay(torchMarker);
}
gmap.panTo(new google.maps.LatLng(city.lat, city.lng));
gmap.addOverlay(selectionMarker);
// Force torch to overlay any other markers.
if(torchMarker)
{
gmap.addOverlay(torchMarker);
}
//addMarkerEvent(torchMarker, city);
addMarkerEvent(selectionMarker, city);
// Show info window
openInfoWindow(selectionMarker, city);
}
function getInfoWindowHtml(city) {
var shortName = city.name.split('-')[0];
var image = "";
if(TorchMgr.cityImageList && city.index < TorchMgr.cityImageList.length)
{
image = '';
}
var learnLink = '
' + city.learnMore + '
'; var imageLink = '' + image + ''; var html = '' + city.name + '' + (city.info != undefined ? city.info : "") + '
' + '" + data.body + "
"; ge_link.innerHTML = data.ge_link; attribution.innerHTML = data.attribution; */ } TorchMgr.Log("Locale: " + determineLocale() + ", Language: " + determineLanguage()); // Kickstart everything google.setOnLoadCallback(initialize); google.load("maps", "2", {locale:determineLanguage()});