/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU AFFERO General Public License as published by the Free Software Foundation; either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA or see http://www.gnu.org/licenses/agpl.txt. */ // OSRM markers // [base marker class, derived highlight marker and route marker classes] // base marker class (wraps Leaflet markers) OSRM.Marker = function( label, style, position ) { this.label = label ? label : "marker"; this.position = position ? position : new L.LatLng(0,0); this.marker = new L.MouseMarker( this.position, style ); this.marker.parent = this; this.shown = false; this.hint = null; }; OSRM.extend( OSRM.Marker,{ show: function() { OSRM.G.map.addLayer(this.marker); this.shown = true; }, hide: function() { OSRM.G.map.removeLayer(this.marker); this.shown = false; }, setPosition: function( position ) { this.position = position; this.marker.setLatLng( position ); this.hint = null; }, getPosition: function() { return this.position; }, getLat: function() { return this.position.lat; }, getLng: function() { return this.position.lng; }, isShown: function() { return this.shown; }, centerView: function(zoom) { if( zoom == undefined ) zoom = OSRM.DEFAULTS.ZOOM_LEVEL; OSRM.G.map.setViewUI( this.position, zoom ); }, toString: function() { return "OSRM.Marker: \""+this.label+"\", "+this.position+")"; } }); // route marker class (draggable, invokes route drawing routines) OSRM.RouteMarker = function ( label, style, position ) { style.baseicon = style.icon; OSRM.RouteMarker.prototype.base.constructor.apply( this, arguments ); this.label = label ? label : "route_marker"; this.marker.on( 'click', this.onClick ); this.marker.on( 'drag', this.onDrag ); this.marker.on( 'dragstart', this.onDragStart ); this.marker.on( 'dragend', this.onDragEnd ); }; OSRM.inheritFrom( OSRM.RouteMarker, OSRM.Marker ); OSRM.extend( OSRM.RouteMarker, { onClick: function(e) { for( var i=0; i<OSRM.G.markers.route.length; i++) { if( OSRM.G.markers.route[i].marker === this ) { OSRM.G.markers.removeMarker( i ); break; } } OSRM.Routing.getRoute(); OSRM.G.markers.highlight.hide(); OSRM.G.markers.dragger.hide(); }, onDrag: function(e) { this.parent.setPosition( e.target.getLatLng() ); if(OSRM.G.markers.route.length>1) OSRM.Routing.getRoute_Dragging(); OSRM.Geocoder.updateLocation( this.parent.label ); }, onDragStart: function(e) { OSRM.G.dragging = true; this.switchIcon(this.options.dragicon); // store id of dragged marker for( var i=0; i<OSRM.G.markers.route.length; i++) if( OSRM.G.markers.route[i].marker === this ) { OSRM.G.dragid = i; break; } if( this.parent != OSRM.G.markers.highlight) OSRM.G.markers.highlight.hide(); if( this.parent != OSRM.G.markers.dragger) OSRM.G.markers.dragger.hide(); if (OSRM.G.route.isShown()) OSRM.G.route.showOldRoute(); }, onDragEnd: function(e) { OSRM.G.dragging = false; this.switchIcon(this.options.baseicon); this.parent.setPosition( e.target.getLatLng() ); if (OSRM.G.route.isShown()) { OSRM.Routing.getRoute(); OSRM.G.route.hideOldRoute(); OSRM.G.route.hideUnnamedRoute(); } else { OSRM.Geocoder.updateAddress(this.parent.label); OSRM.GUI.clearResults(); } }, toString: function() { return "OSRM.RouteMarker: \""+this.label+"\", "+this.position+")"; } }); //drag marker class (draggable, invokes route drawing routines) OSRM.DragMarker = function ( label, style, position ) { OSRM.DragMarker.prototype.base.constructor.apply( this, arguments ); this.label = label ? label : "drag_marker"; }; OSRM.inheritFrom( OSRM.DragMarker, OSRM.RouteMarker ); OSRM.extend( OSRM.DragMarker, { onClick: function(e) { if( this.parent != OSRM.G.markers.dragger) this.parent.hide(); }, onDragStart: function(e) { var new_via_index = OSRM.Via.findViaIndex( e.target.getLatLng() ); OSRM.G.markers.route.splice(new_via_index+1,0, this.parent ); OSRM.RouteMarker.prototype.onDragStart.call(this,e); }, onDragEnd: function(e) { OSRM.G.markers.route[OSRM.G.dragid] = new OSRM.RouteMarker(OSRM.C.VIA_LABEL, {draggable:true,icon:OSRM.G.icons['marker-via'],dragicon:OSRM.G.icons['marker-via-drag']}, e.target.getLatLng() ); OSRM.G.markers.route[OSRM.G.dragid].show(); OSRM.RouteMarker.prototype.onDragEnd.call(this,e); this.parent.hide(); }, toString: function() { return "OSRM.DragMarker: \""+this.label+"\", "+this.position+")"; } });