/** GOOGLE MAP API V3
 *@author <a href="mailto:laurent@publika.fr">laurent Mouchot</a>
 *\brief API google map customise v1.1
 */
if ( gmMap.regroupe)
 document.write('<script type="text/javascript" src="'+gmMap.urlScripts+'/libs/markerclusterer_compiled.js"></script>');
var defaultCenter = new google.maps.LatLng(47.0,1.7);
gmMap.defaultIcone = gmMap.urlScripts+'/images/'+gmMap.defaultIcone;

var map = null;
var mapElt = null;
var mapCenter = null;
var tabMarkers = new Array();
var points = new Array();
var geocoder = null;
var currentInfo = null;
var infoWindow = ( gmMap.infoWindow ) ? new InfoBox({
 point:point,
 latLng:point.position,
 map: map,
 marker:marker
}):new google.maps.InfoWindow();

/* Option de la carte
 */
var optionsCarte = {
 scrollwheel: false,
 mapTypeId: google.maps.MapTypeId.ROADMAP,
 mapTypeControl:false,
 scaleControl:true,
 zoom:5,
 center:defaultCenter
}

var init = null;
function initCarte(){
 var first = init;
 mapElt = document.getElementById(gmMap.map);
 if ( !mapElt )
  return;
 mapElt.style.width = gmMap.mapWidth+'px';
 mapElt.style.height = gmMap.mapHeight+'px';
 map = new google.maps.Map(mapElt,optionsCarte);
 if ( datapoints.length ){
  makePoints();
  if ( gmMap.regroupe == true){
   google.maps.event.addListener(map, "tilesloaded", function(){
    if (!first){
     refreshMap();
    }
   });
  }	else{
   google.maps.event.addListener(map, "tilesloaded", function(){
    if (!first){
     makeMarkers(tabMarkers);
    }
   });
  }
 }
 if ( gmMap.regroupe )
  clusterize();
 init = 1;
}

/** Cree les gmPoint avec datapoints
 *
     */
function makePoints(){
 for (var i = 0 ; i < datapoints.length ; i++) {
  var point = new gmPoint();
  point.position = new google.maps.LatLng(
   parseFloat(datapoints[i].lat),
   parseFloat(datapoints[i].lng)
   );
  point.icone = gmMap.icones[datapoints[i].Type] || {};
  point.texte = datapoints[i].texte;
  point.titre = datapoints[i].titre;
  point.adresse = datapoints[i].adresse;
  points.push(point);
 }
}
/************************************
     * CREATION DES MARKER DE LA CARTE
     *************************************/
/** Genere un marker google map et le lie a son info bulle
     */
function makeMarkers(markers){
 for (var i = 0; i < points.length; i++) {
  var marker = new google.maps.Marker({
   map:map,
   position: points[i].position,
   draggable: gmMap.pointsDeplacable,
   icon: new google.maps.MarkerImage(gmMap.defaultIcone)
  });
  bindInfoWindow(marker, map, points[i])
  markers.push(marker);
 }
}

function centerMap(markers) {
 map.setCenter(markers[Math.round(markers.length/2)].getPosition());
}

/************************************
     * LIAISON MARKER / INFOBULLE
     *************************************/
//LIE L'INFOWINDOW A UN MARKER
function bindInfoWindow(marker, map, point) {
 var epoint = point;
 var emarker = marker;
 if (!gmMap.infoWindow){
  /*google.maps.event.addListener(marker, 'dblclick', function() {
   setContent(epoint,emarker,true);
   map.setCenter(emarker.position);
  });*/
  google.maps.event.addListener(marker, 'click', function() {
   setContent(epoint,emarker,true);
  // map.setCenter(emarker.position);
  });
 }
// google.maps.event.addListener(point, "rightclick",function(){ showContextMenu(point.position); });
}

function setContent(point,marker,aff){
 infoWindow.setContent(infoContent(point));
 var zoom = map.getZoom();
 //if ( zoom > 7 ){
  //  if ( currentInfo )
  //       currentInfo.close();

  infoWindow.open(map, marker);
 //  currentInfo = marker;
 /*}
 else
  map.setZoom(parseInt(zoom)+1);*/
}

/****************************
CALCUL DES DISTANCES
     *****************************/

var rad = function(x) {
 return x*Math.PI/180;
}
/** Calcul une distance entre 2 points
     **/
function Distance(depart, vers) {
 var R = 6371; // earth's mean radius in km
 var dLat  = rad(vers.lat() - depart.lat());
 var dLong = rad(vers.lng() - depart.lng());

 var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
 Math.cos(rad(depart.lat())) * Math.cos(rad(vers.lat())) * Math.sin(dLong/2) * Math.sin(dLong/2);
 var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
 var d = R * c;

 return d.toFixed(3);
}

//Ne fait rien
if ('function' != typeof window.doNothing)
 function doNothing() {}
function getBounds(){
 var sw = null;
 var ne = null;
 var latSw = 0;
 var lngSw = 0;
 var latNe = 0;
 var lngNe = 0;
 for (var i = 0 ; i < points.length ; i++) {
  if ( i > 0 ){
   latSw = ( points[i].lat < latSw)?points[i].lat:latSw;
   lngSw = ( points[i].lng < lngSw)?points[i].lng:lngSw;
   latNe = ( points[i].lat > latSw)?points[i].lat:latNe;
   lngNe = ( points[i].lng > lngSw)?points[i].lng:lngNe;
  }
  else{
   latSw  = latNe = points[i].lat;
   lngNe = lngNe = points[i].lng;
  }
 }
 sw = new google.maps.LatLng(latSw,lngSw);
 ne = new google.maps.LatLng(latNe,lngNe);
 var bounds = new google.maps.LatLngBounds(sw,ne)
 map.fitBounds(bounds);
 mapCenter = bounds.getCenter();
}
/** REGROUPEMENT DES PLOTS **/
function clusterize(){
 var markerClusterer = null;
 /** IMAGES DE REGROUPEMENT **/
 var style = [{
  url: gmMap.urlScripts+'/images/'+gmMap.regroupeIcones[0],
  height: 44,
  width: 44,
  opt_anchor: [25, 0],
  opt_textColor: '#ff00ff',
  opt_textSize: 10
 }, {
  url: gmMap.urlScripts+'/images/'+gmMap.regroupeIcones[1],
  height: 45,
  width: 45,
  opt_anchor: [24, 0],
  opt_textColor: '#ff0000',
  opt_textSize: 11
 }, {
  url: gmMap.urlScripts+'/images/'+gmMap.regroupeIcones[2],
  height: 55,
  width: 55,
  opt_anchor: [32, 0],
  opt_textSize: 12
 }];
 var markers = [];

 makeMarkers(markers);

 var zoom = parseInt(-1, 10);
 var size = parseInt(-1, 10);
 zoom = zoom == -1 ? null : zoom;
 size = size == -1 ? null : size;
 markerClusterer = new MarkerClusterer(map, markers, {
  maxZoom: 10,
  gridSize: 50,
  styles: style
 });
}
/** CHARGEMENT DE LA MAP **/
if(document.addEventListener)
 window.addEventListener('load', initCarte, false);
else
 window.attachEvent('onload', initCarte);


