/*************** ** Variables ** ***************/ var cRuler = new aprsRULER(); var rulerMarkers = new Array(); var numRulers = 0; /** * aprsRULER::Toggle * * Toggle tools functionality. * */ function toggleRULER() { if (!cRuler.isON()) { if (cObject.isON()) toggleOBJECT(); if (killObject) toggleKILL(); if (!isHidden('viewOverlay')) toggleVIEW(); changeById('toolStatusOverlayMessage', 'RULER: Click map to start'); showWindow('toolsOverlay'); showWindow('toolStatusOverlay'); showControl('controlMEASURE', 'on'); doPause('openaprs_form_pause'); cRuler.ON(); map.disableDoubleClickZoom(); } // if else { showControl('controlMEASURE', 'off'); if (!cObject.isON()) unPause('openaprs_form_pause'); cRuler.OFF(); map.enableDoubleClickZoom(); } // else return; } // toggleRULER /** * clearRULERS * * Clears all created objects. * */ function clearRULERS() { cRuler.Clear(); return; } // clearRULERS function aprsRULER() { this.markers = new Array(); this.handles = new Array(); this.on = false; } // aprsRULER::Constructor aprsRULER.prototype.ON = function() { if (this.on) return; this.on = true; var handle; var me = this; handle = GEvent.addListener(map, 'click', function(overlay, pnt) { if (!pnt) return; var baseIcon = new GIcon(); baseIcon.iconSize = new GSize(32,32); baseIcon.iconAnchor = new GPoint(16,16); baseIcon.infoWindowAnchor = new GPoint(10,0); baseIcon.shadow = "http://www.openaprs.net/images/icons/shadow.png"; var numRuler = numRulers; var startIcon = (new GIcon(baseIcon, "/images/start.png", null, "")); var stopIcon = (new GIcon(baseIcon, "/images/stop.png", null, "")); var marker1 = new GMarker(pnt, { icon:startIcon, draggable: true }); var marker2 = new GMarker(pnt, { icon:stopIcon, draggable: true }); var numObject = numObjects; marker1.enableDragging(); marker2.enableDragging(); var label1 = new ELabel(pnt, '0',"rulerLabel",new GSize(8,25), 60); var label2 = new ELabel(pnt, '0',"rulerLabel",new GSize(8,25), 60); map.addOverlay(marker1); map.addOverlay(label1); map.addOverlay(marker2); map.addOverlay(label2); var line = [marker1.getPoint(),marker2.getPoint()]; var poly = new GPolyline(line,'#FFFF00', 8, 1) map.addOverlay(poly); ruler = { "marker1": marker1, "marker2": marker2, "label1": label1, "label2": label2, "poly": poly }; rulerMarkers[numRuler] = ruler; numRulers++; GEvent.addListener(marker1, "drag", function() { me.Measure(marker1, true, numRuler); }); GEvent.addListener(marker2, "drag", function() { me.Measure(marker2, false, numRuler); }); GEvent.addListener(marker1, "dblclick", function() { me.Remove(marker1); }); GEvent.addListener(marker2, "dblclick", function() { me.Remove(marker2); }); changeById('toolStatusOverlayMessage', 'RULER: DRAG THE START OR END POINT TO MEASURE A DISTANCE'); }); // function this.handles.push(handle); } // aprsRULER::ON aprsRULER.prototype.Measure = function(marker, isFirst, numRuler) { var units = document.getElementById("openaprs_form_units"); var lat1; var lon1; var lat2; var lon2; var line; var bearing; var pnt; var marker1 = rulerMarkers[numRuler]["marker1"]; var marker2 = rulerMarkers[numRuler]["marker2"]; var label1 = rulerMarkers[numRuler]["label1"]; var label2 = rulerMarkers[numRuler]["label2"]; var poly = rulerMarkers[numRuler]["poly"]; if (!marker1 || !marker2 || units == null) { changeById('toolStatusOverlayMessage', 'DRAG RULER: An unknown error occurred.'); return; } // if line = [marker1.getPoint(),marker2.getPoint()]; lat1 = marker1.getPoint().lat(); lon1 = marker1.getPoint().lng(); lat2 = marker2.getPoint().lat(); lon2 = marker2.getPoint().lng(); bearing = Math.round(LatLon.bearing(lat1, lon1, lat2, lon2)); d = marker1.getPoint().distanceFrom(marker2.getPoint()); dist = d.toFixed(0)+"m"; if(parseInt(dist)>10000) dist = (parseInt(dist)/1000).toFixed(1)+"km"; if (units != null) { if (units.value == 'imperial') { d = d * 3.2808399; if (d > 5280) dist = (d/5280).toFixed(1)+"mi"; else dist = d.toFixed(0)+"ft"; } // if else if (units.value == 'nautical') { d = d * 3.2808399; if (d > 6076.11549) dist = (d/6076.11549).toFixed(1)+"knots"; else dist = d.toFixed(0)+"ft"; } // if } // if label1.setContents(dist+' '+bearing+'°'); label2.setContents(dist); label1.setPoint(marker1.getPoint()); label2.setPoint(marker2.getPoint()); map.removeOverlay(poly); poly = new GPolyline(line,'#FFFF00', 8, 1) map.addOverlay(poly); rulerMarkers[numRuler]["poly"] = poly; pnt = marker.getPoint(); changeById('toolStatusOverlayMessage', 'DRAG RULER: ' +pnt.lat().toFixed(6)+','+pnt.lng().toFixed(6)); } aprsRULER.prototype.Remove = function(marker) { var newMarkers = new Array(); for(m in rulerMarkers) { if (rulerMarkers[m]["marker1"] == marker || rulerMarkers[m]["marker2"] == marker) { numRulers--; map.removeOverlay(rulerMarkers[m]["marker1"]); map.removeOverlay(rulerMarkers[m]["marker2"]); map.removeOverlay(rulerMarkers[m]["label1"]); map.removeOverlay(rulerMarkers[m]["label2"]); map.removeOverlay(rulerMarkers[m]["poly"]); continue; } // if newMarkers[m] = rulerMarkers[m]; } // for rulerMakers = newMarkers; changeById('toolStatusOverlayMessage', 'RULER: CLEARED'); } // aprsRULER::Remove aprsRULER.prototype.isON = function() { return this.on; } // aprsRULER::isON aprsRULER.prototype.Clear = function() { for(m in rulerMarkers) { map.removeOverlay(rulerMarkers[m]["marker1"]); map.removeOverlay(rulerMarkers[m]["marker2"]); map.removeOverlay(rulerMarkers[m]["label1"]); map.removeOverlay(rulerMarkers[m]["label2"]); map.removeOverlay(rulerMarkers[m]["poly"]); } // for rulerMarkers = new Array(); numRulers = 0; return; } // aprsRULER::Clear aprsRULER.prototype.OFF = function() { if (!this.on) return false; for(h in this.handles) GEvent.removeListener(this.handles[h]); this.handles = new Array(); this.on = false; return true; } // aprsRULER::OFF