// global vars
var _map;
var _mapContainer;
var _directions;
var _directionsContainer;
var _markerImages; // images for markers
var _companyLat = 45.43072176700643;
var _companyLong = 9.046586751937866;
var _companyName  = "Aesse Misure s.r.l.";
var _companyAddress = "Via della Repubblica, 9 20090 Trezzano sul Naviglio (MI) Italy";
var _companyInfo = "<b>Aesse Misure s.r.l.</b><br /><br />Via della Repubblica, 9<br />20090 Trezzano sul Naviglio (MI)<br />&nbsp;<br />";
var _zoomLevel    = 13;
var _latCenterOffset = 0.01;

// load map reading data from suppied xml (url)
function loadMap( idOfContainerElement, idOfDirectionsContainerElement, urlOfImages, mapType )
{
  _mapContainer = document.getElementById( idOfContainerElement );
  _directionsContainer = document.getElementById( idOfDirectionsContainerElement );

  if ( mapType == null )
    mapType = G_NORMAL_MAP;
    
  // init images array
  _markerImages = [
    G_DEFAULT_ICON.image,
    urlOfImages + "/gMapMarkerHL.png"
  ];
  
  // create map and set properties
  _map = new GMap2( _mapContainer );
  _map.setCenter(new GLatLng(_companyLat + _latCenterOffset, _companyLong), _zoomLevel); 
  _map.addControl(new GLargeMapControl());                               // controls (zoom, scroll)
  _map.addControl(new GMapTypeControl());                                // _map type control
  _map.addControl(new GScaleControl());                                  // display scale
  new GKeyboardHandler(_map);                                            // bind keys (up, down...pup, pdown...+ -)
  _map.enableContinuousZoom();
  _map.enableDoubleClickZoom();
  _map.setMapType( mapType );
  
  addCompanyMarker();
  _map.savePosition(); // this makes the center button useful

  if (GBrowserIsCompatible()) {      
    _directions = new GDirections( _map, _directionsContainer );
    GEvent.addListener(_directions, "load", onGDirectionsLoad);
    GEvent.addListener(_directions, "error", handleErrors);
  }
}

function addCompanyMarker()
{
  _map.clearOverlays();
  var marker = createMarker( _companyName,_companyInfo, _companyLat, _companyLong, 0 );
  _map.setCenter(new GLatLng(_companyLat + _latCenterOffset, _companyLong), _zoomLevel); 
  _map.addOverlay( marker );
}


// create GMarker
function createMarker( companyName, companyInfo, companyLat, companyLong )
{
  var point = new GLatLng(parseFloat( companyLat), parseFloat( companyLong) );
  var marker = new GMarker(point, {title:companyName});
  var infoWin = "";
  
  GEvent.addListener(marker,'mouseover', function()
    {
      marker.visited = true;
      marker.setImage(_markerImages[1]);
      marker.openInfoWindowHtml(companyInfo,{maxWidth:400});
    }
  );
  
  GEvent.addListener(marker,'mouseout', function()
    {
      marker.setImage(_markerImages[0]);
    }
  );
  
  return marker;
}

function setDirections(fromAddress, toAddress, locale) {
  _directions.load("from: " + fromAddress + " to: " + toAddress, { "locale": locale });
}

function handleErrors(){

 addCompanyMarker();
  _directionsContainer.style.display = 'none';

 if (_directions.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
   alert( "L'indirizzo inserito non e' stato riconosciuto\ncome un indirizzo corretto." );
 else if (_directions.getStatus().code == G_GEO_SERVER_ERROR)
   alert("Si č verificato un errore interrogando il servizio di Google Maps.\nSiamo spiacenti, riprova pių tardi.");
 else if (_directions.getStatus().code == G_GEO_MISSING_QUERY)
   alert("Nessun indirizzo specificato.");
 else if (_directions.getStatus().code == G_GEO_BAD_KEY)
   alert("SYSTEM ERROR: invalid key!");
 else if (_directions.getStatus().code == G_GEO_BAD_REQUEST)
   alert("Si č verificato un errore interrogando il servizio di Google Maps.\nSiamo spiacenti, riprova pių tardi.");
//   else if (gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong
//     alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + gdir.getStatus().code);
 else
  alert("Si č verificato un errore interrogando il servizio di Google Maps.\nSiamo spiacenti, riprova pių tardi.");
}

function onGDirectionsLoad(){ 
  _map.clearOverlays();
  _directionsContainer.style.display = 'block';
  window.location.href = window.location.pathname + "#map";
  // Use this function to access information about the latest load()
  // results.
  
        // e.g.
  // document.getElementById("getStatus").innerHTML = gdir.getStatus().code;
  // and yada yada yada...
}

function generateDirections()
{
  var txtSaddr = document.getElementById( 'txtSaddr' );
  if ( txtSaddr.value == '' )
  {
    alert( "Devi specificare un indirizzo di partenza." );
    return;
  }
  setDirections( txtSaddr.value, _companyAddress, 'it' );
}