var gMapCallback;
var gMap;
var gMarker;
var gPrefix;
var gSS = {getItem: function(){return false}, setItem: function(){}};
if (window.sessionStorage)
  gSS = sessionStorage;

function updateStorage() {
  var point = gMap.getCenter();
  if (!point)
    return;

  var lat = point.lat();
  var lng = point.lng();
  var zoom = gMap.getZoom();

  gSS.setItem(gPrefix + "lat", lat);
  gSS.setItem(gPrefix + "lng", lng);
  gSS.setItem(gPrefix + "zoom", zoom);

  if (typeof(updateForm) == "function")
    updateForm(lat, lng, zoom);
}

function onDragEnd() {
  gMap.panTo(gMarker.getPoint());
}

function onMoveEnd() {
  if (gMarker) {
    var point = gMap.getCenter();
    gMap.removeOverlay(gMarker);
    gMarker = new google.maps.Marker(point, {draggable: true});
    gMap.addOverlay(gMarker);
    google.maps.Event.addListener(gMarker, "dragend", function() { onDragEnd(); });
  }
  updateStorage();
}

function createMap(aNode, aPrefix, aFixed, aLat, aLng, aZoom) {
  gPrefix = "" + aPrefix;
  gMap = new google.maps.Map2(aNode);
  gMap.addControl((aFixed) ? new google.maps.SmallMapControl() : new google.maps.SmallZoomControl());

  var lat = aLat || 0;
  var lng = aLng || 0;
  var zoom = aZoom || 1;

  var sLat = gSS.getItem(gPrefix + "lat");
  if (sLat)
    lat = parseFloat(sLat);
  var sLng = gSS.getItem(gPrefix + "lng");
  if (sLng)
    lng = parseFloat(sLng);
  var sZoom = gSS.getItem(gPrefix + "zoom");
  if (sZoom)
    zoom = parseInt(sZoom);

  var point = new google.maps.LatLng(lat, lng);
  gMap.setCenter(point, zoom);
  gMap.enableDoubleClickZoom();
  gMap.enableContinuousZoom();

  gMarker = new google.maps.Marker(point, {draggable: true});
  gMap.addOverlay(gMarker);
  updateStorage();
  if (!aFixed) {
    google.maps.Event.addListener(gMarker, "dragend", onDragEnd);
    google.maps.Event.addListener(gMap, "moveend", onMoveEnd);
  }
}

function mapLoaded() {
  if (!google.maps.BrowserIsCompatible())
    return;

  gMapCallback.call();
}

function apiLoaded() {
  var options = {"callback": mapLoaded};
  if (gLocale)
    options.language = gLocale;
  google.load("maps", "2.x", options);
}

function initMap(aCallback, aKey) {
  if (!aKey)
    return;

  gMapCallback = aCallback;
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.src = "http://www.google.com/jsapi?key=" + aKey + "&callback=apiLoaded";
  document.getElementsByTagName("head")[0].appendChild(script);
}