var maps = new Array();
var courses = new Array();
var entryIds = new Array();
var totalDistance;
var flot;
var origCourseElev;
var points = new Array();
var nextMarkerId = 0;
var curMarkerId;
var adding;
var geocoder;
var clickListener;
var dragListener;

function encodeString() {
  var i = 0;

  var plat = 0;
  var plng = 0;

  var encoded_points = "";

	for (var i = 0; i < courses['id-0'].getVertexCount(); i++) {
		var point = courses['id-0'].getVertex(i);
		var lat = point.lat();
		var lng = point.lng();
		var late5 = Math.floor(lat * 1e5);
		var lnge5 = Math.floor(lng * 1e5);
		
		dlat = late5 - plat;
		dlng = lnge5 - plng;
		
		plat = late5;
		plng = lnge5;
		
		encoded_points += encodeSignedNumber(dlat) + encodeSignedNumber(dlng);
  }

	return encoded_points;
}
function populateDistance(entry_id) {
	if (!entry_id) {
		entry_id = '0';
	}
	var key = 'id-' + entry_id;
	var spans = document.getElementsByTagName('span');
	var useSpans = new Array();
	for (var i = 0; i < spans.length; i++) {
		if (spans[i].className == 'parcoursDistance-' + entry_id) {
			useSpans[useSpans.length] = spans[i];
		}
	}
	if (useSpans.length) {
		var totalDistance;
		for (var i = 0; i < courses[key].getVertexCount(); i++) {
			if (i == 0) {
				totalDistance = 0;
			} else {
				totalDistance += courses[key].getVertex(i).distanceFrom(courses[key].getVertex(i-1));
			}
		}
		totalDistance = (totalDistance/1000).toFixed(2);
		for (var i = 0; i < useSpans.length; i++) {
			useSpans[i].innerHTML = totalDistance;
		}
	}
}
function gmapReset() {
	if (document.overlay) {
		courses['id-0'].disableEditing();
		maps['id-0'].removeOverlay(courses['id-0']);
	}
	courses['id-0'] = new GPolyline([], "#ff0000", 5, .5, { clickable: false });
	if (!clickListener) {
		clickListener = GEvent.addListener(maps['id-0'], 'click', function() {
			gmapCalculate();
		});
	}
	if (!dragListener) {
		dragListener = GEvent.addListener(courses['id-0'], 'dragend', function() {
			gmapCalculate();
		});
	}
	maps['id-0'].addOverlay(courses['id-0']);
	courses['id-0'].enableDrawing();
	document.overlay = courses['id-0'];
	document.getElementById('elevChart-0').innerHTML = '';
}
function gmapEdit() {
	courses['id-0'].enableEditing();
	if (origCourseElev) {
		enableElev();
	}
}
function gmapDraw() {
	courses['id-0'].enableDrawing();
	if (origCourseElev) {
		enableElev();
	}
}
function gmapShorten() {
	var i = courses['id-0'].getVertexCount();
	courses['id-0'].deleteVertex(i - 1);
	gmapCalculate();
}
function enableElev() {
	if (document.getElementById('calculate')) {
		document.getElementById('calculate').innerHTML = origCourseElev;
	}
}
function gmapCalculate(entry_id) {
	if (!entry_id) {
		entry_id = '0';
	}
	var key = 'id-' + entry_id;
	if (courses[key].getVertexCount() == 0) return;
	//courses[key].disableEditing();
	if (document.getElementById('calculate')) {
		origCourseElev = document.getElementById('calculate').innerHTML;
		document.getElementById('calculate').innerHTML = '<p>Calculating...</p>';
	}
	var vertices = new Array();
	for (var i = 0; i < courses[key].getVertexCount(); i++) {
		vertices[i] = courses[key].getVertex(i);
	}
	var url = elevationsUrl;
	url += '?n=' + vertices.length;
	for (var i = 0; i < vertices.length; i++) {
		url += '&lat' + i + '=' + vertices[i].lat() + '&lng' + i + '=' + vertices[i].lng(); 
	}
	jQuery.get(url, function(elevStr, textStatus) {
		updateChart(elevStr, vertices, entry_id);
	});
}
function updateChart(elevStr, vertices, entry_id) {
	var elevs = elevStr.split(',');
	var data = new Array();
	var ticks = new Array([0, '<span id="' + entry_id + '-tick-label">test</span>']);
	totalDistance = 0;
	var maxY;
	var minY;
	var elevLabels = new Array();
	var distMap = new Array();
	for (var i = 0; i < elevs.length; i++) {
		if (elevs[i] < -1000) {
			// assume we're in the ocean
			elevs[i] = 0;
		}
		var x;
		if (i == 0) {
			x = 0;
			minY = elevs[i];
			maxY = elevs[i];
		} else {
			totalDistance += vertices[i].distanceFrom(vertices[i-1]);
			x = totalDistance / 1000;
		}
		data[data.length] = [ x, elevs[i] ];
		ticks[ticks.length] = x;
		elevLabels[x.toString()] = elevs[i];
		distMap[x.toString()] = i;
		if (parseFloat(elevs[i]) > parseFloat(maxY)) {
			maxY = elevs[i];
		}
		if (parseFloat(elevs[i]) < parseFloat(minY)) {
			minY = elevs[i];
		}
	}
	minY = parseFloat(minY);
	maxY = parseFloat(maxY);
	var chartOptions = {
		lines: { show: true },
		colors: [ 'red' ],
		shadowSize: 0,
		xaxis: {
			ticks: ticks,
			tickFormatter: function(val) {
				return '<span id="' + entry_id + '-tick-' + distMap[val] + '"></span>';
			},
			labelWidth: 20
		},
		yaxis: {
			ticks: [ [ minY + ((maxY - minY) / 2), '&plusmn;' + parseFloat(((maxY - minY) / 2)).toFixed(1) + 'm' ] ]
		},
		grid: {
			tickColor: 'red'
		}
	};
	flot = $.plot($('#elevChart-' + entry_id), [ { data: data } ], chartOptions);
	for (var dist in distMap) {
		// workaround; putting any block elements or breaks in the tickFormatter output itself
		// throws off the height of the whole chart
		var str = '<span class="chartDist">' + parseFloat(dist).toFixed(1) + '</span><br /><span class="chartElev">(' + Math.round(parseInt(elevs[distMap[dist]])) + ')</span>';
		document.getElementById(entry_id + '-tick-' + distMap[dist]).innerHTML = str;
	}
	var str = '<div id="' + entry_id + '-tick-label-inner" class="tick-label-inner"><span class="chartDist">km</span><br /><span class="chartElev">(m)</span></div>';
	document.getElementById(entry_id + '-tick-label').innerHTML = str;
	enableElev();
}
function gmapAddPoint(point) {
	var marker = new GMarker(point, { draggable: true });
	maps['id-0'].addOverlay(marker);
	marker.myid = nextMarkerId;
	points['marker-' + nextMarkerId] = { marker: marker };
	showPointFields(nextMarkerId);
	nextMarkerId++;
	adding = 1;
}
function showPointFields(id) {
	if (adding) {
		gmapAnnuler();
	}
	var point = points['marker-' + id];
	if (!point) {
		// filter clicks on info windows
		return;
	}
	document.getElementById('pointEdit').style.display = 'block';
	if (point.fields) {
		document.getElementById('pointExisting').style.display = 'block';
		document.getElementById('pointNew').style.display = 'none';
		showHtml(point);
	} else {
		point.fields = {
			text: '',
			img: '',
			video: '',
			img_width: 325,
			video_width: 325
		};
		document.getElementById('pointNew').style.display = 'block';
		document.getElementById('pointExisting').style.display = 'none';
	}
	document.getElementById('pointText').value = point.fields.text;

	// document.getElementById('textFrame').contentWindow.document.body.innerHTML = document.getElementById("pointText").value

	curMarkerId = id;
}
function gmapEnregistrer() {
	var point = points['marker-' + curMarkerId];
	//maps['id-0'].addOverlay(point.marker);
	populateFromEditor();
	point.fields = {
		text: document.getElementById('pointText').value,
		img: document.getElementById('pointImg').value,
		video: document.getElementById('pointVideo').value
	//	img_width: document.getElementById('pointImgWidth').value,
	//	video_width: document.getElementById('pointVideoWidth').value
	};
	document.getElementById('pointEdit').style.display = 'none';
	document.getElementById('textFrame').contentWindow.document.body.innerHTML = '';

	adding = 0;
	showHtml(point, 1);
}

function showHtml(point, noiframe) {
	var html = '';
	if (point.fields.text) {
		if (!noiframe && document.getElementById('textFrame')) {
			document.getElementById('textFrame').contentWindow.document.body.innerHTML = point.fields.text;
		}
		html += '<p class="pointNote">' + point.fields.text + '</p>';
	}
	if (point.fields.img) {
	//	html += '<img src="' + point.fields.img + '" width="' + point.fields.img_width + '" />';
	}
	if (point.fields.video) {
		var height = Math.floor(point.fields.video_width * .8235);
	//	html += '<object width="' + point.fields.video_width + '" height="' + height + '"><param name="movie" value="' + point.fields.video + '"></param><param name="wmode" value="transparent"></param><embed src="' + point.fields.video + '" type="application/x-shockwave-flash" wmode="transparent" width="' + point.fields.video_width + '" height="' + height + '"></embed></object>';
	}
	point.marker.openInfoWindowHtml(html);
}
function showHtmlOverlay(overlay) {
	if (overlay.myid == null) {
		return;
	}
	var point = points['marker-' + overlay.myid];
	showHtml(point);
}
function gmapModifier() {
	var point = points['marker-' + curMarkerId];
	point.fields = {
		text: document.getElementById('pointText').value,
		img: document.getElementById('pointImg').value,
		video: document.getElementById('pointVideo').value,
		img_width: document.getElementById('pointImgWidth').value,
		video_width: document.getElementById('pointVideoWidth').value
	};
	document.getElementById('pointEdit').style.display = 'none';
	adding = 0;
}
function gmapAnnuler() {
	var point = points['marker-' + curMarkerId];
	maps['id-0'].removeOverlay(point.marker);
	points['marker-' + curMarkerId] = null;
	document.getElementById('pointEdit').style.display = 'none';
	adding = 0;
}
function gmapSuivant(hideDiv, noAlert) {
	if (!document.courseForm.title.value && !noAlert) {
		alert('Enregistrez un nom du parcours');
		return;
	}
	if (clickListener) {
		GEvent.removeListener(clickListener);
	}
	if (dragListener) {
		GEvent.removeListener(dragListener);
	}
	document.getElementById(hideDiv).style.display = 'none';
	if (document.getElementById('finir')) {
		document.getElementById('finir').style.display = 'block';
	}
	if (document.getElementById('pointInstructions')) {
		document.getElementById('pointInstructions').style.display = 'block';
	}
	courses['id-0'].disableEditing();
	GEvent.addListener(maps['id-0'], "click", function(overlay, point) {
		if (!adding) {
			if (overlay) {
				showPointFields(overlay.myid);
			} else {
				gmapAddPoint(point);
			}
		}
	});
	maps['id-0'].getDragObject().setDraggableCursor('default');
	maps['id-0'].getDragObject().setDraggingCursor('default');
}
function gmapGeocode() {
	var addr = document.getElementById('geocodeMe').value;
	geocoder.getLatLng(addr, function(latLng) {
		maps['id-0'].setCenter(latLng);
	});
}
function gmapFinir() {
	var f = document.courseForm;
	if (!f.title.value) {
		alert('Enregistrez un nom du parcours');
		return false;
	}
	f.polyline.value = encodeString();
	var i = 0;
	var html = '';
	for (var key in points) {
		if (points[key] != null) {
			i++;
			var latLng = points[key].marker.getLatLng();
			html += '<input type="hidden" name="point_lat' + i + '" value="' + latLng.lat() + '" />';
			html += '<input type="hidden" name="point_lng' + i + '" value="' + latLng.lng() + '" />';
			html += '<input type="hidden" name="point_text' + i + '" value="' + points[key].fields.text.replace(/"/g, "&quot;") +  '" />';

			html += '<input type="file" style="display: none;" name="point_img' + i + '" value="' + points[key].fields.img + '" />';
			html += '<input type="hidden" name="point_video' + i + '" value="' + points[key].fields.video + '" />';
			html += '<input type="hidden" name="point_img_width' + i + '" value="' + points[key].fields.img_width + '" />';
			html += '<input type="hidden" name="point_video_width' + i + '" value="' + points[key].fields.video_width + '" />';
		}
	}
	if (i) {
		html += '<input type="hidden" name="points_n" value="' + i + '" />';
	}
	document.getElementById('hiddenFields').innerHTML = html;
	return true;
}

