// 

function GRulerControl(){var me=this;me.RESET_BUTTON_TITLE_='清除所有測距標記';me.ENABLE_BUTTON_TITLE_='添加測距標記已啟用，單擊這裡禁用';me.DISABLE_BUTTON_TITLE_='添加測距標記已禁用，單擊這裡啟用';me.DELETE_BUTTON_TITLE_='刪除';me.RESET_BUTTON_IMAGE_='images/ruler_clear.png';me.ENABLE_BUTTON_IMAGE_='images/ruler_enabled.png';me.DISABLE_BUTTON_IMAGE_='images/ruler_disabled.png';me.BACKGROUND_IMAGE_='images/ruler_background.png'
me.KILOMETER_='公里';me.METER_='米';}
GRulerControl.prototype=new GControl();GRulerControl.prototype.initialize=function(map){var me=this;var container=document.createElement('div');me.setButtonStyle_(container);var btnEnable=document.createElement('img');btnEnable.width=btnEnable.height=19;GEvent.addDomListener(btnEnable,'click',function(){me.setEnabled(!me.isEnabled());});container.appendChild(btnEnable);var btnReset=document.createElement('img');btnReset.width=btnReset.height=19;btnReset.src=me.RESET_BUTTON_IMAGE_;btnReset.title=me.RESET_BUTTON_TITLE_;GEvent.addDomListener(btnReset,'click',function(){me.reset();});container.appendChild(btnReset);var txtInfo=document.createElement('div');txtInfo.style.font='small Arial';txtInfo.style.fontWeight='bold';txtInfo.style.fontSize='9pt';txtInfo.style.width='82px';container.appendChild(txtInfo);map.rulerControl_=me;me.map_=map;me.head_=new Object();me.tail_=new Object();me.head_.next_=me.tail_;me.tail_.prev_=me.head_;me.btnEnable_=btnEnable;me.btnReset_=btnReset;me.txtInfo_=txtInfo;me.setEnabled(true);map.getContainer().appendChild(container);return container;}
GRulerControl.prototype.setButtonStyle_=function(button){button.style.backgroundImage='url('+this.BACKGROUND_IMAGE_+')';button.style.font='small Arial';button.style.border='1px solid #888888';button.style.padding='4px';button.style.textAlign='right';button.style.cursor='pointer';}
GRulerControl.prototype.formatDistance_=function(len){var me=this;len=Math.round(len);if(len<=1000){return len+' '+me.METER_;}else if(len<=1000000){return len/1000+' '+me.KILOMETER_;}
return Math.round(len/1000)+' '+me.KILOMETER_;}
GRulerControl.prototype.formatDegree_=function(value){value=Math.abs(value);var v1=Math.floor(value);var v2=Math.floor((value-v1)*60);var v3=Math.round((value-v1)*3600%60);return v1+'°'+v2+'\''+v3+'"';}
GRulerControl.prototype.formatLatLng_=function(pt){var me=this;var latName,lngName;var lat=pt.lat();var lng=pt.lng();latName=lat>=0?'北緯':'南緯';lngName=lng>=0?'東經':'西經';return lngName+me.formatDegree_(lng)+'，'
+latName+me.formatDegree_(lat);}
GRulerControl.prototype.getDefaultPosition=function(){return new GControlPosition(G_ANCHOR_TOP_RIGHT,new GSize(8,8));}
GRulerControl.prototype.isEnabled=function(){return this.enabled_;}
GRulerControl.prototype.setEnabled=function(value){var me=this;if(value==me.enabled_)
return;me.enabled_=value;if(me.enabled_){me.mapClickHandle_=GEvent.addListener(me.map_,'click',me.onMapClick_);me.txtInfo_.style.display='block';me.btnReset_.style.display='inline';me.btnEnable_.src=me.ENABLE_BUTTON_IMAGE_;me.btnEnable_.title=me.ENABLE_BUTTON_TITLE_;me.updateDistance_();}else{GEvent.removeListener(me.mapClickHandle_);me.txtInfo_.style.display='none';me.btnReset_.style.display='none';me.btnEnable_.src=me.DISABLE_BUTTON_IMAGE_;me.btnEnable_.title=me.DISABLE_BUTTON_TITLE_;}}
GRulerControl.prototype.onMapClick_=function(marker,latlng){var me=this.rulerControl_;if(marker)
return;var newMarker=new GMarker(latlng,{draggable:true});var pos=me.tail_.prev_;newMarker.prev_=pos;newMarker.next_=pos.next_;pos.next_.prev_=newMarker;pos.next_=newMarker;GEvent.addListener(newMarker,'dragend',function(){me.map_.closeInfoWindow();me.updateSegments_(newMarker);me.updateDistance_();});GEvent.addListener(newMarker,'click',function(){newMarker.openInfoWindow(me.createInfoWindow_(newMarker));});me.map_.addOverlay(newMarker);if(newMarker.prev_!=me.head_){var segment=[newMarker.prev_.getLatLng(),latlng];newMarker.segPrev_=new GPolyline(segment);newMarker.prev_.segNext_=newMarker.segPrev_;me.map_.addOverlay(newMarker.segPrev_);me.updateDistance_();}}
GRulerControl.prototype.updateDistance_=function(){var me=this;var len=me.getDistance();me.txtInfo_.innerHTML=me.formatDistance_(len);}
GRulerControl.prototype.getDistance=function(){var me=this;var len=0;for(var m=me.head_;m!=me.tail_;m=m.next_){if(m.prev_&&m.prev_.getLatLng)
len+=m.prev_.getLatLng().distanceFrom(m.getLatLng());}
return len;}
GRulerControl.prototype.reset=function(){var me=this;for(var m=me.head_.next_;m!=me.tail_;m=m.next_){me.map_.removeOverlay(m);if(m.segNext_)
me.map_.removeOverlay(m.segNext_);}
me.head_=new Object();me.tail_=new Object();me.head_.next_=me.tail_;me.tail_.prev_=me.head_;me.updateDistance_();}
GRulerControl.prototype.updateSegments_=function(marker){var me=this;var segment;if(marker.segPrev_&&marker.prev_.getLatLng){me.map_.removeOverlay(marker.segPrev_);segment=[marker.prev_.getLatLng(),marker.getLatLng()];marker.segPrev_=new GPolyline(segment);marker.prev_.segNext_=marker.segPrev_;me.map_.addOverlay(marker.segPrev_);}
if(marker.segNext_&&marker.next_.getLatLng){me.map_.removeOverlay(marker.segNext_);segment=[marker.getLatLng(),marker.next_.getLatLng()];marker.segNext_=new GPolyline(segment);marker.next_.segPrev_=marker.segNext_;me.map_.addOverlay(marker.segNext_);}}
GRulerControl.prototype.createInfoWindow_=function(marker){var me=this;var div=document.createElement('div');div.style.fontSize='10.5pt';div.style.width='250px';div.appendChild(document.createTextNode(me.formatLatLng_(marker.getLatLng())));var hr=document.createElement('hr');hr.style.border='solid 1px #cccccc';div.appendChild(hr);var lnk=document.createElement('div');lnk.innerHTML=me.DELETE_BUTTON_TITLE_;lnk.style.color='#0000cc';lnk.style.cursor='pointer';lnk.style.textDecoration='underline';lnk.onclick=function(){me.map_.closeInfoWindow();me.removePoint_(marker);me.updateDistance_();};div.appendChild(lnk);return div;}
GRulerControl.prototype.removePoint_=function(marker){var me=this;me.map_.removeOverlay(marker);if(marker.prev_.getLatLng&&marker.next_.getLatLng){var segment=[marker.prev_.getLatLng(),marker.next_.getLatLng()];var polyline=new GPolyline(segment);marker.prev_.segNext_=polyline;marker.next_.segPrev_=polyline;me.map_.addOverlay(polyline);}
marker.prev_.next_=marker.next_;marker.next_.prev_=marker.prev_;if(marker.segPrev_)
me.map_.removeOverlay(marker.segPrev_);if(marker.segNext_)
me.map_.removeOverlay(marker.segNext_);}
