var done = {};
var spts;
var map;
var poly;
var pcntr;

function grabInfo(param){
var street = $('sbox').value;
var address;
var ele;
var viewnear = "17";
var viewmid = "13";
var viewfar = "10";


        if(param == "quick"){
	$('zcheck').innerHTML = "<input id=sbox type=text onsubmit=\"grabInfo('street'); return false;\"><input type=button id=getgeo value=\"Search Address\" onclick=\"grabInfo('street'); return false;\">";
        address = street;
        ele = viewnear;
        }else if(param == "street"){
        address = street;
        ele = viewnear;
        }else{
        alert("nothing matched");
        return;
        }

var statmsg = "Attempting to geocode for '" + address + "' at google.com";
changeStatus(statmsg, "");
getUSGeo(address, ele);
}


function getUSGeo(addr, ele) {
var addStatus = $('addstatus');
var latitude = $('lat');
var longitude = $('lon');
var geo = new GClientGeocoder();
var reasons=[];
reasons[G_GEO_SUCCESS]            = "Success";
reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";

	geo.getLocations(addr, function (result) {
		if(result.Status.code == G_GEO_SUCCESS) {
              // How many resuts were found
		var num = result.Placemark.length;


                        if(num > 1) {
                        var gaddrs = "<select name=multAddr id=sbox onChange=\"grabInfo('quick'); return false;\">";
			gaddrs += "<option value=null>Please Select an address from below</option>";
                                for(ad=0;ad<num;ad++){
                                var multAddr = result.Placemark[ad].address;
                                var multLatLon = result.Placemark[ad].Point.coordinates;
                                gaddrs += "<option value=\"" + multAddr + "\">" + multAddr + "</option>";
                                }
                        gaddrs += "</select>";
                        $('zcheck').innerHTML = gaddrs;
                        changeStatus("Multiple Addresses found, please select one from the dropdown bar", "normal");

			}else{
			
			var p = result.Placemark[0].Point.coordinates;
			var lat = p[1];
			var lon = p[0];
			latitude.value = lat;
			longitude.value = lon;
			$('lat').innerHTML = lat;
			$('lon').innerHTML = lon;
			$('ele').innerHTML = ele;
			var details = result.Placemark[0].details;
			var place = result.Placemark[0];
			alert(place.address);
//var streetAddress = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;var city = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;
//var state = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
//var zip = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
			//alert(streetAddress);
			//alert(city);
			//alert(state);
			//alert(zip);
			loadMap(lat, lon, ele, "map");
			changeStatus("SUCCESS: Please move the marker below to change your Latitude and Longitude", "normal");
			}
		}else{
		var reason="Code "+result.Status.code;
			if(reasons[result.Status.code]) {
			reason= reasons[result.Status.code];
			}
		alert("ERROR: " + reason);
		}
	}
	);

}
	


function loadMap(dblat,dblon,ele,elid,type) {

        dblon=Number(dblon);
        dblat=Number(dblat);
        $('lat').innerHTML = dblat;
        $('lon').innerHTML = dblon;
        $('ele').innerHTML = ele;

        ele=Number(ele);
	map = new GMap2(document.getElementById(elid));
        var markerInfo = "TEST TEST";
        var addStatus = $('addstatus');
        if (!GBrowserIsCompatible()) { return;}
        var pts = new GLatLng(dblat,dblon);
        map.setCenter(pts, ele);
        //map.setMapType(G_HYBRID_TYPE);
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.addControl(new GOverviewMapControl());
        map.enableScrollWheelZoom();
        map.enableDoubleClickZoom();
        map.enableContinuousZoom();
        //var marker = new GMarker(pts, {draggable: true, icon: icon});
        //marker.GMarkerOptions.draggable = true;
        map.enableScrollWheelZoom();
        var reversegeocoder = new GReverseGeocoder(map);
	var mkr;
	var pcntr;

        GEvent.addListener(reversegeocoder, "load",
          function(placemark) {
            $('revgeo').innerHTML = placemark.address;
          }
        );

	GEvent.addListener(reversegeocoder, "error",
  	function() {
    	$('revgeo').innerHTML = "Unable to Reverse geocode";
  	 }
	);


	mkr = buildMarker(pts, mkr, reversegeocoder);
	map.addOverlay(mkr);
	spts = pts;




		GEvent.addListener(map, "zoomend", function(){
		$('ele').innerHTML = map.getZoom();
		});

                GEvent.addListener(map,"click", function(overlay,latlng) {
		map.removeOverlay(mkr);
			if(!latlng){	
			var curzoom = map.getZoom();
			map.setZoom(curzoom + 1);
			return
			};
                $('lat').innerHTML = latlng.lat();
                $('lon').innerHTML = latlng.lng();
		mkr = buildMarker(latlng, mkr, reversegeocoder);
		map.addOverlay(mkr);
		spts = latlng;

			if(poly){
			map.removeOverlay(poly);
			}
		//poly = addPoly(latlng, map, poly);
		//map.addOverlay(poly);
                });

changeStatus("Map Loaded, please move the <img src='http://maps.google.com/mapfiles/ms/micons/red-pushpin.png' border=0> in order to see your Longitude and Latitude!", "normal");


}

function changeStatus(message, type) {
$('zipstatus').innerHTML = message;
$('statusimg').src = "/images/" + type + ".gif";
//$('medload').src= "/images/med" + type + ".gif";
}

function addPoly(epts){
	if(poly){
	map.removeOverlay(poly);
	}

slat = spts.lat();
slng = spts.lng();
elat = epts.lat();
elng = epts.lng();

var units = $F("units");
//Calculate distance between points
var line1 = distCalc(slat,slng,slat,elng,units);
var line2 = distCalc(slat,elng,elat,elng,units);
var line3 = distCalc(elat,elng,elat,slng,units);
var line4 = distCalc(elat,slng,slat,slng,units);
var diag = distCalc(slat,slng,elat,elng,units);
var tri1 = triangleCalc(line1,line2,diag);
var tri2 = triangleCalc(line3,line4,diag);
var perimeter = line1 + line2 + line3 + line4;
var area = Math.round(((tri1 + tri2) * 100) /100);

$('line2').innerHTML = Math.round(line1 * 100)/100 + " " + units;
$('line1').innerHTML = Math.round(line2 * 100)/100 + " " + units;
//$('line3').innerHTML = line3 + " " + units;
//$('line4').innerHTML = line4 + " " + units;
//$('line5').innerHTML = Math.round((diag * 100)/100) + " " + units;
//$('line6').innerHTML = Math.round((perimeter * 100)/100) + " " + units;
//$('line7').innerHTML = Math.round((area * 100)/100) + " square " + units;

var latOffset = 0.01;
var lonOffset = 0.01;
var polygon = new GPolygon([
new GLatLng(slat, slng),
new GLatLng(slat, elng),
new GLatLng(elat, elng),
new GLatLng(elat, slng),
new GLatLng(slat, slng)
], "#000033", 1, 1, "#ff0000", 0.2);
return polygon;
}



//distance from center of the earth to sea level 6,370,000 meters
//  x = alt * cos(lat) * sin(long)
//  y = alt * sin(lat)
//  z = alt * cos(lat) * cos(long)
//  x = alt * cos(long) * sin(90 degr - lat)
//  y = alt * sin(long) * sin(90 degr - lat)
//  z = alt * cos(90 degr - lat)a
// Math.sin(i) rads asin
// Math.cos(i) rads acos
// Math.atan2(i,a)
// Math.sqrt(i)
// Math.pow(i.p)
//dist = square root( (x1-x0)^2 + (y1-y0)^2 + (z1-z0)^2 )

function buildMarkerBACK(pts, mkr, reversegeocoder){

	if(mkr){
	map.removeOverlay(mkr);
	}
	if(pcntr){
	map.removeOverlay(pcntr);
	}
var icon = new GIcon();
//icon.image = "http://maps.google.com/mapfiles/ms/micons/red-pushpin.png";
//icon.shadow = "http://maps.google.com/mapfiles/ms/micons/pushpin_shadow.png";
icon.image = "/images/pencil48.png";
icon.shadow = "/images/pencil.shadow48.png";
icon.iconSize = new GSize(48, 48);
icon.shadowSize = new GSize(59, 48);
icon.iconAnchor = new GPoint(3, 46);
icon.infoWindowAnchor = new GPoint(3, 48);
var marker = new GMarker(pts, {draggable: true, icon: icon});
	GEvent.addListener(marker, "dragstart", function(){
        map.closeInfoWindow();
        });

        GEvent.addListener(marker, "drag", function() {
        var newll = marker.getPoint();
        var newlat = newll.lat();
        var newlon = newll.lng();
        $('lat').innerHTML = newlat;
        $('lon').innerHTML = newlon;
        poly = addPoly(newll);
        map.addOverlay(poly);
        });

        GEvent.addListener(marker, "dragend", function() {
        var newll = marker.getPoint();
	pcntr = polyCenter(newll, reversegeocoder);
	map.removeOverlay(marker);
	map.addOverlay(pcntr);
        });

reversegeocoder.reverseGeocode(pts);
return marker;
}

function buildMarker(pts, mkr, reversegeocoder){

        if(mkr){
        map.removeOverlay(mkr);
        }
        if(pcntr){
        map.removeOverlay(pcntr);
        }
var icon = new GIcon();
//icon.image = "http://maps.google.com/mapfiles/ms/micons/red-pushpin.png";
//icon.shadow = "http://maps.google.com/mapfiles/ms/micons/pushpin_shadow.png";
icon.image = "/images/pencil48.png";
icon.shadow = "/images/pencil.shadow48.png";
icon.iconSize = new GSize(48, 48);
icon.shadowSize = new GSize(59, 48);
icon.iconAnchor = new GPoint(3, 46);
icon.infoWindowAnchor = new GPoint(3, 48);
var marker = new GMarker(pts, {draggable: true, icon: icon});
        GEvent.addListener(marker, "dragstart", function(){
        map.closeInfoWindow();
        });

        GEvent.addListener(marker, "drag", function() {
        var newll = marker.getPoint();
        var newlat = newll.lat();
        var newlon = newll.lng();
        //$('lat').value = newlat;
        //$('lon').value = newlon;
        //$('clat').innerHTML = newlat;
        //$('clon').innerHTML = newlon;
        poly = addPoly(newll);
        map.addOverlay(poly);
        });

        GEvent.addListener(marker, "dragend", function() {
        var newll = marker.getPoint();
        pcntr = polyCenter(newll, reversegeocoder);
        map.removeOverlay(marker);
        map.addOverlay(pcntr);
        });

reversegeocoder.reverseGeocode(pts);
return marker;
}



function polyCenter(pts, reversegeocoder){
var icon = new GIcon();
icon.image = "http://maps.google.com/mapfiles/ms/micons/camera.png";
icon.shadow = "http://maps.google.com/mapfiles/ms/micons/camera.shadow.png";
icon.iconSize = new GSize(32, 32);
icon.shadowSize = new GSize(59, 32);
icon.iconAnchor = new GPoint(3, 25);
icon.infoWindowAnchor = new GPoint(10, 30);

var slat = spts.lat();
var slng = spts.lng();
var elat = pts.lat();
var elng = pts.lng();


var cntlat = (slat + slat + elat + elat)/4;
var cntlng = (slng + slng + elng + elng)/4;
var cntlatlng = new GLatLng(cntlat, cntlng);
var marker = new GMarker(cntlatlng, {icon: icon});
reversegeocoder.reverseGeocode(cntlatlng);
return marker;
}

//Centroid X coord = (x1+x2+x3) / 3
//Centroid Y coord = (y1+y2+y3) / 3

function distCalc(lat1,lon1,lat2,lon2,units){
//kilometers : 6378.14
//meters : 6378140
//miles : 3959
//feet : 20924640
var earthrad;

	if(units == "miles"){
	earthrad = Number(3959);
	}else if(units == "feet"){
	earthrad = Number(20924640);
	}else if(units == "kilometers"){
	earthrad = Number(6378.14);
	}else{
	earthrad = Number(6378140);
		          //6371000
	}


//convert latitude/longitude to radians
var div = Number(57.2958);

x = (Math.sin(lat1/div) * Math.sin(lat2/div)) + (Math.cos(lat1/div) * Math.cos(lat2/div) * Math.cos((lon2/div) - (lon1/div)));

var miles = earthrad * Math.atan2(Math.sqrt(1 - (Math.pow(x,2))),x);
return miles;
}

function triangleCalc(a,b,c){
//Formula - s = (a + b + c) / 2 or 1/2 of the perimeter of the triangle
//Formula - A = SquareRoot(s * (s - a) * (s - b) * (s - c))
var s = (a + b + c) / 2;
var area = Math.sqrt(s * (s - a) * (s - b) * (s - c));
return area 
}





