var EARTH_RADIUS=6378000.1363;var VERTICAL_GMAP_ZOOM_FACTOR=[0,12192.327825776067,14865.433557768556,11131.40984714159,6656.3844650296605,3608.347559441107,1873.6680528267545,954.0244486220735,481.27907489256387,241.69479892791702,121.11241715528253,60.62238886113816,30.32784069255808,15.168053072358145,7.585059567578373,3.7927862957803566,1.8964581373104221,0.948245209438896,0.47412664026942697,0.23706433096952578,0.118531923865134];function thinOutTrack(zoomLevel,points){var count=points.length;if(count<=2||zoomLevel>=VERTICAL_GMAP_ZOOM_FACTOR.length){return points;}
var thinedTrack=[];var dx=[];var dy=[];var latMin=points[0].lat();var latMax=points[0].lat();for(var i=0;i<count;i++){dx[i]=points[i].lng();dy[i]=points[i].lat();if(dy[i]>latMax){latMax=dy[i];}
if(dy[i]<latMin){latMin=dy[i];}}
var latDelta=latMax-latMin;var latMiddle=(latMax+latMin)*0.5;latMiddle=latMiddle*2*Math.PI/360;var R=EARTH_RADIUS*Math.cos(latMiddle);var latMetr=(2*Math.PI*R)/360.0;var dlevel=VERTICAL_GMAP_ZOOM_FACTOR[zoomLevel];var d=dlevel/latMetr;var x0,x1,x2,y0,y1,y2;var x=0.0,y=0.0;var i0,i1,i2;i0=0;x0=dx[i0];y0=dy[i0];thinedTrack.push(new GLatLng(y0,x0));i1=1;x1=dx[i1];y1=dy[i1];i2=2;x2=dx[i2];y2=dy[i2];var d1=getDistance(x0,x1,y0,y1);var d2=getDistance(x0,x2,y0,y2);for(var i=3;i<count;i++){var ddx=Math.abs(x2-x1);var ddy=Math.abs(y2-y1);if((ddx<=0.0000001)&&(ddy<=0.0000001)){i1++;x1=dx[i1];y1=dy[i1];i2++;x2=dx[i2];y2=dy[i2];continue;}
if((d>d1)&&(d>d2)){i1++;x1=dx[i1];y1=dy[i1];i2++;x2=dx[i2];y2=dy[i2];d1=d2;d1=getDistance(x0,x1,y0,y1);d2=getDistance(x0,x2,y0,y2);continue;}else{if((d<d1)&&(d<d2)){thinedTrack.push(new GLatLng(y1,x1));x0=x1;y0=y1;i1++;x1=dx[i1];y1=dy[i1];i2++;x2=dx[i2];y2=dy[i2];d1=d2;d1=getDistance(x0,x1,y0,y1);d2=getDistance(x0,x2,y0,y2);continue;}else{var cs=3;var radicand=0.0;if(x2==x1){cs=1;}else if(y2==y1){cs=2;}
switch(cs){case 1:x=x2;radicand=d*d-(x-x0)*(x-x0);if(radicand<0.0){radicand=1.0e-12;}
y=Math.sqrt(radicand);y=y+y0;break;case 2:y=y2;radicand=d*d-(y-y0)*(y-y0);if(radicand<0.0){radicand=1.0e-12;}
x=Math.sqrt(radicand)+x0;break;case 3:var aa=(y2-y1)/(x2-x1);var f=y1-y0-x1*aa;var a=1.0+aa*aa;var b=2.0*(aa*f-x0);var c=x0*x0+f*f-d*d;var D=-8.0*aa*f*x0-4.0*f*f+4.0*d*d-4.0*aa*aa*x0*x0+
4.0*aa*aa*d*d;x=getQuadratic(a,b,c,D,x1,x2);y=(x-x1)*aa+y1;break;}
var dc=getDistance(x0,x,y0,y);x0=x;y0=y;thinedTrack.push(new GLatLng(y,x));i1++;x1=dx[i1];y1=dy[i1];i2++;x2=dx[i2];y2=dy[i2];d1=getDistance(x0,x1,y0,y1);d2=getDistance(x0,x2,y0,y2);}}}
thinedTrack.push(new GLatLng(dy[count-1],dx[count-1]));return thinedTrack;}
function getDistance(x1,x2,y1,y2){return Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));}
function getQuadratic(a,b,c,D,x1,x2){var x=0.0;var tmp=0.000001;if(D>0){tmp=Math.sqrt(D);}
var a1=1.0/a;var xc1=0.5e0*a1*(-b-tmp);var xc2=0.5e0*a1*(-b+tmp);if(((xc1>x1)&&(xc1<x2))||((xc1<x1)&(xc1>x2))){return xc1;}else{return xc2;}}
var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",encode:function(input){var output="";var chr1,chr2,chr3,enc1,enc2,enc3,enc4;var i=0;input=Base64._utf8_encode(input);while(i<input.length){chr1=input.charCodeAt(i++);chr2=input.charCodeAt(i++);chr3=input.charCodeAt(i++);enc1=chr1>>2;enc2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;}
output=output+
this._keyStr.charAt(enc1)+this._keyStr.charAt(enc2)+
this._keyStr.charAt(enc3)+this._keyStr.charAt(enc4);}
return output;},decode:function(input){var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\-_\=]/g,"");while(i<input.length){enc1=this._keyStr.indexOf(input.charAt(i++));enc2=this._keyStr.indexOf(input.charAt(i++));enc3=this._keyStr.indexOf(input.charAt(i++));enc4=this._keyStr.indexOf(input.charAt(i++));chr1=(enc1<<2)|(enc2>>4);chr2=((enc2&15)<<4)|(enc3>>2);chr3=((enc3&3)<<6)|enc4;output=output+String.fromCharCode(chr1);if(enc3!=64){output=output+String.fromCharCode(chr2);}
if(enc4!=64){output=output+String.fromCharCode(chr3);}}
output=Base64._utf8_decode(output);return output;},_utf8_encode:function(string){string=string.replace(/\r\n/g,"\n");var utftext="";for(var n=0;n<string.length;n++){var c=string.charCodeAt(n);if(c<128){utftext+=String.fromCharCode(c);}
else if((c>127)&&(c<2048)){utftext+=String.fromCharCode((c>>6)|192);utftext+=String.fromCharCode((c&63)|128);}
else{utftext+=String.fromCharCode((c>>12)|224);utftext+=String.fromCharCode(((c>>6)&63)|128);utftext+=String.fromCharCode((c&63)|128);}}
return utftext;},_utf8_decode:function(utftext){var string="";var i=0;var c=c1=c2=0;while(i<utftext.length){c=utftext.charCodeAt(i);if(c<128){string+=String.fromCharCode(c);i++;}
else if((c>191)&&(c<224)){c2=utftext.charCodeAt(i+1);string+=String.fromCharCode(((c&31)<<6)|(c2&63));i+=2;}
else{c2=utftext.charCodeAt(i+1);c3=utftext.charCodeAt(i+2);string+=String.fromCharCode(((c&15)<<12)|((c2&63)<<6)|(c3&63));i+=3;}}
return string;}}
function DragZoomControl(opts_boxStyle,opts_other,opts_callbacks){this.globals={draggingOn:false,cornerTopDiv:null,cornerRightDiv:null,cornerBottomDiv:null,cornerLeftDiv:null,mapPosition:null,outlineDiv:null,mapWidth:0,mapHeight:0,mapRatio:0,startX:0,startY:0,borderCorrection:0};this.globals.style={opacity:.2,fillColor:"#000",border:"2px solid blue"};var style=this.globals.style;for(var s in opts_boxStyle){style[s]=opts_boxStyle[s]}var borderStyleArray=style.border.split(' ');style.outlineWidth=parseInt(borderStyleArray[0].replace(/\D/g,''));style.outlineColor=borderStyleArray[2];style.alphaIE='alpha(opacity='+(style.opacity*100)+')';this.globals.backStack=[];this.globals.options={buttonHTML:'zoom ...',buttonStartingStyle:{width:'52px',border:'1px solid black',padding:'2px'},buttonStyle:{background:'#FFF'},backButtonHTML:'zoom back',backButtonStyle:{background:'#FFF',display:'none'},buttonZoomingHTML:'Drag a region on the map',buttonZoomingStyle:{background:'#FF0'},overlayRemoveTime:6000,backButtonEnabled:false,stickyZoomEnabled:false,rightMouseZoomOutEnabled:false,minDragSize:0};for(var s in opts_other){this.globals.options[s]=opts_other[s]}if(opts_callbacks==null){opts_callbacks={}}this.globals.callbacks=opts_callbacks};DragZoomControl.prototype=new GControl();DragZoomControl.prototype.saveMapContext=function(text){if(this.globals.options.backButtonEnabled){this.saveBackContext_(text,true);this.globals.backButtonDiv.style.display='block'}};DragZoomControl.prototype.initiateZoom=function(){this.buttonclick_()};DragZoomControl.prototype.initiateZoomBack=function(){if(this.globals.options.backButtonEnabled)this.backbuttonclick_()};DragZoomControl.prototype.initButton_=function(buttonContainerDiv){var G=this.globals;var buttonDiv=document.createElement('div');buttonDiv.innerHTML=G.options.buttonHTML;DragZoomUtil.style([buttonDiv],{cursor:'pointer',zIndex:200});DragZoomUtil.style([buttonDiv],G.options.buttonStartingStyle);DragZoomUtil.style([buttonDiv],G.options.buttonStyle);buttonContainerDiv.appendChild(buttonDiv);return buttonDiv};DragZoomControl.prototype.initBackButton_=function(buttonContainerDiv){var G=this.globals;var backButtonDiv=document.createElement('div');backButtonDiv.innerHTML=G.options.backButtonHTML;DragZoomUtil.style([backButtonDiv],{cursor:'pointer',zIndex:200});DragZoomUtil.style([backButtonDiv],G.options.buttonStartingStyle);DragZoomUtil.style([backButtonDiv],G.options.backButtonStyle);buttonContainerDiv.appendChild(backButtonDiv);return backButtonDiv};DragZoomControl.prototype.setButtonMode_=function(mode){var G=this.globals;if(mode=='zooming'){G.buttonDiv.innerHTML=G.options.buttonZoomingHTML;DragZoomUtil.style([G.buttonDiv],G.options.buttonStartingStyle);DragZoomUtil.style([G.buttonDiv],G.options.buttonZoomingStyle)}else{G.buttonDiv.innerHTML=G.options.buttonHTML;DragZoomUtil.style([G.buttonDiv],G.options.buttonStartingStyle);DragZoomUtil.style([G.buttonDiv],G.options.buttonStyle)}};DragZoomControl.prototype.initialize=function(map){var G=this.globals;var me=this;var mapDiv=map.getContainer();var buttonContainerDiv=document.createElement("div");DragZoomUtil.style([buttonContainerDiv],{cursor:'pointer',zIndex:150});var buttonDiv=this.initButton_(buttonContainerDiv);var backButtonDiv=this.initBackButton_(buttonContainerDiv);mapDiv.appendChild(buttonContainerDiv);var zoomDiv=document.createElement("div");var DIVS_TO_CREATE=['outlineDiv','cornerTopDiv','cornerLeftDiv','cornerRightDiv','cornerBottomDiv'];for(var i=0;i<DIVS_TO_CREATE.length;i++){var id=DIVS_TO_CREATE[i];var div=document.createElement("div");DragZoomUtil.style([div],{position:'absolute',display:'none'});zoomDiv.appendChild(div);G[id]=div}DragZoomUtil.style([zoomDiv],{position:'absolute',display:'none',overflow:'hidden',cursor:'crosshair',zIndex:101});mapDiv.appendChild(zoomDiv);GEvent.addDomListener(buttonDiv,'click',function(e){me.buttonclick_(e)});GEvent.addDomListener(backButtonDiv,'click',function(e){me.backbuttonclick_(e)});GEvent.addDomListener(zoomDiv,'mousedown',function(e){me.coverMousedown_(e)});GEvent.addDomListener(document,'mousemove',function(e){me.drag_(e)});GEvent.addDomListener(document,'mouseup',function(e){me.mouseup_(e)});G.mapPosition=DragZoomUtil.getElementPosition(mapDiv);G.buttonDiv=buttonDiv;G.backButtonDiv=backButtonDiv;G.mapCover=zoomDiv;G.map=map;G.borderCorrection=G.style.outlineWidth*2;this.setDimensions_();this.initStyles_();G.mapCover.onselectstart=function(){return false};return buttonContainerDiv};DragZoomControl.prototype.getDefaultPosition=function(){return new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(3,120))};DragZoomControl.prototype.coverMousedown_=function(e){var G=this.globals;var pos=this.getRelPos_(e);G.startX=pos.left;G.startY=pos.top;if(e.which){var rightMouse=(e.which!=1)}else if(e.button){var rightMouse=(e.button!=1)}G.draggingRightMouse=rightMouse;DragZoomUtil.style([G.mapCover],{background:'transparent',opacity:1,filter:'alpha(opacity=100)'});DragZoomUtil.style([G.outlineDiv],{left:G.startX+'px',top:G.startY+'px',display:'block',width:'1px',height:'1px'});G.draggingOn=true;G.cornerTopDiv.style.top=(G.startY-G.mapHeight)+'px';G.cornerTopDiv.style.display='block';G.cornerLeftDiv.style.left=(G.startX-G.mapWidth)+'px';G.cornerLeftDiv.style.top=G.startY+'px';G.cornerLeftDiv.style.display='block';G.cornerRightDiv.style.left=G.startX+'px';G.cornerRightDiv.style.top=G.startY+'px';G.cornerRightDiv.style.display='block';G.cornerBottomDiv.style.left=G.startX+'px';G.cornerBottomDiv.style.top=G.startY+'px';G.cornerBottomDiv.style.width='0px';G.cornerBottomDiv.style.display='block';if(G.callbacks.dragstart!=null){G.callbacks.dragstart(G.startX,G.startY)}return false};DragZoomControl.prototype.drag_=function(e){var G=this.globals;if(G.draggingOn){var pos=this.getRelPos_(e);var rect=this.getRectangle_(G.startX,G.startY,pos,G.mapRatio);if(rect.left){addX=-rect.width}else{addX=0}if(rect.top){addY=-rect.height}else{addY=0}DragZoomUtil.style([G.outlineDiv],{left:G.startX+addX+'px',top:G.startY+addY+'px',display:'block',width:'1px',height:'1px'});G.outlineDiv.style.width=rect.width+"px";G.outlineDiv.style.height=rect.height+"px";G.cornerTopDiv.style.height=((G.startY+addY)-(G.startY-G.mapHeight))+'px';G.cornerLeftDiv.style.top=(G.startY+addY)+'px';G.cornerLeftDiv.style.width=((G.startX+addX)-(G.startX-G.mapWidth))+'px';G.cornerRightDiv.style.top=G.cornerLeftDiv.style.top;G.cornerRightDiv.style.left=(G.startX+addX+rect.width+G.borderCorrection)+'px';G.cornerBottomDiv.style.top=(G.startY+addY+rect.height+G.borderCorrection)+'px';G.cornerBottomDiv.style.left=(G.startX-G.mapWidth+((G.startX+addX)-(G.startX-G.mapWidth)))+'px';G.cornerBottomDiv.style.width=(rect.width+G.borderCorrection)+'px';if(G.callbacks.dragging!=null){G.callbacks.dragging(G.startX,G.startY,rect.endX,rect.endY)}return false}};DragZoomControl.prototype.mouseup_=function(e){var G=this.globals;if(G.draggingOn){var pos=this.getRelPos_(e);G.draggingOn=false;var rect=this.getRectangle_(G.startX,G.startY,pos,G.mapRatio);if(rect.left)rect.endX=rect.startX-rect.width;if(rect.top)rect.endY=rect.startY-rect.height;this.resetDragZoom_();if(rect.width>=G.options.minDragSize&&rect.height>=G.options.minDragSize){var nwpx=new GPoint(rect.startX,rect.startY);var nepx=new GPoint(rect.endX,rect.startY);var sepx=new GPoint(rect.endX,rect.endY);var swpx=new GPoint(rect.startX,rect.endY);var nw=G.map.fromContainerPixelToLatLng(nwpx);var ne=G.map.fromContainerPixelToLatLng(nepx);var se=G.map.fromContainerPixelToLatLng(sepx);var sw=G.map.fromContainerPixelToLatLng(swpx);var zoomAreaPoly=new GPolyline([nw,ne,se,sw,nw],G.style.outlineColor,G.style.outlineWidth+1,.4);try{G.map.addOverlay(zoomAreaPoly);setTimeout(function(){G.map.removeOverlay(zoomAreaPoly)},G.options.overlayRemoveTime)}catch(e){}var polyBounds=zoomAreaPoly.getBounds();var ne=polyBounds.getNorthEast();var sw=polyBounds.getSouthWest();var se=new GLatLng(sw.lat(),ne.lng());var nw=new GLatLng(ne.lat(),sw.lng());if(G.options.rightMouseZoomOutEnabled&&G.draggingRightMouse){var mapSpan=G.map.getBounds().toSpan();var polySpan=polyBounds.toSpan();var dSize=Math.max(mapSpan.lat()/polySpan.lat(),mapSpan.lng()/polySpan.lng());var zoomLevel=G.map.getZoom()-Math.ceil(Math.log(dSize,2))}else{var zoomLevel=G.map.getBoundsZoomLevel(polyBounds)}var center=polyBounds.getCenter();G.map.setCenter(center,zoomLevel);if(G.callbacks.dragend!=null){G.callbacks.dragend(nw,ne,se,sw,nwpx,nepx,sepx,swpx)}}if(G.options.stickyZoomEnabled){this.initCover_();if(G.options.backButtonEnabled)this.saveBackContext_(G.options.backButtonHTML,false);G.backButtonDiv.style.display='none'}}};DragZoomControl.prototype.setDimensions_=function(){var G=this.globals;var mapSize=G.map.getSize();G.mapWidth=mapSize.width;G.mapHeight=mapSize.height;G.mapRatio=G.mapHeight/G.mapWidth;DragZoomUtil.style([G.mapCover,G.cornerTopDiv,G.cornerRightDiv,G.cornerBottomDiv,G.cornerLeftDiv],{top:'0px',left:'0px',width:G.mapWidth+'px',height:G.mapHeight+'px'})};DragZoomControl.prototype.initStyles_=function(){var G=this.globals;DragZoomUtil.style([G.mapCover,G.cornerTopDiv,G.cornerRightDiv,G.cornerBottomDiv,G.cornerLeftDiv],{filter:G.style.alphaIE,opacity:G.style.opacity,background:G.style.fillColor});G.outlineDiv.style.border=G.style.border};DragZoomControl.prototype.buttonclick_=function(){var G=this.globals;G.backButtonDiv.style.display='none';if(G.mapCover.style.display=='block'){this.resetDragZoom_();if(G.options.backButtonEnabled){this.restoreBackContext_();if(G.backStack.length==0)G.backButtonDiv.style.display='none'}}else{this.initCover_();if(G.options.backButtonEnabled)this.saveBackContext_(G.options.backButtonHTML,false)}};DragZoomControl.prototype.backbuttonclick_=function(){var G=this.globals;if(G.options.backButtonEnabled&&G.backStack.length>0){this.restoreBackContext_();if(G.callbacks['backbuttonclick']!=null){G.callbacks.backbuttonclick(G.methodCall)}}};DragZoomControl.prototype.saveBackContext_=function(text,methodCall){var G=this.globals;var backFrame={};backFrame["center"]=G.map.getCenter();backFrame["zoom"]=G.map.getZoom();backFrame["maptype"]=G.map.getCurrentMapType();backFrame["text"]=G.backButtonDiv.innerHTML;backFrame["methodCall"]=methodCall;G.backStack.push(backFrame);G.backButtonDiv.innerHTML=text};DragZoomControl.prototype.restoreBackContext_=function(){var G=this.globals;var backFrame=G.backStack.pop();G.map.setCenter(backFrame["center"],backFrame["zoom"],backFrame["maptype"]);G.backButtonDiv.innerHTML=backFrame["text"];G.methodCall=backFrame["methodCall"];if(G.backStack.length==0)G.backButtonDiv.style.display='none'};DragZoomControl.prototype.initCover_=function(){var G=this.globals;G.mapPosition=DragZoomUtil.getElementPosition(G.map.getContainer());this.setDimensions_();this.setButtonMode_('zooming');DragZoomUtil.style([G.mapCover],{display:'block',background:G.style.fillColor});DragZoomUtil.style([G.outlineDiv],{width:'0px',height:'0px'});if(G.callbacks['buttonclick']!=null){G.callbacks.buttonclick()}};DragZoomControl.prototype.getRelPos_=function(e){var pos=DragZoomUtil.getMousePosition(e);var G=this.globals;return{top:(pos.top-G.mapPosition.top),left:(pos.left-G.mapPosition.left)}};DragZoomControl.prototype.getRectangle_=function(startX,startY,pos,ratio){var left=false;var top=false;var dX=pos.left-startX;var dY=pos.top-startY;if(dX<0){dX=dX*-1;left=true}if(dY<0){dY=dY*-1;top=true}delta=dX>dY?dX:dY;return{startX:startX,startY:startY,endX:startX+delta,endY:startY+parseInt(delta*ratio),width:delta,height:parseInt(delta*ratio),left:left,top:top}};DragZoomControl.prototype.resetDragZoom_=function(){var G=this.globals;DragZoomUtil.style([G.mapCover,G.cornerTopDiv,G.cornerRightDiv,G.cornerBottomDiv,G.cornerLeftDiv],{display:'none',opacity:G.style.opacity,filter:G.style.alphaIE});G.outlineDiv.style.display='none';this.setButtonMode_('normal');if(G.options.backButtonEnabled&&(G.backStack.length>0))G.backButtonDiv.style.display='block'};var DragZoomUtil={};DragZoomUtil.gE=function(sId){return document.getElementById(sId)};DragZoomUtil.getMousePosition=function(e){var posX=0;var posY=0;if(!e)var e=window.event;if(e.pageX||e.pageY){posX=e.pageX;posY=e.pageY}else if(e.clientX||e.clientY){posX=e.clientX+(document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft);posY=e.clientY+(document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop)}return{left:posX,top:posY}};DragZoomUtil.getElementPosition=function(element){var leftPos=element.offsetLeft;var topPos=element.offsetTop;var parElement=element.offsetParent;while(parElement!=null){leftPos+=parElement.offsetLeft;topPos+=parElement.offsetTop;parElement=parElement.offsetParent}return{left:leftPos,top:topPos}};DragZoomUtil.style=function(elements,styles){if(typeof(elements)=='string'){elements=DragZoomUtil.getManyElements(elements)}for(var i=0;i<elements.length;i++){for(var s in styles){elements[i].style[s]=styles[s]}}};DragZoomUtil.getManyElements=function(idsString){var idsArray=idsString.split(',');var elements=[];for(var i=0;i<idsArray.length;i++){elements[elements.length]=DragZoomUtil.gE(idsArray[i])};return elements};