// JavaScript Document
function MakeCaller(func,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10)
{return function(){func(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);};}


var Icon=new GIcon(G_DEFAULT_ICON);

Icon.image="http://www.eddmaps.org/img/blue.png";
Icon.shadow="http://www.eddmaps.org/img/shadow.png";
Icon.iconSize=new GSize(20,34);
Icon.shadowSize=new GSize(37,34);
Icon.iconAnchor=new GPoint(9,34);
Icon.infoWindowAnchor=new GPoint(9,2);
Icon.infoShadowAnchor=new GPoint(18,25);





var LANG_UNKNOWN=0;
var LANG_ENGLISH=1;
var LANG_FRENCH=2;
var currentLanguage=LANG_UNKNOWN;
var _mInstructions;
function SetLanguage(language)
{
if(language!=currentLanguage)
{
switch(language)
{
case LANG_ENGLISH:_mInstructions='Drag the map with your mouse, or double-click to center.';
_mSiteName='Google Maps';
_mDataCopy='Map data &#169;2005 ';
_mZenrinCopy='Map &#169;2005 ';
_mNormalMap='Map';
_mNormalMapShort='Map';
_mHybridMap='Hybrid';
_mHybridMapShort='Hyb';
_mKeyholeMap='Satellite';
_mKeyholeMapShort='Sat';
_mNew='New!';_mTerms='Terms of Use';
_mKeyholeCopy='Imagery &#169;2005 ';
_mDecimalPoint='.';
_mThousandsSeparator=',';
_mZoomIn='Zoom In';
_mZoomOut='Zoom Out';
_mZoomSet='Click to set zoom level';
_mZoomDrag='Drag to zoom';
_mPanWest='Go left';_mPanEast='Go right';_mPanNorth='Go up';_mPanSouth='Go down';_mLastResult='Return to the last result';_mScale='Scale at the center of the map';
break;


}

_mZoomIn=EntityToIso8859(_mZoomIn);
_mZoomOut=EntityToIso8859(_mZoomOut);_mZoomSet=EntityToIso8859(_mZoomSet);
_mZoomDrag=EntityToIso8859(_mZoomDrag);
_mPanWest=EntityToIso8859(_mPanWest);
_mPanEast=EntityToIso8859(_mPanEast);
_mPanNorth=EntityToIso8859(_mPanNorth);
_mPanSouth=EntityToIso8859(_mPanSouth);
_mLastResult=EntityToIso8859(_mLastResult);
_mScale=EntityToIso8859(_mScale);

currentLanguage=language;}}

var pztCookieName='positionZoomType2';

var oldPztCookieName='positionZoomType';function SavePositionZoomTypeCookie(map)
{var mapCenter=map.getCenter();var mapZoom=map.getZoom();var mapTypeLetter=MapTypeToLetter(map.getCurrentMapType());var cookieValue=mapCenter.lat().toFixed(5)+','+mapCenter.lng().toFixed(5)+','+mapZoom+','+mapTypeLetter;SaveCookie(pztCookieName,cookieValue);ClearCookie(oldPztCookieName);}
function GetPositionZoomTypeCookie(map)
{var cookieValue=GetCookie(pztCookieName);if(cookieValue==null)
return false;var vals=cookieValue.split(',');if(vals.length!=4)
return false;var mapY=parseFloat(vals[0]);var mapX=parseFloat(vals[1]);var mapZoomStr=vals[2];var mapTypeLetter=vals[3];var mapZoom=parseInt(mapZoomStr);map.setCenter(new GLatLng(mapY,mapX),mapZoom);map.setMapType(LetterToMapType(mapTypeLetter));return true;}
function SavePositionZoomTypeCookieOnChanges(map)
{var caller=MakeCaller(SavePositionZoomTypeCookie,map);GEvent.addListener(map,'move',MakeCaller(SpztcChecker,caller));GEvent.addListener(map,'zoomend',caller);GEvent.addListener(map,'maptypechanged ',caller);}
var spztcMoveEndTimer=null;var spztcMoveEndCheckMsecs=700;var spztcMoveCount,spztcPrevMoveCount;function SpztcChecker(caller)
{if(spztcMoveEndTimer==null)
{spztcMoveEndTimer=setTimeout(MakeCaller(SpztcTimeChecker,caller),spztcMoveEndCheckMsecs);spztcPrevMoveCount=spztcMoveCount=0;}
++spztcMoveCount;}



function SpztcTimeChecker(caller)
{if(spztcMoveCount==spztcPrevMoveCount)
{spztcMoveEndTimer=null;caller();}
else
{spztcMoveEndTimer=setTimeout(MakeCaller(SpztcTimeChecker,caller),spztcMoveEndCheckMsecs);spztcPrevMoveCount=spztcMoveCount;}}
function MapTypeToLetter(mapType)
{switch(mapType)
{case G_NORMAL_MAP:return'M';case G_SATELLITE_MAP:return'S';case G_HYBRID_MAP:return'H';case WMS_TOPO_MAP:return'T';case WMS_DOQ_MAP:return'O';case WMS_NEXRAD_MAP:return'N';default:return'-';}}
function LetterToMapType(letter)
{switch(letter)
{case'M':return G_NORMAL_MAP;case'S':return G_SATELLITE_MAP;case'H':return G_HYBRID_MAP;case'T':return WMS_TOPO_MAP;case'O':return WMS_DOQ_MAP;case'N':return WMS_NEXRAD_MAP;default:return G_NORMAL_MAP;}}
var degreesPerRadian=180.0/Math.PI;var radiansPerDegree=Math.PI/180.0;function Bearing(from,to)
{var lat1=from.lat()*radiansPerDegree;var lon1=from.lng()*radiansPerDegree;var lat2=to.lat()*radiansPerDegree;var lon2=to.lng()*radiansPerDegree;var angle=-Math.atan2(Math.sin(lon1-lon2)*Math.cos(lat2),Math.cos(lat1)*Math.sin(lat2)-Math.sin(lat1)*Math.cos(lat2)*Math.cos(lon1-lon2));if(angle<0.0)
angle+=Math.PI*2.0;angle=angle*degreesPerRadian;return angle;}
function BadBearing(from,to)
{var a=from.lat();var b=to.lat();var l=to.lng()-from.lng();var episilon=0.0000000001;if(Math.abs(l)<=episilon)
if(a>b)
return 180.0;else
return 0.0;else if(Math.abs(Math.abs(l)-180.0)<=episilon)
if(a>=0.0&&b>=0.0)
return 0.0;else if(a<0.0&&b<0.0)
return 180.0;else if(a>=0.0)
if(a>-b)
return 0.0;else
return 180.0;else
if(a>-b)
return 180.0;else
return 0.0;a*=radiansPerDegree;b*=radiansPerDegree;l*=radiansPerDegree;var d=Math.acos(Math.sin(a)*Math.sin(b)+Math.cos(a)*Math.cos(b)*Math.cos(l));var angle=Math.acos((Math.sin(b)-Math.sin(a)*Math.cos(d))/(Math.cos(a)*Math.sin(d)));angle=angle*degreesPerRadian;if(Math.sin(l)<0)
angle=360.0-angle;return angle;}
function Direction(bearing)
{if(bearing>=348.75||bearing<11.25)
return"N";if(bearing>=11.25&&bearing<33.75)
return"NxNE";if(bearing>=33.75&&bearing<56.25)
return"NE";if(bearing>=56.25&&bearing<78.75)
return"ExNE";if(bearing>=78.75&&bearing<101.25)
return"E";if(bearing>=101.25&&bearing<123.75)
return"ExSE";if(bearing>=123.75&&bearing<146.25)
return"SE";if(bearing>=146.25&&bearing<168.75)
return"SxSE";if(bearing>=168.75&&bearing<191.25)
return"S";if(bearing>=191.25&&bearing<213.75)
return"SxSW";if(bearing>=213.75&&bearing<236.25)
return"SW";if(bearing>=236.25&&bearing<258.75)
return"WxSW";if(bearing>=258.75&&bearing<281.25)
return"W";if(bearing>=281.25&&bearing<303.75)
return"WxNW";if(bearing>=303.75&&bearing<326.25)
return"NW";if(bearing>=326.25&&bearing<348.75)
return"NxNW";return"???"}
var clickZoomMap=null;var clickZoomListener;var clickZoomClicked;var clickZoomDoubleClicked;function ClickZoom(map)
{if(map==clickZoomMap)
return;if(clickZoomMap!=null)
ClickZoomOff();clickZoomMap=map;clickZoomListener=GEvent.addListener(clickZoomMap,'click',ClickZoomClickHandler);clickZoomClicked=false;clickZoomDoubleClicked=false;}
function ClickZoomOff()
{if(clickZoomMap!=null)
{GEvent.removeListener(clickZoomListener);clickZoomListener=null;clickZoomMap=null;}}
function ClickZoomClickHandler(overlay,point)
{if(overlay==null&&point!=null)
{if(clickZoomClicked)
clickZoomDoubleClicked=true;else
{clickZoomClicked=true;clickZoomDoubleClicked=false;setTimeout(MakeCaller(ClickZoomLaterHandler,point),250);}}}
function ClickZoomLaterHandler(point)
{if(!clickZoomDoubleClicked)
clickZoomMap.setCenter(point,clickZoomMap.getZoom()+1);clickZoomClicked=false;}
var mouseWheelZoomMap=null;function MouseWheelZoom(map)
{if(map==mouseWheelZoomMap)
return;if(mouseWheelZoomMap!=null)
MouseWheelZoomOff();mouseWheelZoomMap=map;var container=mouseWheelZoomMap.getContainer();if(container.addEventListener)
container.addEventListener('DOMMouseScroll',MouseWheelZoomHandler,false);else
container.onmousewheel=window.onmousewheel=document.onmousewheel=MouseWheelZoomHandler;}
function MouseWheelZoomOff()
{if(mouseWheelZoomMap!=null)
{var container=mouseWheelZoomMap.getContainer();if(container.removeEventListener)
container.removeEventListener('DOMMouseScroll',MouseWheelZoomHandler,false);else
container.onmousewheel=window.onmousewheel=document.onmousewheel=null;mouseWheelZoomMap=null;}}





var mapDiv=document.getElementById('map');
var areaDiv=document.getElementById('area');
var areaDivkm=document.getElementById('areakm');
var map;
var points=[];
var pointsrand=[];
var pointsx=[];
var pointsy=[];
var temp = new Array();
var markers=[];
var lines=[];
var polygonPoints=[];
var polygon=null;
var lineWidth=5;
var lineColor='#ff0000';
var closerColor='#ff0000';
var fillColor='#00FF00';
var redIcon=new GIcon(G_DEFAULT_ICON);


function Gload()
{

	if(!GBrowserIsCompatible())
	{
		mapDiv.innerHTML='Sorry, your browser is not compatible with Google Maps.';
		return;
	}
		map = new GMap2(document.getElementById("map"),{draggableCursor: 'crosshair', draggingCursor: 'pointer'});
	map.addControl(new GLargeMapControl());

	map.addControl(new GMapTypeControl());
	map.addControl(new GScaleControl());
	GEvent.addListener(map,'click',MapClick);

    map.setCenter(new GLatLng(36.633162, -96.064453), 4);
	map.setMapType(G_NORMAL_MAP);
	
	areaDiv.innerHTML='0 m&sup2;';
	areaDivkm.innerHTML='0 km&sup2;';
	
	Display();
}

function createMarker(point, number) 
{
	var marker=new GMarker(point,{icon:Icon,draggable:true});
		
	GEvent.addListener(marker,"dragend",function()
	{
		points[number]=marker.getLatLng();
		Display();
	});	
	return marker;
}

function Display()
{
	for(var i=0;i<markers.length;++i)
	{
		map.removeOverlay(markers[i]);
	}
	markers=[];
	for(var i=0;i<lines.length;++i)
	{
		map.removeOverlay(lines[i]);
	}
	lines=[];
	polygonPoints=[];
	if(polygon!=null)
	{
		map.removeOverlay(polygon);
		polygon=null;
	}
	map.clearOverlays();

	for(var i=0;i<points.length;++i)
	{
		//var marker=new GMarker(points[i],{icon:Icon,draggable:true});
		//markers.push(marker);
		map.addOverlay(createMarker(points[i], i));
		//map.addOverlay(marker);
		
		if(i>0&&points.length>=3)
		{
			AddPolylines(lines,GreatCirclePoints(points[i-1],points[i]),lineColor,lineWidth);
		}	
	}
	
	if(points.length>=2)
AddPolylines(lines,GreatCirclePoints(points[points.length-1],points[0]),closerColor,lineWidth);

	if(points.length>=3)
	{
		polygon=new GPolygon(polygonPoints,lineColor,0,0,fillColor,0.5);
		map.addOverlay(polygon);
	}

	areaDiv.innerHTML='&nbsp;';
	areaDivkm.innerHTML='&nbsp;';

	if(points.length>=3)
	{
		//alert (pointInPolygon(5.6597185545,12.788085938,pointsy,pointsx,points.length+1));
		p= new GLatLng(5.6597185545, 12.788085938);
		
		if (polygon.Contains(p)) {
         // alert ("The mouse is INSIDE the polygon.");
        } else {
		//	alert ("The mouse is outside the polygon.");
         
        }

	
		var areaMeters2=SphericalPolygonAreaMeters2(points);
		if(areaMeters2<1000000.0)
			areaMeters2=PlanarPolygonAreaMeters2(points);
			//update display for area
		areaDiv.innerHTML=Areas(areaMeters2);
		areaDivkm.innerHTML=Areaskm(areaMeters2);
	}

}
 

function AddPolylines(lines,ps,lineColor,lineWidth)
{
	var line=new GPolyline(ps,lineColor,lineWidth);
	lines.push(line);
	map.addOverlay(line);
	for(var i=0;i<ps.length;++i)
		polygonPoints.push(ps[i]);
}

var metersPerKm=1000.0;
var meters2PerHectare=10000.0;
var feetPerMeter=3.2808399;
var feetPerMile=5280.0;
var acresPerMile2=640;

function Areas(areaMeters2)
{
	var areaHectares=areaMeters2/meters2PerHectare;
	var areaKm2=areaMeters2/metersPerKm/metersPerKm;
	var areaFeet2=areaMeters2*feetPerMeter*feetPerMeter;
	var areaMiles2=areaFeet2/feetPerMile/feetPerMile;
	var areaAcres=areaMiles2*acresPerMile2;
	
	//cut out long stuff
	return areaMeters2.toFixed(5)+' m&sup2; <br />'+areaKm2.toFixed(5)+' km&sup2; <br /> '+areaHectares.toFixed(5)+' hectares <br /><br />';
	
	//return areaMeters2+' m&sup2; ';
}

function Areaskm(areaMeters2)
{
	var areaHectares=areaMeters2/meters2PerHectare;
	var areaKm2=areaMeters2/metersPerKm/metersPerKm;
	var areaFeet2=areaMeters2*feetPerMeter*feetPerMeter;
	var areaMiles2=areaFeet2/feetPerMile/feetPerMile;
	var areaAcres=areaMiles2*acresPerMile2;
	
	//cut out long stuff
	return areaFeet2.toFixed(5)+' ft&sup2; <br /> '+areaAcres.toFixed(5)+' acres <br /> '+areaMiles2.toFixed(5)+' mile&sup2;';
	
	//return areaKm2+' km&sup2; ';
}

var earthRadiusMeters=6367460.0;
var metersPerDegree=2.0*Math.PI*earthRadiusMeters/360.0;

function GreatCirclePoints(p1,p2)
{
	var maxDistanceMeters=200000.0;
	var ps=[];
	if(p1.distanceFrom(p2)<=maxDistanceMeters)
{
	ps.push(p1);
	ps.push(p2);
}
else
{
	var theta1=p1.lng()*radiansPerDegree;
	var phi1=(90.0-p1.lat())*radiansPerDegree;
	var x1=earthRadiusMeters*Math.cos(theta1)*Math.sin(phi1);
	var y1=earthRadiusMeters*Math.sin(theta1)*Math.sin(phi1);
	var z1=earthRadiusMeters*Math.cos(phi1);
	var theta2=p2.lng()*radiansPerDegree;
	var phi2=(90.0-p2.lat())*radiansPerDegree;
	var x2=earthRadiusMeters*Math.cos(theta2)*Math.sin(phi2);
	var y2=earthRadiusMeters*Math.sin(theta2)*Math.sin(phi2);
	var z2=earthRadiusMeters*Math.cos(phi2);
	var x3=(x1+x2)/2.0;
	var y3=(y1+y2)/2.0;
	var z3=(z1+z2)/2.0;
	var r3=Math.sqrt(x3*x3+y3*y3+z3*z3);
	var theta3=Math.atan2(y3,x3);
	var phi3=Math.acos(z3/r3);
	var p3=new GLatLng(90.0-phi3*degreesPerRadian,theta3*degreesPerRadian);
	var s1=GreatCirclePoints(p1,p3);
	var s2=GreatCirclePoints(p3,p2);
	for(var i=0;i<s1.length;++i)
	ps.push(s1[i]);
	for(var i=1;i<s2.length;++i)
	ps.push(s2[i]);
}
return ps;
}

function PlanarPolygonAreaMeters2(points)
{var a=0.0;
for(var i=0;i<points.length;++i)
{var j=(i+1)%points.length;
var xi=points[i].lng()*metersPerDegree*Math.cos(points[i].lat()*radiansPerDegree);
var yi=points[i].lat()*metersPerDegree;
var xj=points[j].lng()*metersPerDegree*Math.cos(points[j].lat()*radiansPerDegree);
var yj=points[j].lat()*metersPerDegree;
a+=xi*yj-xj*yi;
}
return Math.abs(a/2.0);
}

function SphericalPolygonAreaMeters2(points)
{
	var totalAngle=0.0;
	for(i=0;i<points.length;++i)
	{
		var j=(i+1)%points.length;
		var k=(i+2)%points.length;
		totalAngle+=Angle(points[i],points[j],points[k]);
	}
	var planarTotalAngle=(points.length-2)*180.0;
	var sphericalExcess=totalAngle-planarTotalAngle;
	if(sphericalExcess>420.0)
	{
		totalAngle=points.length*360.0-totalAngle;
		sphericalExcess=totalAngle-planarTotalAngle;
	}
	else if(sphericalExcess>300.0&&sphericalExcess<420.0)
	{
		sphericalExcess=Math.abs(360.0-sphericalExcess);
	}
	return sphericalExcess*radiansPerDegree*earthRadiusMeters*earthRadiusMeters;
}

function Angle(p1,p2,p3)
{
	var bearing21=Bearing(p2,p1);
	var bearing23=Bearing(p2,p3);
	var angle=bearing21-bearing23;
	if(angle<0.0)
	angle+=360.0;
	return angle;
}
var clicked=false,doubleClicked;

function MapClick(overlay,point)
{

		if(overlay==null&&point!=null)
		{
			if(clicked)
			doubleClicked=true;
			else
			{
				clicked=true;
				doubleClicked=false;
				setTimeout(MakeCaller(MapClickLater,point),250);
			}
		}
	
}


function MapClickLater(point)
{
	
		if(!doubleClicked)
		{
			
			temp =(String(point).split(','));
			
			temp[0]=stripCharacter(temp[0],'(');
			temp[1]=stripCharacter(temp[1],')');
			
			pointsx.push(temp[0]);
			pointsy.push(temp[1]);
			
			points.push(point);
			Display();
		}
		clicked=false;
	
}

function stripCharacter(words,character) {
	  var spaces = words.length;
	  for(var x = 1; x<spaces; ++x){
	   words = words.replace(character, "");   
	}
	 return words;
    }

function DeleteLastPoint()
{
	if(points.length>0)
	points.length--;
	Display();
}

function ClearAllPoints()
{
	points=[];
	Display();
}





  // === A method for testing if a point is inside a polygon
      // === Returns true if poly contains point
      // === Algorithm shamelessly stolen from http://alienryderflex.com/polygon/ 
      GPolygon.prototype.Contains = function(point) {
		 // alert(point);
        var j=0;
        var oddNodes = false;
        var x = point.lng();
        var y = point.lat();
        for (var i=0; i < this.getVertexCount(); i++) {
          j++;
          if (j == this.getVertexCount()) {j = 0;}
          if (((this.getVertex(i).lat() < y) && (this.getVertex(j).lat() >= y))
          || ((this.getVertex(j).lat() < y) && (this.getVertex(i).lat() >= y))) {
            if ( this.getVertex(i).lng() + (y - this.getVertex(i).lat())
            /  (this.getVertex(j).lat()-this.getVertex(i).lat())
            *  (this.getVertex(j).lng() - this.getVertex(i).lng())<x ) {
              oddNodes = !oddNodes
            }
          }
        }
        return oddNodes;
      }
