//=====================================================================
	//--------------------------------------------------
	// Copyright HervÃ© Le Cornec 2008
	// Tout droit de copie partielle ou totale interdit.
	// hcl # oceanvirtuel ; com
	//--------------------------------------------------
	function get_xy_from_lonlat(lon,lat) 	{ 
		var x = X0+lon*W/180;
		var y = Y0-lat*W/180;
		return new Array(x,y); 
	}
	function get_lonlat_from_xy(x,y) 		{ 
		var lon = (x-X0)*180/W;
		var lat = (Y0-y)*180/W;
		lon.toFixed(6);
		lat.toFixed(6)
		return new Array(lon,lat); 
	}
	function init_variables() {
		WIDTH_SUBMAP 	= WIDTH_VISU/2;
		W 				= Math.pow(2,parseInt(ZOOM))*WIDTH_VISU;
		DL_MAP			= 180/Math.pow(2,parseInt(ZOOM)+1);
		XC 				= WIDTH_SUBMAP;
		YC 				= WIDTH_SUBMAP;
		X0				= XC-LONC*W/180;
		Y0				= YC+LATC*W/180;	
	}
	function make_map(layer) {
		//document.getElementById('masque').style.display='';
		init_variables();		
		var e 	= 	W/2;		
		var x0=Math.floor((XC-X0)/WIDTH_SUBMAP-1)*WIDTH_SUBMAP+X0;
		var y0=Math.ceil ((YC-Y0)/WIDTH_SUBMAP+1)*WIDTH_SUBMAP+Y0;
		var x1=Math.ceil ((XC-X0)/WIDTH_SUBMAP+1)*WIDTH_SUBMAP+X0;
		var y1=Math.floor((YC-Y0)/WIDTH_SUBMAP-1)*WIDTH_SUBMAP+Y0;	
			
			XV0 = x0;
			YV0 = y0;
			XV1 = x1;
			YV1 = y1;
			
		document.getElementById('dragbag').style.left 	= x0+'px';
		document.getElementById('dragbag').style.top 	= y1+'px';	
		if		(layer=='regate') 	{ 
			for(var myid in MATRIX_REGATE[ZOOM]) 	
				if(MATRIX_REGATE[ZOOM][myid]!='') 	{
					document.getElementById(myid).style.display = 'none';
					document.getElementById('traj_'+myid).style.display = 'none';
				}	
		}
		else if	(layer=='meteo' ) 	{ for(var myid in MATRIX_METEO[METEO_TIME][ZOOM]) 	{ if(MATRIX_METEO[METEO_TIME][ZOOM][myid]!='') 	document.getElementById(myid).style.display = 'none'; } }		
		else  						{ for(var myid in MATRIX_MAP[FOND][ZOOM]) 			{ if(MATRIX_MAP[FOND][ZOOM][myid]!='') 			document.getElementById(myid).style.display = 'none'; } }				
		for(var x=x0;x<x1;x+=WIDTH_SUBMAP) {
			for(var y=y1;y<y0;y+=WIDTH_SUBMAP) {
				var left = x-x0;
				var top  = y-y1;	
				if	(x >= W+X0+WIDTH_SUBMAP || x < X0-W-WIDTH_SUBMAP|| y >= Y0+e || y < Y0-e) 	continue; 			
				var arr = get_lonlat_from_xy(x,y+WIDTH_SUBMAP);								
				if		(arr[0]<-180)	var id = 'submap_'+(360+arr[0]).toFixed(5)+'_'+arr[1].toFixed(5); 
				else if	(arr[0]>=180) 	var id = 'submap_-180_'+arr[1].toFixed(5); 
				else					var id = 'submap_'+arr[0].toFixed(5)+'_'+arr[1].toFixed(5);	
				if		(layer=='regate') { 
					id = 'regate_'+id;
					if(MATRIX_REGATE[ZOOM][id]) { 				
						document.getElementById(id).style.left = left;
						document.getElementById(id).style.top  = top;
						document.getElementById(id).style.display = '';
						document.getElementById('traj_'+id).style.left = left;
						document.getElementById('traj_'+id).style.top  = top;
						document.getElementById('traj_'+id).style.display = '';
						continue; 
					}
					else {
						var str  = '<div id="'+id+'" class="submap" style="top:'+top+';left:'+left+';width:'+(WIDTH_SUBMAP)+';height:'+(WIDTH_SUBMAP)+';"></div>';
						var strb = '<div id="traj_'+id+'" class="submap" style="top:'+top+';left:'+left+';width:'+(WIDTH_SUBMAP)+';height:'+(WIDTH_SUBMAP)+';"></div>';
						MATRIX_REGATE[ZOOM][id] = str;
						MATRIX_TRAJ[ZOOM][id]   = strb;
						requestAjaxMap('regate',id);
					}	
				}
				else if	(layer=='meteo' ) { 
					id = 'meteo_'+id;
					if(MATRIX_METEO[METEO_TIME][ZOOM][id]) { 				
						document.getElementById(id).style.left = left;
						document.getElementById(id).style.top  = top;
						document.getElementById(id).style.display = '';
						continue; 
					}
					else {
						var str = '<div id="'+id+'" class="submap" style="top:'+top+';left:'+left+';width:'+(WIDTH_SUBMAP)+';height:'+(WIDTH_SUBMAP)+';"></div>';
						MATRIX_METEO[METEO_TIME][ZOOM][id] = str;
						requestAjaxMap('meteo',id);
					}	
				}						
				else  { 						
					if(MATRIX_MAP[FOND][ZOOM][id]) { 				
						document.getElementById(id).style.left = left;
						document.getElementById(id).style.top  = top;
						document.getElementById(id).style.display = '';
						continue; 
					}
					else {
						var str = '<div id="'+id+'" class="submap" style="top:'+top+';left:'+left+';width:'+(WIDTH_SUBMAP)+';height:'+(WIDTH_SUBMAP)+';"></div>';
						MATRIX_MAP[FOND][ZOOM][id] = str;
						requestAjaxMap(FOND,id);
					}	
				}
			}
		}
	draw_loxo();
	//document.getElementById('masque').style.display='none';
	}
	function OnDragStart(ele,mx,my) {
		var arr0 	= get_lonlat_from_xy(WIDTH_SUBMAP-ele.totalMX,WIDTH_SUBMAP-ele.totalMY); 	
		document.getElementById('centre').innerHTML = 'Lon:'+dec_to_deg(arr0[0])+'<br>Lat:'+dec_to_deg(arr0[1]);
	}
	function OnDrag(ele,mdx,mdy) {
		xMoveTo(ele, xLeft(ele) + mdx, xTop(ele) + mdy);
  		xMoveTo('ptdep', xLeft('ptdep') + mdx, xTop('ptdep') + mdy);
  		xMoveTo('ptarr', xLeft('ptarr') + mdx, xTop('ptarr') + mdy);
		ele.totalMX += mdx;
		ele.totalMY += mdy;
		var arr0 	= get_lonlat_from_xy(WIDTH_SUBMAP-ele.totalMX,WIDTH_SUBMAP-ele.totalMY); 	
		document.getElementById('centre').innerHTML = 'Lon:'+dec_to_deg(arr0[0])+'<br>Lat:'+dec_to_deg(arr0[1]);
	}
	function OnDragEnd(ele,mx,my) {
		XC=WIDTH_SUBMAP-ele.totalMX;
		YC=WIDTH_SUBMAP-ele.totalMY;
		var arr0 = get_lonlat_from_xy(XC,YC);
		LONC = arr0[0];
		LATC = arr0[1];
		make_map(FOND);
		make_map('meteo');
		make_map('regate');
		ele.totalMX = 0;
		ele.totalMY = 0;
	}
	function requestAjaxMap(layer,id){		
		var regexp 	= new RegExp('^.*submap_([0-9\.\-]+)_([0-9\.\-]+)$');
		var lon0 	= parseFloat(id.replace(regexp,'$1'));
		var lat0 	= parseFloat(id.replace(regexp,'$2'));
		var lon1 	= lon0+DL_MAP;
		var lat1 	= lat0+DL_MAP;
		//console.debug(VENTDIFF);
		var url 	= 'serveur_images_6.1.php?zoom='		+ZOOM+
										'&mapsize='		+(WIDTH_VISU/2)+
										'&layer='		+layer+
										'&mapext='		+lon0.toFixed(5)+','+lat0.toFixed(5)+','+lon1.toFixed(5)+','+lat1.toFixed(5)+
										'&meteotime='	+METEO_TIME+
										'&regate='		+ID_REGATE+
										'&vent_diff='	+VENTDIFF+
										'&liste='		+BATEAUX_LISTE+
										'&fromto='		+BATEAUX_FROMTO;
		var http_request = false;
		if (window.XMLHttpRequest) { // Mozilla, Safari,...
			http_request = new XMLHttpRequest();
			if (http_request.overrideMimeType)  http_request.overrideMimeType('text/xml');
		} 
		else if (window.ActiveXObject) { // IE
			try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } 
			catch (e) { 
				try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } 
				catch (e) {}
			}
		}
		if (!http_request) { 
			alert('Abandon : Impossible de créer une instance XMLHTTP');
			return false;
		}
		document.getElementById('masque').style.display='';
		NSUB++;
		http_request.onreadystatechange = function() { receiveAjaxMap(http_request,layer,id); };
		http_request.open('GET',url, true);
		http_request.send(null);
			
	}
	function receiveAjaxMap(http_request,layer,id) {
		if (http_request.readyState == 4) {
			if (http_request.status == 200) {
				var reponse = new String(http_request.responseText);
				var str 	= new String(reponse.substring(9,reponse.length-10));
				reponse 	= unescape(str);
				var reg1 	= new RegExp('Warning');
				
				if(layer=='meteo') {
					if		(reponse.match(reg1)) 	MATRIX_METEO[METEO_TIME][ZOOM][id] = '';
					else if	(reponse) 	{
						document.getElementById('meteo').innerHTML 	+= MATRIX_METEO[METEO_TIME][ZOOM][id];
						document.getElementById(id).innerHTML='<img src="'+reponse+'" border=0>';
						document.getElementById(id).style.display 	 = '';
					}
					else 							MATRIX_METEO[METEO_TIME][ZOOM][id] = '';
				}
				else if(layer=='regate') {
					var arr = reponse.split(";");
					var traj 		= arr[0];
					reponse 		= arr[1];
					var etiquette 	= arr[2];
					if(etiquette!='') {
						var arr1 = etiquette.split("#");
						var areastr = new String();
						var n = ETIQUETTE[ZOOM].length;
						for(var i=0;i<arr1.length;i++) {
							var arr2 = arr1[i].split(",");
							ETIQUETTE[ZOOM][n+i] = new Array();
							for(var j=0;j<arr2.length;j++) {
								ETIQUETTE[ZOOM][n+i][j] = arr2[j];
								
							}
							if(ETIQUETTE[ZOOM][n+i][0]=='') continue;
							var x = ETIQUETTE[ZOOM][n+i][8];
							var y = ETIQUETTE[ZOOM][n+i][9];
							areastr += "<area shape=\"rect\" coords=\""+Math.floor(x-2)+","+Math.floor(y-2)+","+Math.ceil(x+2)+","+Math.ceil(y+2)+"\" onmouseover=\"show_etiquette('"+ETIQUETTE[ZOOM][n+i][0]+"')\" onmouseout=\"hide_etiquette()\">\n";													
						}
						areastr = "<map id=\""+id+"\" name=\""+id+"\">"+areastr+"</map>";
						var areaname = 'ISMAP usemap=\"#'+id+'\"';
 					}
					else {
						var areastr = '';
						var areaname = '';
						var etiquette = '';
					}
					
					if		(reponse.match(reg1)) 	MATRIX_REGATE[ZOOM][id] = '';
					else if	(reponse) 				{
						document.getElementById('traj').innerHTML 	+= MATRIX_TRAJ[ZOOM][id];
						document.getElementById('regate').innerHTML += MATRIX_REGATE[ZOOM][id];
						document.getElementById(id).innerHTML		='<img '+areaname+' src="'+reponse+'" border=0>'+areastr;
						document.getElementById('traj_'+id).innerHTML		='<img src="'+traj+'" border=0>';
						document.getElementById(id).style.display 	 = '';
						document.getElementById('traj_'+id).style.display 	 = '';
					}
					else {
						MATRIX_REGATE[ZOOM][id] = '';		
						MATRIX_TRAJ[ZOOM][id] = '';		
					}			
				}
				else {
					if		(reponse.match(reg1)) 	MATRIX_MAP[FOND][ZOOM][id] = '';
					else if	(reponse) 				{
						document.getElementById('map').innerHTML 	+= MATRIX_MAP[FOND][ZOOM][id];
						document.getElementById(id).innerHTML		 ='<img src="'+reponse+'" border=0>';
						document.getElementById(id).style.display 	 = '';
					}
					else 							MATRIX_MAP[FOND][ZOOM][id] = '';
				}
				NSUB--;
				if(NSUB<1) 	document.getElementById('masque').style.display='none';
			} 
			//else alert('Ajax problem.');
		}
	}
	function div_onoff(id) {
		if(document.getElementById(id).style.visibility == 'visible') 	document.getElementById(id).style.visibility = 'hidden';
		else  															document.getElementById(id).style.visibility = 'visible';
	}
	function show_etiquette(cl) {
		var regexp = new RegExp("[^0-9]+");
		if(cl.match(regexp)) {
			document.getElementById('etiquette_mark').style.visibility = 'visible';
			for(var i =0;i<ETIQUETTE[ZOOM].length;i++) {
				if(ETIQUETTE[ZOOM][i][0] == cl) {
					document.getElementById('nom_wp').innerHTML = ETIQUETTE[ZOOM][i][0];
					switch(ETIQUETTE[ZOOM][i][7]) {
						case 'n' : ETIQUETTE[ZOOM][i][7] = 'N'; break;
						case 's' : ETIQUETTE[ZOOM][i][7] = 'S'; break;
						case 'e' : ETIQUETTE[ZOOM][i][7] = 'E'; break;
						case 'w' : ETIQUETTE[ZOOM][i][7] = 'W'; break;
					}
					document.getElementById('dir_wp').innerHTML = ETIQUETTE[ZOOM][i][7];
				}
			}
		}
		else {
			document.getElementById('etiquette').style.visibility = 'visible';
			for(var i =0;i<ETIQUETTE[ZOOM].length;i++) {
				if(parseInt(ETIQUETTE[ZOOM][i][0])==parseInt(cl)) {
					document.getElementById('etiq_text_distance').innerHTML = 'Distance'
					document.getElementById('etiq_text_time').innerHTML 	= 'Time'
					document.getElementById('etiq_text_nextwp').innerHTML 	= 'Next WP'
					document.getElementById('etiq_classement').innerHTML 	= ETIQUETTE[ZOOM][i][0];
					document.getElementById('etiq_nom').innerHTML 			= ETIQUETTE[ZOOM][i][1];
					document.getElementById('etiq_team').innerHTML 			= ETIQUETTE[ZOOM][i][7];
					if(ETIQUETTE[ZOOM][i][3])	var imgpavillon = '&nbsp;&nbsp;&nbsp;&nbsp;<img src="bateaux/'+ID_REGATE+'/'+ETIQUETTE[ZOOM][i][10]+'/'+ETIQUETTE[ZOOM][i][3]+'" width=50 height=30 align="center">';
					else 						var imgpavillon = '';
					document.getElementById('etiq_pavillons').innerHTML 	= '<img src="images_utiles_6.1/world_flags/'+ETIQUETTE[ZOOM][i][2]+'.gif" width=50 height=30 align="center">'+imgpavillon;
					document.getElementById('etiq_distance').innerHTML 		= ETIQUETTE[ZOOM][i][5];
					document.getElementById('etiq_time').innerHTML 			= ETIQUETTE[ZOOM][i][4];
					document.getElementById('etiq_nextwp').innerHTML 		= ETIQUETTE[ZOOM][i][6];
				}
			}
		}
	}
	function hide_etiquette() {
		document.getElementById('etiquette').style.visibility = 'hidden';
		document.getElementById('etiquette_mark').style.visibility = 'hidden';
	}
	function change_layer(key) {
			document.getElementById('masque').style.display 	= '';
			NSUB++;
		if(key=='fond') {
			CACHE_MAP[FOND][ZOOM] 							= document.getElementById('map').innerHTML;
			FOND 											= document.getElementById('fond').value;
			if(CACHE_MAP[FOND][ZOOM]) 	document.getElementById('map').innerHTML = CACHE_MAP[FOND][ZOOM];
			else 						document.getElementById('map').innerHTML = '';		
			make_map(FOND);
		}
		else if(key=='meteo') {		
			CACHE_METEO[METEO_TIME][ZOOM] 						= document.getElementById('meteo').innerHTML;
			METEO_TIME 											= document.getElementById('hmeteo').value;
			var flag=0;
			for(var h in CACHE_METEO) { if(h==METEO_TIME) { flag=1; break; } }
			if(flag==1) {
				if(CACHE_METEO[METEO_TIME][ZOOM]) 	document.getElementById('meteo').innerHTML = CACHE_METEO[METEO_TIME][ZOOM];
				else 								{
					MATRIX_METEO[METEO_TIME] 							= new Array();	
					for(var i=0;i<13;i++) MATRIX_METEO[METEO_TIME][i] 	= new Array(); 
					document.getElementById('meteo').innerHTML = '';		
				}
			}
			else {
				CACHE_METEO[METEO_TIME] 							= new Array();
				MATRIX_METEO[METEO_TIME] 							= new Array();	
				for(var i=0;i<13;i++) MATRIX_METEO[METEO_TIME][i] 	= new Array(); 
				document.getElementById('meteo').innerHTML = '';		
			}
			make_map('meteo');
		}
		else if(key=='zoom') {
			document.getElementById('dragbag').style.display 	= 'none';
			CACHE_MAP[FOND][ZOOM] 			= document.getElementById('map').innerHTML;
			CACHE_METEO[METEO_TIME][ZOOM] 	= document.getElementById('meteo').innerHTML;
			CACHE_REGATE[ZOOM] 				= document.getElementById('regate').innerHTML;
			CACHE_TRAJ[ZOOM] 				= document.getElementById('traj').innerHTML;
			
			ZOOM 							= document.getElementById('zoom').value;
			FOND 							= document.getElementById('fond').value;
			
			if(CACHE_MAP[FOND][ZOOM]) 			document.getElementById('map').innerHTML = CACHE_MAP[FOND][ZOOM];
			else 								document.getElementById('map').innerHTML = '';		
			make_map(FOND);
				
			if(CACHE_METEO[METEO_TIME][ZOOM]) 	document.getElementById('meteo').innerHTML = CACHE_METEO[METEO_TIME][ZOOM];
			else 								document.getElementById('meteo').innerHTML = '';		
			make_map('meteo');
			
			if(CACHE_REGATE[ZOOM]) 				{
				document.getElementById('regate').innerHTML = CACHE_REGATE[ZOOM];
				document.getElementById('traj').innerHTML = CACHE_TRAJ[ZOOM];
			}
			else 								{
				document.getElementById('regate').innerHTML = '';
				document.getElementById('traj').innerHTML = '';
			}		
			make_map('regate');
			document.getElementById('dragbag').style.display 	= '';
			
		}
		move_pt('ptdep',LONPTDEP,LATPTDEP);
		move_pt('ptarr',LONPTARR,LATPTARR);
		place_deparr();
		NSUB--;
		if(NSUB<1) 	document.getElementById('masque').style.display='none';
	}
	function dec_to_deg(str) {
		var num 	= parseFloat(str);
		if(num<0) var sign = '&nbsp;-';
		else      var sign = '+';
		num = Math.abs(num);
		var deg = Math.floor(num)
		var degstr = new String(deg);
		if		(degstr.length == 1) 	degstr = '00'+degstr;
		else if	(degstr.length == 2)	degstr = '0'+degstr
		var min = (num-deg)*60;
		var fmin = Math.floor(min);
		var minstr = new String(fmin);
		if	(minstr.length == 1) 	minstr = '0'+min.toFixed(2);
		else 						minstr = min.toFixed(2);
		return sign+degstr+'&deg;'+minstr+'\'';
	}
	function move_pt(id,lon,lat) {
		var arr = get_xy_from_lonlat(lon,lat);
		if(id=='ptdep') {
			XPTDEP = arr[0]-6;
			YPTDEP = arr[1]-6;
			document.getElementById(id).style.left = XPTDEP+'px';
			document.getElementById(id).style.top  = YPTDEP+'px';
		}
		else if(id=='ptarr'){
			XPTARR = arr[0]-6;
			YPTARR = arr[1]-6;
			document.getElementById(id).style.left = XPTARR+'px';
			document.getElementById(id).style.top  = YPTARR+'px';
		}
	}
	function ondragstart_pt(ele,mx,my) {
		place_deparr();	
	}
	function ondrag_pt(ele,mdx,mdy) {
		xMoveTo(ele, xLeft(ele) + mdx, xTop(ele) + mdy);
		ele.totalMX += mdx;
		ele.totalMY += mdy;	
		var arr0 = get_lonlat_from_xy(xLeft(ele)+6,xTop(ele)+6); 	
		if(ele.id=='ptdep') {
			LONPTDEP = arr0[0];
			LATPTDEP = arr0[1];
		}
		else if(ele.id=='ptarr'){
			LONPTARR = arr0[0];
			LATPTARR = arr0[1];
		}	
		place_deparr();
	
	}
	function ondragend_pt(ele,mx,my) {
		return ;	
	}
	function centrer_ptdepptarr() {
		xMoveTo('ptdep', WIDTH_SUBMAP-6, WIDTH_SUBMAP-6);
		xMoveTo('ptarr', WIDTH_SUBMAP-6, WIDTH_SUBMAP-6);
		LONPTDEP = LONC;
		LATPTDEP = LATC;
		LONPTARR = LONC;
		LATPTARR = LATC;
		document.getElementById('ligne').innerHTML = '<div id="ortho"></div>';
		document.getElementById('txt_lon_ptdep').innerHTML = dec_to_deg(LONC);
		document.getElementById('txt_lat_ptdep').innerHTML = dec_to_deg(LATC);
		document.getElementById('txt_lon_ptarr').innerHTML = dec_to_deg(LONC);
		document.getElementById('txt_lat_ptarr').innerHTML = dec_to_deg(LATC);
	}
	function go_home() {
		
		document.getElementById('dragbag').style.display 	= 'none';
		CACHE_MAP[FOND][ZOOM] 			= document.getElementById('map').innerHTML;
		CACHE_METEO[METEO_TIME][ZOOM] 	= document.getElementById('meteo').innerHTML;
		CACHE_REGATE[ZOOM] 				= document.getElementById('regate').innerHTML;		
		CACHE_TRAJ[ZOOM] 				= document.getElementById('traj').innerHTML;		
		LONC 			= LONC_INI;
		LATC 			= LATC_INI;
		ZOOM 			= ZOOM_INI;
		FOND 			= FOND_INI;
		METEO_TIME 		= METEO_TIME_INI;
		ID_REGATE 		= ID_REGATE_INI;
		BATEAUX_LISTE 	= BATEAUX_LISTE_INI;
		BATEAUX_FROMTO 	= BATEAUX_FROMTO_INI;
		LONPTDEP 		= LONPTDEP_INI;
		LATPTDEP 		= LATPTDEP_INI;
		LONPTARR 		= LONPTARR_INI;
		LATPTARR 		= LATPTARR_INI;
		document.getElementById('zoom').value 	= ZOOM;
		document.getElementById('fond').value 	= FOND;
		document.getElementById('hmeteo').value = METEO_TIME;
		if(CACHE_MAP[FOND][ZOOM]) 			document.getElementById('map').innerHTML = CACHE_MAP[FOND][ZOOM];
		else 								document.getElementById('map').innerHTML = '';		
		make_map(FOND);	
		if(CACHE_METEO[METEO_TIME][ZOOM]) 	document.getElementById('meteo').innerHTML = CACHE_METEO[METEO_TIME][ZOOM];
		else 								document.getElementById('meteo').innerHTML = '';		
		make_map('meteo');
		if(CACHE_REGATE[ZOOM]) 				{
			document.getElementById('regate').innerHTML = CACHE_REGATE[ZOOM];
			document.getElementById('traj').innerHTML = CACHE_TRAJ[ZOOM];
		}		
		else 								{
			document.getElementById('regate').innerHTML = '';
			document.getElementById('traj').innerHTML = '';
		}		
		make_map('regate');
		move_pt('ptdep',LONPTDEP,LATPTDEP);
		move_pt('ptarr',LONPTARR,LATPTARR);
		place_deparr();
		document.getElementById('dragbag').style.display 	= '';
	}
	function dist_ortho(lond,latd,lona,lata) {
		var f = 0.01745329251994;
		var distortho;
		latd = latd*f;
		lata = lata*f;
		distortho = 60*Math.acos(Math.sin(latd)*Math.sin(lata)+Math.cos(latd)*Math.cos(lata)*Math.cos((lond-lona)*f))/f;
		return distortho.toFixed(2);
	}
	function dist_loxo(lond,latd,lona,lata) {
		var dl,dL,dLg,m;
		var N=30
		dl=(lata-latd)/N
		dl2 = dl*dl
		dL=(lona-lond)/N
		for(var i=0,m=0;i<N;i++) {
			dLg = dL*Math.cos((latd+i*dl)*0.01745329251994);
			m += 60*Math.sqrt(dLg*dLg+dl2);
		}
		return m.toFixed(2);
	}
	function cap_ortho(lond,latd,lona,lata) {
		var f,odx,ody,odz,oax,oay,oaz,b,tdax,tday,tdaz;
		var tdan2x,tdan2y,tdanz,n2x,n2y,nz,e2x,e2y,ez,x,y,cap;
		f = 0.017453292519940;
		latd = latd*f;
		lond = lond*f;
		lata = lata*f;
		lona = lona*f;
		if(lona==lond) {
			if(latd>lata) cap = 180;
			else          cap = 0;
			return cap;
		}
		if(lata==latd) {
			if(lond>lona) cap = 270;
			else          cap = 90;
			return cap;
		}
		var coslond = Math.cos(lond);
		var coslatd = Math.cos(latd);
		var coslona = Math.cos(lona);
		var coslata = Math.cos(lata);
		var sinlond = Math.sin(lond);
		var sinlatd = Math.sin(latd);
		var sinlona = Math.sin(lona);
		var sinlata = Math.sin(lata);
		odx = coslatd*coslond;
		ody = coslatd*sinlond;
		odz = sinlatd;
		oax = coslata*coslona;
		oay = coslata*sinlona;
		oaz = sinlata;
		b = (odx*oax+ody*oay+odz*oaz);
		tdan2x = (-odx+b*oax);
		tdan2y = (-ody+b*oay);
		tdanz  = (-odz+b*oaz);
		n2x = -coslond*sinlatd;
		n2y = -sinlatd*sinlond;
		nz  =  coslatd;
		e2x = -sinlond;
		e2y =  coslond;
		x = tdan2x*n2x+tdan2y*n2y+tdanz*nz;
		y = tdan2x*e2x+tdan2y*e2y;
		if(lond>lona) cap = 360+Math.atan2(y,x)/f;
		else          cap = Math.atan2(y,x)/f;
		if (cap<0)    cap = (cap + 180);
		if (cap>360)  cap = (cap - 180);
		cap = cap.toFixed(0); 	
		if(cap==360)  cap=0;
		return cap;  
	}	
	function cap_loxo(lond,latd,lona,lata) {
		var dl = lata-latd;
		var dL = (lona-lond)*Math.cos(0.017453292519940*latd);
		var cap = 180*(Math.PI/2-Math.atan2(dl,dL))/Math.PI;
		if(cap<0) cap =360+cap;
		return cap.toFixed(0);
	}	
	function drawLine( lineIndex, x1, y1, x2, y2 )
	{
		objectHandle = document.getElementById( "line"+ lineIndex )
		if( !objectHandle )
		{
			document.getElementById('ligne').innerHTML += "<img id='line"+ lineIndex +"' class='line' border=0/>"
			objectHandle = document.getElementById( "line"+ lineIndex )
		}
	
		updateLine( objectHandle, x1, y1, x2, y2 )
	}

	function updateLine( lineObjectHandle, Ax, Ay, Bx, By )
	{
		var
			xMin		= Math.min( Ax, Bx ),
			yMin		= Math.min( Ay, By ),
			xMax		= Math.max( Ax, Bx ),
			yMax		= Math.max( Ay, By ),
			boxWidth	= Math.max( xMax-xMin, 1 ),
			boxHeight	= Math.max( yMax-yMin, 1 ),
			tmp			= Math.min( boxWidth, boxHeight, 256 ),
			lineIndex	= (Bx-Ax)*(By-Ay)<0?0:1
	
		while( tmp>>=1 ) lineIndex+=2
	
		lineObjectHandle.src = preloadedImages[lineIndex].src
		with( lineObjectHandle.style ) {
			width	= boxWidth	+"px"
			height	= boxHeight	+"px"
			left	= xMin		+"px"
			top		= yMin		+"px"
		}
	}
	function draw_loxo() {
		for(var i=0;i<=100;i++) {
				try { document.getElementById( "line"+(i+10) ).style.visibility = 'hidden'; }
				catch(e) { break; }
		}  
		var leftdep = xLeft('ptdep')-XV0+6;
		var topdep  = -YV1+xTop('ptdep')+6;	
		var leftarr = xLeft('ptarr')-XV0+6;
		var toparr  = -YV1+xTop('ptarr')+6;	
		
		if(leftdep>leftarr) { var leftmax = leftdep; 	var leftmin = leftarr; }
		else 				{ var leftmax = leftarr; 	var leftmin = leftdep; }
		if(topdep>toparr) 	{ var topmax = topdep; 		var topmin = toparr; }
		else 				{ var topmax = toparr; 		var topmin = topdep; }
		
		var w = leftmax-leftmin;
		var h = topmax-topmin;
		
		document.getElementById('ligne').style.left 	= leftmin+'px';
		document.getElementById('ligne').style.top 		= topmin+'px';
		document.getElementById('ligne').style.width	= w+'px';
		document.getElementById('ligne').style.height 	= h+'px';
			
		drawLine(0,leftmax-leftdep,topmax-topdep,leftmax-leftarr,topmax-toparr);
	
	}
function draw_ortho() {
   	var z  = Math.pow(2,parseInt(ZOOM));
	
	
	var leftdep = xLeft('ptdep')-XV0+6;
	var topdep  = -YV1+xTop('ptdep')+6;	
	var leftarr = xLeft('ptarr')-XV0+6;
	var toparr  = -YV1+xTop('ptarr')+6;	
	
	if(leftdep>leftarr) { var leftmax = leftdep; 	var leftmin = leftarr; }
	else 				{ var leftmax = leftarr; 	var leftmin = leftdep; }
	if(topdep>toparr) 	{ var topmax = topdep; 		var topmin = toparr; }
	else 				{ var topmax = toparr; 		var topmin = topdep; }
	
	var w = Math.abs(leftmax-leftmin);
	var h = Math.abs(topmax-topmin);
	
	var xdep = leftdep-leftmin;
	var ydep = topdep-topmin;
	var xarr = leftarr-leftmin;
	var yarr = toparr-topmin;
   
	if		(LONPTARR>LONPTDEP&&LATPTARR>LATPTDEP) { var sign1 =  1; var sign2 = -1;}
	else if	(LONPTARR>LONPTDEP&&LATPTARR<LATPTDEP) { var sign1 =  1; var sign2 =  1;}
	else if	(LONPTARR<LONPTDEP&&LATPTARR>LATPTDEP) { var sign1 = -1; var sign2 = -1;}
	else if	(LONPTARR<LONPTDEP&&LATPTARR<LATPTDEP) { var sign1 = -1; var sign2 =  1;}
	
  	var str = '';
 	for(var i=0,l=LATPTDEP,L=LONPTDEP;i<=300;i++) {
		var cap = cap_ortho(L,l,LONPTARR,LATPTARR);    
		newl = l+ Math.sin(1.570796326795000-cap*0.017453292519940)/z;
		newL = L+(Math.cos(1.570796326795000-cap*0.017453292519940)/Math.cos(newl*0.017453292519940))/z;
   		if(Math.abs(newL-LONPTDEP)>Math.abs(LONPTARR-LONPTDEP)) { newL = L; newl=l; }
		var x = xdep+sign1*w*(newL-LONPTDEP)/(LONPTARR-LONPTDEP);
		var y = ydep+sign2*h*(newl-LATPTDEP)/(LATPTARR-LATPTDEP);
		str += '<div id="ortho'+i+'" class="pixel" style="left:'+x+'px;top:'+y+'px;"><img src="images_utiles_6.1/pixel_ortho.gif"></div>';
		l = newl;
		L = newL;
		if(newL< (LONPTARR+0.1)&&newL> (LONPTARR-0.1)&&newl<(LATPTARR+0.1)&&newl> (LATPTARR-1)) break; 
	}   
   document.getElementById('ortho').innerHTML = str;
  
}
function switch_loxortho() {
	if(LOXO==1) { 
		draw_ortho(); 
		LOXO=0; 
		//problÃ¨me : les 2 lignes suivantes ne fonctionnent pas, il faut
		//inscrire la couleur "on" du cap ortho en dur, sans accÃ¨s aux css
		//document.getElementById('txt_cap_ortho').style.className 	= 'txt_cap_ortho_on';
		//document.getElementById('txt_dist_ortho').style.className 	= 'txt_dist_ortho_on';
		document.getElementById('txt_cap_ortho').style.color 		= '#ff00ff';
		document.getElementById('txt_dist_ortho').style.color 		= '#ff00ff';
	}
	else 		{ 
		document.getElementById('ortho').innerHTML = ''; 
		LOXO=1; 
		place_deparr();
		//draw_loxo(); 
		//document.getElementById('txt_cap_ortho').style.className 	= 'txt_cap_ortho';
		//document.getElementById('txt_dist_ortho').style.className 	= 'txt_dist_ortho';
		document.getElementById('txt_cap_ortho').style.color 		= '';
		document.getElementById('txt_dist_ortho').style.color 		= '';
	}

}
function place_deparr() {
	document.getElementById('txt_lon_ptdep').innerHTML = dec_to_deg(LONPTDEP);
	document.getElementById('txt_lat_ptdep').innerHTML = dec_to_deg(LATPTDEP);
	document.getElementById('txt_lon_ptarr').innerHTML = dec_to_deg(LONPTARR);
	document.getElementById('txt_lat_ptarr').innerHTML = dec_to_deg(LATPTARR);
	var distloxo 	= 	parseFloat(dist_loxo(LONPTDEP,LATPTDEP,LONPTARR,LATPTARR));
	var distortho 	= 	parseFloat(dist_ortho(LONPTDEP,LATPTDEP,LONPTARR,LATPTARR));
	var caploxo 	= 	parseInt(cap_loxo(LONPTDEP,LATPTDEP,LONPTARR,LATPTARR));
	var caportho 	= 	parseInt(cap_ortho(LONPTDEP,LATPTDEP,LONPTARR,LATPTARR));
	document.getElementById('txt_cap_loxo').innerHTML = caploxo+'&deg';
	document.getElementById('txt_dist_loxo').innerHTML = distloxo.toFixed(2)+'nm';
	document.getElementById('txt_cap_ortho').innerHTML = caportho+'&deg';
	document.getElementById('txt_dist_ortho').innerHTML = distortho.toFixed(2)+'nm';
	draw_loxo();
	if(LOXO==0) draw_ortho();
}

function get_gmttime() {	
	var dat = new Date();
	var time_gmt = dat.getTime()+dat.getTimezoneOffset()*60000;		
	dat.setTime(time_gmt);		
	var annee 	= dat.getFullYear();
	var mois 	= (((dat.getMonth()+1) 	< 10) ? "0" : "")+(dat.getMonth()+1);
	var jour 	= ((dat.getDate() 		< 10) ? "0" : "")+dat.getDate();
	var heure 	= ((dat.getHours() 		< 10) ? "0" : "")+dat.getHours();
	return annee+mois+jour+heure;	
}
function update_deparr(lon,lat,lonnext,latnext) {
	LONPTDEP = LONPTDEP_INI = lon;
	LATPTDEP = LATPTDEP_INI = lat;
	LONPTARR = LONPTARR_INI = lonnext;
	LATPTARR = LATPTARR_INI = latnext;
	move_pt('ptdep',LONPTDEP,LATPTDEP);
	move_pt('ptarr',LONPTARR,LATPTARR);
	place_deparr();
}
function update_display_boats(liste_bateaux,liste_fromto) {
	
	//console.debug(liste_fromto+'/'+liste_bateaux);
	
	BATEAUX_FROMTO_INI = BATEAUX_FROMTO = liste_fromto;
	BATEAUX_LISTE_INI  = BATEAUX_LISTE = liste_bateaux;
	//reset_regate_matrix();
	//make_map('regate');		
	

}
function update_preferences(zoom,fondcarte,theme) {
	if(fondcarte=='') fondcarte = 'uni';
	var regexp = new RegExp('jpl:');
	var fond = fondcarte.replace(regexp,'');
	if(ZOOM!=zoom  || FOND!=fond) {
		var N = document.getElementById('fond').options.length;
		for(var i=0;i<N;i++) {
			if(document.getElementById('fond').options[i].value == fond) document.getElementById('fond').selectedIndex = i;
		}
		var N = document.getElementById('zoom').options.length;
		for(var i=0;i<N;i++) {
			if(document.getElementById('zoom').options[i].value == zoom) document.getElementById('zoom').selectedIndex = i;
		}
		change_layer('zoom');
		FOND_INI = fond;
		ZOOM_INI = zoom;
	}
	if(THEME!=theme) {
		THEME_INI = THEME = theme;
		set_images_theme();
	}
}
function set_images_theme() {
		var arr = new Array('ortho','map','meteo','regate','traj','repere','home','dac');
		var regexp = new RegExp('(themes/[0-9]+/)');
		for( var i=0; i< arr.length; i++) {
			document.getElementById('icone_'+arr[i]).src = document.getElementById('icone_'+arr[i]).src.replace(regexp,'themes/'+THEME+'/');
		}
}
function reset_meteo_matrix() {
	CACHE_METEO					= new Array();	
	CACHE_METEO[METEO_TIME]		= new Array();		
	MATRIX_METEO 				= new Array();
	MATRIX_METEO[METEO_TIME] 	= new Array();	
	for(var i=0;i<13;i++) MATRIX_METEO[METEO_TIME][i] = new Array(); 
	document.getElementById('meteo').innerHTML = '';
}
function reset_regate_matrix() {
	CACHE_REGATE			= new Array();	
	MATRIX_REGATE 			= new Array();
	for(var i=0;i<13;i++) MATRIX_REGATE[i] 	= new Array(); 	
	CACHE_TRAJ				= new Array();	
	MATRIX_TRAJ 			= new Array();
	for(var i=0;i<13;i++) MATRIX_TRAJ[i] 	= new Array(); 
	ETIQUETTE				= new Array();	
	for(var i=0;i<13;i++) ETIQUETTE[i] 		= new Array(); 
	document.getElementById('regate').innerHTML = '';
	document.getElementById('traj').innerHTML = '';
}
function update_refresh(lon,lat,lonnext,latnext,gmttime) {
	var time_now = new String(get_gmttime());
	LONC_INI = LONC = lon;
	LATC_INI = LATC = lat;
	LONPTDEP_INI = LONPTDEP = lon;
	LATPTDEP_INI = LATPTDEP = lat;
	LONPTARR_INI = LONPTARR = lonnext;
	LATPTARR_INI = LATPTARR = latnext;
	var dat_maj = new Date();
	var time_update = dat_maj.getTime()+dat_maj.getTimezoneOffset()*60000;		
	var heure 	= dat_maj.getHours();
	
	if(heure<7) { time_update = time_update-(24*3600*1000); }
	dat_maj.setTime(time_update);
	var annee 	= dat_maj.getFullYear();
	var mois 	= dat_maj.getMonth()+1;
	var jour 	= dat_maj.getDate();
	var heure	= 6;
	dat_maj.setFullYear(annee);
	dat_maj.setMonth(mois);
	dat_maj.setDate(jour);
	dat_maj.setHours(heure);
	dat_maj.setMinutes(0);
	dat_maj.setSeconds(0);
	dat_maj.setMilliseconds(0);
	time_update = dat_maj.getTime();

	var regexp = new RegExp('(....)(..)(..)(..)');
	var regexp2 = new RegExp('^0');
	var annee 	= parseInt(METEO_TIME_INI.replace(regexp,'$1'));
	var mois 	= parseInt(METEO_TIME_INI.replace(regexp,'$2').replace(regexp2,''));
	var jour 	= parseInt(METEO_TIME_INI.replace(regexp,'$3').replace(regexp2,''));
	var heure 	= parseInt(METEO_TIME_INI.replace(regexp,'$4').replace(regexp2,''));
	
	var dat_ini = new Date();
	dat_ini.setFullYear(annee);
	dat_ini.setMonth(mois);
	dat_ini.setDate(jour);
	dat_ini.setHours(heure);
	dat_ini.setMinutes(0);
	dat_ini.setSeconds(0);
	dat_ini.setMilliseconds(0);
	time_ini = dat_ini.getTime();
	
	var diff = (time_ini-time_update)/(1000*3600);
	
	if(time_now != METEO_TIME_INI) {
		if(diff>24 || diff<1) {
			METEO_TIME_INI = METEO_TIME = time_now;
			reset_meteo_matrix()
			reset_regate_matrix();
		}
		else {
			METEO_TIME_INI = METEO_TIME = time_now;
			//METEO_TIME = time_now;
			CACHE_METEO[METEO_TIME] 							= new Array();
			MATRIX_METEO[METEO_TIME] 							= new Array();	
			for(var i=0;i<13;i++) MATRIX_METEO[METEO_TIME][i] 	= new Array();
			document.getElementById('meteo').innerHTML = '';			
			reset_regate_matrix();
		}
		make_map('meteo');
		make_map('regate');
		make_map(FOND);
		update_deparr(lon,lat,lonnext,latnext);
		requestAjaxMenuMeteo();
	
	}
	else go_home();
}
function requestAjaxMenuMeteo(){		
	var http_request = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType)  http_request.overrideMimeType('text/xml');
	} 
	else if (window.ActiveXObject) { // IE
		try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } 
		catch (e) { 
			try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } 
			catch (e) {}
		}
	}
	if (!http_request) {
		alert('Abandon : Impossible de créer une instance XMLHTTP');
		return false;
	}
	http_request.onreadystatechange = function() { receiveAjaxMenuMeteo(http_request); };
	http_request.open('GET','serveur_menu_meteo_6.1.php', true);
	http_request.send(null);			
}
function receiveAjaxMenuMeteo(http_request) {
	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
			var reponse = new String(http_request.responseText);
			var str 	= new String(reponse.substring(9,reponse.length-10));
			reponse 	= unescape(str);
			document.getElementById('menu_meteo').innerHTML = reponse;
		} 
		//else alert('Un problème est survenu avec la requête Ajax.');
	}
}
function setActiveStyleSheet(title) {
   var i, a, main;
   for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
     if(a.getAttribute("rel").indexOf("style") != -1
        && a.getAttribute("title")) {
       a.disabled = true;
       if(a.getAttribute("title") == title) a.disabled = false;
     }
   }
}









