diff --git a/eventplanner/templates/eventplanner/event_update_form.html b/eventplanner/templates/eventplanner/event_update_form.html
index 63851b1..6334f6f 100644
--- a/eventplanner/templates/eventplanner/event_update_form.html
+++ b/eventplanner/templates/eventplanner/event_update_form.html
@@ -42,6 +42,7 @@
{% addtoblock "css" strip %} {% endaddtoblock %}
{% addtoblock "css" strip %} {% endaddtoblock %}
+{% addtoblock "css" strip %} {% endaddtoblock %}
{% addtoblock "js" %}
diff --git a/location_field/media/form.css b/location_field/media/form.css
new file mode 100644
index 0000000..35751df
--- /dev/null
+++ b/location_field/media/form.css
@@ -0,0 +1,29 @@
+
+
+.map_dialog .form-horizontal
+{
+ margin-top: 10px;
+}
+
+.map_dialog input
+{
+ width: 390px;
+}
+
+
+
+.map_dialog input.displayed_location_input
+{
+ width: 350px;
+}
+
+.map_dialog .map_canvas img
+{
+ max-width: none;
+}
+
+.map_dialog label
+{
+ margin-bottom: 0px;
+ display: inline;
+}
\ No newline at end of file
diff --git a/location_field/media/form.html b/location_field/media/form.html
new file mode 100644
index 0000000..6c9d350
--- /dev/null
+++ b/location_field/media/form.html
@@ -0,0 +1,28 @@
+
\ No newline at end of file
diff --git a/location_field/media/form.js b/location_field/media/form.js
index 7dff5f6..d719d10 100644
--- a/location_field/media/form.js
+++ b/location_field/media/form.js
@@ -1,127 +1,189 @@
($ || django.jQuery)(function($){
- function location_field_load( map, base_field, initZoom )
+
+
+
+ // map: the div that is made to the map
+ // coordinate_field: input element where position & zoom is stored ( and read to init the map )
+ function MapObject( mapDiv, coordinate_field, init_position, init_zoom )
{
- var parent = map.parent().parent();
- var coordinate_field = parent.find('input[type=text]');
+ // Default Argument for init_position
+ init_position = typeof init_position !== 'undefined' ? init_position : new google.maps.LatLng( 49.340174,10.890595 );
+ init_zoom = typeof init_zoom !== 'undefined' ? init_zoom : 16;
+
+
+ // --------------------------- Members --------------------------------------
+
+ this.map = new google.maps.Map( mapDiv, {
+ mapTypeId: google.maps.MapTypeId.HYBRID,
+ zoomControl: true,
+ streetViewControl: false,
+ zoomControlOptions: { style: google.maps.ZoomControlStyle.SMALL }
+ } );
- var map;
- var current_position;
+ this.geocoder = new google.maps.Geocoder();
+ this.geocoder.region = "de";
+ this.geocoder.location = init_position;
- //coordinate_field.hide();
- coordinate_field.attr("readonly","readonly")
-
- function load()
+ this.marker = new google.maps.Marker({
+ map: this.map,
+ position: init_position,
+ draggable: true
+ });
+
+
+ // --------------------------- Methods --------------------------------------
+
+ this.placeMarkerUsingAddressString = function ( addressStr )
+ {
+ var theObject = this;
+ this.geocode( addressStr , function(l) {
+ theObject.placeMarker( l );
+ theObject.saveToInputField();
+ });
+ }
+
+ this.placeMarker = function( location )
{
- var options = { mapTypeId: google.maps.MapTypeId.HYBRID };
- map = new google.maps.Map(map[0], options);
-
- if ( coordinate_field.val() ) // Already values in the coordinate field
- {
- var l = coordinate_field.val().split(/,/);
- if (l.length > 1)
- {
- current_position = new google.maps.LatLng(l[0], l[1]);
- map.setZoom( parseInt( l[2] ) );
- }
- }
-
- if ( ! current_position )
- {
- var locationRohr = new google.maps.LatLng( 49.340174,10.890595 );
- current_position = locationRohr;
- map.setZoom( initZoom );
- }
-
- function savePosition( p ) {
- current_position = p;
- coordinate_field.val( current_position.lat().toFixed(6) + "," + current_position.lng().toFixed(6) + "," + map.getZoom() );
- }
-
- var marker = new google.maps.Marker({
- map: map,
- position: current_position,
- draggable: true
- });
-
- google.maps.event.addListener(marker, 'dragend', function(mouseEvent) {
- savePosition(mouseEvent.latLng);
- });
-
- google.maps.event.addListener(map, 'click', function(mouseEvent){
- marker.setPosition(mouseEvent.latLng);
- savePosition( mouseEvent.latLng );
- });
-
- google.maps.event.addListener(map, 'zoom_changed', function(mouseEvent){
- savePosition( current_position );
- });
-
- base_field.bindWithDelay( "keypress", function() {
-
- geocode( base_field.val() , function(l){
- coordinate_field.val( l.lat()+','+l.lng() );
- });
- onLocationCoordinateChange();
- }, 2000 );
-
-
- function onLocationCoordinateChange()
- {
- var latlng = jQuery(this).val().split(/,/);
- if (latlng.length < 2) return;
- var latlng = new google.maps.LatLng( latlng[0], latlng[1] );
- placeMarker( latlng );
- map.setZoom( latlng[2] );
- }
-
- function placeMarker(location) {
- marker.setPosition(location);
- map.setCenter(location);
- savePosition(location);
- map.panTo(location);
- }
-
- function geocode(address, cb) {
- var result;
- var geocoder = new google.maps.Geocoder();
- if (geocoder) {
- geocoder.geocode({"address": address}, function(results, status) {
- if (status == google.maps.GeocoderStatus.OK) {
- cb(results[0].geometry.location);
- placeMarker(results[0].geometry.location);
- }
- });
- }
- }
- /*
- function geocode_reverse(location, cb) {
- var geocoder = new google.maps.Geocoder();
- if (geocoder) {
- geocoder.geocode({"latLng": location}, function(results, status) {
- if (status == google.maps.GeocoderStatus.OK) {
- cb(results[0].geometry.location);
- placeMarker(results[0].geometry.location);
- }
- });
- }
- }*/
-
- placeMarker( current_position );
+ this.marker.setPosition( location );
+ this.map.setCenter( location );
+ this.map.panTo( location );
}
- load();
+
+ this.geocode = function(address, cb)
+ {
+ var result;
+ if (this.geocoder) {
+ this.geocoder.geocode({"address": address}, function(results, status) {
+ if (status == google.maps.GeocoderStatus.OK) {
+ cb(results[0].geometry.location);
+ }
+ });
+ }
+ }
+
+ this.geocode_reverse = function( cb)
+ {
+ if (this.geocoder) {
+ this.geocoder.geocode({"latLng": this.marker.getPosition() }, function(results, status) {
+ if (status == google.maps.GeocoderStatus.OK) {
+ cb( results );
+ }
+ });
+ }
+ }
+
+ this.saveToInputField = function()
+ {
+ var p = this.marker.getPosition();
+ coordinate_field.value = p.lat().toFixed(6) + "," + p.lng().toFixed(6) + "," + this.map.getZoom() ;
+ }
+
+ this.loadFromInputField = function()
+ {
+ if ( coordinate_field.value ) // Already values in the coordinate field
+ {
+ var l = coordinate_field.value.split(/,/);
+ if (l.length > 1)
+ {
+ this.placeMarker( new google.maps.LatLng(l[0], l[1]) );
+ this.map.setZoom( parseInt( l[2] ) );
+ }
+ }
+ else
+ {
+ this.placeMarker( init_position );
+ this.map.setZoom( 16 );
+ }
+ }
+
+
+ // --------------------------- Constructor -------------------------------------
+
+ this.init = function()
+ {
+ var theObject = this;
+ // Event handling
+ google.maps.event.addListener( this.marker, 'dragend', function(mouseEvent) {
+ theObject.saveToInputField();
+ });
+
+ google.maps.event.addListener( this.map, 'click', function(mouseEvent){
+ theObject.placeMarker( mouseEvent.latLng );
+ theObject.saveToInputField();
+ });
+
+ google.maps.event.addListener( this.map, 'zoom_changed', function(mouseEvent){
+ theObject.saveToInputField();
+ });
+
+ theObject.loadFromInputField();
+ }
+
+ this.init();
}
+
+ $(".map_dialog").dialog( {
+ modal: true,
+ width: 650,
+ height: 730,
+ resizeable: false,
+ autoOpen: false
+ } );
+
+
+ $('input[data-location-widget]').click( function() {
+
+ var formCoordField = $(this);
+ var $basedField = $( formCoordField.attr('data-based-field') );
+ var $dialogElement = $( formCoordField.attr('data-dialog-id') );
+
+ var $dialogCoordField = $dialogElement.find(".coordinate_input");
+ var $dialogLocationField = $dialogElement.find(".displayed_location_input");
+ $dialogLocationField.val( $basedField.val() );
+ $dialogCoordField.val( formCoordField.val() );
+
+ // Init Map if not yet initialized:
+ var map;
+ if ( ! $dialogElement[0].map )
+ {
+ map = $( formCoordField.attr('data-map') )[0];
+ var zoom = parseInt( formCoordField.attr('data-zoom') );
+
+ // Add Buttons
+ $dialogElement.dialog( "option", "buttons", {
+ Abbrechen: function() {
+ $( this ).dialog( "close" );
+ },
+ Ok: function() {
+ $(formCoordField).val( $dialogCoordField.val() );
+ $basedField.val( $dialogLocationField.val() );
+ $( this ).dialog( "close" );
+ } }
+ );
- $('input[data-location-widget]').each(function(){
- var $el = $(this);
+ // Init Map
+ $dialogElement[0].map = new MapObject( map, $dialogCoordField[0] );
+ }
+
+ $dialogLocationField.on("keypress", function(e) {
+ if ( e.keyCode == 13 ) { // enter
+ $dialogElement[0].map.placeMarkerUsingAddressString( $dialogLocationField.val() );
+ return false;
+ }
+ });
+
+ $dialogElement.find(".coord_to_display_button").click( function() {
+ $dialogElement[0].map.geocode_reverse( function(result) {
+ $dialogLocationField.val( result[0].formatted_address );
+ });
+ });
- var $map = $($el.attr('data-map')),
- $based_field = $(($el.attr('data-based-field'))),
- zoom = parseInt($el.attr('data-zoom'));
-
- location_field_load( $map, $based_field, zoom );
+
+ $dialogElement.dialog('open');
});
+
});
diff --git a/location_field/widgets.py b/location_field/widgets.py
index a255e99..da00966 100644
--- a/location_field/widgets.py
+++ b/location_field/widgets.py
@@ -1,6 +1,8 @@
from django.forms import widgets
from django.utils.safestring import mark_safe
+import os
+
class LocationWidget(widgets.TextInput):
def __init__(self, attrs=None, based_field=None, zoom=None, width=610, height = 480, **kwargs):
self.based_field = based_field
@@ -24,26 +26,33 @@ class LocationWidget(widgets.TextInput):
based_field = "#id_" + self.based_field.name
attrs = attrs or {}
+ attrs['readonly'] = "readonly"
attrs['data-location-widget'] = name
attrs['data-based-field'] = based_field
attrs['data-zoom'] = self.zoom
attrs['data-map'] = '#map_' + name
-
+ attrs['data-dialog-id'] = "#map_dialog_" + name
text_input = super(LocationWidget, self).render(name, value, attrs)
- map_div = u'''
-
- '''
- return mark_safe(text_input + map_div % {'name': name, 'width': self.width, 'height': self.height })
+ path = os.path.abspath(os.path.dirname(__file__))
+ with open( path + "/media/form.html" , 'r') as content_file:
+ html = content_file.read()
+
+ return mark_safe(text_input + html % {'name': name, 'width': self.width, 'height': self.height })
class Media:
+ css = {
+ 'all' : ('/location_field/media/form.css', )
+ }
# Use schemaless URL so it works with both, http and https websites
js = (
'//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js', # jquery
+ '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js',
'//maps.google.com/maps/api/js?sensor=false&language=de',
'/static/js/bindWithDelay.js',
'/location_field/media/form.js',
)
+
+
+
diff --git a/website/static/css/concert_route.css b/website/static/css/concert_route.css
index f65def7..6170387 100644
--- a/website/static/css/concert_route.css
+++ b/website/static/css/concert_route.css
@@ -4,6 +4,16 @@
height: 480px;
}
+#map img
+{
+ max-width: none;
+}
+#map label
+{
+ margin-bottom: 0px;
+ display: inline;
+}
+
#concert_route .map iframe{
display: block;
}
diff --git a/website/templates/website/concert_route.html b/website/templates/website/concert_route.html
index fbaefa6..b5c84cc 100644
--- a/website/templates/website/concert_route.html
+++ b/website/templates/website/concert_route.html
@@ -100,7 +100,9 @@
var myOptions = {
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROAD,
- zoomControl: false
+ zoomControl: false,
+ panControl: false,
+ streetViewControl: false
}
var directionsService = new google.maps.DirectionsService();
var directionsDisplay = new google.maps.DirectionsRenderer();