﻿var PolDistance = null;var MarkDistance = [];var MarkOverDistance = [];var IndexMarkDistance = 0;var Codec = {encodePoints:(function (locations) {var points = [];var x0 = 0;var y0 = 0;locations = this.map((function (x) {return Math.round(x / 0.00001);}), locations);for (var i = 0; i < locations.length / 2; i++) {var y = locations[i << 1];var dy = y - y0;y0 = y;var f = (Math.abs(dy) << 1) - (dy < 0);while (1) {var e = f & 31;f >>= 5;if (f) {e |= 32;}points.push(String.fromCharCode(e + 63));if (f == 0) {break;}}var x = locations[(i << 1) + 1];var dx = x - x0;x0 = x;f = (Math.abs(dx) << 1) - (dx < 0);while (1) {var e = f & 31;f >>= 5;if (f) {e |= 32;}points.push(String.fromCharCode(e + 63));if (f == 0) {break;}}}return points.join("");}), decodePoints:(function (points) {if (!points) {return [];}var locations = [];var pb = 0;var Ka = 0;var Pa = 0;while (pb < points.length) {var oc = 0;var Fa = 0;while (1) {var ub = points.charCodeAt(pb) - 63;pb += 1;Fa |= (ub & 31) << oc;oc += 5;if (ub < 32) {break;}}var i;if (Fa & 1) {i = ~(Fa >> 1);} else {i = Fa >> 1;}Ka += i;locations.push(Ka * 0.00001);oc = 0;Fa = 0;while (1) {var ub = points.charCodeAt(pb) - 63;pb += 1;Fa |= (ub & 31) << oc;oc += 5;if (ub < 32) {break;}}if (Fa & 1) {i = ~(Fa >> 1);} else {i = Fa >> 1;}Pa += i;locations.push(Pa * 0.00001);}return locations;}), G_Map:(function (f, a) {var results = [];for (var i = 0; i < a.length; i++) {results[i] = f(a[i]);}return results;})};var routePoints = new Array(0);var total_distance = 0;var MILES = {label:"miles", f:(function (distance) {return distance / 1609.344;})};var KMS = {label:"km", f:(function (distance) {return distance / 1000;})};var unit_handler = MILES;function calculateDistance(points) {if (points.length < 2) {return 0;}var dist = 0;for (var i = 0; i < points.length - 1; i++) {dist += distance_between_points(points[i], points[i + 1]);}return dist;}function updateDisplay() {var dist = unit_handler.f(total_distance);document.getElementById("distance").innerHTML = dist.toFixed(3);var span = document.getElementById("units");span.innerHTML = unit_handler.label.toUpperCase();}function toggleUnits(arg) {if (arg == "MILES") {unit_handler = MILES;} else {if (arg == "KMS") {unit_handler = KMS;} else {unit_handler = KMS;}}updateDisplay();}function generatePermalink() {var params = [];var url = window.location.href.split("?")[0];var zl = G_Map.getZoomLevel();params.push("zl=" + zl);var center = G_Map.getCenterLatLng();params.push("x=" + center.x);params.push("y=" + center.y);var location = [];var pt;for (var i = 0; i < routePoints.length; i++) {pt = routePoints[i];location.push(pt.y);location.push(pt.x);}params.push("path=" + Codec.encodePoints(location));url += "?";url += params.join("&");return url;}function initialiseMapFromURL(url) {var url = url.split("?");if (!url[1]) {return null;}var params = new Object();var queryStr = url[1].split("&");var pattern = /(\w+)=(.+)/;var result;for (var i = 0; i < queryStr.length; i++) {if ((result = pattern.exec(queryStr[i])) != null) {var param = result[1];params[param] = decodeURI(result[2]);}}G_Map.centerAndZoom(new GPoint(params.x, params.y), params.zl);if (params.path) {var path = Codec.decodePoints(params.path);for (var i = 0; i < path.length / 2; i++) {routePoints.push(new GPoint(path[2 * i + 1], path[2 * i]));}G_Map.addOverlay(new GPolyline(routePoints));G_Map.addOverlay(new GMarker(routePoints[0]));G_Map.addOverlay(new GMarker(routePoints[routePoints.length - 1]));total_distance = calculateDistance(routePoints);}updateDisplay();}Math.deg2rad = (function (x) {return x * (Math.PI / 180);});var EARTH_RADIUS = 6367000;function distance_between_points(p1, p2) {var a = Math.deg2rad(90 - p1.y);var b = Math.deg2rad(90 - p2.y);var theta = Math.deg2rad(p2.x - p1.x);var c = Math.acos(Math.cos(a) * Math.cos(b) + Math.sin(a) * Math.sin(b) * Math.cos(theta));return c * EARTH_RADIUS;}function GetIconPoint(type) {var baseIcon = new GIcon();baseIcon.shadow = "images/shadow50.png";if (type == 1) {baseIcon.image = "images/dd-start.png";} else {baseIcon.image = "images/dd-end.png";}baseIcon.iconSize = new GSize(20, 34);baseIcon.shadowSize = new GSize(37, 34);baseIcon.iconAnchor = new GPoint(10, 34);baseIcon.infoShadowAnchor = new GPoint(1, 1);return baseIcon;}function createMarkerPoint(point, type) {var marker;if (type == 1) {marker = new GMarker(point, {icon:GetIconPoint(type), title:"Start"});} else {marker = new GMarker(point, {icon:GetIconPoint(type), title:"End"});}return marker;}function clearLastLeg() {if (routePoints.length < 1) {return;}routePoints.pop();if (MarkOverDistance[IndexMarkDistance] != -1) {dots_gmarkers[MarkOverDistance[IndexMarkDistance]].show();}G_Map.removeOverlay(MarkDistance[IndexMarkDistance]);G_Map.removeOverlay(PolDistance);if (routePoints.length > 0) {IndexMarkDistance--;if (routePoints.length > 1) {PolDistance = new GPolyline(routePoints, "#000000", 5, 0.5, false, false);G_Map.addOverlay(PolDistance);MarkDistance[IndexMarkDistance] = createMarkerPoint(routePoints[routePoints.length - 1], 2);G_Map.addOverlay(MarkDistance[IndexMarkDistance]);}if (MarkOverDistance[IndexMarkDistance] != -1) {dots_gmarkers[MarkOverDistance[IndexMarkDistance]].hide();}}total_distance = calculateDistance(routePoints);updateDisplay();}function clearRoute() {routePoints = [];var i = 0;if (PolDistance != null) {G_Map.removeOverlay(PolDistance);}for (i = MarkOverDistance.length - 1; i >= 0; i--) {G_Map.removeOverlay(MarkDistance[i]);if (MarkOverDistance[i] != -1) {dots_gmarkers[MarkOverDistance[i]].show();}}MarkDistance = [];MarkOverDistance = [];IndexMarkDistance = 0;PolDistance = null;total_distance = 0;updateDisplay();}DoMarkInMap = (function (overlay, point) {if (point) {routePoints.push(point);if (PolDistance != null) {G_Map.removeOverlay(PolDistance);if (routePoints.length > 2) {G_Map.removeOverlay(MarkDistance[IndexMarkDistance]);if (MarkOverDistance[IndexMarkDistance] != -1) {dots_gmarkers[MarkOverDistance[IndexMarkDistance]].show();}}}PolDistance = new GPolyline(routePoints, "#000000", 5, 0.5, false, false);G_Map.addOverlay(PolDistance);if (routePoints.length == 1) {MarkOverDistance[0] = -1;if (overlay != null) {dots_gmarkers[overlay].hide();MarkOverDistance[0] = overlay;}MarkDistance[0] = createMarkerPoint(routePoints[0], 1);G_Map.addOverlay(MarkDistance[0]);}if (routePoints.length > 1) {IndexMarkDistance++;MarkDistance[IndexMarkDistance] = createMarkerPoint(routePoints[routePoints.length - 1], 2);MarkOverDistance[IndexMarkDistance] = -1;if (overlay != null) {dots_gmarkers[overlay].hide();MarkOverDistance[IndexMarkDistance] = overlay;}G_Map.addOverlay(MarkDistance[IndexMarkDistance]);var lastLeg = distance_between_points(routePoints[routePoints.length - 2], routePoints[routePoints.length - 1]);total_distance += lastLeg;updateDisplay();}return;}});var _eventDoMarkInMap = null;function AddEventToDistance() {_eventDoMarkInMap = GEvent.addListener(G_Map, "click", DoMarkInMap);}function RemoveEventToDistance() {if (_eventDoMarkInMap != null) {GEvent.removeListener(_eventDoMarkInMap);}}