var shown = false;
function showMap() {
	shown=true;
	if (GBrowserIsCompatible()) {
		var map = new GMap2(document.getElementById("map"));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(40.09596548172856, -74.22213077545166), 5);
		
		GEvent.addListener(map, 'click', function(overlay, point) {
		
			if (overlay) {
			  //map.removeOverlay(overlay);
			} else if (point) {
				map.clearOverlays();
				map.addOverlay(new GMarker(point));
				map.panTo(point); 
				document.zmanim.latitude.value = point.y;
				document.zmanim.longitude.value = point.x;
				document.zmanim.elevation.value=0;
			}
		});
	}
}

function displayMap(){
	if(document.getElementById("map").style.display=="block"){
		document.getElementById("map").style.display="none"
	} else {
		document.getElementById("map").style.display="block";
		if(! shown){
			showMap();
		}

	}
}

function loadXML(latitude, longitude) {
	var url = "http://www.kosherjava.com/zmanim/elevation.php?latitude=" + latitude + "&longitude=" + longitude;
	var elevation = 0;
	//alert(url);
	var request = GXmlHttp.create();
	request.open('GET', url, true);
	//alert("after request.open");
	request.onreadystatechange = function() {
		//alert("in onreadystatechange = function");
		if (request.readyState == 4) {
			//alert("in if (request.readyState == 4) ");
			var xmlDoc = request.responseXML;
			elevation = xmlDoc.documentElement.getElementsByTagName("meters")[0].firstChild.nodeValue;
			alert(elevation);
			//alert("elevation=" + elevation);
			document.zmanim.elevation.value = elevation;
		} else {
			document.zmanim.elevation.value ="problems";
		}
	}
	request.send(null);
	document.zmanim.elevation.value = elevation;
	//alert("exiting loadXML");
}


var degreesPerRadian = 180.0 / Math.PI;
var radiansPerDegree = Math.PI / 180.0;
 
// Returns the bearing in degrees between two points.
// North = 0, East = 90, South = 180, West = 270.
function bearing( from, to ) {
	// See T. Vincenty, Survey Review, 23, No 176, p 88-93,1975.
	// Convert to radians.
	var lat1 = from.latRadians();
	var lon1 = from.lngRadians();
	var lat2 = to.latRadians();
	var lon2 = to.lngRadians();

	// Compute the angle.
	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;

	// And convert result to degrees.
	angle = angle * degreesPerRadian;
	angle = angle.toFixed(1);

	return angle;
}


function showJerusalemMap() {
	if (GBrowserIsCompatible()) {
		var showGodesic=true;
		var map = new GMap2(document.getElementById("map"));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		//map.setCenter(new GLatLng(40.09596548172856, -74.22213077545166), 5);
		var kosel = new GLatLng(31.7773990631, 35.2341003418);

		var point = new GLatLng(40.095965, -74.222130);//lakewood
		map.setCenter(kosel, 3);
		var koselMarker = new GMarker(kosel);
		var pointMarker = new GMarker(point);
		
		map.addOverlay(koselMarker);
		map.addOverlay(pointMarker);
		
		var points=[kosel, point];
		var straightPolyline = new GPolyline(points, "#ff0000", 3);
		
		
        map.addOverlay(straightPolyline);
        if(showGodesic){
			var geodesicPolyline = new GPolyline(points,"#00ff00", 3, 1,{geodesic:true});
			map.addOverlay(geodesicPolyline);
        }
        
        /*var straightLength = straightPolyline.getLength()/1000;
        var geodesicLength = geodesicPolyline.getLength()/1000;

    	var message = "The length of this great circle is: " + geodesicLength + " kilometers.";
    	message += "<br/>The length of the straight line is: " + straightLength + " kilometers.";
    	GEvent.addListener(pointMarker,"click", function() {
		     	    var myHtml = message;
		     	    map.openInfoWindowHtml(point, myHtml);
    	  });*/
		
		
		GEvent.addListener(map, 'click', function(overlay, point) {
		
			if (overlay) {
			  //map.removeOverlay(overlay);
			} else if (point) {
				map.clearOverlays();
				map.addOverlay(koselMarker);
				map.addOverlay(new GMarker(point));
				//map.panTo(point); 

				/*var distance = kosel.distanceFrom(point)/1000;
                var bearingToJ = bearing(point, kosel);*/
                
                points=[kosel, point];
                straightPolyline = new GPolyline(points, "#ff0000", 3);
                map.addOverlay(straightPolyline);
                
                if(showGodesic){
					geodesicPolyline = new GPolyline(points,"#00ff00", 3, 1,{geodesic:true});
					map.addOverlay(geodesicPolyline);
        		}
            	//map.addOverlay(new GPolyline(points, "#FF0000", 3));
				//alert("distance=" + distance.toFixed(0) +" kilometres \nBearing Circular Route=" + bearingToJ + "degrees");
				
				
			}
		});
	}
}

var addrEmptyMsg = 'Enter a location or zipcode';
function findGeoLocation(){
	var geocoder = new GClientGeocoder();
	var address = document.getElementById('address').value;
	if (address == '' || address == addrEmptyMsg)
	{
		alert(addrEmptyMsg);
		return;
	}
	geocoder.getLocations(address, showAddressOnMap);
}

// called when address bar is focused
function focusAddressBar()
{
	var address = document.getElementById('address');

	address.style.color = '#000000';
	if (address.value == addrEmptyMsg)
		address.value = '';
}


// called when address bar lose focus
function leaveAddressBar()
{
	var address = document.getElementById('address');

	if (address.value == '' || address.value == addrEmptyMsg)
	{
		address.style.color = '#999999';
		address.value = addrEmptyMsg;
	}
}

// show address on map
function showAddressOnMap(response) 
{
	if (!response || response.Status.code != 200) 
		alert('Address not found');
	else 
	{
		place = response.Placemark[0];
		point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
		map.setCenter(point, 8+ place.AddressDetails.Accuracy);
		marker = new GMarker(point);
		map.addOverlay(marker);
		marker.openInfoWindowHtml(place.address);
	}
}