/*
 * Script d'affichage des Markers sur la map google . Ce script est publié sous licence GPL
 * date : 2006-06-04
 * http://www.gnu.org/copyleft/gpl.html
 * Author : ju@jurun.org
 * Modifié : jlb@lato-sensu.net (LUG68)
 * Vous pouvez le modifier librement et le redistribuer.
 * Merci de m'indiquer tout bug, incompatibilité, amélioration
 * à  admins   at   ubuntu-fr
*/


// Create our "tiny" marker icon
var baseIcon = new GIcon();
/*baseIcon.image = "user.png";*/
baseIcon.iconSize = new GSize(23, 23);
baseIcon.shadowSize = new GSize(22, 20);
baseIcon.iconAnchor = new GPoint(6, 20);
baseIcon.infoWindowAnchor = new GPoint(14, 5);


var i;
var fromXmlMarkers = Array();
var onMapMarkers = Array();
var mapInfo = Array();
/* Création de l'objet GClientGeocoder */
var geocoder = new GClientGeocoder(); // for ShowAdress

function mapLoad () {
	
	// map defaults
	window.map = new GMap2($("map"));
	defaultPlace = new GLatLng(47.89, 7.37);
	defaultZoom = 9;
	timeOut = 5;
	
	// define controls
	map.addControl(new GLargeMapControl());

	map.addMapType(G_PHYSICAL_MAP) ; 
	map.addControl(new GMapTypeControl());
	map.enableScrollWheelZoom();
	map.setCenter(defaultPlace, defaultZoom);
	map.setMapType(G_PHYSICAL_MAP);
	
	// call XML datas using an external request
	loadDataFromLUG68();

	GEvent.addListener(map, "click", function(marker, point) {
		//if (marker) 
		//	map.removeOverlay(marker);
		/* Sinon, on ajoute un marqueur au point demandé */
// 			else map.addOverlay(new GMarker(point));
		// update last position on point (not marker)
		if (point) {
			$('lastLatUpper').innerHTML = getLatTxtFr(point);
			$('lastLatBottom').innerHTML = getLatTxtFr(point);
			$('lastLngUpper').innerHTML = getLngTxtFr(point);
			$('lastLngBottom').innerHTML = getLngTxtFr(point);
		}
	});
	
	// recall XML datas and update infos
	GEvent.addListener(map, "moveend", function() {loadDataFromLUG68();} );

	// update text coordinates
	GEvent.addListener(map, "mousemove", function(point) {
		$('curLatUpper').innerHTML = getLatTxtFr(point);
		$('curLatBottom').innerHTML = getLatTxtFr(point);
		$('curLngUpper').innerHTML = getLngTxtFr(point);
		$('curLngBottom').innerHTML = getLngTxtFr(point);
	});
}

function getLatTxtFr (point) {
	return point.y.toFixed(14).replace(/\./,',');
}
function getLngTxtFr (point) {
	return point.x.toFixed(14).replace(/\./,',');
}

function loadDataFromLUG68 () {
	var uri = 'http://lug68.com/google/extract.php?&zoom='+map.getZoom()+'&latMin='+map.getBounds().getSouthWest().lat()+'&latMax='+map.getBounds().getNorthEast().lat()+'&lngMin='+map.getBounds().getSouthWest().lng()+'&lngMax='+map.getBounds().getNorthEast().lng();
	$('uri').innerHTML = uri;
	var request = GXmlHttp.create();
	request.open("GET",uri, true);
	// Chargement des Markers
	request.onreadystatechange = function() {
		if (request.readyState == 4)
			parseData(request.responseText);
	}
 	request.send(null);
}

function parseData (responseText) {
	var xmlDoc = GXml.parse(responseText);
	//var xmlDoc = request.responseXML;
	fromXmlMarkers = xmlDoc.documentElement.getElementsByTagName('marker');
	i=0;
	// create all points
	mapMarkerRecursive();
	// get map informations
	mapInfo = xmlDoc.documentElement.getElementsByTagName('map')[0];
	//dispo=mapInfo[0].getAttribute("dispo");
	$('total').innerHTML = mapInfo.getAttribute('total')+'  membres géolocalisés extraits,';
	// parce qu'on affichera que 100 meme si plus sont dispo
	if (onMapMarkers.length !=mapInfo.getAttribute('dispo') )
		$('info_visibles').innerHTML = mapInfo.getAttribute('dispo')+' membres géolocalisés affichables, zoomez pour les avoir tous';
	else
		$('info_visibles').innerHTML = onMapMarkers.length+' membres géolocalisés affichés';

	// reset visible markers
	onMapMarkers = Array(); 
}

  /*
   * Thanks Pyg de Framasoft pour celle la, bien jolie ;-)
   */

function mapMarkerRecursive() {
	if ( i < fromXmlMarkers.length) {
		// Update the loading window
		$('counter').innerHTML = i + ' / ' + fromXmlMarkers.length; 
		// create point
		var marker = createMarker(fromXmlMarkers[i]);				
		var point = Array(parseFloat(fromXmlMarkers[i].getAttribute('lat').replace(/,/,'.')),parseFloat(fromXmlMarkers[i].getAttribute('lng').replace(/,/,'.')));
		// On va tester si on l'a pas deja celui la
		if ((!inArray(fromXmlMarkers[i].getAttribute('id'),onMapMarkers)) && isVisible(onMapMarkers,point)) {
			//alert('Point '+ i +': ID='+ fromXmlMarkers[i].getAttribute('id') +' (' + fromXmlMarkers[i].getAttribute('lat') + ';' + fromXmlMarkers[i].getAttribute('lng') + ') : ' + point.join(';'));
			onMapMarkers.push(fromXmlMarkers[i].getAttribute('id'));
			// Draw point
			map.addOverlay(marker);					
		}
		i++;
		//window.setTimeout(mapMarkerRecursive(),timeOut);
		mapMarkerRecursive()
	} else {
		 // No more points to draw : hide the loading window...
		$('loading').style.visibility='hidden';
	}
}


// Creates a marker whose info window displays the given number
function createMarker(m) {
	var icon = new GIcon(baseIcon);

	var icontypes = new Array('lug68.png','ascar.png','ram.png');

	var i=parseInt(m.getAttribute('type'))-1;
	icon.image = '/google/icons/'+icontypes[i];

	icon.image = '/google/icons/lug68.png';
	icon.shadow = '/google/icons/lug68.shadow.png';
	icon.iconSize = new GSize(48, 48); // ok
	icon.shadowSize = new GSize(48,48);
	// icon.iconAnchor = new GPoint(6, 20);
	// icon.infoWindowAnchor = new GPoint(5, 1);

	var point = new GPoint(parseFloat(m.getAttribute("lng").replace(/,/,'.')),parseFloat(m.getAttribute("lat").replace(/,/,'.')))
	var marker = new GMarker(point,icon);

	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowTabsHtml(createHtml(m));
	});

	return marker;
}

// Fonctions internes au nom explicite... rien d'interessant ;-p

function inArray(elt, array) {
	for (l in array) {
		if (array[l] == elt) {
			return true;
		}
	}
	return false;
}

function isVisible(array,point) {
	var lat = point[0];
	var	lng = point[1];
	var b=map.getBounds();
	return ( (b.getSouthWest().lat() <= lat) && (lat <= b.getNorthEast().lat()) && (b.getSouthWest().lng() <= lng) && (lng <= b.getNorthEast().lng()) )
}

function param(attr,marker) {
// 	document.write(attr);
	if ( marker.getAttribute(attr) ) {
		return marker.getAttribute(attr);
	} else {
    	return false;
	}
}

/* Fonction qui à partir d'une adresse va déterminer le point géographique */

function showAddress (address) {
	if (geocoder) {
		geocoder.getLatLng(address, function(point) {
			if (!point) { /* Si les coordonnées n'ont pas été trouvés */
				alert("Impossible de localiser l'adresse :\n\n" + address);
			} else { /* /* Les coordonnées ont été trouvés */
				/* Centrer la carte sur le point */
				map.setCenter(point, 14);
				/* Création d'un marqueur */
				var marker = new GMarker(point);
				/* Afficher le marqueur */
				map.addOverlay(marker);
				/* Associer une info-bulle au marqueur */
				marker.openInfoWindowHtml(address);
			}
		});
	}
}

function createHtml(marker) {

	var info = '<div id="desc">';

	var reg=new RegExp("'", "g");
	for (var i=0;i<marker.attributes.length;i++) {
		var attrName = marker.attributes[i].nodeName.toString();
		var attrValue = marker.attributes[i].nodeValue.toString();
		attrName.replace(reg,"\'");
		attrValue.replace(reg,"\'");
// 		alert(attrName+'='+attrValue);
		eval('var ' + attrName + '=' + "'" + attrValue + "'");
	}

	// Is there a photo ? yes print it, no print default pic
// 	if (avatar) var avatar_url =  "http://forum.ubuntu-fr.org/img/avatars/"+param("avatar",marker);
// 	else var avatar_url =  "icons/default.jpg";
// 	info += '<img id="pic" src="' + avatar_url + ' "/>';

// 	if (url) info += '<p><a href="' + url + '">';

	if (fn) info += '<b>' + fn + '</b> ';
	if (ln) info += '<b>' + ln + '</b>';
	if (!ln && !fn) info += 'Site perso';
// 	if (url.length) info += '</a></p>';
	info += '<p>';
	if (parseInt(age)>0) info += age+' ans ';
// 	if (sexe) info += sexe;
	info += '</p>';
	if (parseInt(icq)) info += '<br/><img src="/img/icons/icq.png" alt="icq" /> ' + icq;
	if (jabber.length) info += '<br/><img src="/img/icons/jabber.png" alt="jabber" /> ' + jabber;
	if (sip.length) info += '<br/><img src="/img/icons/sip.png" alt="sip" /> ' + sip;
	if (irc.length) info += '<br/><img src="/img/icons/irc.png" alt="irc" /> ' + irc;
	if (aim.length) info += '<br/><img src="/img/icons/aim.png" alt="aim" /> ' + aim;
	if (wengo.length) info += '<br/><img src="/img/icons/wengo.png" alt="wengo" /> ' + wengo;
	if (skype.length) info += '<br/><img src="/img/icons/skype.png" alt="skype" /> ' + skype;
	if (msn.length) info += '<br/><img src="/img/icons/msn.png" alt="msn" /> ' + msn;
	if (yahoo.length) info += '<br/><img src="/img/icons/yahoo.png" alt="yahoo" /> ' + yahoo;
	info += '</div>';

	var comm2 = '';
	var p = 0;
	for (var j=0;j<comm.length;j++) {
		var c = comm.substr(j,1); 
		comm2 += c;
		if (p>35 && c==' ') {
			comm2 += '<br/>\n';
			p = 0;
		}
		p++;
	}

	var lug68 = '<div style="text-align:left">'+comm2+'</div>';

	var infoTabs = [new GInfoWindowTab('Info',info), new GInfoWindowTab('Comm',lug68)];

	return infoTabs;
}


// Pareil et on le fera en php cette fois...
function checkName(input, response) {
  var j;
  var m = 0;
  //$('match').innerHTML ='Entrez au moins deux caract&eacute;res' ;
  if (input.length > 1) {
		for (j=0; j < fromXmlMarkers.length;j++ ) {
			if (fromXmlMarkers[j].getAttribute("pseudo").substring(0,input.length) == input)
				// Update match window
				$('match').innerHTML = '<div class="el" >' + fromXmlMarkers[j].getAttribute("pseudo") + '</div>'; 
			if (fromXmlMarkers[j].getAttribute("pseudo").toLowerCase() == input.toLowerCase())  {
				var point = new GPoint(parseFloat(fromXmlMarkers[j].getAttribute("lng")),parseFloat(fromXmlMarkers[j].getAttribute("lat")));
				map.centerAndZoom(point,10);
				map.openInfoWindowHtml(point,createHtml(fromXmlMarkers[j]));
				return true;
			}
		}
  }
}
