  function LoadGPXFileIntoGoogleMap( str_mapname, filename, couleur, trait, espace )
  {
    var request = GXmlHttp.create();
    request.open( "GET", filename, true );
    request.onreadystatechange = function()
    {
      if( request.readyState == 4 )
      {
        parser = new GPXParser( request.responseXML, str_mapname );
        parser.SetTrackColour( couleur );
        parser.SetTrackWidth( trait );
        parser.SetMinTrackPointDelta( espace );
        parser.AddTrackpointsToMap();
        parser.AddWaypointsToMap();
      }
    }
    request.send( null );
  }

  function showAddresses( str_mapname, array_addresses )
  {
    for( i = 0; i < array_addresses.length; i++ )
    {
      showAddress( str_mapname, array_addresses[i][0], array_addresses[i][1], array_addresses[i][2] );
    }
  }

  function showAddress( str_mapname, address, htmlInfo, moveToPoint )
  {
    if( geocoder )
    {
      geocoder.getLatLng(
        address,
        function( point )
        {
          if( !point )
          {
            alert( "Location not found:" + address );
          }
          else
          {
            if( moveToPoint )
            {
              str_mapname.setCenter( point );
            }
            var marker = new GMarker( point );
            str_mapname.addOverlay( marker );
            if( htmlInfo != "" )
            {
              GEvent.addListener( marker, "click", function()
              {
                marker.openInfoWindowHtml( htmlInfo );
              });
            }
          }
        }
      );
    }
  }

  function showGpxTraces( str_mapname, array_gpxtraces )
  {
    for( i = 0; i < array_gpxtraces.length; i++ )
    {
      LoadGPXFileIntoGoogleMap( str_mapname, array_gpxtraces[i][0], array_gpxtraces[i][1], array_gpxtraces[i][2], array_gpxtraces[i][3] );
    }
  }

  function showGeopoints( str_mapname, array_geopoints )
  {
    for( i = 0; i < array_geopoints.length; i++ )
    {
      showGeopoint( str_mapname, array_geopoints[i][0], array_geopoints[i][1], array_geopoints[i][2], array_geopoints[i][3], array_geopoints[i][4], array_geopoints[i][5] );
    }
  }

  function showGeopoint( str_mapname, longitude, latitude, htmlInfo, moveToPoint, useIcon, useLibIcon )
  {
    if( moveToPoint )
    {
      str_mapname.setCenter( new GLatLng( longitude, latitude ) );
    }

    var marker = new GMarker( new GLatLng( longitude, latitude ), useLibIcon[useIcon] );
    str_mapname.addOverlay( marker );
    if( htmlInfo != "" )
    {
      GEvent.addListener( marker, "click", function()
      {
        marker.openInfoWindowHtml( htmlInfo );
      });
    }
  }

  function openGeopoint( str_mapname, longitude, latitude, htmlInfo, moveToPoint, useIcon, useLibIcon )
  {
    if( moveToPoint )
    {
      str_mapname.setCenter( new GLatLng( longitude, latitude ) );
    }
    var marker = new GMarker( new GLatLng( longitude, latitude ), useLibIcon[useIcon] );
    str_mapname.addOverlay( marker );
    marker.openInfoWindowHtml( htmlInfo );
    if( htmlInfo != "" )
    {
      GEvent.addListener( marker, "click", function()
      {
        marker.openInfoWindowHtml( htmlInfo );
      });
    }
  }

  function moveToGeopoint( str_mapname, index )
  {
    str_mapname.panTo( new GLatLng( geopoints[index][0], geopoints[index][1] ) );
  }

  function moveToAddress( str_mapname, index )
  {
    moveToAddressEx( str_mapname, addresses[index][0] );
  }

  function moveToAddressEx( str_mapname, addressString )
  {
    if( geocoder )
    {
      geocoder.getLatLng(
        addressString,
        function( point )
        {
          if( !point )
          {
            alert( "Location not found:" + addressString );
          }
          else
          {
            center = point;
            str_mapname.panTo( point );
          }
        }
      );
    }
  }

  function moveToAddressDMarker( str_mapname, addressString )
  {
    if( geocoder )
    {
      geocoder.getLatLng(
        addressString,
        function( point )
        {
          if( !point )
          {
            alert( "Location not found:" + addressString );
          }
          else
          {
            center = point;
            setZoomFactor( 16 );
            str_mapname.panTo( point );
            addDragableMarker();
          }
        }
      );
    }
  }

  function setZoomFactor( str_mapname, factor )
  {
    str_mapname.setZoom( factor );
  }

  function addDragableMarker( str_mapname )
  {
    if( !marker )
    {
      marker = new GMarker( center, { draggable: true } );
      str_mapname.addOverlay( marker );
      GEvent.addListener( marker, "dragend", function()
        {
          var tpoint = marker.getPoint();
          document.getElementById( updateX ).value = tpoint.lat();
          document.getElementById( updateY ).value = tpoint.lng();
        }
      );
    }
    else
    {
      marker.setPoint( center );
    }
    var tpoint =  marker.getPoint();
    document.getElementById( updateX ).value = tpoint.lat();
    document.getElementById( updateY ).value = tpoint.lng();
  }
