// global vars
var _map;
var _mapContainer;
var _directions;
var _directionsContainer;
var _markerImages; // images for markers
var _sedeVenetoLat   = 45.846251;
var _sedeVenetoLong  = 11.673684;
var _sedeAostaLat   = 45.724748;
var _sedeAostaLong  = 7.090804;

var _sedeAostaName  = "OndaSelvaggia VALLE D'AOSTA";
var _sedeAostaInfo  = "<b>OndaSelvaggia</b><br /><br />Valle del Monte Bianco<br /> Derby (Aosta)<br />&nbsp;<br />";
var _venetoAddress  = "Via Merlo San Nazario Vicenza italy";
var _aostaAddress   = "Valle del Monte Bianco Derby Aosta italy";
var _sedeVenetoName = "OndaSelvaggia VENETO";
var _sedeVenetoInfo = "<b>OndaSelvaggia</b><br /><br />Via Merlo-San Nazario<br />(Vicenza) <br />&nbsp;<br />";
var _zoomLevel    = 13;
var _sedeCorrente = null;

// load map reading data from suppied xml (url)
function loadMap( idOfContainerElement, idOfDirectionsContainerElement, urlOfImages, mapType, sedeVeneto, sedeAosta )
{
  _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 bounds
  var bounds = new GLatLngBounds();
  
  // create map and set properties
  _map = new GMap2( _mapContainer );
  _map.setCenter(new GLatLng(0,0),_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 );
  
  addSediMarkers( sedeVeneto, sedeAosta, bounds );
  
  var center = bounds.getCenter();
  _map.setCenter(center, _map.getBoundsZoomLevel(bounds) );
  _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 addSediMarkers( sedeVeneto, sedeAosta, mapBounds )
{
  _map.clearOverlays();
  
  if( sedeVeneto == 'True' )
  {
    _sedeCorrente = _venetoAddress;
    var marker = createMarker( _sedeVenetoName,_sedeVenetoInfo, _sedeVenetoLat, _sedeVenetoLong, mapBounds );
    _map.addOverlay( marker );  
    marker.openInfoWindowHtml(_sedeVenetoInfo,{maxWidth:400});
  }
  
  if( sedeAosta == 'True' )
  {
    _sedeCorrente = _aostaAddress;
    var marker = createMarker( _sedeAostaName,_sedeAostaInfo, _sedeAostaLat, _sedeAostaLong, mapBounds );
    _map.addOverlay( marker );  
    marker.openInfoWindowHtml(_sedeAostaInfo,{maxWidth:400});
  }
  
}


// create GMarker
function createMarker( sedeName, sedeInfo, sedeLat, sedeLong, mapBounds )
{
  var point = new GLatLng(parseFloat( sedeLat), parseFloat( sedeLong) );
  var marker = new GMarker(point, {title:sedeName});
  
  mapBounds.extend( point );
  
  var infoWin = "";
  
  GEvent.addListener(marker,'mouseover', function()
    {
      marker.visited = true;
      marker.setImage(_markerImages[1]);
    }
  );
  
  GEvent.addListener(marker,'mouseout', function()
    {
      marker.setImage(_markerImages[0]);
    }
  );

  return marker;
}

function setDirections(fromAddress, toAddress) {
  _directions.load("from: " + fromAddress + " to: " + toAddress);
}

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, _sedeCorrente );
}