var map;
var mapDiv;
var ge;
var srch;
var gIcons = new Array();
var overlays = new Array();
var hyb;
var phy;
var s3d;

google.load('earth', '1');

function initMap() {
 mapDiv = document.getElementById('map');
 map = new google.maps.Map2(mapDiv);
 if (zoomIsDefault) {
  var wh = document.body.clientHeight ||
           document.documentElement.clientHeight ||
           window.innerHeight;
  if (wh && (wh < 700)) {
   zoom = 4;
  }
  else if (wh && (wh < 300)) {
   zoom = 3;
  }
 }

 map.setCenter(new google.maps.LatLng(lat, lng), zoom);
 map.enableContinuousZoom();
 // map.enableScrollWheelZoom();
 map.enableGoogleBar();
 // map.setUIToDefault();

 var opts = {'urlArg': G_HYBRID_MAP.getUrlArg(),
             'maxResolution': G_HYBRID_MAP.getMaximumResolution(),
             'minResolution': G_HYBRID_MAP.getMinimumResolution(),
             'tileSize': G_HYBRID_MAP.getTileSize(),
             'textColor': G_HYBRID_MAP.getTextColor(),
             'linkColor': G_HYBRID_MAP.getLinkColor(),
             'errorMessage': G_HYBRID_MAP.getErrorMessage(),
             'alt': G_HYBRID_MAP.getAlt()};
 hyb = new google.maps.MapType(G_HYBRID_MAP.getTileLayers(),
                                   G_HYBRID_MAP.getProjection(),
                                   'Ilmakuva', opts);
 map.addMapType(hyb);

 opts = {'urlArg': G_PHYSICAL_MAP.getUrlArg(),
         'maxResolution': G_PHYSICAL_MAP.getMaximumResolution(),
         'minResolution': G_PHYSICAL_MAP.getMinimumResolution(),
         'tileSize': G_PHYSICAL_MAP.getTileSize(),
         'textColor': G_PHYSICAL_MAP.getTextColor(),
         'linkColor': G_PHYSICAL_MAP.getLinkColor(),
         'errorMessage': G_PHYSICAL_MAP.getErrorMessage(),
         'alt': G_PHYSICAL_MAP.getAlt()};
 phy = new google.maps.MapType(G_PHYSICAL_MAP.getTileLayers(),
                                   G_PHYSICAL_MAP.getProjection(),
                                   'Maasto', opts);
 map.addMapType(phy);

// opts = {'urlArg': G_SATELLITE_3D_MAP.getUrlArg(),
//         'maxResolution': G_SATELLITE_3D_MAP.getMaximumResolution(),
//         'minResolution': G_SATELLITE_3D_MAP.getMinimumResolution(),
//         'tileSize': G_SATELLITE_3D_MAP.getTileSize(),
//         'textColor': G_SATELLITE_3D_MAP.getTextColor(),
//         'linkColor': G_SATELLITE_3D_MAP.getLinkColor(),
//         'errorMessage': G_SATELLITE_3D_MAP.getErrorMessage(),
//         'alt': G_SATELLITE_3D_MAP.getAlt(),
//         'radius': 6378137};
// var s3d = new google.maps.MapType(G_SATELLITE_3D_MAP.getTileLayers(),
//                                   G_SATELLITE_3D_MAP.getProjection(),
//                                   '3D', opts);

 s3d = G_SATELLITE_3D_MAP;
 map.addMapType(s3d);

 map.removeMapType(G_HYBRID_MAP);
 map.removeMapType(G_NORMAL_MAP);
 map.removeMapType(G_SATELLITE_MAP);

 // map.maptypechanged = checkShims;
 google.maps.Event.addListener(map, 'maptypechanged', checkShims);

 var result = eval('map.setMapType(' + maptype + ')');

 var sz = new google.maps.Size(5, 40);
 var tl = new google.maps.ControlPosition(G_ANCHOR_TOP_LEFT, sz);
 map.addControl(new google.maps.LargeMapControl3D(), tl);

 // var lscopts = {
 //  searchFormHint: 'Hae (esim. käsityöt)'
 // };
 // var lsc = new google.elements.LocalSearch(lscopts);
 // sz = new google.maps.Size(33, 20);
 // var br = new google.maps.ControlPosition(G_ANCHOR_BOTTOM_RIGHT, sz);
 // map.addControl(lsc, br);

 sz = new google.maps.Size(33, 40);
 var tr = new google.maps.ControlPosition(G_ANCHOR_TOP_RIGHT, sz);
 map.addControl(new google.maps.MapTypeControl(), tr);

 // var sctrl = new google.search.SearchControl()
 // srch = new google.search.LocalSearch();
 // srch.setCenterPoint(map);
 // var sopts = new google.search.SearcherOptions();
 // sopts.setExpandMode(google.search.SearchControl.EXPAND_MODE_OPEN);
 // sctrl.addSearcher(srch , sopts);
 // sctrl.draw(document.getElementById('search'));

 initIcons();
 initPlaces();
 initFeeds();
 // initNodes();
 initMe();
 if (maptype == 's3d') {
  map.getEarthInstance(initEarth);
 }
 setTimeout(checkShims, 15000);
}
function checkShims() {
 var isGE = (map.getCurrentMapType() == G_SATELLITE_3D_MAP) ||
            (map.getCurrentMapType() == s3d);
 mapDiv.style.top = (isGE ? '5px' : '0px');
 ifs = document.getElementsByTagName('iframe');
 for (var i=0; i<ifs.length; i++) {
  ifs[i].style.display = isGE ? 'block' : 'none';
 }
 // divs = document.getElementsByTagName('div');
 // for (var i=0; i<divs.length; i++) {
 //  divs[i].style['moz-border-radius'] = isGE ? '0' : '0.5em';
 // }
}
function initEarth(instance) {
 ge = instance;
 ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);
 ge.getWindow().setVisibility(true);
 var camera = cameras[cameras.length];
 if (ge && camera) {
  ge.getOptions().setFlyToSpeed(flyToSpeed);
  var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
  // alert(camera.latitude);
  lookAt.setLatitude(camera.latitude);
  lookAt.setLongitude(camera.longitude);
  lookAt.setAltitude(camera.altitude);
  lookAt.setHeading(camera.heading);
  lookAt.setTilt(camera.tilt);
  lookAt.setRange(camera.range);
  if (camera.altitudeMode == 'clampToGround') {
   lookAt.setAltitudeMode(ge.ALTITUDE_CLAMP_TO_GROUND);
  }
  else if (camera.altitudeMode == 'absolute') {
   lookAt.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
  }
  ge.getView().setAbstractView(lookAt);
 }
 checkShims();
}
function initNodes() {
 var shim = document.createElement('iframe');
 shim.frameBorder = 0;
 shim.scrolling = 'no';
 // shim.src = (navigator.userAgent.indexOf('MSIE 6') >= 0) ? '' : 'javascript:void(0);';
 shim.src = 'javascript:void(0);';
 // shim.style.opacity = 0;
 for (var i=0; i<nodes.length; i++) {
  var l = document.getElementById(nodes[i]);
  if (!l) {
   continue;
  }
  var s = shim;
  s.style.height = '100%';
  s.style.width = '100%';
  l.parentNode.insertBefore(s, l);
 }
}
function initIcons() {
 var i;
 for (i=0; i<icons.length; i++) {
  var icon = icons[i];
  var opts = eval(icon.opts);
  gIcons[icon.id] = new google.maps.Icon(G_DEFAULT_ICON);
  for (var prop in opts) {
   if (prop.indexOf('Size') > 0) {
    gIcons[icon.id][prop] = new google.maps.Size(opts[prop][0], opts[prop][1]);
   }
   else if (prop.indexOf('Anchor') > 0) {
    gIcons[icon.id][prop] = new google.maps.Point(opts[prop][0], opts[prop][1]);
   }
   else {
    gIcons[icon.id][prop] = opts[prop];
   }
  }
 }
 return i;
}
function initPlaces() {
 var i;
 for (i=0; i<places.length; i++) {
  var place = places[i];
  var p = new google.maps.LatLng(place.lat, place.lng);
  var opts = {'title': place.name};
  if (place.icon) {
   // icon = gIcons[place.icon];
   // for (var i in icon) { alert(i + ' = ' + icon[i]);}
   opts['icon'] = gIcons[place.icon];
   // opts['draggable'] = true;
  }
  var marker = new google.maps.Marker(p, opts);
  marker.placeId = i;
  // google.maps.Event.addListener(marker, 'dblclick', function() {
  //  this.showMapBlowup({zoomLevel: 12});
  // });
  marker.html = '<div class="bubble"><h2>' + place.name + '</h2><p>' + 
                '<a href="http://' + place.shortName + '.tietopaikka.fi/">' + 
                place.desc + '</a></p></div>';
  google.maps.Event.addListener(marker, 'mouseover', function() {
   this.openInfoWindowHtml(this.html);
  });
  google.maps.Event.addListener(marker, 'click', function() {
   var place = places[this.placeId];
   if (place) {
    window.location.href = 'http://' + place.shortName + '.tietopaikka.fi/';
   }
  });
  // google.maps.Event.addListener(marker, 'mouseout', function() {
  //  this.closeInfoWindow();
  // });
  // google.maps.Event.addListener(marker, 'click', function() {
  //  var place = places[this.placeId];
  //  if (place) {
  //   map.setCenter(this.getLatLng(), parseInt(place.zoom));
  //   eval('map.setMapType(' + place.type + ')');
  //   window.location.href = 'http://' + place.shortName + '.tietopaikka.fi/';
  //  }
  // });
  map.addOverlay(marker);
  // var circle = new CircleOverlay(p, 40, "#336699", 1, 1, '#336699', 0.25);
  // map.addOverlay(circle);
 }
 return i;
}
function initFeeds() {
 for (id in feeds) {
  feeds[id] = new google.maps.GeoXml(feeds[id]);
 }
 var inputs = document.getElementsByTagName('input');
 var i;
 for (i=0; i<inputs.length; i++) {
  var obj = inputs[i];
  if (obj.className == 'toggler') {
   obj.onfocus = function() {toggleOverlay(this.id, this.checked);};
   obj.onchange = function() {toggleOverlay(this.id, this.checked);};
   toggleOverlay(obj.id, obj.checked);
  }
 }
 return i;
}
function initMe() {
 var clat = 0; // client latitude
 var clng = 0; // client longitude
 if (google.loader.ClientLocation) {
  var c = google.loader.ClientLocation;
  clat = c.latitude;
  clng = c.longitude;
  createCM(clat, clng);
 }
 if (navigator && navigator.geolocation &&
     navigator.geolocation.getCurrentPosition) {
   navigator.geolocation.getCurrentPosition(function(pos) {
     clat = pos.coords.latitude;
     clng = pos.coords.longitude;
     createCM(clat, clng);
    });
 }
}
function createCM(clat, clng) {
  // var b = map.getBounds();
  // var sw = b.getSouthWest();
  // var ne = b.getNorthEast();
  // if ((clat <= ne.lat()) && (sw.lat() <= clat) &&
  //     (clng <= ne.lng()) && (sw.lng() <= clng)) {
   var p = new google.maps.LatLng(clat, clng);
   feeds['me'] = new google.maps.Marker(p, {'title': 'Olet tÃÂ¤ssÃÂ¤', draggable: true});
   google.maps.Event.addListener(feeds['me'], 'click', cmInfoShow);
   google.maps.Event.addListener(feeds['me'], 'dragstart', cmInfoHide);
   google.maps.Event.addListener(feeds['me'], 'dragend', cmInfoShow);
  // }
 // }
}
function cmInfoShow() {
 if (!feeds['me']) {
  return false;
 }
 var point = feeds['me'].getLatLng();
 var lat = Math.round(point.lat()*10000)/10000;
 var lng = Math.round(point.lng()*10000)/10000;
 var pos = new String(lat) + ', ' + new String(lng);

 var div = document.createElement('div');
 var p = document.createElement('p');
 var text = document.createTextNode('Arvioitu sijaintisi on ' + pos);
 google.maps.Event.addListener(p, 'click',
                   function() {map.showMapBlowup(feeds['me'].getLatLng());});
 p.title = 'Näytä tarkemmin';
 p.style.textDecoration = 'underline';
 p.style.cursor = 'pointer';
 p.appendChild(text);
 div.appendChild(p);

 feeds['me'].openInfoWindowHtml(div);
}
function cmInfoHide() {
 if (feeds['me'] && feeds['me'].closeInfoWindow) {
  feeds['me'].closeInfoWindow();
 }
}
function toggleOverlay(id, state) {
 // alert('Toggling ' + id + ' to ' + state + ', current = ' + overlays[id]);
 if (overlays[id] == state) {
  return state;
 }
 var layers = feeds[id];
 if (!layers) {
  return false;
 }
 if (state) {
  if (layers instanceof Array) {
   for (var i=0; i<layers.length; i++) {
    map.addOverlay(layers[i]);
   }
  }
  else {
   map.addOverlay(layers);
  }
 }
 else {
  if (layers instanceof Array) {
   for (var i=0; i<layers.length; i++) {
    map.removeOverlay(layers[i]);
   }
  }
  else {
   map.removeOverlay(layers);
  }
 }
 overlays[id] = state;
 return state;
}
function showRoute(from, to) {
 directionsPanel = document.getElementById('route');
 directions = new google.maps.Directions(map, directionsPanel);
 directions.load('from: ' + from.toString() + ' to: ' + to.toString());
}
google.setOnLoadCallback(initMap);
google.maps.Event.addListener(window, 'unload', GUnload);

