var baseURL = "http://www.chronopost.fr/transport-express/webdav/site/chronov4/groups/administrators/public/Chronomaps/" ;

// SOAP recherche bt web service
var rechercheBT_wsdl = "http://www.chronopost.fr/soap.point.relais/services/ServiceRechercheBt";

// JSON webservice
var json_ws_path = baseURL + "ag_chronopost.json" ;

var bt_list = [] ;	// list des points chronopost.
var max_bt = 3 ;	// nombre maximum de points chronopost.

var next_bt = 0 ;	// variable de travail  markers sur la map.  

var current_ag_index = 0 ; 
var current_ag_max_dist = 0 ; 

// variable de travail pour definir le rectangle de la zone de la map a afficher selon les markers places
var min_lat = 0 ;
var max_lat = 0 ;
var min_lng = 0 ;
var max_lng = 0 ;

var query ;		// tableau associatif des variables de la requete HTTP transmis via la methode GET. 

var markersPath = baseURL+"layout/lib/";
var imgPath = markersPath+"images/" ;

var map ;		// GMap2 object
var geocoder; 	// The geocoder client
var gdir ;		// The direction helper :)
var om ;		// OverlayMessage object
var mgr;		// MarkerManager object

var user_info ;

var notFoundMsg = "D&eacute;sol&eacute; nous n'avons pas r&eacute;ussi &agrave; localiser l'adresse."
    			+"<br />Nous vous proposons de r&eacute;essayer en v&eacute;rifiant l'adresse saisie." ;

// Les vues des difféntes infos bulles

var to_htmls = [] ;		// vue d'itineraire : Vers ce lieu
var from_htmls = [];	// vue d'itineraire : A partir de ce lieu
var default_htmls = []; // vue par defaut
var mail_htmls = [];	// vue Envoyer E-mail

var allmarkers = [] ;	// liste de tous les markers places sur la map

var isDifferentGeocodingAddress = false ;
var google_rs = [] ;
 
var iconData = {
  "ac": { width: 32, height: 28 },
  "cr": { width: 32, height: 28 },
  "ac-shadow": { width: 44, height: 28 },
  "cr-shadow": { width: 44, height: 28}
};

var icons = {} ;


// variables de travail pour la gestion de l'impression, notamment l'impression de l'itineraire.
var is_print_direction = false ; // index du point de l'itineraire, -1 on imprime seulement un point pas un itineraire.
var to_print_addr = "" ;   // stocke la valeur du lieu de départ
var from_print_addr = "" ; // stocke la valeur du lieu de destination
var bt_print = -1 ;


function init_smallMap(div)
{
	if (GBrowserIsCompatible())
	{
		map = new GMap2(document.getElementById(div));
		if (div =="sw-bGmap")
		{
			om = new OverlayMessage(document.getElementById(div));      
			om.Set('<b>Recherche en cours...</b>');
			map.addControl(new GLargeMapControl());
			// map.addControl(new GOverviewMapControl());
			
			//user_info = new OverlayMessage("div-user-info") ;
		}
		if (div == "sw-pGmap")
		{  
			map.addControl(new GLargeMapControl());
			// map.addControl(new GOverviewMapControl());
			
		}
		
	    if (div =="sw-sGmap")
		{
		//	om = new OverlayMessage(document.getElementById(div));      
		//	om.Set('<b>Recherche en cours...</b>');
		//	map.addControl(new GLargeMapControl());
		//	map.addControl(new GOverviewMapControl());
			
			//user_info = new OverlayMessage("div-user-info") ;
		}
		
		gdir = new GDirections(map, document.getElementById("sw-directions")) ;
	   
		geocoder = new GClientGeocoder();
		geocoder.setBaseCountryCode('fr');
		
		GEvent.addListener(map, 'load', _mapLoadHandler) ;
		
		map.setCenter(new GLatLng(47.100045 , 1.735840), 5);
		mgr = new MarkerManager(map, {trackMarkers:true});
		
		if (div != "sw-sGmap")
		{
			// handler pour afficher les infos bulles au chargement de la page, si besoin
			GEvent.addListener(map, 'zoomend', _mapZoomEndHandler) ;
	    
	   		GEvent.addListener(map, 'moveend', _mapMoveEndHandler) ;
		}
	    GEvent.addListener(gdir, 'load', _directionsLoadHandler) ;
	    GEvent.addListener(gdir, 'error', _directionsErrorHandler) ;		
	}
}

function _mapLoadHandler()
{
	// demarre le script ici, apres le chargement de la map.
	if (document.getElementById("sw-sGmap") != null)
	{
		query = [] ;
		query["sw-form-type-point"] = "agence" ;
		loadAllAgence() ;
	}
	else
	{
		_main() ;
	}
	
	GEvent.clearListeners(map, 'load') ;
}

function _mapMoveEndHandler()
{
	if (query["request"] != "print")
	{
		if (bt_list.length == 1)
		{
			window.setTimeout("defaultView(0)", 500) ;
		}
	}
	
	GEvent.clearListeners(map, 'moveend') ;
}

function _mapZoomEndHandler()
{
	if (query["request"] != "print")
	{
		if (bt_list.length == 1)
		{
			window.setTimeout("defaultView(0)", 500) ;
		}
	}
	
	GEvent.clearListeners(map, 'zoomend') ;
	
	var level = map.getZoom() ;
	level = level - 1;

	map.setZoom(level) ;
	
	
}

function getIcon(images)
{
	var icon = null;
	
	if (images)
	{
	  if (icons[images])
	  {
	    icon = icons[images];
	  }
	  else
	  {
	    icon = new GIcon();
	    icon.image = markersPath+"images/"+ images + ".png";
	    icon.transparent =icon.image; 

	    var size = iconData[images];
	    icon.iconSize = new GSize(size.width, size.height);
	    icon.iconAnchor = new GPoint((size.width >> 1)-16,( size.height >> 1)+12);
	    icon.infoWindowAnchor = new GPoint(size.width >> 1, size.height >> 1); 
	    icon.shadow = markersPath +"images/"+images+"-shadow"+ ".png"; 
	    size = iconData[images+"-shadow"];
	    icon.shadowSize = new GSize(size.width, size.height);
	    icons[images] = icon;
	  }
	}               
	return icon;
}

function getHorairesTab(anArray, highlight)
{
	var rs = "" ;
	if ( query["sw-form-type-point"] == "opt_chrlas" )
	{
		rs =  "<table id=\"sw-table-horaire\" class=\"sw-table\">"
			+ "<tr><td>Lun:</td>"+ parseHorairesOuverture(anArray["horairesOuvertureLundi"], 1, highlight) +"</tr>"
			+ "<tr><td>Mar:</td>"+ parseHorairesOuverture(anArray["horairesOuvertureMardi"], 2, highlight) +"</tr>"
			+ "<tr><td>Mer:</td>"+ parseHorairesOuverture(anArray["horairesOuvertureMercredi"], 3, highlight) +"</tr>"
			+ "<tr><td>Jeu:</td>"+ parseHorairesOuverture(anArray["horairesOuvertureJeudi"], 4, highlight) +"</tr>"
			+ "<tr><td>Ven:</td>"+ parseHorairesOuverture(anArray["horairesOuvertureVendredi"], 5, highlight) +"</tr>"
			+ "<tr><td>Sam:</td>"+ parseHorairesOuverture(anArray["horairesOuvertureSamedi"], 6, highlight) +"</tr>"
			+ "<tr><td>Dim:</td>"+ parseHorairesOuverture(anArray["horairesOuvertureDimanche"], 0, highlight) +"</tr>"
			+ "</table>" ;
	}
	else
	{
		rs =  "<table id=\"sw-table-horaire-client\" class=\"sw-table\">"
			+ "<tr><th colspan=\"2\" align=\"center\"><strong>Accueil client</strong></th></tr>"
			+ "<tr><td align=\"center\"><i>lundi &agrave; vendredi</i></td><td align=\"center\"><i>Samedi</i></td></tr>"
			+ "<tr><td align=\"center\">"+anArray["hor1"]+"</td><td align=\"center\">"+anArray["hor2"]+"</td></tr>"
			+ "</table>"
			+ "<table id=\"sw-table-horaire-depot\" class=\"sw-table\">"
			+ "<tr><th colspan=\"2\" align=\"center\"><strong>Accueil d&eacute;p&ocirc;t</strong></th></tr>"
			+ "<tr><td align=\"center\"><i>lundi &agrave; vendredi</i></td><td align=\"center\"><i>Samedi</i></td></tr>"
			+ "<tr><td align=\"center\">"+anArray["hor3"]+"</td><td align=\"center\">"+anArray["hor4"]+"</td></tr>"
			+ "</table>" ;
	}
	return rs ;
}
  	
function displayWindowInfo(anArray, marker, direction)
{
	var options = {maxWidth : 300,    selectedTab : 0,suppressMapPan:true};
	var tab = new GInfoWindowTab ("Infos", '<div id="sw-infowindow-info" class="sw-infowindow">'+getMarkerInfoContent(anArray)+direction+'</div>');
	var tab2 = new GInfoWindowTab ("Horaires",  '<div id="sw-infowindow-hor" class="sw-infowindow">'+"<h2>Horaires</h2>"+getHorairesTab(anArray, true)+'</div>') ;
	
	// on recentre la map pour eviter que les onglets des tabs colle au haut de la map
	var point = marker.getPoint(); 
	mapZoomandCenter(point,235);
	marker.openInfoWindowTabsHtml( new Array(tab, tab2), options) ;
}

function getMarkerInfoContent(anArray)
{
	
	if ( query != null && query["sw-form-type-point"] == "opt_chrlas" )
    	icoPath = imgPath + "ico_ac_shaded.gif" ;
    else
		icoPath =imgPath + "ico_cr_shaded.gif" ;
	var content="<div class=\"sw-map-adresse-wrp\" style=\"background-image: url("+ icoPath +"); background-repeat: no-repeat;padding-left:50px;\">"
						+ "<h2>"+anArray["nomEnseigne"]+"</h2>"
						+ "<div class=\"sw-map-adresse\">"								
						+ parseAdresse(anArray)
						+ anArray["codePostal"] + " " + anArray["localite"] 
			 			+ "</div></div>";
	return content;
}

function _directionsErrorHandler()
{
	// error
	shwmsg( notFoundMsg, "sw-form-mail-error") ;
}

function _directionsLoadHandler()
{
	if ( query["request"] == "print" )
	{
		if (is_print_direction)
			fillPrintDirections()
	}
	else
	{	
		removeClassName(document.getElementById("sw-results-display"),'sw-visible');
		addClassName(document.getElementById("sw-results-display"),'sw-hidden');
		removeClassName(document.getElementById("sw-itineraire"),'sw-hidden');
		addClassName(document.getElementById("sw-itineraire"),'sw-visible');
	
		removeClassName(document.getElementById("sw-form-mail-error"),'sw-visible');
		addClassName(document.getElementById("sw-form-mail-error"),'sw-hidden');

		fillFromInfo() ;
		fillToInfo() ;
		fillDistInfo() ;
		
		addClassName(document.getElementById("sw-searchForm"),'sw-hidden');
		
		for (var i=0; i < allmarkers.length; i++)
		{
			var mark = allmarkers[i] ;
			mark.closeInfoWindow() ;
		}

	}
	
}

function set_directions(i)
{
   	is_print_direction = true ;
   	from_print_addr = document.getElementById("saddr").value ;
   	to_print_addr = document.getElementById("daddr").value ;
   	bt_print = i ;
   	
   	if ( from_print_addr != "" && to_print_addr != "" )
   	{
    	gdir.load("from: " + from_print_addr + " to: " + to_print_addr,
              	{ "locale": "fr" });
	}
    return false ;
}
    

    
    
function getActionsForm(point, label)
{
    	var html="";
		
		if (document.getElementById("sw-sGmap") == null)
		{
         // The info window version with the "to here" form open
        to_htmls[label] = html + '<div class="sw-tool-itineraire"><h4>Rechercher un itin&eacute;raire</h4>'+
           '<div id="sw-form-mail-error" class="sw-alert sw-hidden"></div>' +
           '<span class="sw-map-itin-tools"><b>Vers ce lieu</b> - <a href="javascript:fromhere('+label+')">À? partir de ce lieu</a></span>' +
           '<form id="sw-form-itineraire-to" class="clearfix" method="post" onsubmit="return false;">' +
           '<label class="sw-desc" for="saddr">Lieu de d&eacute;part :</label>'+
           '<input class="sw-field sw-text sw-large" type="text" size="40" maxlength="40" name="saddr" id="saddr" value="" />' +
           '<label class="sw-help" for="saddr">Ex: 4 rue Berryer 75008 Paris</label>'+
           '<input id="sw-directions-to-submit" class="sw-btn-submit sw-btn"  value="Envoyer"  type="button" onclick="set_directions('+label+')" />' +
           '<input type="hidden" id="daddr" name="daddr" value="' + bt_list[label]["adresse1"] + ' ' + bt_list[label]["codePostal"]  + ' ' + bt_list[label]["localite"] + '"/>' +
           '<input type="hidden" name="hl" value="fr" /></form>' +
           '<a href="javascript: defaultView('+label+')" class="sw-back-link">Retour</a></div>';
           
        // The info window version with the "to here" form open
        from_htmls[label] = html + '<div class="sw-tool-itineraire"><h4>Rechercher un itin&eacute;raire</h4>'+
           '<div id="sw-form-mail-error" class="sw-alert sw-hidden"></div>' +
           '<span class="sw-map-itin-tools"><a href="javascript:tohere('+label+')">Vers ce lieu</a> - <b>À partir de ce lieu</b></span>' +
           '<form class="clearfix" id="sw-form-itineraire-from" method="post" onsubmit="return false;">'+
           '<label class="sw-desc" for="daddr">Lieu d&acute;arriv&eacute;e :</label>' +
           '<input class="sw-field sw-text sw-large" type="text" size="40" maxlength="40" name="daddr" id="daddr" value="" />' +
           '<label class="sw-help" for="daddr">Ex: 4 rue Berryer 75008 Paris</label>'+
           '<input  id="sw-directions-from-submit" class="sw-btn-submit sw-btn" value="Envoyer" type="button" onclick="set_directions('+label+')" />' +
           '<input type="hidden" id="saddr" name="saddr" value="' + bt_list[label]["adresse1"] + ' ' + bt_list[label]["codePostal"]  + ' ' + bt_list[label]["localite"] + '"/>' +
           '<input type="hidden" name="hl" value="fr" /></form>' +
           '<a href="javascript: defaultView('+label+')" class="sw-back-link">Retour</a></div>'  ;
        
        mail_htmls[label] =  html + getMarkerMailContent(label) ; 
 		
 		if (query["request"] != "print")
 		{
     		// Modification suppression envoi email
 			html = html + '<div class="sw-map-tools"><a href="javascript:printPage('+label+')">Imprimer</a>'
 			//			+ '&nbsp;-&nbsp;<a href="javascript:mailTo('+label+')">Envoyer par Email</a>'
 						+ '&nbsp;-&nbsp;<a href="javascript:tohere('+label+')">Rechercher un itin&eacute;raire</a>' 						
 						+ '</div>';
 		}
		}
 		// The default html 
 		default_htmls[label] = html ;
 		
        return html;
}
    
function getMarkerMailContent(label)
{
	return '<div id="sw-sendbymail-wrap"><div id="sw-form-mail-success" class="sw-success sw-hidden"></div><form id="sw-form-sendbymail" method="post" class="clearfix" enctype="multipart/form-data" action="'+baseURL+'sendMail.php" onsubmit="javascript: return ajaxSendByMail(); return false;">'
       		  + '<h4>Envoyer par Email</h4>'
       		  + '<div id="sw-form-mail-error" class="sw-alert sw-hidden"></div>'
       		  + '<label class="sw-desc" for="receiver">Email du destinataire</label>'
       		  +	'<input class="sw-field sw-text sw-large" type="text" name="receiver" id="receiver"  />'
              +	'<label class="help" for="receiver">Ex: nathalie.martin@email.fr</label>'
       		  + '<label class="sw-desc" for="msg">Message</label>'
       		  + '<textarea class="sw-field sw-textarea sw-large" name="msg" id="msg"></textarea>'
       		  + '<input type="hidden" id="nomEnseigne" name="nomEnseigne" value="'+bt_list[label]["nomEnseigne"]+'" />'
       		  + '<input type="hidden" id="localite" name="localite" value="'+bt_list[label]["localite"]+'" />'
       		  + '<input type="hidden" id="id" name="id" value="'+bt_list[label]["identifiantChronopostPointA2PAS"]+'" />'
       		  + '<input type="hidden" id="type" name="type" value="'+query["sw-form-type-point"]+'" />'
       		  + '<input type="hidden" id="src_page" name="src_page" value="'+getUrl()+'" />'
       		  + '<input type="hidden" id="baseURL" name="baseURL" value="'+baseURL+'" />'
       		  + '<input type="hidden" id="queryString" name="queryString" value="'+btQueryString(bt_list[label], false)+'" />'
       		  + '<input  id="sw-sendbymail-submit" class="sw-btn-submit sw-btn"  type="submit" value="Envoyer" />'
       		  + '</form>'
       		  + '<a href="javascript: defaultView('+label+')" class="sw-back-link">Retour</a></div>'  ;
       		  ;
}

    
function deleteMarker()
{
	var markerNum = parseInt(document.getElementById("markerNum").value);
	mgr.removeMarker(allmarkers[markerNum]);
}
   
function clearMarkers()
{
	mgr.clearMarkers();
}

/**
 *	Cree un nouveau marker avec les informations transmises en parametre.
 *	@param posn Position du marker.
 *	@param anArray Information du point chronopost.
 *	@retunr GMarker Retourne le marker crée.
 */
function createMarkerWithArray(posn, anArray)
{  
    var title = anArray["nomEnseigne"] ;
    var icon = getIcon(anArray["icnname"]) ;
    var rlabel = next_bt ;
    var marker = new GMarker(posn, {title: title, icon: icon, draggable:false });
  
    GEvent.addListener(marker, "click", function() {
	    var options = {maxWidth : 300,    selectedTab : 0,suppressMapPan:true};
		var tab = new GInfoWindowTab ("Infos", '<div id="sw-infowindow-info" class="sw-infowindow">'+getMarkerInfoContent(anArray) + getActionsForm(posn, rlabel)+'</div>') ;
		var tab2 = new GInfoWindowTab ("Horaires",'<div id="sw-infowindow-hor" class="sw-infowindow">'+ "<h2>Horaires</h2>"+getHorairesTab(anArray, true)+'</div>') ;
		
		// on recentre la map pour eviter que les onglets des tabs colle au haut de la map
		mapZoomandCenter(posn,115);

		marker.openInfoWindowTabsHtml( new Array(tab, tab2), options) ;
    });

	return marker;
}

function mapZoomandCenter(posn, windowsize) {
	var custsize=(windowsize) ? windowsize:115;
	//Pixel distance to the center of the map 
	var CDivPixel = map.fromLatLngToDivPixel(map.getCenter()); 
	//Pixel distance from the marker point 
	var pointDivPixel = map.fromLatLngToDivPixel(posn); 
	//Difference between the above mentioned distances 
	var fromCenter = subGPoints(pointDivPixel, CDivPixel); 
	//Pan to the corrected location (the -40 and +215 
	map.panBy(new GSize(-fromCenter.x-40,-fromCenter.y+custsize)) 
}
	
	
function subGPoints(a,b) { 
	//returns the distance in pixels between point 
	return new GPoint(a.x-b.x, a.y-b.y); 
} 


/*---------------------------------------------------------------
						MISC
*/

/**
 *	Formate les informations des horaires dans 2 cellules (<td>matin</td><td>am</td>) .
 *	@param value Horaire au format '00:00-00:00 00:00-00:00'
 *	@param day Jour de l'horaire transmis en parametre
 *	@return String Retourne 2 cellules de tableau formatees.
 */
function parseHorairesOuverture(value , day, highlight)
{
	var rs = "" ;
	
	if ( query["sw-form-type-point"] == "opt_chrlas" )
	{
		var now = new Date() ;
		var today = now.getDay() ;	// number of day
		var attributedCell = "" ;	
		var reg = new RegExp(" ", "g");
	
		var horaires = value.split(reg) ;
		
		for (var i=0; i < horaires.length; i++)
		{
			// first define the attributes for the current cell
			if ( highlight == true && day == today)
			{
				attributedCell = "style=\"color:red;\"" ;
			}
			else
			{
				attributedCell = "" ;
			}
			
			// so, re-format time
			if (horaires[i] == "00:00-00:00")
			{
				horaires[i] = "<td "+attributedCell+">&nbsp;</td>" ;
			}
			else
			{
				horaires[i] = "<td "+attributedCell+">"+horaires[i]+"</td>" ;
			}
			
			// yeah, concatenates result to the returned value
			rs += horaires[i] ;
		}
	}
	else
	{
		
	}
	
	return rs ;
}

/**
 *	Formate l'adresse d'un point chronopost transmis en parametre.
 *	L'adresse1, adresse2 et adresse3 sont mis en forme.
 *	@param anArray Information d'un point.
 *	@return String Retourne l'adresse complete formatee selon les le point transmis en parametre. 
 */
function parseAdresse(anArray)
{
	var address = anArray["adresse1"] + "<br />" ;
      
	if (typeof(anArray["adresse2"]) != "undefined" && anArray["adresse2"] != "undefined")
		address += anArray["adresse2"] + "<br />" ;
		
	if (typeof(anArray["adresse3"]) != "undefined" && anArray["adresse3"] != "undefined")
		address += anArray["adresse3"] + "<br />" ;
    
    return address ;
} 

function typePoint()
{
	var type = "" ;
	
	if ( query["sw-form-type-point"] == "opt_chrlas" )
		type = "Chrono Relais"  ;
	else
		type = "Agence Chronopost" ;
	
	return type ;
}

/*---------------------------------------------------------------
					INFO BULLE FONCTIONS
*/
/**
 *	Affiche la vue d'itineraire Vers ce lieu...
 *	@param i Index du point chronopost.
 */
function tohere(i)
{   
	displayWindowInfo(bt_list[i] , allmarkers[i], to_htmls[i]) ;
} 

/**
 *	Affiche la vue d'itineraire A partir de ce lieu...
 *	@param i Index du point chronopost.
 */
function fromhere(i)
{ 
	displayWindowInfo(bt_list[i] , allmarkers[i], from_htmls[i]) ;
}

/**
 *	Affiche la vue Envoyer par E-mail...
 *	@param i Index du point chronopost.
 */  
function mailTo(i)
{    
	displayWindowInfo(bt_list[i] , allmarkers[i], mail_htmls[i]) ;
}

/**
 *	Affiche la vue par defaut...
 *	@param i Index du point chronopost.
 */    
function defaultView(i)
{
    displayWindowInfo(bt_list[i] , allmarkers[i], default_htmls[i]) ;
}

function printPage(i)
{
	var  fen=open("","Impression"); 
	fen.focus();
	
	if ( is_print_direction == false )
	{
		fen.location.href = baseURL
							+ "print-result.html?request=print&"
							+ btQueryString(bt_list[i], true)
							+ "&sw-form-type-point=" + query["sw-form-type-point"]
							+ "&is_print_direction=" + is_print_direction
							+ "&from_addr=" + escape(from_print_addr)
							+ "&to_addr=" + escape(to_print_addr) ;
	}
	else
	{
		var bt_string = "" ;
		
		if (bt_print != -1)
		{
			bt_string = "&" + btQueryString(bt_list[bt_print], true) ;
		}
		
		fen.location.href = baseURL
							+ "print-result.html?request=print"
							+ bt_string
							+ "&sw-form-type-point=" + query["sw-form-type-point"]
							+ "&is_print_direction=" + is_print_direction
							+ "&from_addr=" + escape(from_print_addr)
							+ "&to_addr=" + escape(to_print_addr) ;
	}
}

/*--------------------------------------------------------
				CHRONOPOST SERVICE WEB SOAP
*/

/**
 *	Analyse et recupere les informations au format XML issues de l'appel au web service SOAP de chronopost.
 *	Cette fonction initialise la liste des points chronopost (bt_list).
 *	On initialise au maximum max_bt points chronopost.
 *	@param doc Contenu XML des points chronopost.
 */
function parseRechercheBT(doc)
{    
     var xmlDoc = GXml.parse(doc);  
     var markers = xmlDoc.documentElement.getElementsByTagName("multiRef");
     var loop_count = markers.length ;
     
     // on ne traite que le nombre max d'elements predefini...
     if (loop_count > max_bt)
     	loop_count = max_bt ;
     
     for (var i = 0; i < loop_count; i++)
     {
     	var bt = [] ;
     	
     	bt["adresse1"] = markers[i].getElementsByTagName("adresse1")[0].childNodes[0].nodeValue;
     	
     	if (markers[i].getElementsByTagName("adresse2")[0].childNodes.length > 0)
     		bt["adresse2"] = markers[i].getElementsByTagName("adresse2")[0].childNodes[0].nodeValue;
     	
     	if (markers[i].getElementsByTagName("adresse3")[0].childNodes.length > 0)
     		bt["adresse3"] = markers[i].getElementsByTagName("adresse3")[0].childNodes[0].nodeValue;
     		
       	bt["codePostal"] = markers[i].getElementsByTagName("codePostal")[0].childNodes[0].nodeValue;
       	bt["localite"] = markers[i].getElementsByTagName("localite")[0].childNodes[0].nodeValue;
       	bt["nomEnseigne"] = markers[i].getElementsByTagName("nomEnseigne")[0].childNodes[0].nodeValue;
       	bt["horairesOuvertureLundi"] = markers[i].getElementsByTagName("horairesOuvertureLundi")[0].childNodes[0].nodeValue;
       	bt["horairesOuvertureMardi"] = markers[i].getElementsByTagName("horairesOuvertureMardi")[0].childNodes[0].nodeValue;
       	bt["horairesOuvertureMercredi"] = markers[i].getElementsByTagName("horairesOuvertureMercredi")[0].childNodes[0].nodeValue;
       	bt["horairesOuvertureJeudi"] = markers[i].getElementsByTagName("horairesOuvertureJeudi")[0].childNodes[0].nodeValue;
       	bt["horairesOuvertureVendredi"] = markers[i].getElementsByTagName("horairesOuvertureVendredi")[0].childNodes[0].nodeValue;
       	bt["horairesOuvertureSamedi"] = markers[i].getElementsByTagName("horairesOuvertureSamedi")[0].childNodes[0].nodeValue;
       	bt["horairesOuvertureDimanche"] = markers[i].getElementsByTagName("horairesOuvertureDimanche")[0].childNodes[0].nodeValue;
       	bt["identifiantChronopostPointA2PAS"] = markers[i].getElementsByTagName("identifiantChronopostPointA2PAS")[0].childNodes[0].nodeValue;

       	bt["rtype"] = "chronorelais" ;
		bt["icnname"] = "ac" ;
  
   		bt_list.push(bt) ;
     	
     } // end of for
}

/**
 *	Fonction qui cree un marker sur la map. Cette fonction doit Ã?Â?Ã?Âªtre appelee lorsque la liste des points chronopost a ete creee par parseRechercheBT(...).
 *	Chaque point chronopost est geocode à  partir de son adresse (process asynchrone), la fonction de callback du geocodage cree le marker et rappelle cette fonction si il reste encore des points chronopost à  creer. 
 */
function btMarkersThread()
{
	if (next_bt < bt_list.length)
	{
		var address = bt_list[next_bt]["adresse1"] + " " + bt_list[next_bt]["codePostal"] + " " + bt_list[next_bt]["localite"] ;
		
		if ( geocoder != null )
		{
			geocoder.getLatLng(address, _btMarkersThread_handler ) ;
		}
	}
}

/**
 *	Handler du geocodage d'un point chronopost.
 *	Cree un marker à  la position transmise en parametre puis rappelle la fonction btMarkersThread() si il reste des points chronopost à  traiter.
 *	@param posn Position du marker
 */
function _btMarkersThread_handler(posn)
{
	var marker = null;
	
	if ( posn )
	{
		if ( next_bt == 0 )
		{	// on traite le premier element, on initialise
			// les var de travail pour la zone avec ces valeurs
			min_lat = posn.lat() ;
			max_lat = posn.lat() ;
			min_lng = posn.lng() ;
			max_lng = posn.lng() ;
		}
		else
		{
			if ( posn.lat() > max_lat )
				max_lat = posn.lat() ;
			
			if ( posn.lat() < min_lat )
				min_lat = posn.lat() ;
			
			if ( posn.lng() > max_lng )
				max_lng = posn.lng() ;
			
			if ( posn.lng() < min_lng )
				min_lng = posn.lng() ;
		}
		
		// on met a jour l'objet bt avec ses coordonnees
		bt_list[next_bt]["lat"] =  posn.lat() ;
		bt_list[next_bt]["lng"] =  posn.lng() ;

		// on cree le marker et on l'ajoute à  la map		
		marker = createMarkerWithArray(posn, bt_list[next_bt]) ;

		mgr.addMarker(marker,0,17);
		
		allmarkers[next_bt] = marker ;
        			  
        mgr.refresh();

	}
	
	// on incremente l'index du prochain bt a geoencoder
	next_bt++ ;
	
	// on geocode au besoin
	if ( next_bt < bt_list.length)
	{
		btMarkersThread() ;
	}
	else
	{
		/**
			Update the view finally after all loading...
		*/
		if (query["request"] != "print")
		{
			fillResultsInfo(query) ;
			
			if (query["request"] != "mail")
			{
				fillFormWithValues(query) ;
			}
		}
		else
		{
			if (is_print_direction == false)
			{
				// Impression d'un point
				fillPrintAddress() ;
				fillPrintTime() ;
			}
			else
			{
				// impression d'un itineraire
				// le remplissage du formulaire se fait apres le chargement
				// des directions sur la map dans le handler:
				// _directionsLoadHandler ;
			}
		}
		
		// on a charge tous les markers ont peut centrer la map et definir le niveau de zoom
		var bounds = new GLatLngBounds; 
		bounds.extend(new GLatLng(min_lat, min_lng)); 
		bounds.extend(new GLatLng(max_lat, max_lng)) ;
		map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
		
		map.savePosition()
		
		if (bt_list.length == 1)
		{
			getActionsForm(posn, 0) ;
		}
		
        if (om) om.Clear(); // Clear the loading message
	}
	
}

/**
 *	Appel au service web SOAP : rechercheBtParIdChronopostA2Pas
 *	@param id Identifiant du bureau de tabac
 */
function chronorelaisById(id)
{
	var pl = new SOAPClientParameters();	
	
	pl.add("idChronopostA2Pas", id) ;

	SOAPClient.invoke(rechercheBT_wsdl, "rechercheBtParIdChronopostA2Pas", pl, true, _callback_chronorelaisById);
}

/**
 *	Callback du service web SOAP rechercheBtParIdChronopostA2Pas
 *	@param r
 *	@param soapResponse
 */
function _callback_chronorelaisById(r, soapResponse)
{
	// IE
    if(soapResponse.xml)
    {
        parseRechercheBT(soapResponse.xml) ;
    }
    else
    {    // MOZ
        parseRechercheBT((new XMLSerializer()).serializeToString(soapResponse)) ;
    }
    
    if ( bt_list.length > 0)
 	{
 		// on lance le processus qui va placer les markers un Ã  un sur la map.
    	btMarkersThread() ;
    }
    else
    {
    	resultNotFound() ;
    }
}

/**
 *	Appel au service web SOAP : rechercheBtParCodeproduitEtCodepostalEtDate
 *	@param id Identifiant du bureau de tabac
 */
function chronorelaisByCodePostal(cp)
{
	var pl = new SOAPClientParameters();
	var d = new Date() ;
	
	pl.add("codeproduit", "") ;
	pl.add("codePostal", cp) ;
	pl.add("date", d) ;

	SOAPClient.invoke(rechercheBT_wsdl, "rechercheBtParCodeproduitEtCodepostalEtDate", pl, true, _callback_chronorelaisByCodePostal);
}

/**
 *	Callback du service web SOAP rechercheBtParCodeproduitEtCodepostalEtDate
 *	@param r
 *	@param soapResponse
 */
function _callback_chronorelaisByCodePostal(r, soapResponse)
{
	// IE
    if(soapResponse.xml)
    {
        parseRechercheBT(soapResponse.xml) ;
    }
    else
    {    // MOZ
        parseRechercheBT((new XMLSerializer()).serializeToString(soapResponse)) ;
    }
    
    if ( bt_list.length > 0)
 	{
 		// on lance le processus qui va placer les markers un à  un sur la map.
    	btMarkersThread() ;
    }
    else
    {
    	resultNotFound() ;
    }
}

function resultNotFound()
{
	if (om)
	{
		var oDiv = document.getElementById('sw-searchForm');
	  	var oLink = document.getElementById('sw-form-navig-link');
	  	var odivToShow = document.getElementById('sw-results-display');
		
		fillFormWithValues(query) ;
		
	  	removeClassName(oDiv,'sw-hidden');
	  	addClassName(oDiv,'sw-visible');
	  	removeClassName(odivToShow,'sw-visible');
	  	addClassName(odivToShow,'sw-hidden');
	
		om.Set("<b>"+notFoundMsg+"</b>") ;
		shwmsg(notFoundMsg, "sw-form-error") ;
	}
}

function mapInfoMessage(msg)
{
	if (om)
	{
		var oDiv = document.getElementById('sw-searchForm');
	  	var oLink = document.getElementById('sw-form-navig-link');
	  	var odivToShow = document.getElementById('sw-results-display');
		
		fillFormWithValues(query) ;
		
	  	removeClassName(oDiv,'sw-hidden');
	  	addClassName(oDiv,'sw-visible');
	  	removeClassName(odivToShow,'sw-visible');
	  	addClassName(odivToShow,'sw-hidden');
	
		om.Set("<b>"+msg+"</b>") ;
		shwmsg(msg, "sw-form-error") ;
	}
}

function displayUserInfoPanel(msg)
{
	shwmsg(msg, "sw-form-error") ;
}

function isValidSearchForm()
{
	var rs = true ;
	var cp = document.getElementById('sw-form-cp').value ;
	
	/* conversion en entier... Si conversion impossible renvoie : NaN */
	/* cp = parseInt(cp) ; */
	
	var type_point = document.getElementById('sw-form-type-point').value ;
	var error = "" ;
	
	if ( type_point == "Choisissez" )
	{
		error = error + "Vous devez choisir un type de point." ;
		rs = false ;
	}
	
	if ( !cp || cp.length < 2 )
	{
		if (error != "")
			error += "<br />" ;
		
		error = error + "Vous devez renseigner un code postal." ;
		rs = false ;
	}
	
	if (rs == false)
		shwmsg(error, "sw-form-error") ;
	
	return rs ;
}

/*--------------------------------------------------------
					HTML VUES FONCTIONS
*/

/**
 *	Pre-rempli le formulaire de recherche selon les parametres de la query transmise en parametre.
 *	@param query Parametre de la requÃ?Â?Ã?Âªte url sous la forme d'un tableau associatif (cle/valeur).
 */
function fillFormWithValues(query)
{
	document.getElementById("sw-form-adresse").value = (query["sw-form-adresse"] != "undefined" ? UTF8Decode(query["sw-form-adresse"]).replace(/\+/g,' ')  : "")  ;
	document.getElementById('sw-form-ville').value = (query["sw-form-ville"] != "undefined" ? UTF8Decode(query["sw-form-ville"]).replace(/\+/g,' ')  : "")  ;
	document.getElementById('sw-form-cp').value = (query["sw-form-cp"] != "undefined" ? UTF8Decode(query["sw-form-cp"]) : "")  ;
	
	var sel = document.getElementById("sw-form-type-point");
	for(i=0; i<sel.length; i++) {
		if(sel.options[i].value==query["sw-form-type-point"]) sel.options[i].selected=true;
	}
	
}

/**
 *	Pre-rempli le bloc d'information de la recherche effectuee.
 *	@param query Parametre de la requete url sous la forme d'un tableau associatif (cle/valeur).
 */
function fillResultsInfo(query)
{
	if (query["request"] == "mail")
	{
		var obj = bt_list[0] ;
		var elementDiv = document.getElementById("sw-search-results-info") ;
		var address = (obj != null ? obj["adresse1"] : "" ) ;
		var cp = (obj != null ? obj["codePostal"] : "" ) ;
		var localite = (obj != null ? obj["localite"] : "" ) ;
		var pays = "" ;
		
		var rs = '<dl>'
				+ '<dt>'+typePoint()+'</dt>'
				+ '<dd class="sw-dl_ttre"><strong>&Agrave; l&#8217;adresse :</strong></dd>'
				+ '<dd class="sw-def1 sw-def">'+address+'</dd>'
				+ '<dd class="sw-def2 sw-def">'+cp+(localite!=""? ", "+localite: "")+'</dd>'
				+ '</dl>' ;
				
		elementDiv.innerHTML = rs ;
	}
	else
	{
		var elementDiv = document.getElementById("sw-search-results-info") ;
		var address = (query["sw-form-adresse"] != "undefined" ? query["sw-form-adresse"] : "" ) ;
		var cp = (query["sw-form-cp"] != "undefined" ? query["sw-form-cp"] : "" ) ;
		var localite = (query["sw-form-ville"] != "undefined" ? query["sw-form-ville"] : "" ) ;
//		var pays = (typeof(query["sw-form-pays"]) != "undefined" ? query["sw-form-pays"] : "" ) ; 
		
		var rs = '<dl>'
				+ '<dt>'+typePoint()+'</dt>'
				+ '<dd class="sw-dl_ttre"><strong>&Agrave; proximit&eacute; de l\'adresse :</strong></dd>'
				+ '<dd class="sw-def1 sw-def">'+UTF8Decode(address).replace(/\+/g,' ') +'</dd>'
				+ '<dd class="sw-def2 sw-def">'+cp+(localite!=""? ", "+UTF8Decode(localite).replace(/\+/g,' ') : "")+'</dd>'
				+ '</dl>' ;
				
		elementDiv.innerHTML = rs ;
		
		if (isDifferentGeocodingAddress == true)
		{
			fillGoogleResult() ;
		}
	}
}

function fillFromInfo()
{
	var elementDiv = document.getElementById("itineraire-from-info") ;
	var rs = '<dl>'
			 + '<dt>D&eacute;part</dt>' 
			 //+ '<dd class="sw-def1 sw-def">'+document.getElementById("saddr").value.toUpperCase()+'</dd>'
			 + '<dd class="sw-def1 sw-def">'+from_print_addr.toUpperCase()+'</dd>'
			 + '<dd class="sw-def2 sw-def"></dd>'
			 + '<dd class="sw-def3 sw-def"></dd>'
			 + '</dl>' ;

	elementDiv.innerHTML = rs ;
}

function fillToInfo()
{
	var elementDiv = document.getElementById("itineraire-to-info") ;
	var rs = '<dl>'
			 + '<dt>Arriv&eacute;e</dt>' 
			 //+ '<dd class="sw-def1 sw-def">'+document.getElementById("daddr").value.toUpperCase()+'</dd>'
			 + '<dd class="sw-def1 sw-def">'+to_print_addr.toUpperCase()+'</dd>'
			 + '<dd class="sw-def2 sw-def"></dd>'
			 + '<dd class="sw-def3 sw-def"></dd>'
			 + '</dl>' ;

	elementDiv.innerHTML = rs ;
}

function fillDistInfo()
{
	var elementDiv = document.getElementById("itineraire-dist-info") ;
	var rs = '<dl>'
			 + '<dt>Distance</dt>' 
			 + '<dd class="sw-def1 sw-def">'+gdir.getDistance().html+', '+gdir.getDuration().html+'</dd>'
			 + '<dd class="sw-def2 sw-def"></dd>'
			 + '<dd class="sw-def3 sw-def"></dd>'
			 + '</dl>' ;

	elementDiv.innerHTML = rs ;
}

function fillGoogleResult()
{
	//var elementDiv = document.getElementById("google-geocoding-result") ;
	var elementDiv = document.getElementById("sw-search-results-info") ;
	
	var rs = '<dl>'
			 + '<dt>&Agrave; proximit&eacute; de l\'adresse :</dt>' 
			 + '<dd class="sw-def1 sw-def">'+google_rs["streetLine"]+'</dd>'
			 + '<dd class="sw-def2 sw-def">'+google_rs["zip"]+', '+google_rs["city"]+'</dd>'
			 + '<dd class="sw-def3 sw-def">'+google_rs["state"]+'</dd>'
			 + '</dl>' ;

	elementDiv.innerHTML = rs ;
}

function fillPrintAddress()
{
	var elementDiv = document.getElementById("div-adresse");
	var rs = '<dl>'
	+ '<dt>'+bt_list[0]["nomEnseigne"]+'</dt>'
	+ '<dd class="sw-def1-1 sw-def">'+parseAdresse(bt_list[0])+'</dd>'
	+ '<dd class="sw-def2 sw-def">'+bt_list[0]["codePostal"]+', '+bt_list[0]["localite"]+'</dd>'
	+ '</dl>' 
	elementDiv.innerHTML = rs ;
}

function fillPrintTime()
{
	var elementDiv = document.getElementById("div-horaires");
			
	var rs = getHorairesTab(bt_list[0], false) ;

	elementDiv.innerHTML = rs ;
}

function fillPrintDirections()
{
	var elementDiv = document.getElementById("sw-print-itineraire") ;
	
	var rs = '<h2>Itineraire </h2>'
		+'	<div class="sw-boxLeft clearfix">'
		+'		<div class="sw-col sw-col1">'
		+'			<div id="itineraire-from-info" class="sw-content">'
		+'				<dl>'
		+'					<dt>Départ</dt>'
		+'					<dd class="sw-def1">'+from_print_addr+'</dd>'
		+'				</dl>'
		+'			</div>'
		+'		</div>'
		+'		<div class="sw-col sw-col2">'
		+'			<div id="itineraire-to-info" class="sw-content">'
		+'				<dl>'
		+'					<dt>Arrivée</dt>'
		+'					<dd class="sw-def1">'+to_print_addr+'</dd>'
		+'				</dl>'
		+'			</div>'
		+'		</div>'
		+'		<div class="sw-col sw-col3">'
		+'			<div id="itineraire-dist-info" class="sw-content">'
		+'				<dl>'
		+'					<dt>Distance</dt>'
		+'					<dd>'+gdir.getDistance().html+'</dd>'
		+'					<dd>'+gdir.getDuration().html+'</dd>'
		+'				</dl>'
		+'			</div>'
		+'		</div>'
		+'	</div>';

	elementDiv.innerHTML = rs ;
}

/*--------------------------------------------------------
				  AJAX SEND BY MAIL
*/

function ajaxSendByMail()
{
	var xhr ;
	var receiver = document.getElementById("receiver").value ;
	var msg = document.getElementById("msg").value ;
	
	if (window.XMLHttpRequest) 
	{
	  //Firefox ou IE >= 7.0
	  xhr = new XMLHttpRequest();
	}
	else if (window.ActiveXObject) 
	{
	  try 
	  { // essaie de charger l'objet pour IE
	    xhr = new ActiveXObject("Msxml2.XMLHTTP");
	  } 
	  catch (e) 
	  {
	     try 
	     { // essaie de charger l'objet pour une autre version IE
	        xhr = new ActiveXObject("Microsoft.XMLHTTP");
	     } 
	     catch (e) 
	     {
	        shwmsg("Votre navigateur ne prend pas en charge l'objet XMLHTTPRequest.", "sw-form-error") ;
	     }
	  } 
	}

	var filename = baseURL+"sendMail.php" ;

	var data = "receiver=" + receiver ;
	data += "&msg=" + msg ;
	data += "&nomEnseigne=" + document.getElementById("nomEnseigne").value ;
	data += "&localite=" + document.getElementById("localite").value ;
	data += "&id=" + document.getElementById("id").value ;
	data += "&type=" + document.getElementById("type").value ;
	data += "&src_page=" + document.getElementById("src_page").value ;
	data += "&baseURL=" + document.getElementById("baseURL").value ;
	data += "&queryString=" + document.getElementById("queryString").value ;
		
	xhr.open("POST", filename, true);
	
	xhr.onreadystatechange = function() {
	
	   if(xhr.readyState == 4) { 
	      var resp = xhr.responseText ;

	      if(resp == "success")
	      { 
	      	removeClassName(document.getElementById("sw-form-mail-error"),'sw-visible');
			addClassName(document.getElementById("sw-form-mail-error"),'sw-hidden');
			// mail envoyé
			shwmsg("Votre message a &eacute;t&eacute; envoy&eacute; avec succ&egrave;s.", "sw-form-mail-success", false) ;
			
			var form = document.getElementById("sw-form-sendbymail") ;
			
			if (form) {
				form.reset() ;
				 form.style.display = "none" ;
			}

	      }
	      else
	      {
	      	removeClassName(document.getElementById("sw-form-mail-success"),'sw-visible');
			addClassName(document.getElementById("sw-form-mail-success"),'sw-hidden');
	      	// error
	      	shwmsg( resp, "sw-form-mail-error") ;
	      } 
	   }
	} 

 	xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xhr.send(data) ;
	
	
	return false ;
}

/*--------------------------------------------------------
					URL FONCTIONS
*/

function btQueryString(anArray, needEscape)
{
	var rs = "" ;

     for (key in anArray)
    {
    	if (needEscape == true)
    	{
    		if (rs != "")
    			rs += "&"
    		rs += key +"=" + escape(anArray[key]) ;
    	}
    	else
    	{
    		if (rs != "")
    			rs += "_-_"
    	    rs += key +"=" + anArray[key] ;
    	}
    }	
	
	return rs ;
}

// http://snipplr.com/view/799/get-url-variables/
function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
 
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = unescape(hash[1]) ;
    }
    return vars;
}

function getUrl()
{
	return window.location.href ;
}

function UTF8Decode(utftext)
{
    var string = "";
    if (utftext)
    {
	    var i = 0;
	    var c = c1 = c2 = 0;
	
	    while ( i < utftext.length )
	    {
	        c = utftext.charCodeAt(i);
	
	        if (c < 128)
	        {
	            string += String.fromCharCode(c);
	            i++;
	        }
	        else if((c > 191) && (c < 224))
	        {
	            c2 = utftext.charCodeAt(i+1);
	            string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
	            i += 2;
	        }
	        else
	        {
	            c2 = utftext.charCodeAt(i+1);
	            c3 = utftext.charCodeAt(i+2);
	            string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
	            i += 3;
	        }
	
		}
	}
    return string;
}
/*---------------------------------------------------------
							Main
*/
function _main()
{
	query = getUrlVars() ;

	if (query["request"] == "mail")
	{
		// from mail
		if ( query["sw-form-type-point"] == "opt_chrlas" )
		{	
			chronorelaisById(query["id"]) ;
		}
		else
		{
			var reg = new RegExp("\\+", "g") ;
			
			// Impression d'un point agence
			var bt = [] ;
     	
	     	bt["adresse1"] = UTF8Decode(query["adresse1"]).replace(reg, " ") ;
	     	bt["adresse2"] = UTF8Decode(query["adresse2"]).replace(reg, " ")  ;
	     	bt["adresse3"] = UTF8Decode(query["adresse3"]).replace(reg, " ")  ;
	     		
	       	bt["codePostal"] = UTF8Decode(query["codePostal"]).replace(reg, " ")  ;
	       	bt["localite"] = UTF8Decode(query["localite"]).replace(reg, " ")  ;
	       	bt["nomEnseigne"] =	UTF8Decode(query["nomEnseigne"]).replace(reg, " ")  ;

			bt["hor1"] = UTF8Decode(query["hor1"]).replace(reg, " ")  ;
		    bt["hor2"] = UTF8Decode(query["hor2"]).replace(reg, " ")  ;
		    bt["hor3"] = UTF8Decode(query["hor3"]).replace(reg, " ")  ;
		    bt["hor4"] = UTF8Decode(query["hor4"]).replace(reg, " ")  ;
		    
		    bt["tel"] = UTF8Decode(query["tel"]).replace(reg, " ")  ;
			bt["fax"] = UTF8Decode(query["fax"]).replace(reg, " ")  ;
	
	       	bt["rtype"] = query["rtype"] ;
			bt["icnname"] = query["icnname"] ;
			
	  
	   		bt_list.push(bt) ;
	   		
	   		btMarkersThread() ;
		}
	}
	else if (query["request"] == "print")
	{
		is_print_direction  = ( query["is_print_direction"] == "true" ) ? true :  false ;
			
		from_print_addr = unescape(query["from_addr"]) ;
		to_print_addr = unescape(query["to_addr"]) ;
		
		
		if (is_print_direction == true)
		{
			// Hide elements when print
			var el = document.getElementById("sw-pGmap") ;
			if (el) el.style.display = "none" ;
			
			// Impression d'un itineraire
			if ( from_print_addr != "" && to_print_addr != "" )
		   	{
		    	gdir.load("from: " + from_print_addr + " to: " + to_print_addr,	{ "locale": "fr" }) ;
		        
		        // Impression d'un point
				getPointPrintInfor()
		   		fillPrintAddress() ;
		   		fillPrintTime() ;
			}
			else
			{
				// TODO: alert param invalid
			}
		}
		else
		{
			//print direction =false
			
			// Hide elements when print
     		var el2 = document.getElementById("sw-print-itineraire") ;
			if (el2) el2.style.display = "none" ;
			getPointPrintInfor();
			var address = query["adresse1"] + " " + query["codePostal"] + " " + query["localite"];
			if ( geocoder != null )
				geocoder.getLatLng(address, correct_modification_latlng );
		}
		
	}
	else if (query["sw-form-type-point"]) 
	{	
		fillResultsInfo(query) ;
		
		if ( query["sw-form-type-point"] == "opt_chrlas" )
		{
			// recherche des bt
			chronorelaisByCodePostal(query["sw-form-cp"]) ;
		}
		
		if ( query["sw-form-type-point"] == "opt_ag_chpst" )
		{
			// Geocoding du point de recherche
			var adr = (query["sw-form-adresse"] != "undefined" ? query["sw-form-adresse"] : "")  ;
			var cp = (query["sw-form-cp"] != "undefined" ? query["sw-form-cp"] : "") ;
			var ville = (query["sw-form-ville"] != "undefined" ? query["sw-form-ville"] : "") ;
			var pays = (typeof(query["sw-form-pays"]) != "undefined" ? query["sw-form-pays"] : "") ;
			var address =adr + " " + cp +" " + ville + " " + pays ;

			searchPointGeocoding(UTF8Decode(address)) ;
		}
	}
	else
	{
		resultNotFound() ;
	}
}

function correct_modification_latlng(posn) {
 	_btMarkersThread_handler(new GLatLng(query["lat"],query["lng"]));
}


function getPointPrintInfor()	{
	var bt = [] ;
	     	
		     	bt["adresse1"] = query["adresse1"] ;
		     	bt["adresse2"] = query["adresse2"] ;
		     	bt["adresse3"] = query["adresse3"] ;
		     		
		       	bt["codePostal"] = query["codePostal"] ;
		       	bt["localite"] = query["localite"] ;
		       	bt["nomEnseigne"] =	query["nomEnseigne"] ;
		       	
		       	if (query["sw-form-type-point"] == "opt_chrlas")
		       	{
			       	bt["horairesOuvertureLundi"] = query["horairesOuvertureLundi"] ;
			       	bt["horairesOuvertureMardi"] = query["horairesOuvertureMardi"] ;
			       	bt["horairesOuvertureMercredi"] = query["horairesOuvertureMercredi"] ;
			       	bt["horairesOuvertureJeudi"] = query["horairesOuvertureJeudi"] ;
			       	bt["horairesOuvertureVendredi"] = query["horairesOuvertureVendredi"] ;
			       	bt["horairesOuvertureSamedi"] = query["horairesOuvertureSamedi"] ;
			       	bt["horairesOuvertureDimanche"] = query["horairesOuvertureDimanche"] ;
			       	bt["identifiantChronopostPointA2PAS"] = query["identifiantChronopostPointA2PAS"] ;
			    }
			    else
			    {
			    	bt["hor1"] = query["hor1"] ;
			       	bt["hor2"] = query["hor2"] ;
			       	bt["hor3"] = query["hor3"] ;
			       	bt["hor4"] = query["hor4"] ;
			       	
			       	bt["tel"] = query["tel"] ;
			       	bt["fax"] = query["fax"] ;
			    }
		
		       	bt["rtype"] = query["rtype"] ;
				bt["icnname"] = query["icnname"] ;
		  
		   		bt_list.push(bt) ;
	return bt;
}

function searchPointGeocoding(address)
{	
	geocoder.getLocations(address, _searchPointGeocoding_handler ) ;
}

function parseresponse(response) {

	google_rs["country"] = ""; 
	google_rs["state"] = ""; 
	google_rs["city"] = ""; 
	google_rs["country_name"] = ""; 
	google_rs["streetLine"] = "";
	google_rs["zip"] = "";
	
	place = response.Placemark[0];
	google_rs["accuracy"] = place.AddressDetails.Accuracy;
	google_rs["address"] = place.address;
	posn = new  GLatLng (place.Point.coordinates[1],place.Point.coordinates[0]);

	if ( place.AddressDetails && place.AddressDetails.Country ) { 
		google_rs["country"] = place.AddressDetails.Country.CountryNameCode; 
		if ( place.AddressDetails.Country.AdministrativeArea ) { 
	       google_rs["state"] = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName; 
	       if ( place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea ){
	           google_rs["country_name"] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName; 
	           if ( place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality) { 
	               google_rs["city"] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName; 	               	  
		              
	               if ( place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality) {
		              
		               if ( place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare) { 
		                       
		                       google_rs["streetLine"] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare.ThoroughfareName;
		                       
		                       // on supprime la virgule de l'adresse
		                       var reg=new RegExp(",", "g");
		                       google_rs["streetLine"] = google_rs["streetLine"].replace(reg, "");
		                        
		               }
		               if ( place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.PostalCode) { 
		                       google_rs["zip"] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.PostalCode.PostalCodeNumber; 
		               }
		           }
		         if ( place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare) { 
		                       
	                     google_rs["streetLine"] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
	                     
	                     // on supprime la virgule de l'adresse
	                     var reg=new RegExp(",", "g");
	                     google_rs["streetLine"] = google_rs["streetLine"].replace(reg, "");
	                      
	             }
	             if ( place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode) { 
	                     google_rs["zip"] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber; 
	             }
	           } 
	       } 
		} 
	}

	return !( ( UTF8Decode(query["sw-form-adresse"].toLowerCase().replace(/\+/g,' ')) == google_rs["streetLine"].toLowerCase() )
				&& ( UTF8Decode(query["sw-form-ville"].toLowerCase().replace(/\+/g,' ')) == google_rs["city"].toLowerCase() )
				&& ( query["sw-form-cp"].toLowerCase() == google_rs["zip"].toLowerCase() )
			);

}

//Recherche des Agences chronopost
function _searchPointGeocoding_handler(response)
{
	if ( typeof(response.Placemark) != "undefined" 
		&& response.Placemark.length > 0)
	{

		isDifferentGeocodingAddress = parseresponse(response) ;

		place = response.Placemark[0];
		accuracy = place.AddressDetails.Accuracy;

//		alert(place.AddressDetails.Country) ;
		if (!place.AddressDetails.Country)
		{
			resultNotFound() ;
		}
		else
		{
			if (place.AddressDetails.Country.CountryNameCode != "FR")
			{
				// ALERT:
				// Désolé ce service n'est disponible que pour la France métropolitaine pour l'instant.
				var msg = "D&eacute;sol&eacute; ce service n'est disponible que pour la France m&eacute;tropolitaine pour l'instant."
				
				mapInfoMessage(msg) ;
			}
			else
			{
				posn = new  GLatLng (place.Point.coordinates[1],place.Point.coordinates[0]);
	
				if (posn == null)
				{
					resultNotFound() ;
				}
				else
				{
					// recherche des agences via le wec service
					GDownloadUrl(json_ws_path, function (doc) {
			
						var ag_list = eval('(' + doc + ')') ;
						var s = "" ;
						// alert(ag_list.length) ;
						
						for (var i=0; i < ag_list.length; i++)
						{
							var obj = ag_list[i] ;
							
							// status 602 = adresse invalide
							if (obj.status != "602")
							{
								
								var latLng = new GLatLng(obj.lat, obj.long) ;
								var dist = latLng.distanceFrom(posn) ;		
			
								if (current_ag_index < max_bt
									|| dist < current_ag_max_dist)
								{
									var bt = [] ;
			     					bt["adresse1"] = UTF8Decode(obj.adresse) ;
			     					bt["adresse2"] = "undefined" ;
			     					bt["adresse3"] =  "undefined" ;
			     		
			       					bt["codePostal"] = obj.cp ;
			       					bt["localite"] = UTF8Decode(obj.ville) ;
			       					bt["nomEnseigne"] = UTF8Decode(obj.agence) ;
							       	bt["hor1"] = UTF8Decode(obj.hor1) ;
							       	bt["hor2"] = UTF8Decode(obj.hor2) ;
							       	bt["hor3"] = UTF8Decode(obj.hor3) ;
							       	bt["hor4"] = UTF8Decode(obj.hor4) ;
									
									bt["tel"] = obj.tel ;
									bt["fax"] = obj.fax ;
			       					
			       					bt["rtype"] = "agence" ;
									bt["icnname"] = "cr" ;
									
									bt["lat"] = obj.lat ;
									bt["lng"] = obj.long ;
									bt["dist"] = dist ;
			  						
			  						insert_nearest_ag(bt) ;
			  						
			  						var index = bt_list.length ;
			  						if (index > 0)
			  							index--;
			  						// mis a jour de la distance max des points trouves
			  						current_ag_max_dist = bt_list[index]["dist"] ;
			  						current_ag_index = bt_list.length ;
								}
							}
						} // end for - get 5 nearest agences
						
						for (var j=0; j < bt_list.length; j++)
						{
			
							s += bt_list[j]["dist"] +  "\n" ;
			
							next_bt = j ;
			
							var loc = new GLatLng(bt_list[j]["lat"], bt_list[j]["lng"]) ;
							
							// on definit, au passage la zone de la map a afficher
							if ( j == 0 )
							{	// on traite le premier element, on initialise
								// les var de travail pour la zone avec ces valeurs
								min_lat = loc.lat() ;
								max_lat = loc.lat() ;
								min_lng = loc.lng() ;
								max_lng = loc.lng() ;
							}
							else
							{
								if ( loc.lat() > max_lat )
									max_lat = loc.lat() ;
								
								if ( loc.lat() < min_lat )
									min_lat = loc.lat() ;
								
								if ( loc.lng() > max_lng )
									max_lng = loc.lng() ;
								
								if ( loc.lng() < min_lng )
									min_lng = loc.lng() ;
							}
			
							// on cree le marker et on l'ajoute à  la map		
							var marker = createMarkerWithArray(loc, bt_list[j]) ;
							mgr.addMarker(marker,0,17);
						
							allmarkers[j] = marker ;
				        			  
				        	mgr.refresh();
				        
				        	if (om)
				        		om.Clear(); // Clear the loading message
				        
						} // end for
			
						/**
							finalement on arrange la map et les info
						*/
						if (query["request"] != "print")
						{
							// TODO: 
							fillResultsInfo(query) ;
							fillFormWithValues(query) ;
						}
						else
						{
							if (is_print_direction == false)
							{
								// TODO: 
								// Impression d'un point
								//fillPrintAddress() ;
								//fillPrintTime() ;
							}
							else
							{
								// impression d'un itineraire
								// le remplissage du formulaire se fait apres le chargement
								// des directions sur la map dans le handler:
								// _directionsLoadHandler ;
							}
						}
						
						// on a charge tous les markers ont peut centrer la map et definir le niveau de zoom
						var bounds = new GLatLngBounds; 
						bounds.extend(new GLatLng(min_lat, min_lng)); 
						bounds.extend(new GLatLng(max_lat, max_lng)) ;
						map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
						
						map.savePosition()
						
						if (bt_list.length == 1)
						{
							getActionsForm(loc, 0) ;
						}
						
					});
				}
			}
		}
	}
	else
	{
	
		resultNotFound() ;
	}
}

function loadAllAgence()
{
	// recherche des agences via le wec service
	GDownloadUrl(json_ws_path, function (doc) {
	
		var ag_list = eval('(' + doc + ')') ;
		var s = "" ;
		// alert(ag_list.length) ;
		
		for (var i=0; i < ag_list.length; i++)
		{
			var obj = ag_list[i] ;
			
			// status 602 = adresse invalide
			if (obj.status != "602")
			{
				var bt = [] ;
				bt["adresse1"] = UTF8Decode(obj.adresse) ;
				bt["adresse2"] = "undefined" ;
				bt["adresse3"] =  "undefined" ;
	
				bt["codePostal"] = obj.cp ;
				bt["localite"] = UTF8Decode(obj.ville) ;
				bt["nomEnseigne"] = UTF8Decode(obj.agence) ;
		       	bt["hor1"] = UTF8Decode(obj.hor1) ;
		       	bt["hor2"] = UTF8Decode(obj.hor2) ;
		       	bt["hor3"] = UTF8Decode(obj.hor3) ;
		       	bt["hor4"] = UTF8Decode(obj.hor4) ;
				
				bt["tel"] = obj.tel ;
				bt["fax"] = obj.fax ;
     					
     			bt["rtype"] = "agence" ;
				bt["icnname"] = "cr" ;
				
				bt["lat"] = obj.lat ;
				bt["lng"] = obj.long ;
//				bt["dist"] = dist ;
						
				bt_list.push(bt) ;
			}
		} // end for - get 5 nearest agences
		
		for (var j=0; j < bt_list.length; j++)
		{
	
			next_bt = j ;
	
			var loc = new GLatLng(bt_list[j]["lat"], bt_list[j]["lng"]) ;
			
			// on definit, au passage la zone de la map a afficher
			if ( j == 0 )
			{	// on traite le premier element, on initialise
				// les var de travail pour la zone avec ces valeurs
				min_lat = loc.lat() ;
				max_lat = loc.lat() ;
				min_lng = loc.lng() ;
				max_lng = loc.lng() ;
			}
			else
			{
				if ( loc.lat() > max_lat )
					max_lat = loc.lat() ;
				
				if ( loc.lat() < min_lat )
					min_lat = loc.lat() ;
				
				if ( loc.lng() > max_lng )
					max_lng = loc.lng() ;
				
				if ( loc.lng() < min_lng )
					min_lng = loc.lng() ;
			}
	
			// on cree le marker et on l'ajoute à  la map		
			var marker = createMarkerWithArray(loc, bt_list[j]) ;
			mgr.addMarker(marker,0,17);
		
			allmarkers[j] = marker ;
	       			  
	       	mgr.refresh();
	       
	       	if (om)
	       		om.Clear(); // Clear the loading message
	       
		} // end for
		
		// on a charge tous les markers ont peut centrer la map et definir le niveau de zoom
		var bounds = new GLatLngBounds; 
		bounds.extend(new GLatLng(min_lat, min_lng)); 
		bounds.extend(new GLatLng(max_lat, max_lng)) ;
		map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
		
		map.savePosition() ;
		
	});
}

function insert_nearest_ag(ag)
{
	var i = bt_list.length ;
	
	if (i == 0)
	{
		// premier element insere
		bt_list[0] = ag ;	
	}
	else
	{
		if (i == max_bt)
			i-- ;
		
		for (i; i>0; i--)
		{
			if ( i==0 )
			{	
				// on a atteint l'index 0, on traite donc l'agence la plus proche du point de recherche
				bt_list[i] = ag ;
				
				break ; // on peut desormais quitter la boucle
			}
			else
			{
				if ( ag["dist"] > bt_list[i-1]["dist"] )
				{					
					bt_list[i] = ag ;
					
					break ; // on peut quitter la boucle
				}
				else
				{
					// on effectue le decalage
					bt_list[i] = bt_list[i-1] ;
					bt_list[i-1] = ag ;
				}
			}
		}
	}
}

