// JavaScript Document

var Icon=new GIcon(G_DEFAULT_ICON);

Icon.image="http://sandbox.htmlblender.com/bpdc/wp-content/themes/claculator/public/js/marker.png";
Icon.shadow="http://sandbox.htmlblender.com/bpdc/wp-content/themes/claculator/public/js/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 mapDiv=document.getElementById('map');
var areaDivFeetTB=document.getElementById('tb_areafeet');

var flag = false;

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 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 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.addMapType(G_PHYSICAL_MAP);
	map.addControl(new GMenuMapTypeControl());
	map.addControl(new GScaleControl());
	GEvent.addListener(map,'click',MapClick);

    map.setCenter(new GLatLng(0,0), 3);
	map.setMapType(G_NORMAL_MAP);
	
	areaDivFeetTB.value="";
	
	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)
	{

		map.addOverlay(createMarker(points[i], i));
		
		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);
	}

	if(points.length>=3)
	{
		p= new GLatLng(5.6597185545, 12.788085938);
		
		var areaMeters2=SphericalPolygonAreaMeters2(points);
		if(areaMeters2<1000000.0)
		{
			areaMeters2=PlanarPolygonAreaMeters2(points);
		}
		
        
/*        if (!flag){
            flag = true;
            var hint = document.getElementById("hint");
            hint.style.display = 'block';
            setTimeout('document.getElementById("hint").style.display = "none"', 5000);
        }*/
		//update display for area
		areaDivFeetTB.value=Areasfeet(areaMeters2).toFixed(2);
	}

}

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;
	
	return areaMeters2+' m&sup2;';
}

function Areasfeet(areaMeters2)
{
	var areaHectares=areaMeters2/meters2PerHectare;
	var areaKm2=areaMeters2/metersPerKm/metersPerKm;
	var areaFeet2=areaMeters2*feetPerMeter*feetPerMeter;
	var areaMiles2=areaFeet2/feetPerMile/feetPerMile;
	var areaAcres=areaMiles2*acresPerMile2;
	
	return areaFeet2;
}

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();
}


function SearchPoints()
{

for(var i=0;i<pointsrand.length;++i)
	
		
	
	//if pointsrand[i]
			
			//p= new GLatLng(5.6597185545, 12.788085938);
		
		if (polygon.Contains(pointsrand[i])) {
			 map.addOverlay(new GMarker(pointsrand[i]),Icon);
         // alert ("The mouse is INSIDE the polygon.");
        } else {
		//	alert ("The mouse is outside the polygon.");
         
        }
	
	

}


// === 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;
  };


function clearall()
{
	points=[];
	map.clearOverlays();
	areaDivFeetTB.value="";
	Display();
}

function clearlast()
{
	points.pop();
	areaDivFeetTB.value="";
	Display();
}

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 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);};}
