// JavaScript Document
var map;
var mId = -1;
var mapArr = new Array();
var markers = new Array();
var geocoder  = new GClientGeocoder();
var markerMan;
var infoDest = new Array();
var mapDirections = null;
var selMarker = null;
var pointer   = null;
var xmlData = null;	
var convAddrInfos = new Array();
var convPostalInfos = new Array();
var root = "";	  		

//****** AJAX functions			 
function gm_setInfos(params)
{														
setInfos(phpself+"?"+params);
}	

//Mettre a jour les coordonn�es d'un markeur
function updateMarkerPt(uid, newPt)
{
//Trouver le marker dans la liste qui correspond au uid 
for(var i = 0; i < markers.length; i++)
if (markers[i].uid == uid)	
{
	markers[i].setPoint(newPt);
	break;
}

//Si le markeur est selui selectionn�, le mettre a jour
if (selMarker.uid == uid)
	selMarker.setPoint(newPt);	

markerMan.refresh();
}	


//******

function selectMarker(overlay)
{
if (typeof overlay == "undefined"){overlay = selMarker}
	
	if (selMarker == null)
{
		selMarker = addMarker(overlay.getPoint(), true);
		map.addOverlay(selMarker);
		//markerMan.addMarker(selMarker,1,19);
}
else						 	
	selMarker.setPoint(overlay.getPoint());
//alert(selMarker.getPoint());

selMarker.postal  = overlay.postal;
selMarker.address = overlay.address;
selMarker.uid     = overlay.uid;
//selMarker.myhtml  = overlay.myhtml;

markerMan.refresh();
}		

function selectMarkerByPt(point)
{
var markerPoint	;
var precision = 0.0000000000001;
for(var i = 0; i < markers.length; i++)	
{				
	markerPoint	= markers[i].getPoint();	

	var diffX = Math.abs(markerPoint.lng() - point.lng());
	var diffY = Math.abs(markerPoint.lat() - point.lat());
	 
	if ( diffX <= precision && diffY <= precision )
	{						
		selectMarker(markers[i]);						
		break;			   					
	}
}
}

function selectMarkerById(uid)
{

for(var i = 0; i < markers.length; i++)
if (markers[i].uid == uid)	
{								
	selectMarker(markers[i]);
	break;
}
}
			
function addMarker(point, selected)
{						
if (typeof selected == "undefined"){selected = false}
if (typeof infoWin == "undefined"){infoWin = null}
					
var baseIcon      = new GIcon(G_DEFAULT_ICON);

if (selected)
	baseIcon.image      = "images/icon-home-over.png";
else
	baseIcon.image      = "images/icon-home.png";
baseIcon.iconSize   = new GSize(20, 19);
baseIcon.iconAnchor = new GPoint(10,10);
baseIcon.shadow     = "";
var markerOptions = { icon:baseIcon };
var marker = new GMarker(point, markerOptions);


if (selected === false)
markers.push(marker);

return marker;
}

function addFirstMarkerFromPostalList(callback)
{
if("undefined" == typeof callback) {callback = null;}  

info = convPostalInfos.shift();

geocoder.getLatLng( info[1], 
	function(point){
		
		if (point == null){

			//nothing
			/*if (callback != null && convPostalInfos.length == 0)
			{
				callback();								
			}*/
			point = new GLatLng(0,0);
			gm_setInfos("gmAction=posNotify&sia="+info[4]);	
		}
								
		marker = addMarker(point);	    				
	marker.myhtml  = info[0];
	marker.postal  = info[1];
	marker.uid     = info[2];
	marker.address = info[3];					
						
	//Si c'est le dernier de la liste, executer le callback
	if (callback != null && convPostalInfos.length == 0)
	{
		callback();						
	}
		
	gm_setInfos("gmAction=saveMarker&id="+info[2]+"&lng="+point.lng()+"&lat="+point.lat());
	});					    	
}


//Geocode une string en longitude/latitude
function getPoint(searchStr, callback, onFail)
{
if("undefined" == typeof onFail) {onFail = null;}  

geocoder.getLatLng( searchStr,
	function(point){
								
		if (!point)
		{		
			//Si un evenement 'onFail' existe, le lanc� 
			if (onFail != null)
				return onFail();	
			else
				return false;
		}
		else
		{	 							    				
			callback(point);
		}
			
	});
}
	

function addFirstMarkerFromAddrList(callback)
{
if("undefined" == typeof callback) {callback = null;}  

info = convAddrInfos.shift();

geocoder.getLatLng( info[3], 
	function(point){
				 
		if (point == null)
		{		  
			convPostalInfos.push(info);
		gm_setInfos("gmAction=saveMarker&id="+info[2]);

		//Si c'est le dernier de la liste, executer le callback
		if (callback != null && convAddrInfos.length == 0)
			callback();
		}
		else
		{		    							    				
			marker = addMarker(point);
			marker.myhtml  = info[0];    				
			marker.postal  = info[1];
		marker.uid     = info[2];
		marker.address = info[3];
										
		//Si c'est le dernier de la liste, executer le callback
		if (callback != null && convAddrInfos.length == 0)
			callback();	
			
			//alert("gmAction=saveMarker&id="+info[2]+"&lng="+point.lng()+"&lat="+point.lat());
			gm_setInfos("gmAction=saveMarker&id="+info[2]+"&lng="+point.lng()+"&lat="+point.lat());
		}
	});
}

function centerOn(query, zoom, callback )
{
if("undefined" == typeof callback) {callback = null;}
if("undefined" == typeof zoom) {zoom = 12;}

geocoder.getLatLng( query, 
	function(point){
		if (point != null)
		{
			map.setCenter(point, zoom);
			//mapArr[mId][1] = new GMarkerManager(map);
			//markerMan = mapArr[mId][1];
			if (callback != null)
				callback(point);
		}
		else
			alert("Impossible de trouver : " + query);
	});
}

function centerOnPt(lat, lng)
{
map.setCenter(new GLatLng(lat,lng), 16);
}

function showPointerOn(point)
{
if (pointer == null)
{		    			    		
	var baseIcon        = new GIcon(G_DEFAULT_ICON);		    	
	baseIcon.image      = root+"images/icon-pointer.png";	
									
	baseIcon.iconSize   = new GSize(35, 35);
	baseIcon.iconAnchor = new GPoint(15,30);
	baseIcon.shadow     = "";
	var markerOptions   = { icon:baseIcon, draggable:true, bouncy:true }; 
	pointer = new GMarker(point, markerOptions);	
	map.addOverlay(pointer);
}
pointer.setPoint(point);
}

function loadMarkersFromXML(xmlMarkers, callback)
{					    
if("undefined" == typeof callback) {callback = null;}
var mLat 		= null;
var mLng 		= null;
var mInfoHTML	= null;		
var mPostal		= null;	
var mUid  	 	= null;	
var mAddress	= null;		
var mGeoFailed	= null;
var toDecode	= null;
var iCpt		= 0;	

var refreshFct = function(){
	if (convAddrInfos.length == 0 && convPostalInfos.length == 0 )
	{
		markerMan.addMarkers(markers, 7, 17);
		markerMan.refresh();

		if (typeof $ != "undefined"){
			var markerLoader = $('gmMarkerLoader');
			markerLoader.morph('.gmInactiveLoader');
		}
		
		if (callback != null)
			callback();
	}
	else if (convPostalInfos.length > 0)
	{
		
		for(var i = 0; i<convPostalInfos.length; i++ ){
			var fct = function(){addFirstMarkerFromPostalList()};
			setTimeout(fct, 250*i);
		}

		setTimeout(refreshFct, 250*convPostalInfos.length+1);
	}
};

	var xml = GXml.parse(xmlMarkers);
var nodes = xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i < nodes.length; i++) 
{
	mInfoHTML  = GXml.value(nodes[i]);
	mLat 	   = nodes[i].getAttribute("lat");
	mLng 	   = nodes[i].getAttribute("lng");
	mPostal    = nodes[i].getAttribute("postal");
	mAddress   = nodes[i].getAttribute("address");
	mUid	   = nodes[i].getAttribute("uid");
	mSia	   = nodes[i].getAttribute("sia");
	mGeoFailed = nodes[i].getAttribute("geofailed");

	if ((mLat == "" || mLng == "") && calcNewPoints)
	{
		var info = new Array();
		info[0] = mInfoHTML;
		info[1] = mPostal;
		info[2] = mUid;
		info[3] = mAddress;
		info[4] = mSia;

		if (mGeoFailed == 0)
		{
			convAddrInfos.push(info);
			var fct = function(){addFirstMarkerFromAddrList(refreshFct)};
			setTimeout(fct, 250*iCpt);
			iCpt = iCpt + 1;
		}
		else
			convPostalInfos.push(info);
	}
	else
	{
			var point = new GLatLng(mLat, mLng);

			marker 		  	= addMarker(point);	
			
			marker.myhtml   = mInfoHTML;
			marker.postal 	= mPostal;
			marker.uid 	= mUid;
			marker.address	= mAddress;
	}
}

if (convAddrInfos.length == 0 )
	refreshFct();


}

function addAllMarkers(callback)
{	
if("undefined" == typeof callback) {callback = null;}


markers = new Array();		    		 
if (xmlData == null)					    	
	GDownloadUrl(basename_phpself+"?gmAction=xmlMarkers", function(data){loadMarkersFromXML(data, callback);xmlData=data;});
else					    	
	loadMarkersFromXML(xmlData, callback);

}

function askFromPostal(elem)
{	  
//infoDest[0] = selMarker.postal;//toPostal;
//infoDest[1] = selMarker.address;							
elem.innerHTML = 'Entrez votre code postal : <br><input type="text" style="width:60px" onkeypress="checkEnter(event,function(){getDirections(this.parentNode.childNodes[2].value);})"><input type="button" value="Go" onclick="getDirections(this.parentNode.childNodes[2].value)">';
}

function getDirections(fromPostal)
{
var showDirectionsFCT = function(){
	//afficher la boite de directions et le titre
	var directions = document.getElementById("bmDirections");
	var dirContainer = document.getElementById("bmDirContainer");
	var title = document.getElementById("bmTitle");
	directions.innerHTML = '<div style="padding-left:10px;padding-top:10px"><a href="http://maps.google.ca/maps?f=d&hl='+lang+'&saddr='+fromPostal+'&daddr='+selMarker.postal+'&z=14&om=1&pw=2" target="_blank"><img src="images/bt-page_03.gif" width="20" height="20" border="0" align="absmiddle">&nbsp;&nbsp;' + ((langId == 0) ? "Version imprimable" : "Printable Version")+'</a></div>';	
	
	if (parseInt(directions.style.width) != 300)
	{
		//Redimensionner la map
		var mapDiv = document.getElementById("map2");
		mapDiv.style.width  = parseInt(mapDiv.style.width) - 330 + "px";
		mapDiv.style.height  = parseInt(mapDiv.style.height) - 30 + "px";
	
		directions.style.width  = "300px";	
		dirContainer.style.width  = "330px";
		dirContainer.style.display = "";
		dirContainer.style.height = mapDiv.style.height;
		
		title.style.height  = "30px";
		title.style.overflow = "hidden";
		title.style.display = "";
		
	}							
	title.innerHTML = "<h2>"+selMarker.address+"</h2>";								
	
	if (mapDirections != null)
		mapDirections.clear();
	mapDirections = new GDirections(map, directions);
	mapDirections.load("from:"+fromPostal + " to:" + selMarker.address, {"locale":((langId == 0) ? 'fr_CA' : 'en_US')});
	
	if (mapDirections.getNumGeocodes() != 2 )
		mapDirections.load("from:"+fromPostal + " to:" + selMarker.postal, {"locale":((langId == 0) ? 'fr_CA' : 'en_US')});	
	
	//map.clearOverlays();
}	

if (document.getElementById("map2") != null)
{
	showDirectionsFCT();
	//map.clearOverlays();
}
else
	showBigMap(showDirectionsFCT);			

}

function activateMap(mId)
{
map = mapArr[mId][0];
markerMan = mapArr[mId][1];
if("undefined" != typeof markerMan)						
	markerMan.refresh();						
}

function loadGMap(callback, mapId)
{
if("undefined" == typeof callback || callback == null) {callback = addAllMarkers;}
if("undefined" == typeof mapId) {mapId = "map";}


if (typeof $ != "undefined"){
	
var markerLoader = $('gmMarkerLoader');
var mapDim = $(mapId).getSize();
var elemDim = markerLoader.getSize();

markerLoader.setStyle('left',(mapDim.x/2) - (elemDim.x/2));
markerLoader.setStyle('top',(mapDim.y/2) - (elemDim.y/2));

}

if ( GBrowserIsCompatible() ) 
{					    	
	mId = mId+1;
	mapArr[mId] = new Array();
	mapArr[mId][0] = new GMap2( document.getElementById(mapId) );
	map = mapArr[mId][0];			      	

	map.addControl( new GSmallMapControl() );	
	map.addControl( new GMapTypeControl() );
map.enableDoubleClickZoom();
map.enableContinuousZoom();
map.setMapType(G_NORMAL_MAP);
map.removeMapType(G_SATELLITE_MAP)

centerOn("Sherbrooke,QC", 11, function(){
	mapArr[mId][1] = new GMarkerManager(map);
	markerMan = mapArr[mId][1];	
	callback();
});								
							
GEvent.addListener(map, "click", function(overlay, point) { 
		if (overlay && overlay.myhtml){
			selectMarker(overlay);			 
			//alert(overlay.getPoint());		
			overlay.openInfoWindowHtml(overlay.myhtml);			   				
		}
});	

}
}