function toddEncodeJSON(data)
{
  switch(typeof data)
  {
    case 'boolean':
      return data ? 'true' : 'false';
    case 'object':
      if(data==null)
        return'null';

      if(data instanceof Array)
      {
        var retval='[';
        for (var i=0;i<data.length;++i)
          retval+=(i>0?',':'')+toddEncodeJSON(data[i]);
        return retval+']';
      }

      var retval='{';
      for (cellname in data) //ADDME safari 1.3 fallback for hasownproperty?!
        if(!data.hasOwnProperty || data.hasOwnProperty(cellname))
          retval += (retval.length>1?',':'') + '"' + cellname + '":' + toddEncodeJSON(data[cellname]);
      return retval+'}';
    case 'number':
      return data.toString();
    case 'string':
      if (/["\\\x00-\x1f]/.test(data))
      {
          return '"' + data.replace(/[\x00-\x1f\\"]/g, function (a)
          {
              var c = a.charCodeAt();
              return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
          }) + '"';
      }
      return '"' + data + '"';
    default:
      return alert("toddEncodeJSON: How to encode " + typeof data + "?");
  }
}


// Our todd map controller object
var mymap;

// Last bounds (prevent requesting overlays twice)
var lastbounds;

// Move handler timeout
var movetimeout = null;

// Div containing the info contents
var contentsWindow;

var mapCanvas;

var contentsWindowIsVisible = false;

function LoadMap(StartCoord, StartZoom)
{
  contentsWindow = document.getElementById("maps-infowindow");
  mapCanvas = document.getElementById("map_canvas");

  mymap = toddGM_Initialize("map_canvas", { maptype: "map"
                                          , center: StartCoord
                                          , zoom: StartZoom
                                          , moveable: true
                                          , iconsize: 30
                                          , showcontrols: false
                                          , icons: [ { name: ""
                                                     , icon: repositoryroot + "images/pin.png"
                                                     , anchor_x: 15
                                                     , anchor_y: 15
                                                     , label_x: 29
                                                     , label_y: 6
                                                     , popup_x: 120
                                                     , popup_y: 14
                                                     }
                                                   ]
                                          , OnInitialized: MapInitialized
                                          , OnOverlayClick: OverlayClicked
                                          , OnMoveStart: CloseInfoWindow
                                          , OnMoveEnd: CloseInfoWindow
                                          , OnZoomEnd: XHR_UpdateOverlays
                                          , CloseInfoWindow: CloseInfoWindow
                                          });

}

function UnloadMap()
{
  toddGM_DeInit(mymap);
}

function MapInitialized()
{
  mymap.map.addControl(new GLargeMapControl3D());

  XHR_UpdateOverlays();
}


function XHR_UpdateOverlays(force)
{

  if (movetimeout)
  {
    window.clearTimeout(movetimeout)
    movetimeout = null;
  }

  var bounds = toddGM_BoundsToString(mymap.GetMapIconBounds());
  if (bounds == lastbounds && !force)
  {
    return;
  }
  lastbounds = bounds;

  var request = { type: "updateoverlays"
                , bounds: bounds
                , zoom: mymap.map.getZoom()
                };

  $.post("map.shtml",toddEncodeJSON(request),function(response,textStatus){
    if(textStatus=="success")
    {
      mymap.UpdateAllOverlays(response.overlays);
    }
  },"json");

}


function OverlayClicked(overlay)
{
  OpenInfoWindow(overlay);
}


function OpenInfoWindow(overlay)
{
  var markerPosition = overlay.marker.getLatLng();
  var pixelPosition = mymap.map.fromLatLngToContainerPixel(markerPosition);

  var leftStyle = mapCanvas.offsetLeft + pixelPosition.x + 25;
  var topStyle = mapCanvas.offsetTop + pixelPosition.y - 30;

  contentsWindow.style.top = topStyle + "px";
  contentsWindow.style.left = leftStyle + "px";

  var contents = '<div style="position: relative;"><div class="infowindowclosebutton"><a class="closeinfowindow" onclick="CloseInfoWindow();">x</a></div></div>';

  if (overlay.rowkeys.length==1)
  {
    if (overlay.infohtml)
    {
      contentsWindow.style.display = "block";
      contentsWindow.innerHTML = contents + '<div class="infowindowcontents">' + overlay.infohtml + '</div>';
    }
  }
  else if (overlay.rowkeys.length>1)
  {
    contentsWindow.style.display = "block";
    contentsWindow.innerHTML = contents + '<div class="infowindowcontents">' + "Er zijn " + overlay.rowkeys.length
                             + " filialen gevonden op de gekozen locatie.<br /><br />"
                             + "Zoomt u a.u.b. verder in om de verschillende filialen te kunnen bekijken.</div>";
  }

  contentsWindowIsVisible = true;
}

function CloseInfoWindow()
{
  contentsWindow.style.display = "none";
}

