summaryrefslogtreecommitdiff
path: root/protected/extensions/egmap/assets/latloncontrol.js
diff options
context:
space:
mode:
Diffstat (limited to 'protected/extensions/egmap/assets/latloncontrol.js')
-rw-r--r--protected/extensions/egmap/assets/latloncontrol.js81
1 files changed, 81 insertions, 0 deletions
diff --git a/protected/extensions/egmap/assets/latloncontrol.js b/protected/extensions/egmap/assets/latloncontrol.js
new file mode 100644
index 0000000..e009e26
--- /dev/null
+++ b/protected/extensions/egmap/assets/latloncontrol.js
@@ -0,0 +1,81 @@
+/**
+* LatLngControl class displays the LatLng and pixel coordinates
+* underneath the mouse within a container anchored to it.
+* @param {google.maps.Map} map Map to add custom control to.
+*/
+function LatLngControl(map) {
+ /**
+ * Offset the control container from the mouse by this amount.
+ */
+ this.ANCHOR_OFFSET_ = new google.maps.Point(8, 8);
+
+ /**
+ * Pointer to the HTML container.
+ */
+ this.node_ = this.createHtmlNode_();
+
+ // Add control to the map. Position is irrelevant.
+ map.controls[google.maps.ControlPosition.TOP].push(this.node_);
+
+ // Bind this OverlayView to the map so we can access MapCanvasProjection
+ // to convert LatLng to Point coordinates.
+ this.setMap(map);
+
+ // Register an MVC property to indicate whether this custom control
+ // is visible or hidden. Initially hide control until mouse is over map.
+ this.set('visible', false);
+ }
+
+ // Extend OverlayView so we can access MapCanvasProjection.
+ LatLngControl.prototype = new google.maps.OverlayView();
+ LatLngControl.prototype.draw = function() {};
+
+ /**
+ * @private
+ * Helper function creates the HTML node which is the control container.
+ * @return {HTMLDivElement}
+ */
+ LatLngControl.prototype.createHtmlNode_ = function() {
+ var divNode = document.createElement('div');
+ divNode.id = 'latlng-control';
+ divNode.index = 100;
+ divNode.style.backgroundColor = "#ffc";
+ divNode.style.border = "1px solid #676767";
+ divNode.style.fontFamily = "arial, helvetica, sans-serif";
+ divNode.style.fontSize = "0.7em";
+ divNode.style.padding = "2px 4px";
+ divNode.style.position = "absolute";
+ return divNode;
+ };
+
+ /**
+ * MVC property's state change handler function to show/hide the
+ * control container.
+ */
+ LatLngControl.prototype.visible_changed = function() {
+ this.node_.style.display = this.get('visible') ? '' : 'none';
+ };
+
+ /**
+ * Specified LatLng value is used to calculate pixel coordinates and
+ * update the control display. Container is also repositioned.
+ * @param {google.maps.LatLng} latLng Position to display
+ */
+ LatLngControl.prototype.updatePosition = function(latLng) {
+ var projection = this.getProjection();
+ var point = projection.fromLatLngToContainerPixel(latLng);
+
+ // Update control position to be anchored next to mouse position.
+ this.node_.style.left = point.x + this.ANCHOR_OFFSET_.x + 'px';
+ this.node_.style.top = point.y + this.ANCHOR_OFFSET_.y + 'px';
+
+ // Update control to display latlng and coordinates.
+ this.node_.innerHTML = [
+ latLng.toUrlValue(4),
+ '<br/>',
+ point.x,
+ 'px, ',
+ point.y,
+ 'px'
+ ].join('');
+}; \ No newline at end of file