
var map;var dPts=new Array(0);var pts=new Array(0);var record=false;var fudge=0.99;var base=fudge*1.0;var pointClk=true;var geocoder=null;if(!queryStringObj)
var queryStringObj=new String(location.href);var elevationurl="http://gisdata.usgs.net/xmlwebservices2/elevation_service.asmx/getElevation?";var elevation=new Array();var elevationAlert=false;function showAddress(address){geocoder.getLatLng(address,function(point){if(!point){alert(address+" not found");}else{map.setCenter(point,13);}});}
function submitSaveMapForm()
{document.saveMapForm.submit();}
function submitTopoMapForm()
{topowindow=window.open('','elev','width=720,height=230,titlebar=0,status=0');topowindow.focus();document.topoMapForm.submit();topowindow.document.title='getting image...';}
function submitGoogleEarthForm()
{document.googleEarthForm.submit();}
function loadXMLDoc(url)
{var resultary;var altitude;if(elevation[0]==-9999)
return;var request=GXmlHttp.create();request.open('GET',url,true);var requestTimer=setTimeout(function(){request.abort();altitude=-9999;elevation.push(altitude);if(!elevationAlert)
{alert("USGS altitude data unavailable");elevationAlert=true;}},120000);request.onreadystatechange=function(){if(request.readyState==4){clearTimeout(requestTimer);var response=request.responseXML;altitude=response.getElementsByTagName('double')[0].firstChild.data;if(altitude<-1000.0){altitude=-9999;}
elevation.push(altitude);if(Math.round(100*(elevation.length/pts.length))<100)
{document.getElementById("ta").style.visibility="visible";document.getElementById("ta").innerHTML="acquiring topo data "+Math.round(100*(elevation.length/pts.length))+"%<br>";}
else
{document.getElementById("ta").style.visibility="hidden";document.getElementById("ta").innerHTML="";}}}
request.send(null);}
function getElevation(x,y)
{var url=elevationurl+"X_Value="+x+"&Y_Value="+y+"&Elevation_Units=FEET&Source_Layer=-1&Elevation_Only=TRUE&AspxAutoDetectCookieSupport=1";loadXMLDoc("proxy.php?"+url);}
function initClicks(){if(navigator.appName=='Microsoft Internet Explorer'){document.onmouseup=clickHandler;}
else{window.onmouseup=clickHandler;}}
function clickHandler(e){if(navigator.appName=='Netscape'&&e.which==3){zoomOut();return false;}
else{if(navigator.appName=='Microsoft Internet Explorer'&&event.button==2){zoomOut();return false;}}
return true;}
function newZoom(zoom){return 17-zoom;}
function initializeMap(){map=new GMap2(document.getElementById('map'),{draggableCursor:'crosshair',draggingCursor:'move'});map.setCenter(new GLatLng(37.0625,-95.677068),newZoom(13));map.addControl(new GLargeMapControl());map.addControl(new GMapTypeControl());map.addControl(new GScaleControl());map.addMapType(G_SATELLITE_3D_MAP);map.addMapType(G_PHYSICAL_MAP);geocoder=new GClientGeocoder();var dragmenu=document.getElementById("copy");Drag.init(dragmenu,null,null,null,null,null,true,false);initClicks();dPts.push(0);rehydrateMapFromUrl();GEvent.addListener(map,'click',function(overlay,point){if(point)
pointClk=true;else
pointClk=false;if(overlay&&!record)
{var html='<br>Lat,Long:&nbsp;'+overlay.getPoint().lat()+','+overlay.getPoint().lng()+'<br>Elevation:&nbsp;'+overlay.elevation+'<br><form action=\'http://maps.google.com/maps\' method=\'get\' target=\'_blank\'><p><label for=\'saddr\'>Driving&nbsp;Instructions&nbsp;from&nbsp;address,&nbsp;zip<br>or&nbsp;city,&nbsp;state:</label><input type=\'text\' name=\'saddr\' id=\'saddr\' value=\'\' /><input type=\'submit\' value=\'GO\' /><input type=\'hidden\' name=\'daddr\' value=\''+overlay.getPoint().lat()+','+overlay.getPoint().lng()+'\' /><input type=\'hidden\' name=\'hl\' value=\'en\' /></p></form>';overlay.openInfoWindowHtml(html);}
if(point&&record)
{addWayPt(trunkNum(point.x),trunkNum(point.y));drawPolyLine(pts);}
if(point&&!record)
{if(map.getZoom()<19)
map.setCenter(point,map.getZoom()+1);else if(map.getZoom()==19)
map.setCenter(point,19);}});}
function zoomOut(){if(!record&&pointClk)
{if(map.getZoom()>0)
map.setCenter(map.getCenter(),map.getZoom()-1);else if(map.getZoom()==0)
map.setCenter(map.getCenter(),0);}
pointClk=true;}
function addWayPt(xCoord,yCoord){if(record){pts.push(new GPoint(xCoord,yCoord));dPts.push(dPts[dPts.length-1]+lastDist());if(pts.length>elevation.length)
{getElevation(xCoord,yCoord);}}}
function mileage(point1y,point1x,point2y,point2x){return(3963.0*Math.acos(Math.sin(point1y/57.2958)*Math.sin(point2y/57.2958)+Math.cos(point1y/57.2958)*Math.cos(point2y/57.2958)*Math.cos((point2x/57.2958)-(point1x/57.2958))));}
function initializeParameter(nameOfParameter,defaultValue){var returnVal='';var qstringVal=getQuerystringParameter(nameOfParameter);if(qstringVal.length>0){returnVal=qstringVal;}else{returnVal=defaultValue;}
return returnVal;}
function rehydrateMapFromUrl(){var featureList=getQuerystringParameter('fl');if(featureList.length>0){var featureListArr=featureList.split('-');var mapType=featureListArr[0];var englishOrMetric=featureListArr[1];if(mapType=='s'){map.setMapType(G_SATELLITE_MAP);}else if(mapType=='m'){map.setMapType(G_NORMAL_MAP);}else if(mapType=='h'){map.setMapType(G_HYBRID_MAP);}
(englishOrMetric=='m')?setMetricUnits():setEnglishUnits();}
var curCenterX=parseFloat(initializeParameter('centerX',-95.677068));var curCenterY=parseFloat(initializeParameter('centerY',37.0625));var zoomLevel=parseInt(initializeParameter('zl',13));map.setCenter(new GLatLng(curCenterY,curCenterX),newZoom(zoomLevel));var elevpolyline=getQuerystringParameter('elev');if(elevpolyline.length>0){arrPoints=decodeElevPolyline(elevpolyline);var j=0;while(j<arrPoints.length){elevation[j]=arrPoints[j++]/100;}}
var polyline=getQuerystringParameter('polyline');if(polyline.length>0){arrPoints=decodePolyline(polyline);record=true;document.controlPanel.startRecording.value='Stop recording';var j=0;while(j<arrPoints.length){var yCoord=arrPoints[j++]/100000;var xCoord=arrPoints[j++]/100000;addWayPt(xCoord,yCoord);}
record=false;drawPolyLine(pts);document.controlPanel.startRecording.value='Start recording';}}
function prepArray(myArray){var sReturn='';var sIndCoords;for(i=0;i<myArray.length;i++){sReturn+=new String(Math.round(100*myArray[i]));if(i<myArray.length-1)
sReturn+=',';}
return sReturn;}
function prepPointArray(pointArray){var sReturn='';var sIndCoords;for(i=0;i<pointArray.length;i++){sReturn+=(new String(Math.round(100000*pointArray[i].y)))+','+(new String(Math.round(100000*pointArray[i].x)));if(i<pointArray.length-1)
sReturn+=',';}
return sReturn;}
function lastDist(){var distanceToReturn=0;lastPointIdx=pts.length-1;secondToLastPointIdx=lastPointIdx-1;;if(lastPointIdx>0){var fLastLeg;distanceToReturn=mileage(pts[lastPointIdx].y,pts[lastPointIdx].x,pts[secondToLastPointIdx].y,pts[secondToLastPointIdx].x);}
return distanceToReturn;}
function delWayPt(){if(record==true){if(pts.length>0){pts.pop();dPts.pop();elevation.pop();drawPolyLine(pts);}else{alert('No points to remove');}}}
function encodeElevPolyline(a){var p=a.split(',');var d='';var xo=0;var yo=0;for(c=0;c<p.length;c++){x=p[c];xd=x-xo;xo=x;f=(Math.abs(xd)<<1)-(xd<0);do{e=f&31;f>>=5;if(f){e|=32};d+=String.fromCharCode(e+63);}while(f!=0);}
return d;}
function encodePolyline(a){var p=a.split(',');var d='';var xo=0;var yo=0;for(c=0;c<p.length;c+=2){x=p[c];xd=x-xo;xo=x;f=(Math.abs(xd)<<1)-(xd<0);do{e=f&31;f>>=5;if(f){e|=32};d+=String.fromCharCode(e+63);}while(f!=0);y=p[c+1];yd=y-yo;yo=y;f=(Math.abs(yd)<<1)-(yd<0);do{e=f&31;f>>=5;if(f){e|=32};d+=String.fromCharCode(e+63);}while(f!=0);}
return d;}
function getQuerystringParameter(paramName){var sReturnStr='';var paramNameObj=new String(paramName+'=');paramNameObj=paramNameObj.toLowerCase();if(queryStringObj.indexOf('?')>-1){var qStringArray=queryStringObj.split('?');if(qStringArray[1].length>0){var allParams=qStringArray[1];var paramArray=allParams.split('&');for(i=0;i<=paramArray.length-1;i++){var origCaseFullParam=paramArray[i];var lcaseFullParam=paramArray[i].toLowerCase();if(lcaseFullParam.indexOf(paramNameObj)>-1)
sReturnStr=unescape(origCaseFullParam.substr(paramNameObj.length));}}}
return sReturnStr;}
function returnPermalinkParams(){var curCenterX=map.getCenter().x;var curCenterY=map.getCenter().y;var sPoints='';var ePoints='';if(pts.length>0){sPoints=encodePolyline(prepPointArray(pts));}
if(elevation.length>0){if(elevation[0]>-9999)
ePoints=encodeElevPolyline(prepArray(elevation));}
return('?centerX='+escape(curCenterX)+'&centerY='+escape(curCenterY)+'&zl='+new String(17-map.getZoom())+'&fl='+createFeatureListString()+'&polyline='+escape(sPoints)+'&elev='+escape(ePoints));}
function returnPermalinkString(){var locationString=new String(location.href);var locationArr=locationString.split('?');locationString=locationArr[0];return(locationString+returnPermalinkParams());}
function createFeatureListString(){var sResult;if(map.getCurrentMapType()==G_SATELLITE_MAP){sResult='s';}else if(map.getCurrentMapType()==G_NORMAL_MAP){sResult='m';}else if(map.getCurrentMapType()==G_HYBRID_MAP){sResult='h';}
sResult+='-';sResult+=(metricUnits()?'m':'e');return sResult;}
function printMap(){document.getElementById("copy").style.display='none';}
function topoMapold(name){var dragtopo=document.getElementById("topo");Drag.init(dragtopo,null,null,null,null,null,false,true);if(elevation.length>0&&elevation[0]>-9999)
{document.getElementById("topomap").innerHTML="<a href='javascript:void(0)' style='position:absolute;right:0px;top:0px;' onclick='this.parentNode.parentNode.style.visibility=\"hidden\"';>Hide Topo</a><br><img src=topomap.png"+returnPermalinkParams()+"&name="+escape(name)+">";document.getElementById("topo").style.visibility="visible";}
else
{alert('Topo data unavailable');}}
function topoMap(name){if(pts.length>0)
{document.topoMapForm.centerX.value=map.getCenter().x;document.topoMapForm.centerY.value=map.getCenter().y;document.topoMapForm.fl.value=createFeatureListString();document.topoMapForm.polyline.value=encodePolyline(prepPointArray(pts));document.topoMapForm.elev.value=encodeElevPolyline(prepArray(elevation));document.topoMapForm.name.value=name;document.topoMapForm.write.value=0;if(metricUnits())
{document.topoMapForm.metric.value=1;submitTopoMapForm();}
else
{document.topoMapForm.metric.value=0;submitTopoMapForm();}}
else
{alert('No route to plot');}}
function googleEarth(name){if(pts.length>0)
{document.googleEarthForm.centerX.value=map.getCenter().x;document.googleEarthForm.centerY.value=map.getCenter().y;document.googleEarthForm.fl.value=createFeatureListString();document.googleEarthForm.polyline.value=encodePolyline(prepPointArray(pts));document.googleEarthForm.elev.value=encodeElevPolyline(prepArray(elevation));document.googleEarthForm.name.value=name;document.googleEarthForm.write.value=0;if(metricUnits())
{document.googleEarthForm.metric.value=1;submitGoogleEarthForm();}
else
{document.googleEarthForm.metric.value=0;submitGoogleEarthForm();}}
else
{alert('No route to show');}}
function saveMap(){if(pts.length>0)
{document.saveMapForm.url.value=returnPermalinkString();submitSaveMapForm();}
else
{alert('No route to save');}}
function createPermalink(){var mypermalink;var limit;if(navigator.userAgent.indexOf("Firefox")!=-1)
limit=8096;else
limit=2048;if(typeof(parenturl)=="undefined")
{mypermalink=returnPermalinkString()+'&write=1';if(mypermalink.length>limit)
{alert("Size of link exceeds limit. Remove some points.");}
else
location.href=returnPermalinkString()+'&write=1';}
else
{mypermalink=parenturl+returnPermalinkParams()+'&write=1';if(mypermalink.length>limit)
{alert("Size of link exceeds limit. Remove some points.");}
else
top.location.href=parenturl+returnPermalinkParams()+'&write=1';}}
function decodeElevPolyline(a){var b=a.length;var c=0;var d=new Array();var e=0;while(c<b){var g;var h=0;var i=0;do{g=a.charCodeAt(c++)-63;i=i|(g&31)<<h;h=h+5;}while(g>=32);var l;if(i&1){l=~(i>>1);}else{l=i>>1;}
e=e+l;d.push(e);}
return d;}
function decodePolyline(a){var b=a.length;var c=0;var d=new Array();var e=0;var f=0;while(c<b){var g;var h=0;var i=0;do{g=a.charCodeAt(c++)-63;i=i|(g&31)<<h;h=h+5;}while(g>=32);var l;if(i&1){l=~(i>>1);}else{l=i>>1;}
e=e+l;d.push(e);h=0;i=0;do{g=a.charCodeAt(c++)-63;i=i|(g&31)<<h;h=h+5;}while(g>=32);var m;if(i&1)
m=~(i>>1);else
m=i>>1;f=f+m;d.push(f);}
return d;}
function clearLinkHandler(){if(record&&dPts.length>1){if(confirm('Are you sure you want to clear the route you have created?\nClicking OK to will clear all points and stop recording.\nClicking Cancel will continue recording and leave points as they are.')){dPts.splice(1,dPts.length-1);pts.splice(0,pts.length);elevation.splice(0,elevation.length);map.clearOverlays();record=false;document.controlPanel.startRecording.value='Start recording';}}else{if(dPts.length==1)
alert('No points to clear');else
alert('You must have recording turned\non to clear points');}}
function getIcon(label){var icon=new GIcon();icon.shadow='shadow.png';icon.iconSize=new GSize(36,34);icon.shadowSize=new GSize(64,34);icon.iconAnchor=new GPoint(18,34);icon.infoWindowAnchor=new GPoint(18,34);iconURL='marker.gif?text='+label;icon.image=iconURL;icon.printImage=iconURL;icon.mozPrintImage=iconURL;icon.shadow='shadow.png';return icon;}
function drawPolyLine(pts){var ratio=1.0;var xMP=-122.0;var yMP=45.0;map.clearOverlays();if(pts.length>0){var startMarker=new GMarker(pts[0],getIcon('S'));if(elevation[0])
{startMarker.elevation=elevation[0];if(metricUnits())
startMarker.elevation=Math.round(startMarker.elevation*1609/5280)+' Meters';else
startMarker.elevation=Math.round(startMarker.elevation)+' Feet';}
map.addOverlay(startMarker);if(record==false){var deltaMP=0.25;var totLength=base*(dPts[dPts.length-1]);if(totLength>5)
deltaMP=0.5;if(totLength>10)
deltaMP=1.0;if(totLength>30)
deltaMP=2.0;if(totLength>50)
deltaMP=5.0;if(totLength>100)
deltaMP=10.0;if(totLength>300)
deltaMP=20.0;if(totLength>500)
deltaMP=50.0;if(totLength>1000)
deltaMP=100.0;if(totLength>5000)
deltaMP=500.0;var currentMP=deltaMP;var i=2;while(i<dPts.length)
{while(base*(dPts[i])>currentMP)
{ratio=(currentMP-base*(dPts[i-1]))/(base*(dPts[i])-base*(dPts[i-1]));xMP=-ratio*(pts[i-1].x-pts[i-2].x)/1-(pts[i-2].x);xMP=-trunkNum(xMP);yMP=-ratio*(pts[i-1].y-pts[i-2].y)-pts[i-2].y;yMP=-trunkNum(yMP);var MPoint=new GPoint(xMP,yMP);var MPMarker=new GMarker(MPoint,getIcon(currentMP));if(elevation[i-2])
{MPMarker.elevation=elevation[i-2]+ratio*(elevation[i-1]-elevation[i-2]);if(metricUnits())
MPMarker.elevation=Math.round(MPMarker.elevation*1609/5280)+' Meters';else
MPMarker.elevation=Math.round(MPMarker.elevation)+' Feet';}
map.addOverlay(MPMarker);currentMP+=deltaMP;}
i++;}}
var EndMarker=new GMarker(pts[pts.length-1],getIcon((base*(dPts[dPts.length-1])).toFixed(3)));if(elevation[elevation.length-1])
{EndMarker.elevation=elevation[elevation.length-1];if(metricUnits())
EndMarker.elevation=Math.round(EndMarker.elevation*1609/5280)+' Meters';else
EndMarker.elevation=Math.round(EndMarker.elevation)+' Feet';}
map.addOverlay(EndMarker);GEvent.addListener(EndMarker,'click',function(){if(record)delWayPt();});map.addOverlay(new GPolyline(pts,'#0000ff',5));}}
function setMetricUnits(){var unitInput=document.controlPanel.units;unitInput[0].checked=false;unitInput[1].checked=true;base=1.609345*fudge;}
function setEnglishUnits(){var unitInput=document.controlPanel.units;unitInput[0].checked=true;unitInput[1].checked=false;base=1.0*fudge;}
function metricUnits(){var curValue;var unitInput=document.controlPanel.units;if(unitInput[0].checked){return false;}
else
{return true;}}
function kmUnits()
{setMetricUnits();drawPolyLine(pts);}
function miUnits()
{setEnglishUnits();drawPolyLine(pts);}
function toggleRecording(){if(record==true){record=false;document.controlPanel.startRecording.value='Start recording';drawPolyLine(pts);}
else{record=true;document.controlPanel.startRecording.value='Stop recording';}}
function trunkNum(num)
{var tmpNum=num;tmpNum*=Math.pow(10,5);tmpNum=Math.floor(tmpNum);tmpNum/=Math.pow(10,5);return tmpNum;}