/**
 * @author apellet
 */


/**
 * Un bug sous IE6, m'oblige à redéclarer cette variable ici une 2eme fois?
 */
var zoom_dep = 15;


var pan_control = null;


//Function appellée au chargement de la page pour créer le plan Google Maps
function loadMap ()
{
	/*Les coordonnées du centre de la carte au chargement*/						
	var map_center = new GLatLng (46.4378568950242, 2.4169921875);	

	//Création des icons en forme de cercle.
	createIconCircle ();
	createIconRegion ();
	//Création des icons des associations.
	//createIconAssoc ();
	createIconActeur ();
	createIconAdresse ();
	
	//Affectation de la taille du conteneur
	jQuery("#map").css("width", map_width);
	jQuery("#map").css("height", map_height);
	jQuery("#all_map").css("width", map_width);
	jQuery("#block_full_map").css("width", map_width);
	
	
	//Initailisation des Icons Cercle
	class_circle = new ClassCircle ({_arr:[
									{min:0,max:50,color:'#ffffff', ico:icon_circle[0]},
									{min:50,max:100,color:'#ffaaaa', ico:icon_circle[1]},
									{min:10,max:10000,color:'#ff5555', ico:icon_circle[2]}
								]} );
								
	//Creation de la carte
	map = new GMap2(document.getElementById("map"));		
	map.setCenter ( map_center, 6 );	
	map.enableScrollWheelZoom ();					
	//GEvent.addListener ( map, "load", function (){drawCircles();}   );
	
	
	//Création du gif ed chargement
	loading = new Loading ( {w:200,h:200} );
	loading.start ();
	
	//Ajout des controles
	//Type de carte
	jQuery('#maptypecontrol').gmap_type( {  
			map: map,  
			types: [0,1,2,3],
			type:1,
			f_size:10
		});
	
	//Bouton FullScreen
	/*jQuery('#mapfullscreen').gmap_fullscreen( {  
		map: map,  
		block_map: 'map',
		block_parent:'all_map'
		
	});*/
	
	//Barre de zoom
	jQuery('#mapzoomcontrol').gmap_zoom( {  
			map: map,
			b_center:true,
			size : 25,
			prefix_path:'',
			rep_img:prefix_php+'styles/controls/images/'
		});
	
	//Legende active
	//map.addControl ( new LegendControl(map, createJsonLegend ()  ) );
	//jQuery("#chk_legende").click();
	
	
	//Barre d'echelle
	map.addControl ( new GScaleControl()  );
	
	//Flèches de navigation
	pan_control = new PanControl ( map, prefix_php + "images/carto/" );
	map.addControl ( pan_control );
	//pan_control.updatePosition ();
	
	//alert(zoom_dep);
	
	//Initialisation des layers
	initLayerAssoc ();
	
	//Dessin des cercles
	drawCircles ();	
	
	//Initialisation des templates
	initTemplates ();
	
	
	//Mise en attente de données du clients
	//Chargement des listes du moteur de recherche
	loadListMission ();
	
	type_struct = -1;
	code_struct = -1;
}


/**
 * Méthode qui charge toutes les associations contenues dans le département 
 * @param {Object} dep Le numéro du département
 */
function loadActeurFromDep ( dep, erase, id_reg )
{
	removeAllMarqueursActeur();
	
	map.closeInfoWindow();
	var data = {dep:dep};
	var acteur_res = {};
	var cpt = 0;
	jQuery.ajax({
            type: "POST",
            url: prefix_php + "./php/__load_acteur_from_dep.php",
            data: data,
			dataType:'xml',
            success: function(xml)
			{
				jQuery(xml).find("annuaire_acteur").each ( function()
				{
					readXmlActeur ( this, acteur_res);
					cpt++;					
				});
				loading.stop();
				
				//Appel de la fonction de rendu
				
				if ( layer_reg != null )
				{
					drawActeur ( acteur_res, null/*layer_reg.get ( dep ).getLatLng()*/, erase );
				}
				else
				{
					drawActeur ( acteur_res, null, erase );
				}
				
				//Appel de la fonction de mise à jour de la liste des résultats
				drawListeResultatActeur ( acteur_res, cpt, erase );
				
				if ( layer_reg != null  )
				{					
						//layer_reg.remove(id_reg);
				}
            },
			error:function (XMLHttpRequest, textStatus, errorThrown)
			{
				alert(textStatus); 
			}
        });
		
}



/**
 * Méthode qui extrait les données issues du xml d'une recherche d'association 
 */
function readXmlActeur ( obj, acteur_res )
{
	
	
		
	var id = jQuery(obj).attr ('id');
	var lat = jQuery(obj).attr ('lat');
	var lng = jQuery(obj).attr ('lng');
	
	
	var struct_nom = parsefromXML(jQuery(obj).attr ('struct_nom'));
	var struct_adresse_1 = parsefromXML(jQuery(obj).attr ('struct_adresse_1'));
	var struct_adresse_2 = parsefromXML(jQuery(obj).attr ('struct_adresse_2'));
	var struct_code_postal = jQuery(obj).attr ('struct_code_postal');
	var struct_ville = parsefromXML(jQuery(obj).attr ('struct_ville'));
	var struct_telephone = jQuery(obj).attr ('struct_telephone');
	var struct_mail = jQuery(obj).attr ('struct_mail');
	var service_etat = parseInt(jQuery(obj).attr ('service_etat'));
	
	
	
	acteur_res[id] = {
						struct_nom:struct_nom,
						id:id,
						lat:lat,
						lng:lng, 
						struct_adresse_1:struct_adresse_1,
						struct_adresse_2:struct_adresse_2,
						struct_code_postal:struct_code_postal,
						struct_ville:struct_ville,
						struct_telephone:struct_telephone,
						struct_mail:struct_mail,
						service_etat:service_etat,
						statut:'ALL'
						};
						
					
}



/**
 * Cette methode permet d'instancier des objets Associations si ils n'existent pas déjà.
 * Ils seront ensuite désinés sur la carte.
 * @param {Object} obj_asso		La liste des associations récupérées depuis le serveur
 * @param {Object} center		L'endroit où l'on doit centrer la carte
 */
function drawActeur ( obj_acteur, center, erase )
{
	//console.log ( "erase : " + erase );
	loading.start();
	var cnt = 0;
	if ( map_acteur == null )
	{
		//initialisation de la collection des associations
		map_acteur = {};
	}
	if ( erase == true )
	{
		//Bien mettre en place cette fonction
		removeAllMarqueursActeur ();		
	}
	
	cur_bounds = new GLatLngBounds ();
	for ( var key in obj_acteur )
	{
		try
		{
			cnt++;
			var o = obj_acteur[key];
			var as = null;
			if ( map_acteur [key] == undefined )
			{
				as = new Acteur ( o );
				map_acteur [key] = as;
			}
			else
			{
				as = map_acteur[key];
				map.addOverlay ( map_layer_acteur[as.statut].get ( as.id ) );
			}
			
			cur_bounds.extend ( new GLatLng ( parseFloat(as.lat), parseFloat (as.lng) ) );
			
		}
		catch ( error )
		{
			console.log ( error );
		}
		
	}
	
	
	if ( cnt > 0 )
	{
		var z = map.getBoundsZoomLevel(cur_bounds);
		if ( cnt == 1 )
		{
			z = 8;
		}
		if  ( z > 14 )
		{
			z = 14;
		}
		map.setCenter ( cur_bounds.getCenter (), z );
	}
	else
	{
		initMapAgain ();
		alert("Votre recherche ne renvoie aucun acteur.");
		
		
	}
	loading.stop ();
}



/**
 * Retrouve toutes les associations dans un rayon de x kilomètres d'une adresse.
 */
function findActeurNearAdresse ()
{
	var adr = jQuery("#txt-adresse").val ();
	if ( adr == "" )
	{
		alert ( "Veuillez saisir votre adresse." );
		return false;
	}
	loading.stop();
	adr += " " + filtre_geocoder + " fr";
	
	//On invoque le géocodeur pour retrouver l'adresse
	if ( geocoder == null )
	{
		geocoder = new GClientGeocoder();	
	}
	geocoder.getLatLng ( adr, GEvent.callback ( this, this.callbackGeocodageActeur ) ) ;
}


/**
 * Fonction appellée lorsque le géocodeur a terminé son travail
 * Son objectif est d'envoyer une requête au serveur pour qu'il renvoi la liste des associations contenues dans le rayon.
 * La liste des résultats est envoyée à une fonction de rendu
 */
function callbackGeocodageActeur ( res )
{
	if ( res == null )
	{
		alert("L'adresse n'est pas valide ou se situe en dehors de l'emprise initiale.");
		removeAdresse ();
		if ( externeModule == 0 )
		{
			initMapAgain ();
		}
		else if ( externeModule == 1 )
		{
			if ( type_struct == 1 )
			{
				removeAdresse ();
				loadActeurFromDep ( jQuery('#moteur_recherche #list_dep').val(), true );
			}
			else if ( type_struct == 2 )
			{
				removeAdresse ();
				drawActeur ( asso_res_reg, null, true );
				drawListeResultatActeur ( asso_res_reg, cpt_asso_reg, true );
			}
		}
		return false;
	}
	
	//Création et ajout du marqueur adresse.
	removeAdresse ();
	m_adresse = new GMarker ( res, {icon:icon_adresse, title:'l\'adresse que vous avez choisi.'} );
	map.addOverlay ( m_adresse );
	
	//Création de la requête spatiale
	rayon = parseInt(jQuery("#km_rayon").val());
	var r = virtualRectangle ( res, rayon );
	
	var query = " WHERE ";
	
	var bl = r.getSouthWest();
	var tr = r.getNorthEast();
	var miny = bl.lat();
	var minx = bl.lng();
	var maxy = tr.lat();
	var maxx = tr.lng();
		
	query += "(lat > " + miny + " AND lat < " + maxy + " AND lng > " + minx + " AND lng < " + maxx + ")";
	
	
	//Ajax pour charger les associations issues de la requête.
	var data = {clause:query, year:new Date().getFullYear()};
	var acteur_res = {};
	var cpt = 0;
	jQuery.ajax({
            type: "POST",
            url: prefix_php + "php/__load_acteur_from_adresse.php",
            data: data,
			dataType:'xml',
            success: function(xml)
			{
				jQuery(xml).find("annuaire_acteur").each ( function()
				{
					readXmlActeur ( this, acteur_res);
					cpt ++;
					
				});
				loading.stop();
				
				//Appel de la fonction de rendu
				drawActeur ( acteur_res, res, true );
				
				
				//Appel de la fonction de mise à jour de la liste des résultats
				drawListeResultatActeur ( acteur_res, cpt, true );
				
				if ( layer_reg != null )
				{
					//layer_reg.remove_all();
				}
				
				
				if ( cpt == 0 )
				{
					
				}
            },
			error:function (XMLHttpRequest, textStatus, errorThrown)
			{
				alert(textStatus); 
			}
        });
	
}



/**
 * Fonction d'initialisation des layers des différants types d'association
 */
function initLayerAssoc ()
{
	layer_all = new Layer ({_map:map, _zoom:zoom_dep, _min_max:'min', _name:'acteur'});
	
	map_layer_acteur = new Object ();
	map_layer_acteur ['ALL'] = layer_all;
	
	/*layer_f = new Layer ({_map:map, _zoom:zoom_dep, _min_max:'min', _name:'asso'});
	layer_cr = new Layer ({_map:map, _zoom:zoom_dep, _min_max:'min', _name:'asso'});
	layer_cd = new Layer ({_map:map, _zoom:zoom_dep, _min_max:'min', _name:'asso'});
	layer_d = new Layer ({_map:map, _zoom:zoom_dep, _min_max:'min', _name:'asso'});
	layer_r = new Layer ({_map:map, _zoom:zoom_dep, _min_max:'min', _name:'asso'});
	layer_n = new Layer ({_map:map, _zoom:zoom_dep, _min_max:'min', _name:'asso'});
	*/
	
	/*
	map_layer_asso['F'] = layer_f;
	map_layer_asso['CR'] = layer_cr;
	map_layer_asso['CD'] = layer_cd;
	map_layer_asso['D'] = layer_d;
	map_layer_asso['R'] = layer_r;
	map_layer_asso['N'] = layer_n;*/
}


/**
 * Methode qui permet de masquer tous les marqueurs des associations
 */
function removeAllMarqueursActeur ()
{
	map_layer_acteur['ALL'].remove_all ();
	
	/*map_layer_asso['F'].remove_all ();
	map_layer_asso['CR'].remove_all ();
	map_layer_asso['CD'].remove_all ();
	map_layer_asso['D'].remove_all ();
	map_layer_asso['R'].remove_all ();
	map_layer_asso['N'].remove_all ();*/
}


/**
 * Méthode qui permet d'invoquer la page de calcul d'itinéraire de Google Maps
 */
function showRouting( acteur/*adr, cp, ville*/ )
{
	//Version sans tabs
	var a = prompt ("Saisissez votre adresse :", "");
	
	if ( a != null )
	{
		window.open ( ("http://maps.google.fr/maps?f=d&saddr=" + encodeURI(a) + "&daddr=" + encodeURI(acteur.struct_adresse_1)+ " " + encodeURI(acteur.struct_adresse_2)+ " " + acteur.struct_code_postal + " " + encodeURI(acteur.struct_ville) + "&ie=UTF8&t=v" ) );
	}
	
	
	
	//Version avec tabs
	/*var a = jQuery( '#bubble_adress_routing' ).val();
	window.open ( ("http://maps.google.fr/maps?f=d&saddr=" + encodeURI(a) + "&daddr=" + encodeURI(asso.a_adresse)+ " " + asso.a_codpos + " " + encodeURI(asso.a_commune) + "&ie=UTF8&t=v" ) );
	*/
}

function removeAdresse ()
{
	if ( m_adresse != null )
	{
		map.removeOverlay ( m_adresse );
		delete m_adresse;
	}
}

