/*
 * Objet de gestion des cartes GoogleMap.
 *
 * @author  Sébastien Raud
 * @version 1.0.0
 */

function etdGoogleMap()
{
  // identidiant div / span de l'ensemble (carte + details )
  this.blocId = null;
  // identifiant div / span ou sera affiché la carte
  this.mapId = null;

  // points (coordonnées)
  this.points = new Array();
  // identifiant div / span contenant l'info bulle des points
  this.pointsDetailsId = new Array();

  // adresses
  this.addresses = new Array();
  // identifiant div / span contenant l'info bulle des adresses
  this.addressesDetailsId = new Array();

  // niveau de zoom
  this.zoom = 1;

  // centre (point)
  this.center = null;

  // la carte
  this.map = null;

  this.error = false;


  if(typeof etdGoogleMap.initialized == "undefined")
  {
    /**
     * Retourne l'identifiant de la zone contenant la carte et les détails.
     *
     * @access public
     * @return string
     */
    etdGoogleMap.prototype.getBlocId = function()
    {
      return(this.blocId);
    }

    /**
     * Met à jour l'identifiant de la zone contenant la carte et les détails.
     *
     * @param  string  blocId  Identifiant de la zone contenant la carte et les détails.
     * @acess  public
     * @return void
     */
	etdGoogleMap.prototype.setBlocId = function(blocId)
	{
      this.blocId = blocId;
	};

    /**
     * Retourne l'identifiant de la zone contenant la carte.
     *
     * @access public
     * @return string
     */
    etdGoogleMap.prototype.getMapId = function()
    {
      return(this.mapId);
    }

    /**
     * Met à jour l'identifiant de la zone contenant la carte.
     *
     * @param  string  mapId  Identifiant de la zone contenant la carte.
     * @acess  public
     * @return void
     */
    etdGoogleMap.prototype.setMapId = function(mapId)
    {
      this.mapId = mapId;
    };

    /**
     * Ajoute un point géographique sur la carte.
     *
     * @param  array  point      Tableau de coordonnées [latitude, longitude].
     * @param  string idDetails  Identifiant de la zone contenant l'info bulle du point.
     * @access public
     * @return void
     */
    etdGoogleMap.prototype.addPoint = function(point, idDetails)
    {
      if (typeof(point) == "object" && point.length)
      {
        this.points.push(point);
        this.pointsDetailsId.push(idDetails);
      }
    };

    /**
     * Ajoute un ensemble de points géographique sur la carte.
     *
     * @param  array  points     Tableau de tableaux de coordonnées [[latitude1, longitude1], [latitude2, longitude2], ...].
     * @param  string idDetails  Tableau des identifiants de la zone contenant l'info bulle des points.
     * @access public
     * @return void
     */
    etdGoogleMap.prototype.addPoints = function(points, idDetails)
    {
      if (typeof(points) == "object" && points.length &&
          typeof(idDetails) == "object" && idDetails.length &&
          point.length == idDetails.length)
      {
        for (var i = 0; i < points.length; i++)
          this.addPoint(points[i], idDetails[i]);
      }
    };

    /**
     * Ajoute une adresse géographique sur la carte.
     *
     * @param  string adress     Adresse (ex : "55 rue du Faubourg-Saint-Honoré, 75008, Paris").
     * @param  string idDetails  Identifiant de la zone contenant l'info bulle du point.
     * @access public
     * @return void
     */
    etdGoogleMap.prototype.addAddress = function(adress, idDetails)
    {
      if (typeof(adress) == "string")
      {
        this.addresses.push(adress);
        this.addressesDetailsId.push(idDetails);
      }
    };

    /**
     * Ajoute un ensemble d'adresses sur la carte.
     *
     * @param  array  adresses   Tableau d'adresses ["adresse1", "adresse2", ...].
     * @param  string idDetails  Tableau des identifiants de la zone contenant l'info bulle des points.
     * @access public
     * @return void
     */
    etdGoogleMap.prototype.addAdresses = function(adresses, idDetails)
    {
      if (typeof(adresses) == "object" && adresses.length &&
          typeof(idDetails) == "object" && idDetails.length &&
          point.length == idDetails.length)
      {
        for (var i = 0; i < adresses.length; i++)
          this.addAddress(adresses[i], idDetails[i]);
      }
    };

    /**
     * Retourne le nivau initial de zoom.
     *
     * @access public
     * @return int
     */
    etdGoogleMap.prototype.getZoom = function()
    {
      return(this.zoom);
    };

    /**
     * Met à jour le niveau initial de zoom.
     *
     * @param  int  zoom  Niveau de zoom
     * @access public
     * @return void
     */
    etdGoogleMap.prototype.setZoom = function(zoom)
    {
      this.zoom = zoom;
    };

    /**
     * Retourne le centre.
     *
     * @access public
     * @return GLatLng
     */
    etdGoogleMap.prototype.getCenter = function()
    {
      return(this.center);
    }

    /**
     * Met à jour le centre.
     *
     * @param  mixed   coord  array [latitude, longitude] / sring adresse.
     * @access public
     */
    etdGoogleMap.prototype.setCenter = function(coord)
    {
      if (typeof(coord) == "object" && coord.length && coord.length == 2)
        this._setCenter(new GLatLng(coord[0], coord[1]));
      else
      {
        var geocoder = new GClientGeocoder();
        var obj = this;
        geocoder.getLatLng(
          coord,
          function(point)
          {
            obj._setCenter(point);
          }
        );
      }
    }

    /**
     * Met à jour le centre.
     *
     * @param  GLatLng   gLatLng  Point géographique Google.
     * @access private
     */
    etdGoogleMap.prototype._setCenter = function(gLatLng)
    {
      this.center = gLatLng;
    }

    /**
     * Charge la carte.
     *
     * @access private
     * @return void
     */
    etdGoogleMap.prototype._load = function()
    {
      if (null == this.mapId)
        return ;

      if (null == this.zoom)
        this.zoom = 1;

      if (null == this.center)
        this.center = new GLatLng(48.9, 2.3);

      if (GBrowserIsCompatible())
      {
        this.map = new GMap2(document.getElementById(this.mapId));
        this.map.setCenter(this.center, this.zoom);
        this.map.addControl(new GSmallMapControl());
        this.map.addControl(new GMapTypeControl());
      }
    }

    /**
     * Affiche une adresse postale sur la carte.
     *
     * @param  string  adress    Adresse postale.
     * @param  string  detailId  Identifiant de la zone contenant l'info bulle.
     * @access private
     * @return void
     */
    etdGoogleMap.prototype._showAddress = function(address, detailId)
    {
      if (null != detailId)
        var windowContent = document.getElementById(detailId).innerHTML;
      else
        var windowContent = null;

      if (null == this.map)
        return ;

      var map = this.map;
      var geocoder = new GClientGeocoder();
      geocoder.getLatLng
      (
        address,
        function(point)
        {
          if (!point)
            ;//alert('impossible de trouver '+address);
          else
          {
            var marker = new GMarker(point);
	        map.addOverlay(marker);
	        if (null != windowContent)
	          marker.openInfoWindowHtml(windowContent);
          }
        }
      );
    }

    /**
     * Affiche les adresses postales sur la carte.
     *
     * @access private
     * @return void
     */
    etdGoogleMap.prototype._showAddresses = function()
    {
      for (var i = 0; i < this.addresses.length; i++)
        this._showAddress(this.addresses[i], this.addressesDetailsId[i]);
    }

    /**
     * Affiche un point géographique sur la carte.
     *
     * @param  array   point     Coordonnées [latitude, longitude].
     * @param  string  detailId  Identifiant de la zone contenant l'info bulle.
     * @access private
     * @return void
     */
    etdGoogleMap.prototype._showPoint = function(point, detailId)
    {
      var point = new GLatLng(point[0], point[1], 9);
      if (null != detailId)
        var windowContent = document.getElementById(DetailId).innerHTML;
      else
        var windowContent = null;

        var marker = new GMarker(point);
        this.map.addOverlay(marker);
        if (null != windowContent)
          marker.openInfoWindowHtml(windowContent);
    }

    /**
     * Affiche les points géographiques sur la carte.
     *
     * @access private
     * @return void
     */
    etdGoogleMap.prototype._showPoints = function()
    {
      for (var i = 0; i < this.points.length; i++)
        this._showPoint(this.points[i], this.pointsDetailsId[i]);
    }

    /**
     * Affiche ou cache le bloc contenant la carte et les zones d'info bulles.
     *
     * @access public
     * @return void
     */
    etdGoogleMap.prototype.showHideMap = function()
    {
      if (null == this.blocId)
        return ;

      var obj = document.getElementById(this.blocId);
      if (obj == null)
      	return ;

      if(obj.style.display == "block")
      {
        obj.style.display = 'none';
        GUnload();
	  }
	  else
	  {
	    obj.style.display = 'block';
	    this._load();

	    if (null == this.map)
	      return ;

	    this._showAddresses();
	    this._showPoints();
	    this.map.checkResize();
	  }
    }

    etdGoogleMap.initialized = true;
  }
}
