// mdr_geoloc.js
// AFG
// creation : 19/03/2008
// fonction pour le module de geo localisation
//alert("ici mdr_geoloc");
error_trace = true;

var MdrGeo = function(pmap) {
	this.tbmap = pmap; /* objet tbMap */
	this.pre_header = 'map_groups-h-';
	this.pre_infos = 'map_groups-i-';
	this.div_id_map = 'mymap';
	this.div_id_map_load = 'loading_map';
	this.div_id_grps = 'map_groups';
	this.div_id_flt = 'map_filters';
	this.map_legend_info = 'map_legend-info';
	this.map_info = 'map_infos';
	this.list_links_id = 'links_list';
	this.images_front_path = '';
	this.obj_name = 'mdrg';
	this.groups_pre_def = new Array('depts','cities','tot');
	this.last_search = new Array();
	this.list_links = new Array();
	this.filters = new Array();
	
	this.filters_conf = new Array();
	this.filters_conf['radius'] = new Array();
	this.filters_conf['radius']['slider_did']='map_filters-radius-slider';
	this.filters_conf['radius']['slider_iid']='map_filters-radius-slider-val';
}

MdrGeo.prototype = {

	setImageFrontPath : function(p_images_front_path) {
		this.images_front_path = p_images_front_path;
	},
	setObjName : function(p_obj_name) {
		this.obj_name = p_obj_name;
	},
	addLinkToList : function (type,lib,link,form_id){
		this.list_links = new Array(); /* un seul type pour l'instant */
		this.list_links[type]= new Array();
		this.list_links[type]['lib']= lib;
		this.list_links[type]['link']= link;
		this.list_links[type]['form_id']= form_id;
	},
	openLink : function (indl){
		var urllink='';
		if (this.list_links[indl]) {
			if (this.list_links[indl]['link']) {
				urllink = this.list_links[indl]['link'];
				if(this.list_links[indl]['form_id']) urllink += '?'+this.getUrlArgsFromForm(this.list_links[indl]['form_id']);
				urllink = html_entity_decode(urllink);
				//gl_trace_error(urllink);
				window.open(urllink,"_blank","");
			}
		}
	},
	buildLinkList : function (){
		var list_links_div = document.getElementById(this.list_links_id);
		var curContent='<span>';
		if (list_links_div) {
			for (var ilink in this.list_links) {
				if (('function' != typeof this.list_links[ilink])) {
					var url_link = this.list_links[ilink]['link'];
					if (url_link) {
						curContent+='<a href="javascript:'+this.obj_name+'.openLink(\''+ilink+'\')">';
						curContent+=this.list_links[ilink]['lib']+'</a>';
					}
				}
			}
			curContent+='</span>';
			list_links_div.innerHTML = curContent;
		}
	},
	search : function(url,type) {
		this.showLoading();
		this.clearMapLegend();
		this.clearGroups();
		this.hideGroups();
		this.clearAndHideFilters();
		/*if (type) themap.deleteDatas(type);*/
		this.tbmap.clearMap(); /* pour l'instant il n'y a qu'un type simultanement => on supprime toutes les donnees */
		this.tbmap.getRes(this.map_info,url,function(obj,args) {obj.CB_search(args);},this);
	},
	
	clearTheMap : function() {
		this.tbmap.clearMap();
	},
	clearMapLegend : function() {
		var div_legendi = document.getElementById(this.map_legend_info);
		div_legendi.innerHTML = "<span class='wait'></span><img src='"+this.images_front_path+"/loading_icons/ico_loading_blue_s.gif'/>";
	},
	CB_search : function() {
		if (this.tbmap) {
			this.tbmap.setDefaultCenter(); 
		}
      
		this.hideLoading();
		this.generateLegend();
		this.generateGroups();
		this.generateFilters();
	},
	focalise : function(lat,lng,zoom) {
		this.tbmap.setCenter(lat,lng,zoom);
	},
	clearLegend : function() {
		var div_legendi = document.getElementById(this.map_legend_info);
		if (div_legendi) div_legendi.innerHTML = '';
	},
	generateLegend : function() {
		var icons_info = this.tbmap.getLegend();
		var div_legendi = document.getElementById(this.map_legend_info);
		if (div_legendi) div_legendi.innerHTML = '';
		var htmlContent = '';
		
		if (icons_info) {
			for(ind in icons_info) {
				try {
					var icon = icons_info[ind];
					if (icon && icon instanceof Array) { //if (('function' != typeof icon)) {
						var curContent='<div class="item" style="float:left;"><table><tr><td>';
						curContent+='<img src="'+icon['image']['src']+'" style="width:'+icon['image']['width']+'px;height:'+icon['image']['height']+'px;">';
						curContent+='</td><td>';
						var curLib='';
						if (isset(icon['cats'])) {
							for(i in icon['cats']) {
								if (('function' != typeof icon['cats'][i])) {
									if ('' == curLib) 
										curLib+=icon['cats'][i]; 
									else 
										curLib+=', '+icon['cats'][i];
								}
							};
						}
						curContent+=curLib;
						curContent+='</td></tr></table></div>';
						htmlContent+=curContent;
					}
				}catch(err){gl_trace_error(err);}
			}
		}
		div_legendi.innerHTML = htmlContent;
	},
	generateFilters : function() {
		var show = false;
		if (this.filters) {
			for(ind in this.filters) {
				var filter = this.filters[ind];
				if (('function' != typeof filter)) {
					if (('radius'==ind) && ('0' != this.last_search['radius']) && ('city' == this.last_search['type'])) {
						show = true;
						var cb_funct = function(rad,obj) {
							if (obj) {
								// filtrer sur la carte
								obj.tbmap.filterRadius(filter['lat'],filter['lng'],rad);
								// mettre a jour le champ en km
								var div_slid_mi = document.getElementById(obj.filters_conf['radius']['slider_iid']);
								var div_slid_km = document.getElementById(obj.filters_conf['radius']['slider_iid']+'-km');
								if (div_slid_mi) div_slid_mi.value = rad;
								if (div_slid_mi && div_slid_km) div_slid_km.value = (div_slid_mi.value * 1.609344).toFixed(1);
							}
						};
						try{cb_funct(this.last_search['radius'],this);}catch(e){} // on tente d'appeler la callback
						gl_createASlider(this.filters_conf['radius']['slider_did'],this.filters_conf['radius']['slider_iid'],this.last_search['radius'],cb_funct,this);
					}
				}
			}
			if (show) this.showFilters();
		}
	},
	showFilters : function() {
		var div_flt = document.getElementById(this.div_id_flt);
		gl_showDiv(div_flt,true);
	},
	clearAndHideFilters : function() {
		this.filters = new Array();
		var div_flt = document.getElementById(this.div_id_flt);
		gl_hideDiv(div_flt,true);
	},
	addFilter : function(id,params) {
		this.filters[id] = params;
	},
	hideGroups : function() {
		var div_grps = document.getElementById(this.div_id_grps);
		gl_hideDiv(div_grps,true);
	},
	clearGroups : function() {
		var groups = this.tbmap.getGroups();
		
		if (groups) {
			for(grp_id in groups) {
				var group = groups[grp_id];
				if (group && ('function' != typeof group)) {
					var header = document.getElementById(this.pre_header+grp_id);
					var infos = document.getElementById(this.pre_infos+grp_id);
					gl_hideDiv(header,true);
					gl_hideDiv(infos,true);
				}
			}
		}
		
		/* on efface les groupes predefinis */
		if (this.groups_pre_def) {
			for(grp_id in this.groups_pre_def) {
				if (('string' == typeof grp_id)) {
					var header = document.getElementById(this.pre_header+grp_id);
					var infos = document.getElementById(this.pre_infos+grp_id);
					gl_hideDiv(header,true);
					gl_hideDiv(infos,true);
				}
			}
		}
	},
	generateGroups : function() {
		try
		{
			var groups = this.tbmap.getGroups();
			
			if (groups) {
				for(grp_id in groups) {
					if (('string' == typeof grp_id) && ('function' != typeof groups[grp_id])) {
						var group = groups[grp_id];
						var header = document.getElementById(this.pre_header+grp_id);
						var infos = document.getElementById(this.pre_infos+grp_id);
						gl_hideDiv(header,true);
						gl_hideDiv(infos,true);
						
						if (infos) {
							if (header) header.innerHTML = '';
							infos.innerHTML = '';
							var items = group['items'];
							//alert("ici :"+group['lib']);
							var nb_items = getAssocArrayLength(items);
							if ( nb_items > 0) {
								//alert("ici :"+group['lib']+", nb_items="+nb_items);
								var img = '<img class="icons" src="'+this.images_front_path+'/mdr_geoloc/groups_h.png"/>';
								if (header && group['lib']) header.innerHTML = img+htmlentities(group['lib']);
								gl_showDiv(header,true);
								gl_showDiv(infos,true);
								var nb_td =  3;
								var nb_tr = Math.ceil(nb_items / nb_td);
								var contentTab = new Array(nb_items);
								var indIt =0;

								for (iit in items) {
									if (('function' != typeof items[iit])) {
										var nb_restot=0;
										for (type in items[iit]['res_count']) {
											if (('function' != typeof items[iit]['res_count'][type])) { nb_restot+=items[iit]['res_count'][type];}
										}
										if (('' == items[iit]['lat']) || ('0' == items[iit]['lat']) || (false == isset(items[iit]['lat']))
											|| ('' == items[iit]['lng']) || ('0' == items[iit]['lng']) || (false == isset(items[iit]['lng'])))  {
											contentTab[indIt++]='<br>'+items[iit]['lib']+'&nbsp;['+nb_restot+']';
										} else {
											contentTab[indIt++]='<a href="javascript:'+this.obj_name+'.focalise('+items[iit]['lat']+','+items[iit]['lng']+','+items[iit]['zoom']+')">'+items[iit]['lib']+'</a>'+'&nbsp;['+nb_restot+']';
											if (this.last_search['id'] == items[iit]['id']) { /* centre sur element recherche */
												var res_zoom = items[iit]['zoom'];
												var rectif=0;
												try {
													if (parseInt(this.last_search['radius']) > 0 ) {
														if (this.last_search['type'] == 'city') this.addFilter('radius',items[iit]);
														rectif = (parseInt(this.last_search['radius'])*2 / 25)+0.5; /* zoom de 12 a 8 => rectif de 0 a 4 */
													}
												} catch(e) { }
												try {
													this.tbmap.setCenter(items[iit]['lat'],items[iit]['lng'],res_zoom-rectif);
												} catch(e) { }
											}
										}
									}
								}
								
								var curContent='<table style="width:100%">';
								for(tr_i=0;tr_i < nb_tr;tr_i++) {
									curContent+='<tr>';
									for(td_i=0;td_i < nb_td;td_i++) {
										var td_content = '';
										var indC = tr_i+(td_i*nb_tr);
										if (indC < nb_items) td_content = contentTab[indC];
										curContent+='<td style="width:30%">'+td_content+'</td>';
									}
									curContent+='</tr>';
								}
								curContent+='</table>';
								
								infos.innerHTML = curContent;
							} 
						} else {gl_trace_error("le div "+this.pre_infos+grp_id+" n existe pas!");}
					}
				}
			}
		} catch(e) { }
		var div_grps = document.getElementById(this.div_id_grps);
		gl_showDiv(div_grps,true);
	},
	showOrHide : function(type) {
		this.tbmap.hideOrShowMarkersOfType(type);
	},
	cleanAllOfType : function(type) {
		this.tbmap.deleteDatas(type);
		this.clearGroups();
	},
	cleanAll : function(type) {
		this.tbmap.clearMap();
		this.clearGroups();
		this.clearLegend();
	},
	showLoading : function () {
		var lmap=document.getElementById(this.div_id_map_load);
		var gmap=document.getElementById(this.div_id_map);
		if ('' != gmap.innerHTML) {
			lmap.style.left=gmap.offsetLeft+'px';
			lmap.style.top=gmap.offsetTop+'px';
			lmap.style.width=gmap.offsetWidth+'px';
			lmap.style.height=gmap.offsetHeight+'px';
		} else {
			lmap.style.left='0px';
			lmap.style.top='0px';
			try{ /* IE */
				lmap.style.width=document.body.clientWidth+'px';
				lmap.style.height=document.body.clientHeight+'px';
			}catch(err){}
			try{ /* FF */
				lmap.style.width=window.innerWidth+'px';
				lmap.style.height=window.innerHeight+'px';
			}catch(err){}
		}
		if (document.all) { /* IE */
			lmap.style.filter = 'alpha\(opacity=90\)'; /*lmap.filters.alpha.opacity=9;*/
		} else lmap.style.opacity=0.9; /* FF */
		gl_showDiv(lmap);
	},
	hideLoading : function (){
		var lmap=document.getElementById(this.div_id_map_load);
		gl_hideDiv(lmap);
	},
	getUrlArgsFromForm : function (form_id){
		var obj_form=document.getElementById(form_id);
		var args = '';
		if (obj_form) {
			
			nb_elements = obj_form.elements.length;
			for (i=0;i<nb_elements;i++) {
				box = obj_form.elements[i];
				if (i==0) sep = ''; else sep = '&';
				if (box) {
					if (('checkbox' != box.type) || (true == box.checked)) {
						args +=  sep+box.name + '=' + box.value;
						if (('dept_id' == box.name) && (0!=box.value)) {this.last_search['id']=box.value;this.last_search['type']='dept';}
						if (('city_id' == box.name) && (0!=box.value)) {this.last_search['id']=box.value;this.last_search['type']='city';}
						if (('radius' == box.name))  {this.last_search['radius']=box.value;}
					}
				} else break;
			}
		}
		return args;
	},
	setLastSearch : function (id,type){
		this.last_search['id']=id;
		this.last_search['type']=type;
	},
	launchRequest : function(form_id,url_get,type) {
		if (form_id && url_get) {
			var args_s = this.getUrlArgsFromForm(form_id);
			this.search(url_get+'&'+args_s,type);
		}
	}
	
} // fin de la classe
//  ------------------------- fin de la classe

/* FUNCTION : cache le div  */
gl_hideDiv = function (objet,display){
	if (objet) {
		objet.style.visibility="hidden";
		if (display) objet.style.display='none';
	}
}
/* FUNCTION : affiche le div  */
gl_showDiv = function (objet,display){
	if (objet) {
		objet.style.visibility="visible";
		if (display) objet.style.display='block';
	}
}

/* utilise pour le plan d'acces : a modifier  */
showWindowInfo = function (markers,marker_id) {
	if (!(markers[marker_id]['content_wi'])) {
		if (markers[marker_id]['url_get_wi']) {
			ar = new Ajax_request(markers[marker_id]['url_get_wi'],{method:'get',async :false,onSuccess:none});
			content = ar.responseText;
			if ((null != content) && ('' != content)) {
				markers[marker_id]['content_wi']=content;
				if (markers[marker_id]['marker']) markers[marker_id]['marker'].openInfoWindowHtml(markers[marker_id]['content_wi']);
			}
		}
	} else {
		if (markers[marker_id]['marker']) markers[marker_id]['marker'].openInfoWindowHtml(markers[marker_id]['content_wi']);
	}
}

/* FUNCTION : affiche un loading et lance le chargement du formulaire */
gl_loadSpecForm = function(url_get,id_select,id_dest) {
	var objet_select = document.getElementById(id_select);
	if ('0' != objet_select.value) { // sauf valeur par defaut
		setTimeout('gl_showWaitInDiv("'+id_dest+'",true)',0);
		setTimeout('gl_getSpecForm("'+url_get+'","'+id_select+'","'+id_dest+'")',15);
	}
	return false; // pour ne updater la page entiere
}
/* FUNCTION : recupere le formulaire  et lance l'affichage de ce dernier */
gl_getSpecForm = function(url_get,id_select,id_dest) {
	var obj_dest = document.getElementById(id_dest);
	var objet_select = document.getElementById(id_select);
	
	if (objet_select && url_get && obj_dest) {
		var reqGetForm = new Ajax_request(url_get,
			{
				method:'post',
				params:objet_select.name+'='+objet_select.value,
				onSuccess:gl_updateSpecForm = function(xhr) {
					var obj_dest = document.getElementById(id_dest);
					setInnerHTML(obj_dest,xhr.responseText);
				},
				async:true
			});
		/*if ('' != reqGetForm.responseText) {
			setInnerHTML(obj_src,reqGetForm.responseText);
		}*/
	}
}
/* FUNCTION : recupere  le nombre d'element du tableau associatif */
function getAssocArrayLength(assocArray) {
	var result=0;
	for (i in assocArray) {
		if (('function' != typeof assocArray[i])) {result++;}
	}
	return result;
}
/* FUNCTION : teste si une variable est initialisee */
function isset(variable_name)
{
	try
	{
		if (typeof(eval(variable_name)) != 'undefined')
		if (eval(variable_name) != null)
		return true;
	} catch(e) { }
	return false;
}

/* FUNCTION : efface le options de l'objet Select */
gl_clearSelectOptions = function (selectObject)
{
	var nb=0;
	if (selectObject) {
		// on laisse la premiere option qui la valeur par defaut
		taille = selectObject.options.length;
		for(var i=taille-1;i > 0;i--){
			selectObject.options[i] = null;
			nb++;
		}
	}
	
	return nb;
}
/* FUNCTION : efface le options de l'objet Select */
gl_selectValueOption = function (selectObject,value)
{
	var indexSearch=0;
	if (selectObject) {
		// on laisse la premiere option qui la valeur par defaut
		var taille = selectObject.options.length;
		for(var i=1;i <(taille);i++){
			if (!selectObject.options[i]) break; /* on s'arrete au 1er null */
			if (value == selectObject.options[i].value) indexSearch=i;
		}
		selectObject.selectedIndex = indexSearch;
	}
	return indexSearch;
}
/* FUNCTION : affiche un loading et lance la construction de la liste d'option des villes */
gl_asyncBuildSelectCitiesOfDept = function(form_id_select,form_dept_id,listCities,loading_id,prox_id,rad_s_id,CB_funct) {
	if (loading_id) {
		var div_load = document.getElementById(loading_id);
		gl_showDiv(div_load,true);
	}
	gl_hideProxSelect(prox_id,rad_s_id);
	if (form_id_select) {
		var div_form_s = document.getElementById(form_id_select);
		gl_hideDiv(div_form_s,false);
		setTimeout(function() {gl_buildSelectCitiesOfDept(form_id_select,form_dept_id,listCities,loading_id,CB_funct);},100);
	}
}
/* FUNCTION : affiche un loading et lance la construction de la liste d'option des villes */
gl_buildSelectCitiesOfDept = function(form_id_select,form_dept_id,listCities,loading_id,CB_funct) {
	var div_form_s = document.getElementById(form_id_select);
	var div_form_d = document.getElementById(form_dept_id);
	var pre_selec = false;
	
	var nb_opt = gl_clearSelectOptions(div_form_s);// on retire toutes les options sauf la 1ere
	//alert('nb_opt='+nb_opt);
	if (div_form_s && listCities && div_form_d) {
		dept_id_selected = div_form_d.value;
		var indOption = 1;
		for(id_city in listCities) {
			if (('function' != typeof filter)) {
				var curCity = listCities[id_city];
				if ((0 == dept_id_selected) || (dept_id_selected == curCity['dept_id'])) {
					var selected =false;
					if ((isset(curCity['selected'])) && ("true" == curCity['selected'])) 
						{selected=true;pre_selec=true;curCity['selected']="false";}
					div_form_s.options[indOption++] = new Option(curCity['value'],curCity['name'],selected,selected);
				}
			}
		}
		//gl_sortOptions(div_form_s,--indOption); /* pas de sort (trop gourmand) => on suppose que l'ordre est bon des le depart  */
		div_form_s.options[indOption++]=null;
		if (!pre_selec) div_form_s.selectedIndex = 0;
		gl_showDiv(div_form_s,false);
	}
	if (loading_id) {
		var div_load = document.getElementById(loading_id);
		gl_hideDiv(div_load,true);
	}
	if (null != CB_funct) {CB_funct();}
}
/* FUNCTION : reagit a la modification de la selection d'une ville (ex : cache la selection de proximite) */
gl_changeSelectedCity = function(div_id_select,div_id_prox,div_id_prox_select) {
	var div_s = document.getElementById(div_id_select);
	if (div_s ) {
		cities_id_selected = div_s.value;
		
		if ('0' != cities_id_selected) {
			var div_p = document.getElementById(div_id_prox);
			gl_showDiv(div_p,true);
		} else {
			gl_hideProxSelect(div_id_prox,div_id_prox_select);
		}
	}
}
/* FUNCTION : show la selection de proximite */
gl_showProxSelect = function(div_id_prox,div_id_prox_select,selectValue) {
	var div_p = document.getElementById(div_id_prox);
	var div_p_s = document.getElementById(div_id_prox_select);
	
	if (div_p && div_p_s) {
		gl_showDiv(div_p,true);
		if (div_p_s) {
			if (selectValue) gl_selectValueOption(div_p_s,selectValue); // selection par defaut
			else div_p_s.selectedIndex = 0; // selection par defaut
		}
	}
}
/* FUNCTION : cache la selection de proximite */
gl_hideProxSelect = function(div_id_prox,div_id_prox_select) {
	var div_p = document.getElementById(div_id_prox);
	var div_p_s = document.getElementById(div_id_prox_select);
	
	if (div_p && div_p_s ) {
		gl_hideDiv(div_p,true);
		if (div_p_s) {
			div_p_s.selectedIndex = 0; // selection par defaut
		}
	}
}
/* FUNCTION : compare deux options par leur champ text (utile pour gl_sortOptions) */
gl_compareOptionText = function(a,b) {
	return a.text!=b.text ? a.text<b.text ? -1 : 1 : 0;
}
/* FUNCTION : trie les options selon le champ text sans tenir compte de 1er choix (celui par defaut qui doit rester au debut)  */
gl_sortOptions = function(list,max_nb) {
	var items = list.options.length;
	if (max_nb < items) items=max_nb;
	//alert('max_nb='+max_nb+', items='+items);
	// create array and make copies of options in list
	var tmpArray = new Array(items);
	for ( i=0; i<(items-1); i++ ) tmpArray[i] = new Option(list.options[i+1].text,list.options[i+1].value);
	// sort options using given function
	tmpArray.sort(gl_compareOptionText);
	// make copies of sorted options back to list
	for ( i=0; i< (items-1); i++ ) list.options[i+1] = new Option(tmpArray[i].text,tmpArray[i].value);
}

/* FUNCTION : trace une erreur */
gl_trace_error = function(msg) {
	if (error_trace) {
		var win = window.open("", "win", "width=300,height=200"); // a window object
		with (win.document) {
			open("text/html", "replace");
			var err_content = "<HTML><HEAD><TITLE>ERROR</TITLE></HEAD>";
			err_content += "<BODY>"+msg+"<p><A HREF='javascript:window.close();'>Return</A></BODY></HTML>";
			write(err_content);
			close();
		}
		//alert(msg);
	}
}

/* FUNCTION : creer un barre slider */
gl_createASlider = function(slider_did,slider_iid,max_value,CB_Funct,objCB) {
	slider_input = document.getElementById(slider_iid);
	slider = document.getElementById(slider_did);
	if (slider && slider_input) {
		slider.innerHTML='';
		form_widget_amount_slider(slider_did,slider_input,120,0,max_value,CB_Funct,objCB);
	}
}

//Encode une chaîne
function htmlentities(texte) {
	texte = texte.replace(/&/g,'&amp;'); // 38 26
	texte = texte.replace(/</g,'&lt;'); // 60 3C
	texte = texte.replace(/>/g,'&gt;'); // 62 3E
	return texte;
}
//Décode une chaîne
function html_entity_decode(texte) {
	texte = texte.replace(/&amp;/g,'&'); // 38 26	
	texte = texte.replace(/&lt;/g,'<'); // 60 3C
	texte = texte.replace(/&gt;/g,'>'); // 62 3E
	return texte;
}

//alert("fin mdr_geoloc");