function MarkerTracker(marker,map,opts){this.map_=map;this.marker_=marker;this.enabled_=true;this.arrowDisplayed_=false;this.arrow_=null;this.oldArrow_=null;this.control_=null;opts=opts||{};this.iconScale_=MarkerTracker.DEFAULT_ICON_SCALE_;if(opts.iconScale!=undefined){this.iconScale_=opts.iconScale}this.padding_=MarkerTracker.DEFAULT_EDGE_PADDING_;if(opts.padding!=undefined){this.padding_=opts.padding}this.color_=MarkerTracker.DEFAULT_ARROW_COLOR_;if(opts.color!=undefined){this.color_=opts.color}this.weight_=MarkerTracker.DEFAULT_ARROW_WEIGHT_;if(opts.weight!=undefined){this.weight_=opts.weight}this.length_=MarkerTracker.DEFAULT_ARROW_LENGTH_;if(opts.length!=undefined){this.length_=opts.length}this.opacity_=MarkerTracker.DEFAULT_ARROW_OPACITY_;if(opts.opacity!=undefined){this.opacity_=opts.opacity}this.updateEvent_=MarkerTracker.DEFAULT_UPDATE_EVENT_;if(opts.updateEvent!=undefined){this.updateEvent_=opts.updateEvent}this.panEvent_=MarkerTracker.DEFAULT_PAN_EVENT_;if(opts.panEvent!=undefined){this.panEvent_=opts.panEvent}this.quickPanEnabled_=MarkerTracker.DEFAULT_QUICK_PAN_ENABLED_;if(opts.quickPanEnabled!=undefined){this.quickPanEnabled_=opts.quickPanEnabled}var babyIcon=new GIcon(marker.getIcon());babyIcon.iconSize=new GSize(marker.getIcon().iconSize.width*this.iconScale_,marker.getIcon().iconSize.height*this.iconScale_);babyIcon.iconAnchor=new GPoint(marker.getIcon().iconAnchor.x*this.iconScale_,marker.getIcon().iconAnchor.y*this.iconScale_/2);babyIcon.shadow=null;this.babyMarker_=new GMarker(new GPoint(0,0),babyIcon);GEvent.bind(this.map_,this.updateEvent_,this,this.updateArrow_);GEvent.bind(this.marker_,'changed',this,this.updateArrow_);if(this.quickPanEnabled_){GEvent.bind(this.babyMarker_,this.panEvent_,this,this.panToMarker_)}this.updateArrow_()};MarkerTracker.DEFAULT_EDGE_PADDING_=25;MarkerTracker.DEFAULT_ICON_SCALE_=0.6;MarkerTracker.DEFAULT_ARROW_COLOR_='#ff0000';MarkerTracker.DEFAULT_ARROW_WEIGHT_=20;MarkerTracker.DEFAULT_ARROW_LENGTH_=20;MarkerTracker.DEFAULT_ARROW_OPACITY_=0.8;MarkerTracker.DEFAULT_UPDATE_EVENT_='move';MarkerTracker.DEFAULT_PAN_EVENT_='click';MarkerTracker.DEFAULT_QUICK_PAN_ENABLED_=true;MarkerTracker.prototype.disable=function(){this.enabled_=false;this.updateArrow_()};MarkerTracker.prototype.enable=function(){this.enabled_=true;this.updateArrow_()};MarkerTracker.prototype.updateArrow_=function(){if(!this.map_.getBounds().containsLatLng(this.marker_.getLatLng())&&this.enabled_){this.drawArrow_()}else if(this.arrowDisplayed_){this.hideArrow_()}};MarkerTracker.prototype.drawArrow_=function(){var bounds=this.map_.getBounds();var SE=this.map_.fromLatLngToDivPixel(bounds.getSouthWest());var NE=this.map_.fromLatLngToDivPixel(bounds.getNorthEast());var minX=SE.x+this.padding_;var minY=NE.y+this.padding_;var maxX=NE.x-this.padding_;var maxY=SE.y-this.padding_;var center=this.map_.fromLatLngToDivPixel(this.map_.getCenter());var loc=this.map_.fromLatLngToDivPixel(this.marker_.getLatLng());var m=(center.y-loc.y)/(center.x-loc.x);var b=(center.y-m*center.x);if(loc.x<maxX&&loc.x>minX){var x=loc.x}else if(center.x>loc.x){var x=minX}else{var x=maxX}var y=m*x+b;if(y>maxY){y=maxY;x=(y-b)/m}else if(y<minY){y=minY;x=(y-b)/m}var ang=Math.atan(-m);if(x>center.x){ang=ang+Math.PI}var arrowLoc=this.map_.fromDivPixelToLatLng(new GPoint(x,y));var arrowLeft=this.map_.fromDivPixelToLatLng(this.getRotatedPoint_(((-1)*this.length_),this.length_,ang,x,y));var arrowRight=this.map_.fromDivPixelToLatLng(this.getRotatedPoint_(((-1)*this.length_),((-1)*this.length_),ang,x,y));var center=this.map_.getCenter();var loc=this.marker_.getLatLng();this.oldArrow_=this.arrow_;this.arrow_=new GPolyline([arrowLeft,arrowLoc,arrowRight],this.color_,this.weight_,this.opacity_);this.map_.addOverlay(this.arrow_);this.babyMarker_.setLatLng(this.map_.fromDivPixelToLatLng(this.getRotatedPoint_(((-2)*this.length_),0,ang,x,y)));if(!this.arrowDisplayed_){this.map_.addOverlay(this.babyMarker_);this.arrowDisplayed_=true}if(this.oldArrow_){this.map_.removeOverlay(this.oldArrow_)}};MarkerTracker.prototype.hideArrow_=function(){this.map_.removeOverlay(this.babyMarker_);if(this.arrow_){this.map_.removeOverlay(this.arrow_)}if(this.oldArrow_){this.map_.removeOverlay(this.oldArrow_)}this.arrowDisplayed_=false};MarkerTracker.prototype.panToMarker_=function(){this.map_.panTo(this.marker_.getLatLng())};MarkerTracker.prototype.getRotatedPoint_=function(x,y,ang,xoffset,yoffset){var newx=y*Math.sin(ang)-x*Math.cos(ang)+xoffset;var newy=x*Math.sin(ang)+y*Math.cos(ang)+yoffset;var rotatedPoint=new GPoint(newx,newy);return(rotatedPoint)};