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);};
