var GDir1,GDir2,normalProj,myNode,markerDragged,isDragged,lastIndex,prevIndex;var waypoints=Array();var gpolys=Array();var routeNodes=Array();function dragMarker(){if(isDragged==2){markerDragged=this;return}isDragged=2;if(markerDragged){marker=markerDragged;markerDragged=false}else{marker=this}lastIndex=marker.MyIndex;var point=marker.getPoint();if(lastIndex>0){if(lastIndex<waypoints.length-1){prevIndex=lastIndex-1;GDir2.loadFromWaypoints([waypoints[lastIndex-1].getPoint(),point.toUrlValue(6),waypoints[lastIndex+1].getPoint()],{getPolyline:true})}else{prevIndex=-1;lastIndex=lastIndex-1;GDir2.loadFromWaypoints([waypoints[lastIndex].getPoint(),point.toUrlValue(6)],{getPolyline:true})}}else{if(waypoints.length>1){prevIndex=-1;GDir2.loadFromWaypoints([point.toUrlValue(6),waypoints[1].getPoint()],{getPolyline:true})}}}function getProximity(mouseLatLng,marker){var dist,zoom;if(routeNodes.length==0){dist=0;zoom=map.getZoom();if(gpolys.length>0&&gpolys[0].getVertexCount()>0){routeNodes.push(normalProj.fromLatLngToPixel(gpolys[0].getVertex(0),zoom))}for(var i=0;i<gpolys.length;i++){dist+=gpolys[i].getLength();for(var j=1;j<gpolys[i].getVertexCount();j++){var point=normalProj.fromLatLngToPixel(gpolys[i].getVertex(j),zoom);point.MyIndex=i;routeNodes.push(point)}}var panel=document.getElementById("panel");if(panel){panel.innerHTML=(dist/1000).toFixed(1)+" km"}}if(!mouseLatLng||routeNodes.length<=1||isDragged>0){return}zoom=map.getZoom();var mousePx=normalProj.fromLatLngToPixel(mouseLatLng,zoom);var minDist=999;var minX=mousePx.x;var minY=mousePx.y;if(routeNodes.length>1){var x,y,d1,d2,d;var dx=mousePx.x-routeNodes[0].x;var dy=mousePx.y-routeNodes[0].y;d2=dx*dx+dy*dy;for(var n=0;++n<routeNodes.length;){d1=d2;x=routeNodes[n].x;dx=mousePx.x-x;y=routeNodes[n].y;dy=mousePx.y-y;d2=dx*dx+dy*dy;dx=x-routeNodes[n-1].x;dy=y-routeNodes[n-1].y;d=dx*dx+dy*dy;var u=((mousePx.x-x)*dx+(mousePx.y-y)*dy)/d;x+=(u*dx);y+=(u*dy);dx=mousePx.x-x;dy=mousePx.y-y;dist=dx*dx+dy*dy;if((d1-dist)+(d2-dist)>d){if(d1<d2){dist=d1;x=routeNodes[n-1].x;y=routeNodes[n-1].y}else{dist=d2;x=routeNodes[n].x;y=routeNodes[n].y}}if(minDist>dist){minDist=dist;minX=x;minY=y;myNode.MyIndex=routeNodes[n].MyIndex}}if(minDist>25){myNode.hide()}else{for(n=waypoints.length;--n>=0;){var markerPx=normalProj.fromLatLngToPixel(waypoints[n].getPoint(),zoom);dx=markerPx.x-minX;dy=markerPx.y-minY;if(dx*dx+dy*dy<25){myNode.hide();return}}myNode.setPoint(normalProj.fromPixelToLatLng(new GPoint(minX,minY),zoom));myNode.show()}}}var routeman=null;var routewait=null;function groute(){alert("Kliknij lokalizacje na mapie by wyznaczy?? punkty trasy");routewait=true;startroute()}function startroute(){normalProj=G_NORMAL_MAP.getProjection();GDir1=new GDirections();GDir2=new GDirections();GEvent.addListener(GDir1,"error",function(){var stat=GDir1.getStatus();alert("Directions Failed: "+stat.code)});GEvent.addListener(GDir2,"error",function(){var stat=GDir2.getStatus();alert("Directions Failed: "+stat.code)});GEvent.addListener(map,"mousemove",getProximity);GEvent.addListener(map,"zoomend",function(){routeNodes=[]});routeman=addListener(function(overlay,point){addPointToRoute(point)});drawer=routeman;iconNode=new GIcon();iconNode.image=basedir+"/32x32/default.png";iconNode.shadow="";iconNode.iconSize=new GSize(32,32);iconNode.shadowSize=new GSize(0,0);iconNode.iconAnchor=new GPoint(16,16);iconNode.infoWindowAnchor=new GPoint(5,5);iconNode.dragCrossImage=basedir+"32x32/default.png";iconNode.dragCrossSize=GSize(1,1);iconNode.maxHeight=1;myNode=new GMarker(map.getCenter(),{icon:iconNode,draggable:true,bouncy:false,zIndexProcess:function(marker,b){return 1}});map.addOverlay(myNode);myNode.show();myNode.hide();GEvent.addListener(myNode,"drag",function(){myNode.show();if(isDragged==2){markerDragged=myNode;return}if(myNode.MyIndex<waypoints.length){isDragged=2;markerDragged=false;lastIndex=myNode.MyIndex;prevIndex=-1;GDir2.loadFromWaypoints([waypoints[lastIndex].getPoint(),myNode.getPoint().toUrlValue(6),waypoints[lastIndex+1].getPoint()],{getPolyline:true})}});GEvent.addListener(myNode,"dragend",function(){var point=myNode.getPoint();var marker=new GMarker(point,{icon:iconNode,draggable:true,dragCrossMove:false,bouncy:false,zIndexProcess:function(marker,b){return 1}});waypoints.splice(myNode.MyIndex+1,0,marker);for(var i=myNode.MyIndex;i<waypoints.length;i++){waypoints[i].MyIndex=i}var dummy=new GPolyline([point]);map.addOverlay(dummy);gpolys.splice(myNode.MyIndex+1,0,dummy);GEvent.addListener(marker,"dragstart",function(){isDragged=1;myNode.hide()});GEvent.addListener(marker,"dragend",function(){isDragged=0});GEvent.addListener(marker,"drag",dragMarker);map.addOverlay(marker);if(myNode.MyIndex<waypoints.length){lastIndex=myNode.MyIndex+1;prevIndex=lastIndex-1;GDir2.loadFromWaypoints([waypoints[lastIndex-1].getPoint(),point.toUrlValue(6),waypoints[lastIndex+1].getPoint()],{getPolyline:true})}});GEvent.addListener(GDir1,"load",function(){var gp=GDir1.getPolyline();var point=gp.getVertex(gp.getVertexCount()-1);var marker=new GMarker(point,{icon:iconNode,draggable:true,dragCrossMove:false,bouncy:false,zIndexProcess:function(marker,b){return 1}});if(waypoints.length==0){marker.title=GDir1.getRoute(0).getStartGeocode().address}else{waypoints[waypoints.length-1].title=GDir1.getRoute(0).getStartGeocode().address;marker.title=GDir1.getRoute(0).getEndGeocode().address}GEvent.addListener(marker,"dragstart",function(){isDragged=1;myNode.hide()});GEvent.addListener(marker,"drag",dragMarker);GEvent.addListener(marker,"dragend",function(){isDragged=0});marker.MyIndex=waypoints.length;waypoints.push(marker);map.addOverlay(marker);if(waypoints.length>1){map.addOverlay(gp);gpolys.push(gp);routeNodes=[];getProximity()}});GEvent.addListener(GDir2,"load",function(){var gp=GDir2.getPolyline();map.removeOverlay(gpolys[lastIndex]);if(prevIndex>=0){map.removeOverlay(gpolys[lastIndex-1]);var minD,minI,points=[];var p0=waypoints[lastIndex].getPoint();for(var i=0;i<gp.getVertexCount();i++){var p=gp.getVertex(i);points.push(p);var d=p0.distanceFrom(p);if(i==0||minD>d){minD=d;minI=i}}gpolys[lastIndex-1]=new GPolyline(points.slice(0,minI+1));gpolys[lastIndex]=new GPolyline(points.slice(minI,points.length));map.addOverlay(gpolys[lastIndex-1]);waypoints[lastIndex-1].title=GDir2.getRoute(0).getStartGeocode().address;waypoints[lastIndex].title=GDir2.getRoute(0).getEndGeocode().address;waypoints[lastIndex+1].title=GDir2.getRoute(1).getEndGeocode().address}else{gpolys[lastIndex]=gp;waypoints[lastIndex].title=GDir2.getRoute(0).getStartGeocode().address;waypoints[lastIndex+1].title=GDir2.getRoute(0).getEndGeocode().address}map.addOverlay(gpolys[lastIndex]);routeNodes=[];getProximity();isDragged=0;if(markerDragged){isDragged=1;GEvent.trigger(markerDragged,"drag")}})}function addPointToRoute(point){waypoints_perm.push(point);if(point){if(waypoints.length==0){var x=point.toUrlValue(6);GDir1.loadFromWaypoints([x,x],{getPolyline:true})}else{GDir1.loadFromWaypoints([waypoints[waypoints.length-1].getPoint(),point.toUrlValue(6)],{getPolyline:true})}}}var next=null;function plotpoints(form){var from=(form.from_addr.value?form.from_addr.value+" ":"")+(form.from_postal.value?form.from_postal.value+" ":"")+form.from_city.value;var to=(form.to_addr.value?form.to_addr.value+" ":"")+(form.to_postal.value?form.to_postal.value+" ":"")+form.to_city.value;if(from!=""){geocoder.getLocations(from,addPoint)}else{alert("Brak adresu 'Od', kliknij lokalizacj?? na mapie.");routewait=true}if(to!=""){next=to}else{alert("Brak adresu 'Do', kliknij lokalizacj?? na mapie.");routewait=true}}function addPoint(response){if(!response||response.Status.code!=200){alert("Serwer nie udzieli?? prawid??owej odpowiedzi (status "+response.Status.code+")")}else{if(response.Placemark.size()==0){alert("Przykro mi, serwer nie zwr??ci?? prawid??owej lokalizacji.\n Sprawd?? czy adres jest prawid??owy.")}else{var point=response.Placemark[0].Point;point.toUrlValue=function(junk){return point.coordinates[1]+","+point.coordinates[0]};addPointToRoute(point)}}if(next!=null){geocoder.getLocations(next,addPoint);next=null}plend()}function plstart(){endall();Element.show("plwin");$("map").appendChild($("plwin"));new Draggable("plwin");routewait=false;startroute()}function plend(){if(routeEnd()){Element.hide($("plwin"))}}function routeEnd(){if(routeman&&routeman!=null){if(routewait!=true){removeListener(routeman);routeman=null;gpolys._each(function(polyline){map.removeOverlay(polyline)});gpolys=Array();waypoints._each(function(point){map.removeOverlay(point)});waypoints=Array();return true}}return false}var RDir;var waypoints_perm=new Array();function copyLine(){type="line";RDir=new GDirections(map);waypoints_perm=new Array();var n=0;waypoints._each(function(point){waypoints_perm[n]=point.getPoint();n++});GEvent.addListener(RDir,"load",function(){var gdirline=RDir.getPolyline();if(typeof(gdirline)=="object"){var vertices_tmp=new Array();var vertices_reuse=new Array();for(n=0;n<gdirline.getVertexCount();n++){vertices_reuse[n]=gdirline.getVertex(n);vertices_tmp[n]={x:Number(vertices_reuse[n].y),y:Number(vertices_reuse[n].x)}}$("polygon").value=vertices_tmp.toJSON();RDir.clear();RDir=null;startLine(vertices_reuse);waypoints_perm=Array()}else{alert("Brak linii do zapisania!")}});RDir.loadFromWaypoints(waypoints_perm,{getPolyline:true});routeEnd()};
