/**
 * @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.72480037466717,2.04345703125);	

	//Création des icons en forme de cercle.
	createIconCircle ();

	//Création des icons des associations.
	createIconAssoc ();
	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:20,color:'#ffffff', ico:icon_circle[0]},
									{min:20,max:50,color:'#ffaaaa', ico:icon_circle[1]},
									{min:50,max:1000,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 ();
	
	//Chargement des listes du moteur de recherche
	loadListeActivite ();
	
	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 loadAssoFromDep ( dep, erase )
{
	map.closeInfoWindow();
	var data = {dep:dep, year:new Date().getFullYear()};
	var asso_res = {};
	var cpt = 0;
	jQuery.ajax({
            type: "POST",
            url: prefix_php + "php/loadAssoFromDep.php",
            data: data,
			dataType:'xml',
            success: function(xml)
			{
				jQuery(xml).find("asso").each ( function()
				{
					readXmlAsso ( this, asso_res);
					cpt++;					
				});
				loading.stop();
				
				//Appel de la fonction de rendu
				
				if ( layer_dep != null )
				{
					drawAssociation ( asso_res, layer_dep.get ( dep ).getLatLng(), erase );
				}
				else
				{
					drawAssociation ( asso_res, null, erase );
				}
				
				//Appel de la fonction de mise à jour de la liste des résultats
				drawListeResultat ( asso_res, cpt, erase );
				
				if ( layer_dep != null )
				{
					layer_dep.remove(dep);
				}
            },
			error:function (XMLHttpRequest, textStatus, errorThrown)
			{
				alert(textStatus); 
			}
        });
		
}

/**
 * Retrouve toutes les associations dans un rayon de x kilomètres d'une adresse.
 */
function findAssoNearAdresse ()
{
	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.callbackGeocodage ) ) ;
}


/**
 * 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 callbackGeocodage ( 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 ();
				loadAssoFromDep ( jQuery('#moteur_recherche #list_dep').val(), true );
			}
			else if ( type_struct == 2 )
			{
				removeAdresse ();
				drawAssociation ( asso_res_reg, null, true );
				drawListeResultat ( 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 += "(latitude > " + miny + " AND latitude < " + maxy + " AND longitude > " + minx + " AND longitude < " + maxx + ")";
	
	
	//Ajax pour charger les associations issues de la requête.
	var data = {clause:query, year:new Date().getFullYear()};
	var asso_res = {};
	var cpt = 0;
	jQuery.ajax({
            type: "POST",
            url: prefix_php + "php/loadAssoFromAdresse.php",
            data: data,
			dataType:'xml',
            success: function(xml)
			{
				jQuery(xml).find("asso").each ( function()
				{
					readXmlAsso ( this, asso_res);
					cpt ++;
					
				});
				loading.stop();
				
				//Appel de la fonction de rendu
				drawAssociation ( asso_res, res, true );
				
				
				//Appel de la fonction de mise à jour de la liste des résultats
				drawListeResultat ( asso_res, cpt, true );
				
				if ( layer_dep != null )
				{
					layer_dep.remove_all();
				}
				
				
				if ( cpt == 0 )
				{
					
				}
            },
			error:function (XMLHttpRequest, textStatus, errorThrown)
			{
				alert(textStatus); 
			}
        });
	
}


/**
 * Méthode qui extrait les données issues du xml d'une recherche d'association 
 */
function readXmlAsso ( obj, asso_res )
{
	var a_code = jQuery(obj).attr ('a_code');
	var a_nom = parsefromXML(jQuery(obj).attr ('lib'));
	var lat = jQuery(obj).attr ('lat');
	var lng = jQuery(obj).attr ('lng');
	
	
	var a_adresse = parsefromXML(jQuery(obj).attr ('a_adresse'));
	var a_codpos = jQuery(obj).attr ('a_codpos');
	var a_commune = parsefromXML(jQuery(obj).attr ('a_commune'));
	var a_tel = jQuery(obj).attr ('a_tel');
	var a_fax = jQuery(obj).attr ('a_fax');
	var a_mel = jQuery(obj).attr ('a_mel');
	var a_chez = parsefromXML(jQuery(obj).attr ('a_chez'));
	var a_web = jQuery(obj).attr ('a_web');
	
	var georef_asso = jQuery(obj).attr ('georef_asso');
	var georef_president = jQuery(obj).attr ('georef_president');
	var georef_contact = jQuery(obj).attr ('georef_contact');
	var georef_activite = jQuery(obj).attr ('georef_activite');
	
	
	
	asso_res[a_code] = {a_nom:a_nom,a_code:a_code,lat:lat,lng:lng, 
						a_adresse:a_adresse,a_codpos:a_codpos,a_commune:a_commune,
						a_tel:a_tel,a_fax:a_fax,a_mel:a_mel,a_chez:a_chez,a_web:a_web,
						georef_asso:georef_asso, 
						georef_president:georef_president, 
						georef_contact:georef_contact, 
						georef_activite:georef_activite 
						};
}

/**
 * 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 drawAssociation ( obj_asso, center, erase )
{
	
	loading.start();
	var cnt = 0;
	if ( map_asso == null )
	{
		//initialisation de la collection des associations
		map_asso = {};
	}
	if ( erase == true )
	{
		removeAllMarqueurs ();
	}
	
	cur_bounds = new GLatLngBounds ();
	for ( var key in obj_asso )
	{
		try
		{
			cnt++;
			var o = obj_asso[key];
			var as = null;
			if ( map_asso [key] == undefined )
			{
				as = new Association ( o );
				map_asso [key] = as;
				
				
				//console.log ( as );
			}
			else
			{
				as = map_asso[key];
				
				
				
				map.addOverlay ( map_layer_asso[as.statut].get ( as.a_code ) );
			}
			
			cur_bounds.extend ( new GLatLng ( parseFloat(as.lat), parseFloat (as.lng) ) );
			
		}
		catch ( error )
		{
			console.log ( error );
		}
		
	}
	//map.setCenter (center,8);
	
	if ( cnt > 0 )
	{
		var z = map.getBoundsZoomLevel(cur_bounds);
		if ( cnt == 1 )
		{
			z = 8;
		}
		map.setCenter ( cur_bounds.getCenter (), z );
	}
	else
	{
		initMapAgain ();
		alert("Votre recherche ne renvoie aucune association.");
	}
	loading.stop ();
}


/**
 * Fonction d'initialisation des layers des différants types d'association
 */
function initLayerAssoc ()
{
	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 = new Object ();
	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 removeAllMarqueurs ()
{
	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( asso/*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(asso.a_adresse)+ " " + asso.a_codpos + " " + encodeURI(asso.a_commune) + "&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;
	}
}

