var points = [];
var marker = null;
var highlighted_marker = null;
var point_markers = [];
var point_markers_html = [];
var map = null;
var geocoder = null;
var lastPoint;
var CompleteWay = new Array();
var GraphicWay;
var CurrentMarker;
var CurrentMarkerId;
var CurrentMarkerIcon;
var CurrentPathLayer;
var flagAddPoint = true;
var EditOn = false;
var EditMode = 'point';

function setEditOn() {
	if (!EditOn) {
		if (point_markers.length > 0) {
			for(i = 0; i < point_markers.length; ++i) {
			    //map.addOverlay(point_markers[i]);
			    point_markers[i].show();
			}
			/*
			CurrentMarker = point_markers[point_markers.length-1];
			CurrentMarkerIcon = point_markers[point_markers.length-1].getIcon();
			CurrentMarker.setImage('pieton_select.png');
			*/
		}
	}
	EditOn = true;
	createPath();
}

function setEditOff() {
	var crtIcon;
	if (point_markers.length > 0) {
		for(i = 1; i < (point_markers.length-1); ++i) {
		    //map.removeOverlay(point_markers[i]);
		    crtIcon = point_markers[i].getIcon();
		    if (crtIcon.image == "typo3conf/ext/ofqd/img/ptnctrl.png") {
			    point_markers[i].hide();
		    }
		}
	}
	EditOn = false;
	createPath();
}
function setEditMode(mode) {
	EditMode = mode;
	switch(mode) {
		case 'point' :
			while (point_markers.length > 1) {
				delPoint();
			}
			break;
		case 'parcours' :
			break;
	}
}

function addWindowInfo() {
	CurrentMarker.bindInfoWindowHtml($('#infoplus').val());
	crtLatLng = CurrentMarker.getLatLng();
	for(i = 0; i < point_markers.length; ++i) {
		testLatLng = point_markers[i].getLatLng();
		if (testLatLng.equals(crtLatLng)) {
			point_markers[i].setImage("typo3conf/ext/ofqd/img/pieton_bleu.png");
			CurrentMarkerIcon.image = "typo3conf/ext/ofqd/img/pieton_bleu.png";
		}
	}
}

function delPoint() {
	if (point_markers.length > 1) {
		indexDel = -1;
		crtLatLng = CurrentMarker.getLatLng();
		CurrentMarker.setImage(CurrentMarkerIcon.image);
		for(i = 0; i < point_markers.length; ++i) {
			testLatLng = point_markers[i].getLatLng();
			if (testLatLng.equals(crtLatLng)) {
				indexDel = i;
				if (indexDel > 0) {
					CurrentMarker = point_markers[i-1];
					CurrentMarkerIcon = point_markers[i-1].getIcon();
				} else {
					CurrentMarker = point_markers[i+1];
					CurrentMarkerIcon = point_markers[i+1].getIcon();
				}
			}
		}
		map.removeOverlay(point_markers[indexDel]);
		point_markers.splice(indexDel,1);
		CurrentMarker.setImage('typo3conf/ext/ofqd/img/pieton_select.png');
	}
	createPath();
}

// Create the Google Map to be used.
function createMap() {
	if (!GBrowserIsCompatible()) {
		alert('Votre navigateur n\'est pas compatible avec Google Maps');
		return;
	}

	//var myLatlng = new GLatLng(44.83785639798075,-0.5839918793945209);
	map = new GMap2(document.getElementById('map_canvas'));
	geocoder = new GClientGeocoder();

	if ($("#rech_adresse").val() && $("#rech_adresse").val() != '') {
		if (0 && geocoder) {
			geocoder.getLatLng(
				$("#rech_adresse").val()+",france",
				function(point) {
					if (!point) {
						alert("Aucune correspondance g&#233;ographiqe pour "+$('#rech_adresse').val()+", veuillez saisir un autre lieu.");
					} else {
						var marker = new GMarker(point);
						map.setCenter(point, 12, G_NORMAL_MAP);
					/*
						map.addOverlay(marker);

						$.get('index.php', {type:"10",action:"rech_carte",point:point,no_cache:"1"},
							  function(data){
							  	tabPoint = data.split('|');
	
								for (i=0;i<tabPoint.length;i++) {
							  		var lat_lng = tabPoint[i].split(',');
							  		if (lat_lng.length == 4) {
							  			var point = new GLatLng(lat_lng[0],lat_lng[1]);
							  			var infoHtml = '<h2>'+lat_lng[2]+'</h2>';
							  			infoHtml += '<div style="margin-top:20px;"><a class="lien_point" href="index.php?id=3&no_cache=1&tx_ofqd_pi1[jrId]='+lat_lng[3]+'">D&eacute;tail</a></div>';
										var newMarker = createMarkerInfo(point, infoHtml);
										map.addOverlay(newMarker);
									}
							  	}
							  });
					*/
					}
				}
			);
		}
	} else
		//map.setCenter(new GLatLng(44.83785639798075,-0.5839918793945209), 13, G_NORMAL_MAP);
		map.setCenter(new GLatLng(46.649436,3.295898), 5, G_NORMAL_MAP);
	
	map.setUIToDefault();

	//map.addControl(new GSmallMapControl());
	//map.addControl(new GMapTypeControl());

	GEvent.addListener(map, "click", function(overlay, latlng) {
		if (EditOn) {
			switch(EditMode) {
				case 'point' :
					if (point_markers.length > 0) {
						map.removeOverlay(point_markers[0]);
						point_markers = [];
					}
					break;
				case 'parcours' :
					break;
			}
			var Chemin = [lastPoint,latlng]; 
			lastPoint = latlng;
			marker = createMarker(lastPoint, "bleu");
			marker.enableDragging();
			map.addOverlay(marker);
			newMarker.setImage('typo3conf/ext/ofqd/img/pieton_select.png');
		}
	});
}

function codeAddress() {
	if ($("#rech_adresse").val() && $("#rech_adresse").val() != '') {
		geocoder = new GClientGeocoder();
		if (geocoder) {
			geocoder.getLatLng(
				$("#rech_adresse").val()+",france",
				function(point) {
					if (!point) {
						alert("Aucune correspondance g&#233;ographiqe pour "+$('#rech_adresse').val()+", veuillez saisir un autre lieu.");
					} else {
						ciblelat = point.lat();
						ciblelng = point.lng();
						$("#codeAddr").val(ciblelat+','+ciblelng);
						//var marker = new GMarker(point);
						//map.setCenter(point, 12, G_NORMAL_MAP);
						//map.addOverlay(marker);
						$("#form_rech_action").submit();
					}
				}
			);
		}
	}
	return false;
}

function codeAddressEdition() {
	if ($("#rech_carte_adresse").val() && $("#rech_carte_adresse").val() != '') {
		geocoder = new GClientGeocoder();
		if (geocoder) {
			geocoder.getLatLng(
				$("#rech_carte_adresse").val(),
				function(point) {
					if (!point) {
						alert("Aucune correspondance g&#233;ographiqe pour "+$('#rech_carte_adresse').val()+", veuillez saisir un autre lieu.");
					} else {
						ciblelat = point.lat();
						ciblelng = point.lng();
						var marker = new GMarker(point);
						map.setCenter(point, 12, G_NORMAL_MAP);
						$("#codeAddr").val(ciblelat+','+ciblelng);
						$("#form_rech_carte").submit();
					}
				}
			);
		}
	}
}

function codeAddressDrag() {
	GEvent.addListener(map, "click", function(overlay,latlng) {
		if (!EditOn) {
			ciblelat = latlng.lat();
			ciblelng = latlng.lng();
			$("#codeAddr").val(ciblelat+','+ciblelng);
			var marker = new GMarker(point);
			map.setCenter(point, 12, G_NORMAL_MAP);
			map.addOverlay(marker);
			geocoder = new GClientGeocoder();
			geocoder.getLocations(latlng,function (response) {
				map.clearOverlays();
				if (!response || response.Status.code != 200) {
					alert("Status Code:" + response.Status.code);
				} else {
					place = response.Placemark[0];
					$("#rech_adresse").val(place.address);
					$("#form_rech_action").submit();
				}
			}
			);
		}
	});	
}

function createMarkerInfo(point,html) {
	var f = new GIcon();
	f.image = "typo3conf/ext/ofqd/img/marche.gif";
	f.shadow = "typo3conf/ext/ofqd/img/pieton_ombre.png";
	f.iconSize = new GSize(20,20);
	f.shadowSize = new GSize(20,20);
	f.iconAnchor = new GPoint(10,10);
	f.infoWindowAnchor = new GPoint(6,1);
	f.infoShadowAnchor = new GPoint(13,13);						
	var marker = new GMarker(point,
				{icon: f,
				 draggable: false});	
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(html);
	});
	return marker;
}

function createMarker(point, color, info) {
	var f = new GIcon();
	//f.image = "pieton_" + color + ".png";
	if (info == 'depart')
		f.image = "typo3conf/ext/ofqd/img/depart.gif";
	else if (info == 'arrivee')
		f.image = "typo3conf/ext/ofqd/img/arrivee.gif";
	else
		f.image = "typo3conf/ext/ofqd/img/ptnctrl.png";
	f.shadow = "typo3conf/ext/ofqd/img/pieton_ombre.png";
	f.iconSize = new GSize(20,20);
	f.shadowSize = new GSize(20,20);
	//f.iconAnchor = new GPoint(6,20);
	f.iconAnchor = new GPoint(10,10);
	f.infoWindowAnchor = new GPoint(6,1);
	f.infoShadowAnchor = new GPoint(13,13);
	
	if (EditOn) {
		newMarker = new GMarker(point,
			{icon: f,
			 draggable: true});
	} else {
		newMarker = new GMarker(point,
			{icon: f,
			 draggable: false});
	}
		
	if (point_markers.length > 1) {
		indexInsert = -1;
		crtLatLng = CurrentMarker.getLatLng();
		for(i = 0; i < point_markers.length; ++i) {
			testLatLng = point_markers[i].getLatLng();
			if (testLatLng.equals(crtLatLng)) {
				indexInsert = i;
			}
		}
		point_markers.splice(indexInsert,1,point_markers[indexInsert],newMarker);
		CurrentMarker.setImage(CurrentMarkerIcon.image);
		CurrentMarker = newMarker;
		CurrentMarkerIcon = newMarker.getIcon();
	} else {
		point_markers.push(newMarker);
		CurrentMarker = newMarker;
		CurrentMarkerIcon = newMarker.getIcon();
	}
	
	GEvent.addListener(newMarker, "click", function() {
		if (CurrentMarker) {
			CurrentMarker.setIcemage(CurrentMarkerIcon.image);
		}
		CurrentMarker = this;
		CurrentMarkerIcon = this.getIcon();
		this.setImage('typo3conf/ext/ofqd/img/pieton_select.png');
	});

	GEvent.addListener(newMarker, "dragstart", function() {
		if (CurrentMarker) {
			CurrentMarker.setImage(CurrentMarkerIcon.image);
		}
		CurrentMarker = this;
		CurrentMarkerIcon = this.getIcon();
		this.setImage('typo3conf/ext/ofqd/img/pieton_select.png');
		createPath();
	});

	GEvent.addListener(newMarker, "drag", function() {
		createPath();
	});

	GEvent.addListener(newMarker, "dragend", function() {
		createPath();
	});

	createPath();

	return newMarker;
}

function createPath() {
  var i = 0;

  var plat = 0;
  var plng = 0;
  var encoded_points = "";
  var encoded_levels = "";
  var latB = new Array();
  var lngB = new Array();

  for(i = 0; i < point_markers.length; ++i) {
    var point = point_markers[i].getLatLng();
    var lat = point.lat();
    var lng = point.lng();
    var level = '13';

    if (i==0) {
    	latB[0]= lat;
    	latB[1]= lat;
    	lngB[0]= lng;
    	lngB[1]= lng;
    }
    if (lat < latB[0]) {latB[0]=lat;}
    if (lat > latB[1]) {latB[1]=lat;}
    if (lng < lngB[1]) {lngB[1]=lng;}
    if (lng > lngB[0]) {lngB[0]=lng;}

    var late5 = Math.round(lat * 1e5);
    var lnge5 = Math.round(lng * 1e5);

    dlat = late5 - plat;
    dlng = lnge5 - plng;

    plat = late5;
    plng = lnge5;

    encoded_points += encodeSignedNumber(dlat) + encodeSignedNumber(dlng);
    encoded_levels += encodeNumber(level);
  }
  //alert(latB[0]+' / '+lngB[0]+' || '+latB[1]+' / '+lngB[1]);
  var llSw = new GLatLng(latB[1],lngB[1]);
  var llNe = new GLatLng(latB[0],lngB[0]);
  if (point_markers.length <= 1) {
	  var llSw = new GLatLng(latB[1]-0.01,lngB[1]-0.01);
	  var llNe = new GLatLng(latB[0]+0.01,lngB[0]+0.01);
  }
  var boiteEnglobante = new GLatLngBounds(llSw,llNe);
  if (CurrentPathLayer) {
    map.removeOverlay(CurrentPathLayer);
  }
  if (point_markers.length > 0) {
  	
	//directions = new GDirections(map,controle);
	//directions.loadFromWaypoints(chemin, {preserveViewport:true, travelMode: G_TRAVEL_MODE_WALKING});

    CurrentPathLayer = GPolyline.fromEncoded({color: "#EC841E",
                                              weight: 2,
                                              opacity:1,
                                              points: encoded_points,
                                              zoomFactor: 32,
                                              levels: encoded_levels,
                                              numLevels: 4
                                             });

    map.addOverlay(CurrentPathLayer);
    if (EditOn) {document.getElementById('tx_ofqd_pi1[longueur]').value=CurrentPathLayer.getLength().toFixed(2);}

    if(!EditOn) map.setCenter(boiteEnglobante.getCenter(), map.getBoundsZoomLevel(boiteEnglobante));

  }
}

function newPath() {
	document.getElementById('tx_ofqd_pi1[jrId]').value='';
	document.getElementById('EncodedPath').value='';
	document.getElementById('EncodedLevel').value='';
	document.getElementById('tx_ofqd_pi1[titre]').value='';
	document.getElementById('tx_ofqd_pi1[description]').value='';
	document.getElementById('tx_ofqd_pi1[temps]').value='';
	document.getElementById('tx_ofqd_pi1[longueur]').value='';
	document.getElementById('tx_ofqd_pi1[difficulte]').value='';
	document.getElementById('tx_ofqd_pi1[type_transport]').value='';
	document.getElementById('tx_ofqd_pi1[saison]').value='';
	document.getElementById('tx_ofqd_pi1[horaire]').value='';
	
	if (point_markers.length > 0) {
		for(i = 0; i < point_markers.length; ++i) {
			map.removeOverlay(point_markers[i]);
		}
	}
	point_markers = [];
	if (CurrentPathLayer) {
		map.removeOverlay(CurrentPathLayer);
	}
}
	
function savePath() {
  var i = 0;

  var plat = 0;
  var plng = 0;
	//var chemin = new Array();
  var encoded_points = "";
  var encoded_levels = "";

  for(i = 0; i < point_markers.length; ++i) {
    var point = point_markers[i].getLatLng();
	//chemin.push(point);
    var lat = point.lat();
    var lng = point.lng();
    var level = '13';

    var late5 = Math.round(lat * 1e5);
    var lnge5 = Math.round(lng * 1e5);

    dlat = late5 - plat;
    dlng = lnge5 - plng;

    plat = late5;
    plng = lnge5;

    encoded_points += encodeSignedNumber(dlat) + encodeSignedNumber(dlng);
    encoded_levels += encodeNumber(level);
  }

  if (CurrentPathLayer) {
    map.removeOverlay(CurrentPathLayer);
  }

  if (point_markers.length > 0) {
  	
	//directions = new GDirections(map,controle);
	//directions.loadFromWaypoints(chemin, {preserveViewport:true, travelMode: G_TRAVEL_MODE_WALKING});

    CurrentPathLayer = GPolyline.fromEncoded({color: "#EC841E",
                                              weight: 2,
                                              opacity:1,
                                              points: encoded_points,
                                              zoomFactor: 32,
                                              levels: encoded_levels,
                                              numLevels: 4
                                             });

    map.addOverlay(CurrentPathLayer);

  }
  $('#EncodedPath').val(encoded_points);
  $('#EncodedLevel').val(encoded_levels);
}

function getPath() {
	var tabCoord = '';
	
	if (point_markers.length > 0) {
		for(i = 0; i < point_markers.length; ++i) {
			map.removeOverlay(point_markers[i]);
		}
	}
	point_markers = [];

	tabCoord = decodeLine($('#EncodedPath').val());
	for(i = 0; i < tabCoord.length; ++i) {
		LatLng = new GLatLng(tabCoord[i][0],tabCoord[i][1],false);
		if (i == 0)
			marker = createMarker(LatLng, "bleu", "depart");
		else if (i == (tabCoord.length-1))
			marker = createMarker(LatLng, "bleu", "arrivee");
		else
			marker = createMarker(LatLng, "bleu", "");
		marker.enableDragging();
		map.addOverlay(marker);
		//newMarker.setImage('typo3conf/ext/ofqd/img/pieton_select.png');  
	}

	createPath();
}

// Encode a signed number in the encode format.
function encodeSignedNumber(num) {
  var sgn_num = num << 1;

  if (num < 0) {
    sgn_num = ~(sgn_num);
  }

  return(encodeNumber(sgn_num));
}

// Encode an unsigned number in the encode format.
function encodeNumber(num) {
  var encodeString = "";

  while (num >= 0x20) {
    encodeString += (String.fromCharCode((0x20 | (num & 0x1f)) + 63));
    num >>= 5;
  }

  encodeString += (String.fromCharCode(num + 63));
  return encodeString;
}

// Decode an encoded polyline into a list of lat/lng tuples.
function decodeLine (encoded) {
  var len = encoded.length;
  var index = 0;
  var array = [];
  var lat = 0;
  var lng = 0;

  while (index < len) {
    var b;
    var shift = 0;
    var result = 0;
    do {
      b = encoded.charCodeAt(index++) - 63;
      result |= (b & 0x1f) << shift;
      shift += 5;
    } while (b >= 0x20);
    var dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
    lat += dlat;

    shift = 0;
    result = 0;
    do {
      b = encoded.charCodeAt(index++) - 63;
      result |= (b & 0x1f) << shift;
      shift += 5;
    } while (b >= 0x20);
    var dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
    lng += dlng;

    array.push([lat * 1e-5, lng * 1e-5]);
  }

  return array;
}

// Decode an encoded levels string into a list of levels.
function decodeLevels(encoded) {
  var levels = [];

  for (var pointIndex = 0; pointIndex < encoded.length; ++pointIndex) {
    var pointLevel = encoded.charCodeAt(pointIndex) - 63;
    levels.push(pointLevel);
  }

  return levels;
}
