map selection of tower site
[freeside.git] / httemplate / elements / jquery-gmaps-latlon-picker.js
diff --git a/httemplate/elements/jquery-gmaps-latlon-picker.js b/httemplate/elements/jquery-gmaps-latlon-picker.js
new file mode 100644 (file)
index 0000000..b839df7
--- /dev/null
@@ -0,0 +1,254 @@
+/**\r
+ *\r
+ * A JQUERY GOOGLE MAPS LATITUDE AND LONGITUDE LOCATION PICKER\r
+ * version 1.2\r
+ *\r
+ * Supports multiple maps. Works on touchscreen. Easy to customize markup and CSS.\r
+ *\r
+ * To see a live demo, go to:\r
+ * http://www.wimagguc.com/projects/jquery-latitude-longitude-picker-gmaps/\r
+ *\r
+ * by Richard Dancsi\r
+ * http://www.wimagguc.com/\r
+ *\r
+ */\r
+\r
+(function($) {\r
+\r
+// for ie9 doesn't support debug console >>>\r
+if (!window.console) window.console = {};\r
+if (!window.console.log) window.console.log = function () { };\r
+// ^^^\r
+\r
+/* local modification */\r
+window.gMapsLatLonPickerState = {};\r
+\r
+$.fn.gMapsLatLonPicker = (function() {\r
+\r
+       var _self = this;\r
+\r
+       ///////////////////////////////////////////////////////////////////////////////////////////////\r
+       // PARAMETERS (MODIFY THIS PART) //////////////////////////////////////////////////////////////\r
+       _self.params = {\r
+               defLat : 0,\r
+               defLng : 0,\r
+               defZoom : 1,\r
+               queryLocationNameWhenLatLngChanges: true,\r
+               queryElevationWhenLatLngChanges: true,\r
+               mapOptions : {\r
+                       mapTypeId: google.maps.MapTypeId.ROADMAP,\r
+      /* local modification */\r
+                       //mapTypeControl: false,\r
+                       disableDoubleClickZoom: true,\r
+                       zoomControlOptions: true,\r
+                       streetViewControl: false\r
+               },\r
+               strings : {\r
+                       markerText : "Drag this Marker",\r
+                       error_empty_field : "Couldn't find coordinates for this place",\r
+                       error_no_results : "Couldn't find coordinates for this place"\r
+               }\r
+       };\r
+\r
+\r
+       ///////////////////////////////////////////////////////////////////////////////////////////////\r
+       // VARIABLES USED BY THE FUNCTION (DON'T MODIFY THIS PART) ////////////////////////////////////\r
+       _self.vars = {\r
+               ID : null,\r
+               LATLNG : null,\r
+               map : null,\r
+               marker : null,\r
+               geocoder : null\r
+       };\r
+\r
+       ///////////////////////////////////////////////////////////////////////////////////////////////\r
+       // PRIVATE FUNCTIONS FOR MANIPULATING DATA ////////////////////////////////////////////////////\r
+       var setPosition = function(position) {\r
+               _self.vars.marker.setPosition(position);\r
+               _self.vars.map.panTo(position);\r
+\r
+               $(_self.vars.cssID + ".gllpZoom").val( _self.vars.map.getZoom() );\r
+               $(_self.vars.cssID + ".gllpLongitude").val( position.lng() );\r
+               $(_self.vars.cssID + ".gllpLatitude").val( position.lat() );\r
+\r
+               $(_self.vars.cssID).trigger("location_changed", $(_self.vars.cssID));\r
+\r
+               if (_self.params.queryLocationNameWhenLatLngChanges) {\r
+                       getLocationName(position);\r
+               }\r
+               if (_self.params.queryElevationWhenLatLngChanges) {\r
+                       getElevation(position);\r
+               }\r
+       };\r
+\r
+       // for reverse geocoding\r
+       var getLocationName = function(position) {\r
+               var latlng = new google.maps.LatLng(position.lat(), position.lng());\r
+               _self.vars.geocoder.geocode({'latLng': latlng}, function(results, status) {\r
+                       if (status == google.maps.GeocoderStatus.OK && results[1]) {\r
+                               $(_self.vars.cssID + ".gllpLocationName").val(results[1].formatted_address);\r
+                       } else {\r
+                               $(_self.vars.cssID + ".gllpLocationName").val("");\r
+                       }\r
+                       $(_self.vars.cssID).trigger("location_name_changed", $(_self.vars.cssID));\r
+               });\r
+       };\r
+\r
+       // for getting the elevation value for a position\r
+       var getElevation = function(position) {\r
+               var latlng = new google.maps.LatLng(position.lat(), position.lng());\r
+\r
+               var locations = [latlng];\r
+\r
+               var positionalRequest = { 'locations': locations };\r
+\r
+               _self.vars.elevator.getElevationForLocations(positionalRequest, function(results, status) {\r
+                       if (status == google.maps.ElevationStatus.OK) {\r
+                               if (results[0]) {\r
+                                       $(_self.vars.cssID + ".gllpElevation").val( results[0].elevation.toFixed(3));\r
+                               } else {\r
+                                       $(_self.vars.cssID + ".gllpElevation").val("");\r
+                               }\r
+                       } else {\r
+                               $(_self.vars.cssID + ".gllpElevation").val("");\r
+                       }\r
+                       $(_self.vars.cssID).trigger("elevation_changed", $(_self.vars.cssID));\r
+               });\r
+       };\r
+\r
+       // search function\r
+       var performSearch = function(string, silent) {\r
+               if (string == "") {\r
+                       if (!silent) {\r
+                               displayError( _self.params.strings.error_empty_field );\r
+                       }\r
+                       return;\r
+               }\r
+               _self.vars.geocoder.geocode(\r
+                       {"address": string},\r
+                       function(results, status) {\r
+                               if (status == google.maps.GeocoderStatus.OK) {\r
+                                       $(_self.vars.cssID + ".gllpZoom").val(11);\r
+                                       _self.vars.map.setZoom( parseInt($(_self.vars.cssID + ".gllpZoom").val()) );\r
+                                       setPosition( results[0].geometry.location );\r
+                               } else {\r
+                                       if (!silent) {\r
+                                               displayError( _self.params.strings.error_no_results );\r
+                                       }\r
+                               }\r
+                       }\r
+               );\r
+       };\r
+\r
+       // error function\r
+       var displayError = function(message) {\r
+               alert(message);\r
+       };\r
+\r
+       ///////////////////////////////////////////////////////////////////////////////////////////////\r
+       // PUBLIC FUNCTIONS  //////////////////////////////////////////////////////////////////////////\r
+       var publicfunc = {\r
+\r
+               // INITIALIZE MAP ON DIV //////////////////////////////////////////////////////////////////\r
+               init : function(object) {\r
+\r
+                       if ( !$(object).attr("id") ) {\r
+                               if ( $(object).attr("name") ) {\r
+                                       $(object).attr("id", $(object).attr("name") );\r
+                               } else {\r
+                                       $(object).attr("id", "_MAP_" + Math.ceil(Math.random() * 10000) );\r
+                               }\r
+                       }\r
+\r
+                       _self.vars.ID = $(object).attr("id");\r
+                       _self.vars.cssID = "#" + _self.vars.ID + " ";\r
+\r
+                       _self.params.defLat  = $(_self.vars.cssID + ".gllpLatitude").val()  ? $(_self.vars.cssID + ".gllpLatitude").val()               : _self.params.defLat;\r
+                       _self.params.defLng  = $(_self.vars.cssID + ".gllpLongitude").val() ? $(_self.vars.cssID + ".gllpLongitude").val()          : _self.params.defLng;\r
+                       _self.params.defZoom = $(_self.vars.cssID + ".gllpZoom").val()      ? parseInt($(_self.vars.cssID + ".gllpZoom").val()) : _self.params.defZoom;\r
+\r
+                       _self.vars.LATLNG = new google.maps.LatLng(_self.params.defLat, _self.params.defLng);\r
+\r
+                       _self.vars.MAPOPTIONS            = _self.params.mapOptions;\r
+                       _self.vars.MAPOPTIONS.zoom   = _self.params.defZoom;\r
+                       _self.vars.MAPOPTIONS.center = _self.vars.LATLNG;\r
+\r
+                       _self.vars.map = new google.maps.Map($(_self.vars.cssID + ".gllpMap").get(0), _self.vars.MAPOPTIONS);\r
+                       _self.vars.geocoder = new google.maps.Geocoder();\r
+                       _self.vars.elevator = new google.maps.ElevationService();\r
+\r
+                       _self.vars.marker = new google.maps.Marker({\r
+                               position: _self.vars.LATLNG,\r
+                               map: _self.vars.map,\r
+                               title: _self.params.strings.markerText,\r
+                               draggable: true\r
+                       });\r
+\r
+                       // Set position on doubleclick\r
+                       google.maps.event.addListener(_self.vars.map, 'dblclick', function(event) {\r
+                               setPosition(event.latLng);\r
+                       });\r
+\r
+                       // Set position on marker move\r
+                       google.maps.event.addListener(_self.vars.marker, 'dragend', function(event) {\r
+                               setPosition(_self.vars.marker.position);\r
+                       });\r
+\r
+                       // Set zoom feld's value when user changes zoom on the map\r
+                       google.maps.event.addListener(_self.vars.map, 'zoom_changed', function(event) {\r
+                               $(_self.vars.cssID + ".gllpZoom").val( _self.vars.map.getZoom() );\r
+                               $(_self.vars.cssID).trigger("location_changed", $(_self.vars.cssID));\r
+                       });\r
+\r
+                       // Update location and zoom values based on input field's value\r
+                       $(_self.vars.cssID + ".gllpUpdateButton").bind("click", function() {\r
+                               var lat = $(_self.vars.cssID + ".gllpLatitude").val();\r
+                               var lng = $(_self.vars.cssID + ".gllpLongitude").val();\r
+                               var latlng = new google.maps.LatLng(lat, lng);\r
+                               _self.vars.map.setZoom( parseInt( $(_self.vars.cssID + ".gllpZoom").val() ) );\r
+                               setPosition(latlng);\r
+                       });\r
+\r
+                       // Search function by search button\r
+                       $(_self.vars.cssID + ".gllpSearchButton").bind("click", function() {\r
+                               performSearch( $(_self.vars.cssID + ".gllpSearchField").val(), false );\r
+                       });\r
+\r
+                       // Search function by gllp_perform_search listener\r
+                       $(document).bind("gllp_perform_search", function(event, object) {\r
+                               performSearch( $(object).attr('string'), true );\r
+                       });\r
+\r
+                       // Zoom function triggered by gllp_perform_zoom listener\r
+                       $(document).bind("gllp_update_fields", function(event) {\r
+                               var lat = $(_self.vars.cssID + ".gllpLatitude").val();\r
+                               var lng = $(_self.vars.cssID + ".gllpLongitude").val();\r
+                               var latlng = new google.maps.LatLng(lat, lng);\r
+                               _self.vars.map.setZoom( parseInt( $(_self.vars.cssID + ".gllpZoom").val() ) );\r
+                               setPosition(latlng);\r
+                       });\r
+\r
+      /* local modification */\r
+      window.gMapsLatLonPickerState[_self.vars.ID] =\r
+      {\r
+        vars : _self.vars,\r
+        params : _self.params\r
+      };\r
+    } // publicfunc\r
+\r
+       }\r
+\r
+       return publicfunc;\r
+});\r
+\r
+}(jQuery));\r
+\r
+$(document).ready( function() {\r
+       $(".gllpLatlonPicker").each(function() {\r
+               $(document).gMapsLatLonPicker().init( $(this) );\r
+       });\r
+});\r
+\r
+$(document).bind("location_changed", function(event, object) {\r
+       console.log("changed: " + $(object).attr('id') );\r
+});\r