var map, centerLatitude = 47, centerLongitude = -69, startZoom = 6;
// Tracking what we've added allows us to avoid unnecessarily adding and removing
// markers.
var markers_on_map = {};
// How much to extend the actual viewport as a proportion of its size.
var extend_proportion = 0.4;

var icons = {
  0: { file: "blue-16.png", width: 16 },
  1: { file: "blue-32.png", width: 32 },
  2: { file: "blue-48.png", width: 48 },
  3: { file: "blue-64.png", width: 64 }
}

var fields = {
  'id': 0,
  'latitude': 1,
  'longitude': 2,
  'child_count': 3,
  'item_id':4
}

function newViewport() {
  var viewport = map.getBounds();
  // Extend the bounds by a proportion in each direction.
  var extend_lat_range = (viewport.getNorthEast().lat() - viewport.getSouthWest().lat()) * extend_proportion;
  var extend_lng_range = (viewport.getNorthEast().lng() - viewport.getSouthWest().lng()) * extend_proportion;
  viewport.extend(new GLatLng(viewport.getSouthWest().lat() - extend_lat_range, viewport.getSouthWest().lng() - extend_lng_range));
  viewport.extend(new GLatLng(viewport.getNorthEast().lat() + extend_lat_range, viewport.getNorthEast().lng() + extend_lng_range));
  GDownloadUrl('map_data.php?sw=' + viewport.getSouthWest().toUrlValue() + '&ne=' + viewport.getNorthEast().toUrlValue() + '',
    function(data) {
    	 initMarkers(eval('(' + data + ')'));           
    });
}

function initMarkers(markers) {
  var i;
  var old_markers = markers_on_map;
  markers_on_map = {};

  for(i = 0; i < markers.length; i++) {
    if (old_markers[markers[i][fields.id]]) {
      // marker already on the map
      markers_on_map[markers[i][fields.id]] = old_markers[markers[i][fields.id]];
      delete old_markers[markers[i][fields.id]];
    } else {
      // not already on map
      markers_on_map[markers[i][fields.id]] = createMarker(markers[i]);
      map.addOverlay(markers_on_map[markers[i][fields.id]]);
    }
  }

  // Zap remaining old markers
  for(id in old_markers) {
    map.removeOverlay(old_markers[id]);
  }
}

function createMarker(pointData) {
  var latlng = new GLatLng(pointData[fields.latitude], pointData[fields.longitude]);
  var icon_choice;

  var label = pointData[fields.child_count];
  if (pointData[fields.child_count] == 1) {
    icon_choice = 0;
    label = '';
  } else if (pointData[fields.child_count] < 20) {
    icon_choice = 1;
  } else if (pointData[fields.child_count] < 50) {
    icon_choice = 2;
  } else {
    icon_choice = 3;
  }

  var icon = icons[icon_choice];
  
  opts = {
    "icon": icon.gicon,
    "clickable": true,
    "labelText": label,
    "labelOffset": new GSize(-(icon.width / 2), -(icon.width / 2)),
    "labelClass": "blueLabel" + icon.width
  };

  var marker = new LabeledMarker(latlng, opts);
  
  if(pointData[fields.child_count] == 1) {
  
     GEvent.addListener(marker, "click", function() {
       GDownloadUrl('infobulle.php?id='+pointData[fields.item_id]+'',
         function(data) {         	   
             var infos=eval(data); 
             CreateContent(infos,marker);
             });
      });     
  }
  else {
  	GEvent.addListener(marker, "click", function() {
       var zoom=map.getZoom();
       map.setCenter(marker.getLatLng(), zoom+3);
      });
  	} 
   
      
  return marker;
}

function init() {
    map=new GMap2(document.getElementById("geomap"),{backgroundColor:"#ffffff"});    
    map.addControl(new GMapTypeControl());
    map.addMapType(G_PHYSICAL_MAP); 
    map.addControl(new GScaleControl());
    map.addControl(new GLargeMapControl());
    /*map.addControl(new GOverviewMapControl());*/		
    map.setCenter(new GLatLng(centerLatitude, centerLongitude), startZoom);

  for (id in icons) {
    icons[id].gicon = new GIcon();
    icons[id].gicon.image = "http://www.arnaudguyomard.com/img_cluster/" + icons[id].file;
    icons[id].gicon.iconSize = new GSize(icons[id].width, icons[id].width);
    icons[id].gicon.iconAnchor = new GPoint(icons[id].width / 2, icons[id].width / 2);
    // ajout
    icons[id].gicon.infoWindowAnchor = new GPoint(icons[id].width / 2, icons[id].width / 2);
  }

  newViewport();
  GEvent.addListener(map, 'moveend', function() { newViewport(); });
}

function ConvertGPS(data){
	var sign;
	if(data < 0){sign = -1;} else {sign =1;} 
   data = Math.abs( Math.round(data * 1000000.));
   var degree= Math.floor(data/1000000)*sign;
   var DecimalMinute= ( (data/1000000) - Math.floor(data/1000000) )*60;
   var minute = Math.floor(DecimalMinute);
   var seconde =  Math.floor( (DecimalMinute - minute) * 100000 ) *60/100000 ;
	 //return (degree+' &deg; '+minute+'\' '+seconde+ ' &quot;');
	 return (degree+'°'+minute+'\' '+seconde+ '');
	}

function CreateContent(infos,marker){
  var field = {'urlphoto': 0,'categorie': 1, 'repertoire': 2,'titre': 3,'prisedevue':4}
  var gps=marker.getLatLng();
   var oDiv = document.getElementById('dynamic');
   while (oDiv.childNodes.length>0) {oDiv.removeChild(oDiv.firstChild);}           
   var titre = document.createTextNode(infos[field.titre]);
   var prisedevue = document.createTextNode('Prise de vue: '+infos[field.prisedevue]);
   var gps = document.createTextNode("GPS: "+ConvertGPS(gps.lat())+', '+ConvertGPS(gps.lng()));
   var a = document.createElement("a");
   a.href = 'http://www.arnaudguyomard.com/panos/'+infos[field.repertoire]+'/'+infos[field.urlphoto]+'?cat='+infos[field.categorie];  
   var img=document.createElement("img");
    img.src='panos/'+infos[field.repertoire]+'/miniature.jpg';  
    img.id='miniature';
   var link360=document.createElement("a");
    link360.href = 'http://www.arnaudguyomard.com/panos/'+infos[field.repertoire]+'/'+infos[field.urlphoto]+'?cat='+infos[field.categorie]; 
   var titrelink360=document.createTextNode('Visualiser la photo à 360 degrés.');
            
   a.appendChild(img);
   link360.appendChild(titrelink360);
   oDiv.appendChild(a);  
   oDiv.appendChild(titre);
   oDiv.appendChild(document.createElement('br'));
   oDiv.appendChild(prisedevue);
   oDiv.appendChild(document.createElement('br'));
   oDiv.appendChild(gps);  
   oDiv.appendChild(document.createElement('br'));
   oDiv.appendChild(document.createElement('br'));
   oDiv.appendChild(link360);
}


window.onload = init;
window.onunload = GUnload;
