function include(src, attributes) {
	try {
		attributes = attributes || {};
		attributes.type = "text/javascript";
		attributes.src = src;

		var script = document.createElement("script");
		for(aName in attributes)
			script[aName] = attributes[aName];

		document.getElementsByTagName("head")[0].appendChild(script);
		return true;
	} catch(e) { return false; }
}

include("/sfJqueryReloadedPlugin/js/plugins/jquery.json-2.2.js");


include("/js/clustering/Fluster2ProjectionOverlay.js");
include("/js/clustering/Fluster2ClusterMarker.js");
include("/js/clustering/Fluster2Cluster.js");
include("/js/clustering/Fluster2.js");

var nav = {}; // see /LOG/init
nav.navpoint= new Array();
nav.navname= new Array();
nav.navlink= new Array();
navmarker = new Array(); 
var fluster;

var map;
var poly;
var geocoder;
var infowindow;
var find=false;


function showDialog(_title, _url, _width) {
	  $(function() {
		$("#dialog").dialog('destroy');
		$("#dialog").attr("title", _title);
		$("#dialog").html($("#spinnerglob").html());
		$("#dialog").load(_url, function() {$('#dialog').dialog('option', 'position', 'center');})
		$("#dialog").dialog({
		  width: _width,
		  height:'auto',
		  bgiframe: true,
		  modal: true,
		  resizable:false
		});
	  });
	}

$(document).ready(function()
{
	$(function() {
		$("#tabs").tabs();
	});
	
	
	
	$("#loader").hide();
    var myOptions = {
      zoom: 6,
      center: new google.maps.LatLng(48, 2),
      disableDefaultUI: false,
      mapTypeId: google.maps.MapTypeId.TERRAIN  
    }
    map = new google.maps.Map(document.getElementById("log_map"),myOptions);
	fluster = new Fluster2(map);
	
	var polyOptions = {
    path: nav.navpoint,
    strokeColor: '#000000',
    strokeOpacity: 1.0,
    strokeWeight: 3
  }
  poly = new google.maps.Polyline(polyOptions);
  poly.setMap(map);
	geocoder = new google.maps.Geocoder();
	google.maps.event.addListener(map, 'click', function(event) {addLatLng(event);});
	$.get("/services.php/AD/xml", {}, function(data) {

									
      jQuery(data).find("marker").each(function() {
        var marker = jQuery(this);
		
        var latlng = new google.maps.LatLng(parseFloat(marker.attr("lat")),
                                    parseFloat(marker.attr("lng")));
		var msize = new google.maps.Size(15,16);
		var opnt = new google.maps.Point(0,0);
		var anch = new google.maps.Point(7,8);
		var img= new google.maps.MarkerImage("/images/icones/" + marker.attr("img"),msize,opnt,anch);
		
		
        var markerad = new google.maps.Marker({position: latlng, icon:img, title:marker.attr("label")});
		fluster.addMarker(markerad);

		google.maps.event.addListener(markerad, 'click', function(event) {addLatLng2(markerad);});
		//google.maps.event.addListener(markerad, 'mouseover', function() {info(markerad);});
     });
	  
	// Initialize Fluster
	// This will set event handlers on the map and calculate clusters the first time.
	fluster.initialize();
    });
	
	infowindow = new google.maps.InfoWindow({disableAutoPan:true});
	$.ajaxSetup({ cache: false });
	$.getJSON("/services.php/LOG/init", function(data) {
												 
		if (data == null) {
			return;
		}
		nav = data;
		
		for (i=0; i<data.navpoint.length; i++) {
			nav.navpoint[i] = new google.maps.LatLng(data.navpoint[i].a, data.navpoint[i].b);
		}
		
		for (i=0; i<data.navlink.length; i++) {
			
			/*if (data.navlink[i] == "") {
				new function () { // hack to keep marker scope...
					var marker = new google.maps.Marker({position: nav.navpoint[i],map: map});
					navmarker.push(marker);
					marker.setDraggable(true);
					google.maps.event.addListener(marker, 'click', function(event) {deletemarker(marker);});
					google.maps.event.addListener(marker, 'dragstart', function() {draggedMarker=marker.getPosition();});
					google.maps.event.addListener(marker, 'dragend', function() {moveLatLng(marker);draggedMarker=null;});
				}();
			} 
			else 
			{
				navmarker.push("");
			}*/
			lat=nav.navpoint[i].lat();
			lng=nav.navpoint[i].lng();
			
			//$.get("/services.php/AD/xml?lat=" + lat +"&lng=" + lng, {}, function(data) {
			$.ajax({
			url: "/services.php/AD/xml?lat=" + lat + "&lng=" + lng,
			async: false,
			success: function(data) { 
			
				find=false;
				
				jQuery(data).find("marker").each(function() {
					find=true;
					
					var marker = jQuery(this);
					var latlng = new google.maps.LatLng(parseFloat(marker.attr("lat")),parseFloat(marker.attr("lng")));
					var msize = new google.maps.Size(15,16);
					var opnt = new google.maps.Point(0,0);
					var anch = new google.maps.Point(7,8);
					var img= new google.maps.MarkerImage("/images/icones/" + marker.attr("img"),msize,opnt,anch);
					var markerad = new google.maps.Marker({position: latlng, icon:img, title:marker.attr("label")});
					fluster.addMarker(markerad);
					google.maps.event.addListener(markerad, 'click', function(event) {addLatLng2(markerad);});
					navmarker.push("");
					
				});
				//si find est toujours nul on a pas trouvé de point on colle un marque
				
				if (find==false)
				{
					new function () { // hack to keep marker scope...
						var marker = new google.maps.Marker({position: nav.navpoint[i],map: map});
						
						navmarker.push(marker);
						marker.setDraggable(true);
						google.maps.event.addListener(marker, 'click', function(event) {deletemarker(marker);});
						google.maps.event.addListener(marker, 'dragstart', function() {draggedMarker=marker.getPosition();});
						google.maps.event.addListener(marker, 'dragend', function() {moveLatLng(marker);draggedMarker=null;});
					}();
				}							   
			}
			});
			
			
			
		}

		poly.setPath(nav.navpoint);
		
		// user options
		if (nav.speed != null) {
			$("#speed").val(nav.speed);
		}
		maj_lognav();
	});
});

function info(marker) {
	a = marker.getTitle().split(" - ");
	if (a.length != 0) {
		$.get("/services.php/AD/info/q/"+a[0], function(res) {
			infowindow.setContent(res);
			infowindow.open(map, marker);
		});
	}
}

function pushLatLng(res, i) {
	if (i>=0) {
		nav.navname[i] = res;
	} else {
		nav.navname.push(res);
	}
}

function extractTown(geo) {
	for (i=0; i<geo.address_components.length; i++) {
		comp = geo.address_components[i];
		if (comp.types[0] == "locality") {
			return comp.long_name;
		}
	}
	return geo.formatted_address;

}

function codeLatLng2(latlng, i) {
	if (geocoder) {
		geocoder.geocode({'latLng': latlng}, function(results, status) {
			res_geo=results[0];				  
			if (status == google.maps.GeocoderStatus.OK) {
				town = extractTown(results[0]);
				s = town + " ("+deg2dms(latlng.lat())+", "+deg2dms(latlng.lng())+")";
				pushLatLng(s, i);
			} else {
				pushLatLng(latlng, i);
			}
			maj_lognav();
		});
	}
	else
	{
		pushLatLng(latlng, i);
	}
}

function codeLatLng(latlng) {
	codeLatLng2(latlng, -1);
}

function print_nav()
{
	vart="";
	vard="";
	varr="";
	for (i=0;i<nav.navpoint.length-1;i++)
	{
		vart=vart+";"+format_temps(temps(i));
		vard=vard+";"+distance(i);
		varr=varr+";"+course(i);
	}
	if (vart.length>0) vart=vart.substring(1);
	if (vard.length>0) vard=vard.substring(1);
	if (varr.length>0) varr=varr.substring(1);
	varm=nav.navname.join(";");
	
	window.open("/LOG/print?navpoint=" + encodeURIComponent(varm) + "&t=" + vart + "&d=" + vard+ "&c=" + varr + "&u=" + getDistanceUnit());
}

// add a known point
function addLatLng2(markerad) {
  
var g=0;
var changement=false;
for (i=0;i<=nav.navpoint.length;i++)
{
	if (markerad.getTitle()==nav.navname[i])
	{
		g=i;	
		i=nav.navpoint.length;
		changement=true;
	}
}

if (changement)
{
	nav.navpoint.splice(g,1);
	nav.navname.splice(g,1);
	nav.navlink.splice(g,1);
	navmarker.splice(g,1);
}
else
{
	a=markerad.getTitle();
	a=a.split(" - ");
	link="";
	if (a[0].length>3) {
		link = a[0];
	}

	pushNav(markerad.getTitle(), markerad.getPosition(), "", link);
}
 poly.setPath(nav.navpoint);
 maj_lognav();
}

function pushNav(name, point, marker, link) {
	nav.navname.push(name);
	nav.navpoint.push(point);
	navmarker.push(marker);
	if (link != "") {
		nav.navlink.push(" <small><a href='/" + link + "' target='_blank'>d&eacute;tail terrain</a></small>");
	} else {
		nav.navlink.push("");
	}

}

var draggedMarker = null;

// add a random point
function addLatLng(event) {
  var marker = new google.maps.Marker({position: event.latLng,map: map});
  navmarker.push(marker);
  marker.setDraggable(true);
  codeLatLng(event.latLng);
  nav.navpoint.push(event.latLng);
  nav.navlink.push("");
  google.maps.event.addListener(marker, 'click', function(event) {deletemarker(marker);});
  google.maps.event.addListener(marker, 'dragstart', function() {draggedMarker=marker.getPosition();});
  google.maps.event.addListener(marker, 'dragend', function() {moveLatLng(marker);draggedMarker=null;});
  poly.setPath(nav.navpoint);
  maj_lognav();
 
}

function moveLatLng(marker) {
	for (i=0; i<=nav.navpoint.length; i++) {
		if (draggedMarker == nav.navpoint[i]) {
			nav.navpoint[i] = marker.getPosition();
			codeLatLng2(nav.navpoint[i], i);
			nav.navlink[i] = "";
			navmarker[i] = marker;
			poly.setPath(nav.navpoint);
			maj_lognav();
			return;
		}
	}
}


function deletemarker(marker) {
	
var g=0;
for (i=0;i<=nav.navpoint.length;i++)
{
	
	if (marker.getPosition()==nav.navpoint[i])
	{
		marker.setVisible(false);
		g=i;
		
		i=nav.navpoint.length;
		nav.navpoint.splice(g,1);
		nav.navname.splice(g,1);
		nav.navlink.splice(g,1);
		navmarker.splice(g,1);
		poly.setPath(nav.navpoint);
		maj_lognav();
	}
}


 
}

function maj_lognav()
{
	nav.speed=$("#speed").val();
	$.ajax({url:"/services.php/LOG/maj?q="+encodeURIComponent($.toJSON(nav))});
	
	$("#loader").show();
	tmp=0;
	dist=0;
	$("#table_log").html('<thead><tr><th width="21"></th><th width="16"></th><th>Point</th><th>Distance</th><th>Route vraie</th><th>Tps</th></tr></thead>');
	$("#table_log").append('<tbody>');
	for (i=1;i<=nav.navpoint.length;i++)
	{
		ajoute(i,nav.navname[i-1]);
	}
	
	for (i=0;i<=nav.navpoint.length-2;i++)
	{
		if (nav.navpoint.length>1)
			{
				dist=dist+distance(i);
				tmp=tmp+temps(i);
			}
	}
	
	if (nav.navpoint.length>1)
	{
		$("#table_log").append('<tr><td>&nbsp;</td><td></td><td>TOTAL</td><td class="centrer">' + format_distance(dist) +'</td><td class="centrer">&nbsp;</td><td class="centrer">' + format_temps(tmp) + '</td></tr>');
	}
	$("#table_log").append('</tbody>');

	$("#loader").hide();
}

function getSpeedUnit() {
	return $("input[name='speed_unit']:checked").attr("alt");
}

function getDistanceUnit() {
	return $("input[name='distance_unit']:checked").attr("alt");
}

function getSpeed() {
	return $("#speed").val();
}

function format_temps(d)
{
	$(function() {
		if (getSpeed() != 0) {
			d=Math.round(d);
			m=d%60;
			d=d-m;
			h=Math.round(d/60);
			
			if (m<10)
			{
				m="0" + m;
			}
			if (h<10)
			{
				h="0" + h;
			}
		} else {
			h = m = "&nbsp;--&nbsp;";
		}
		
		e=h + ":" + m;

	});
	return e;
}

function temps(i)
{
	$(function() {
		conv_d = (getSpeedUnit() == 'km/h' ? 1.852 : 1);
		d=distance(i);
		d=d*60/getSpeed() * conv_d;
	});
	return d;
}

function distance(i)
{	
	lat1=nav.navpoint[i].lat();
	lat2=nav.navpoint[i+1].lat();
	lon1=nav.navpoint[i].lng();
	lon2=nav.navpoint[i+1].lng();
	
	a=3444 * Math.PI * Math.sqrt((lat1 - lat2) * (lat1 - lat2) + Math.cos(lat1 / 57.29578) * Math.cos(lat2 / 57.29578) * (lon1 - lon2) * (lon1 - lon2)) / 180;
	
	return Math.round(a*10)/10;
}

function format_distance(d) {
	return (d * (getDistanceUnit() == "km" ? 1.852 : 1)).toFixed(1) + " " + getDistanceUnit();
}

function deg2dms(dd) {
	d = Math.floor(dd);
	mm = ( dd - d ) * 60;
	return d+"° "+mm.toFixed(3)+"'";
}

function course(i)
{
	lat1=nav.navpoint[i].lat();
	lat2=nav.navpoint[i+1].lat();
	lon1=nav.navpoint[i].lng();
	lon2=nav.navpoint[i+1].lng();
	
	lat1=(Math.PI/180)*lat1;
	lat2=(Math.PI/180)*lat2;
	lon1=(Math.PI/180)*lon1;
	lon2=(Math.PI/180)*lon2;
	
	a=Math.atan2(Math.sin(lon1-lon2)*Math.cos(lat2),Math.cos(lat1)*Math.sin(lat2)-Math.sin(lat1)*Math.cos(lat2)*Math.cos(lon1-lon2)) % (2*Math.PI);
	a=(180/Math.PI)*a;
	
	if (a<0)
	{
		a=-a;
	}
	else
	{
		a=-a+360;
	}
	
	a=Math.round(a);
	
	if (a<10)
	{
		a="00" + a;
	}
	else if (a<100)
	{
		a="0" + a;
	}
	
	return a;
	
	
}

	function ajoute(i,nom)
	{
		$(function(){
		
		if (nav.navlink[i-1]!="")
		{
			link=nav.navlink[i-1];
		}
		else
		{
			link="";
		}
		
		if (i==1)
		{
			$("#table_log").append("<tr id='row" + i + "a'><td class='row1 border'></td><td class='row1 border' rowspan='2'><a href='#' onClick='supp(" + i + ")'><img border='0' src='/images/supprimer.png'/></a></td><td class='row1 border' rowspan='2'><div class='inline' onclick='map.setCenter(nav.navpoint["+i+"-1]);'>"+ nom + "</div>"+  link + "</td><td class='row1 border'></td><td class='row1 border'>&nbsp;</td><td class='row1 border'>&nbsp;</td></tr>");
		}
		else
		{
			if (i==(nav.navpoint.length)) {
				rowspan="";
			} else {
				rowspan=" rowspan='2' ";
			}
			$("#table_log").append("<tr id='row" + i + "a'><td class='row1 border'><a href='#' onclick='down("+i+")'><img border='0' src='/images/down.png'/></a></td><td class='row1 border centrer' rowspan='2'>" + format_distance(distance(i-2)) + "</td><td class='row1 border centrer' rowspan='2'>" + course(i-2) + "&deg; </td><td class='row1 border centrer' rowspan='2'>" + format_temps(temps(i-2)) + "</td></tr>");
			$("#table_log").append("<tr id='row" + i + "b'><td class='row1 border'><a href='#' onclick='up("+i+")'><img border='0' src='/images/up.png'/></a></td><td class='row1 border'"+rowspan+"><a href='#' onClick='supp(" + i + ")'><img border='0' src='/images/supprimer.png'/></a></td><td class='row1 border'"+rowspan+"><div class='inline' onclick='map.setCenter(nav.navpoint["+i+"-1]);'>"+ nom + "</div>"+  link +  "</td></tr>");
		}
	});
	}
	
	function supp(i)
	{
		i--;
		nav.navpoint.splice(i,1);
		nav.navname.splice(i,1);
		nav.navlink.splice(i,1);
		if (navmarker[i]!="") {
			navmarker[i].setVisible(false);
		}
		navmarker.splice(i,1);
		poly.setPath(nav.navpoint);
		maj_lognav();
	}
	
	function close_nav()
	{
		if (nav.navpoint.length>=2)
		{
		
		if (navmarker[0]=="")
		{
			nav.navpoint.push(nav.navpoint[0]);
			nav.navname.push(nav.navname[0]);
			nav.navlink.push(nav.navlink[0]);
			navmarker.push("");
		}
		else
		{
			var marker = new google.maps.Marker({position: navmarker[0].getPosition(),map: map});
  			navmarker.push(marker);
  			codeLatLng(navmarker[0].getPosition());
  			nav.navpoint.push(navmarker[0].getPosition());
  			nav.navlink.push("");
 			google.maps.event.addListener(marker, 'click', function(event) {deletemarker(marker);});
			
		}
		
		
		
		maj_lognav();
		poly.setPath(nav.navpoint);
		}
	}
	
	function up(i)
	{
		nav.navpoint.splice(i-2,0,nav.navpoint[i-1]);
		nav.navpoint.splice(i,1);

		nav.navname.splice(i-2,0,nav.navname[i-1]);
		nav.navname.splice(i,1);
		
		nav.navlink.splice(i-2,0,nav.navlink[i-1]);
		nav.navlink.splice(i,1);
		
		navmarker.splice(i-2,0,navmarker[i-1]);
		navmarker.splice(i,1);
		
		maj_lognav();
		poly.setPath(nav.navpoint);
	}
	
	
	function down(i)
	{
		nav.navpoint.splice(i,0,nav.navpoint[i-2]);
		nav.navpoint.splice(i-2,1);

		nav.navname.splice(i,0,nav.navname[i-2]);
		nav.navname.splice(i-2,1);
		
		nav.navlink.splice(i,0,nav.navlink[i-2]);
		nav.navlink.splice(i-2,1);
		
		navmarker.splice(i,0,navmarker[i-2]);
		navmarker.splice(i-2,1);
		
		maj_lognav();
		poly.setPath(nav.navpoint);
	}
	
	function return_nav()
	{
		if (nav.navpoint.length>=2)
		{
		nav.navpoint.reverse();
		nav.navname.reverse();
		nav.navlink.reverse();
		navmarker.reverse();
		maj_lognav();
		poly.setPath(nav.navpoint);
		}
	}
	
	$(document).ready(function(){
					
		$('#saisie').autocomplete("/services.php/AD/search",{minChars:2});
			 
			
		
		$("#saisie").result(function(event, data, formatted) {
			$("#loader").show();
			$.get("/services.php/AD/getpos?q=" + data[1] + "&a=" + data[2],function(res){
				
				
				a=res.split(",");	
				if (nav.navname[nav.navname.length-1]!=$("#saisie").attr("value"))
				{
																  
  				
				m="";
				if (data[2]!="A")
				{
					//on génere un marker VOR ou Point VFR
					var latlng = new google.maps.LatLng(a[0], a[1]);
					var msize = new google.maps.Size(15,16);
					var opnt = new google.maps.Point(0,0);
					var anch = new google.maps.Point(7,8);
					
					if (data[2]=="V") {
                        var img= new google.maps.MarkerImage("/images/icones/vor.png",msize,opnt,anch);
					} else if (data[2]=="P") {
                        var img= new google.maps.MarkerImage("/images/icones/ptvfr.png",msize,opnt,anch);
					} else if (data[2]=="U") {
                        var img= new google.maps.MarkerImage("/images/icones/ulm.png",msize,opnt,anch);
                    } else if (data[2]=="N") {
                        var img= new google.maps.MarkerImage("/images/icones/ndb.png",msize,opnt,anch);
                    }
					
					var markervor = new google.maps.Marker({position: latlng, map: map, icon:img});
					google.maps.event.addListener(markervor, 'click', function(event) {addLatLng2(markervor);});
					markervor.setTitle($("#saisie").attr("value"));
					
					m = markervor;
				}
				
				link="";
				if (data[2]=="A" || data[2]=="U")
				{
					b=$("#saisie").attr("value");
					b=b.split(" - ");
					link=b[0];
				}
				
				// name, point, marker, link
				pushNav($("#saisie").attr("value"), new google.maps.LatLng(a[0], a[1]), m, link);
				
				
				poly.setPath(nav.navpoint);
 				maj_lognav();
				
				}
				$("#saisie").attr("value","");
				 
			});		
			$("#loader").hide();
			});
			
		});
		
