// JavaScript librairie pour Google Maps API (gma)

//==============================================================================
//==============================================================================
// Variables globales
//==============================================================================
//==============================================================================

//
// la variable map contiendra l'objet GMap2 
// et ovrl son overlay de fond
// utilisé dans tout la librairie
//
var map;

//==============================================================================
//==============================================================================
// la fonction de base appelée depuis le onload de la page html
//==============================================================================
//==============================================================================
function gma_initialize(siteroot, lang) {
	
	if (GBrowserIsCompatible()) {
		
		//
		// initialisations
		//
		root = siteroot;
		langue = lang;
		
		//
		// recuperation valeurs initiales
		//
		var centerLat 	= MapConfig.centerLat;
		var centerLng 	= MapConfig.centerLng;
		var zooml 		= MapConfig.zooml;

		//
		// creation de la map
		//
		map = new GMap2(document.getElementById(MapConfig.divMap));
		
		//
		// parametres intiaux et globaux de la map
		//
		map.setCenter(new GLatLng(centerLat, centerLng), zooml);
		map.setUIToDefault();
		/*
		map.setMapType(G_NORMAL_MAP);
		//map.disableDragging();
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
		*/
		
		//
		// ajout d'un control: map status
		//
		/*************************************************************************
		MStatusControl options:
		DMS: Boolean - Default: false - Show Degrees, Minutes, Seconds *
		Position: GControlPosition()
		vertical: Boolean - Default: false - Make the control taller and more narrow
		background: HTML color - Default: '#eeeeee';
		foreground: HTML color - Default: '#000000';
		***************************************************************************/
		//var pos = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(-300, 0));
		//map.addControl(new MStatusControl({DMS:false, position:pos, background:'#ffffff', foreground:'#000000', vertical:true}));
		
	} else {
		alert('Internet browser dos not allow Google Maps API.');
	}
	
}


//==============================================================================
//==============================================================================
// les fonctions de gestion des markers sur evenements
//==============================================================================
//==============================================================================
function gma_markersCreate(scope, idfiche) {
	// suppression de tous les overlays restants (markers)
	map.clearOverlays();
	
	for (n=0 ; n < Markers.length ; n++ ) {
		// on cree chaque marker
		Markers[n][8] = createMarker(scope,idfiche,n);
		Markers[n][9] = n;
		map.addOverlay(Markers[n][8]);
		Markers[n][8].hide();
	}
	
	markersShow(scope,idfiche);
}

function createInfoWindowHtmlMarkup(n) {
	var data = Markers[n];
	var lat = data[1];
	var lng = data[2];
	var title = data[3];
	var vignette = data[4];
	var sstitre = data[5];
	var descr = data[6];
	var lien = data[7];
	
	var htmlcontent = '';
	htmlcontent = htmlcontent + '<a href="javascript:window.parent.location.href=\''+lien+'\';window.parent.Shadowbox.close();">' + '<img src="' + vignette + '" width="' + MapConfig.InfoBulleVignetteWidth + '" height="' + MapConfig.InfoBulleVignetteHeight + '" class="' + MapConfig.InfoBulleVignetteClass + '" />' + '</a>';
	htmlcontent = htmlcontent + '<a href="javascript:window.parent.location.href=\''+lien+'\';window.parent.Shadowbox.close();">' + '<h2>' + title + '</h2>' + '</a>';
	htmlcontent = htmlcontent + '<p class="resultats">' + sstitre + '</p>';
	htmlcontent = htmlcontent + '<hr />';
	htmlcontent = htmlcontent + '<div style="clear:both">' + '</div>';
	htmlcontent = htmlcontent + '<p>' + descr + '</p>';
	//htmlcontent = htmlcontent + '<p class="liens"><a href="javascript:window.parent.location.href=\''+lien+'\';window.parent.Shadowbox.close();">' + 'En savoir plus' + '</a></p>';
	htmlcontent = htmlcontent + '<p class="liens"><a href="http://maps.google.fr/maps?lsm=1&daddr=+@'+lat+','+lng+'&geocode=&dirflg=&saddr=&vps=1&f=li&hl=fr" target="_blank">' + MapConfig.InfoBulleTextDirTo + '</a></p>';
	htmlcontent = htmlcontent + '<p class="liens"><a href="http://maps.google.fr/maps?lsm=1&daddr=&geocode=&dirflg=&saddr=+@'+lat+','+lng+'&vps=1&f=li&hl=fr" target="_blank">' + MapConfig.InfoBulleTextDirFrom + '</a></p>';
	
	return htmlcontent;
}

function createMarker(scope,idfiche,n) {
	var data = Markers[n];
	var lat = data[1];
	var lng = data[2];
	var title = data[3];
	var vignette = data[4];
	var sstitre = data[5];
	var descr = data[6];
	var lien = data[7];
	
	var point = new GLatLng(lat,lng);
	var marker_img = defineMarkerImg(scope,idfiche,n);
	var newicon = new GIcon(G_DEFAULT_ICON);
	newicon.image = marker_img;
	
	var marker = new GMarker(point,{icon:newicon, title:title});
	
	GEvent.addListener(marker, "click", function() {
		var htmlcontent = createInfoWindowHtmlMarkup(n);
		marker.openInfoWindowHtml(htmlcontent,{maxWidth:MapConfig.InfoBullesMawWidth});
	});
	
	if (scope=='customer-company') {
		var htmlcontent = createInfoWindowHtmlMarkup(n);
		marker.openInfoWindowHtml(htmlcontent,{maxWidth:MapConfig.InfoBullesMawWidth});
	}
	
	return marker;
}

function defineMarkerImg(scope,idfiche,n) {
	var img1 = MapConfig.MarkerImg1;
	var img2 = MapConfig.MarkerImg2;
	
	if (scope=='fiche') {
		if (Markers[n][0]==idfiche) {
			return UrlRoot+'design/'+img1;
		} else {
			return UrlRoot+'design/'+img2;
		}
	} else {
		return UrlRoot+'design/'+img1;
	}
}

function findMarker(idfiche) {
	for (n=0 ; n < Markers.length ; n++ ) {
		// on cree chaque marker
		if (Markers[n][0]==idfiche) return n;
	}
	return -1;
}

function markersShow(scope,idfiche) {
	var nofiche = findMarker(idfiche);
	var maxDistance = (nofiche==-1)? 0:document.getElementById('show_markers_radius').value;
	
	for (n=0 ; n < Markers.length ; n++ ) {
		var marker = Markers[n][8];
		//alert(d);
		if (scope=='fiche') {
			var d = (nofiche==-1)? 0:distance(Markers[nofiche][1],Markers[nofiche][2],Markers[n][1],Markers[n][2]);
			if (Markers[n][0]==idfiche || d<=maxDistance) {
				marker.show();
			} else {
				marker.hide();
			}
		} else {
			marker.show();
		}
	}
}


//==============================================================================
//==============================================================================
// les fonctions de geocodage
//==============================================================================
//==============================================================================
function gma_geocode(addstr) {
	var geoc = new GClientGeocoder();
	geoc.setBaseCountryCode('fr');
	
	//
	// recuperation de l'adreese à géocoder
	// prendre la valeur des champs adresse et ville du formulaire
	//
	//var add = document.getElementById('input_address').value;
	
	//
	// lancer le geocodage
	//
	geoc.getLatLng(addstr, geocodeLatLng);
}

function geocodeLatLng(point) {
	//
	// mettre les valeurs de lat et lng dans 
	// les champs adéquats du forulaire de saisie
	//
	if (point) {
		// alert('latitude:'+point.lat()+', longitude: '+point.lng());
		document.getElementById('output_lat').value = point.lat();
		document.getElementById('output_lng').value = point.lng();
		map.addOverlay(new GMarker(point));
		map.setCenter(new GLatLng(point.lat(), point.lng()), 7);
	} else {
		// alert('sans');
		document.getElementById('output_lat').value = 0;
		document.getElementById('output_lng').value = 0;
	}
		
}


//==============================================================================
//==============================================================================
// les fonctions de calcul de distance entre 2 points
//==============================================================================
//==============================================================================
function distance (lat1, lon1, lat2, lon2) {
	lng = 0; // preset default value
	polyPoints = [new GLatLng(lat1,lon1),new GLatLng(lat2,lon2)]; // make points array
	polyShape = new GPolyline(polyPoints); // make a line from to points (2 point array)
	var lng = polyShape.getLength()/1000; // get length of the line in +- km distance
	//return lng.toFixed(2); // format output by to number after dot
	return lng; // format output by to number after dot
}


//==============================================================================
//==============================================================================
// utilitaires
//==============================================================================
//==============================================================================
function gma_addPointsByClick (nb) {
	var points = new Array();
	var pointsInd = 0;
	
	var mapClick = GEvent.addListener(map, 'click', function(overlay,latlng){
		map.addOverlay(new GMarker(latlng));
		points[pointsInd++] = new LatLong(latlng.lat(), latlng.lng());	
		if (pointsInd==nb) {
			GEvent.removeListener(mapClick);
			processPoints(points);
		}
	});
	
}

function processPoints(points) {
	var d = distance(points[0].lat(),points[0].lng(),points[1].lat(),points[1].lng());
	alert('Distance = '+d);
}
