var map = null;
var geocoder = null;
var marky;

function initialize() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map_canvas"));
    map.setCenter(new GLatLng(55.5, -3.0), 5);
    map.setUIToDefault();
    GEvent.addListener(map, "moveend", function() {
		var center = map.getCenter();
        document.getElementById("latlong").innerHTML = RoundDec(center.lat(),4) + ' &deg;N, ' + RoundDec(center.lng(),4) + ' &deg;E';          
        inlat = deg2rad(center.lat());
		inlon = deg2rad(center.lng());
		document.getElementById("osng").innerHTML = gridfinder(inlat, inlon);
		document.getElementById("osng_names").innerHTML = sheetfinder(inlat, inlon);
		document.getElementById("address").innerHTML = '';
		//document.getElementById("alternatives").innerHTML = '';
		lookupAddress(center);
		showMarker(center);
	});
    geocoder = new GClientGeocoder();
    geocoder.setBaseCountryCode("uk");
    geocoder.setViewport(new GLatLngBounds(new GLatLng(48.0,-12.0), new GLatLng(63.0,3.0)));
  	document.getElementById("for_deletion").innerHTML = ''
  }
}

function lookupAddress(loc) {
	if (geocoder) {
		geocoder.getLocations(
			loc,
			function(response) {
				place = response.Placemark[0];
	   		    document.getElementById("address").innerHTML = place.address;
		        var str = '<ul>';
                // Loop through the results, placing markers
                for (var i=0; i<response.Placemark.length; i++) {
	            	str = str + '<li>' + response.Placemark[i].address + '</li>';
		  	    }
			    document.getElementById("alternatives").innerHTML = str + '</ul>';
		    }
		);
	}
}

function showMarker(loc) {
	if (marky) {map.removeOverlay(marky); }
	marky = new GMarker(loc);
	map.addOverlay(marky);
}

function showAddress(address) {
  if (geocoder) {
    geocoder.getLatLng(
      address,
      function(point) {
        if (!point) {
          alert(address + " not found");
        } else {
          map.setCenter(point, 11);
		  //display_maps(point.lat(), point.lng());
          document.getElementById("latlong").innerHTML = RoundDec(point.lat(),3) + ' &deg;N, ' + RoundDec(point.lng(),3) + ' &deg;E';          
          inlat = deg2rad(point.lat());
		  inlon = deg2rad(point.lng());
		  document.getElementById("osng").innerHTML = gridfinder(inlat, inlon);
		  document.getElementById("osng_names").innerHTML = sheetfinder(inlat, inlon);
        }
      }
    );
    geocoder.getLocations(
    	address,
    	function(response) {
          place = response.Placemark[0];
		  document.getElementById("address").innerHTML = place.address;
		  var str = '';
          // Loop through the results, placing markers
          for (var i=0; i<response.Placemark.length; i++) {
	          str = str + '<br />' + response.Placemark[i].address
		  }
		  document.getElementById("alternatives").innerHTML = str;
	  }	  
	);
  }
}

function display_maps(dlat, dlng) {
	document.getElementById("latlong").innerHTML = RoundDec(dlat,3) + ' &deg;N, ' + RoundDec(dlng,3) + ' &deg;E';
	inlat = deg2rad(dlat);
	inlon = deg2rad(dlng);
	document.getElementById("osng").innerHTML = gridfinder(inlat, inlon);
	document.getElementById("osng_names").innerHTML = sheetfinder(inlat, inlon);	
}



function gridfinder(inlat, inlong) {
	if (is_in_Ireland(inlat, inlong)) {
		var osi65 = WGS842OSI65(inlat, inlong); var cooresult = Geo2TM(osi65.latitude, osi65.longitude, OSIG);
		var refresult = conv_EN2GR(cooresult.eastings, cooresult.northings, OSIG_GS);
		return 'Irish National Grid Reference: <b>' + refresult.square + ' ' + refresult.eastings + ' ' + refresult.northings + '</b>';
	} else {
		var osgb36 = WGS842OSGB36(inlat, inlong); var cooresult = Geo2TM(osgb36.latitude, osgb36.longitude, OSNG);
		var refresult = conv_EN2GR(cooresult.eastings, cooresult.northings, OSNG_GS);
		return 'British National Grid Reference: <b>' + refresult.square + ' ' + refresult.eastings + ' ' + refresult.northings + '</b>';
	}
}
		

function sheetfinder(inlat, inlong) {
	var osgb36 = WGS842OSGB36(inlat, inlong); var osi65 = WGS842OSI65(inlat, inlong);
	var osng = Geo2TM(osgb36.latitude, osgb36.longitude, OSNG);
	var cdel = Geo2CS(osgb36.latitude, osgb36.longitude, CDEL);
	var bons = Geo2BN(osgb36.latitude, osgb36.longitude, BONS);
	var osig = Geo2TM(osi65.latitude, osi65.longitude, OSIG);
	var boni = Geo2BN(osi65.latitude, osi65.longitude, BONI);
	
	var stringResult = '';
	var stringSeriesName = '';
	var stringLastSeriesName = '';
	for (sheet in unsquare_sheets) {
		var eastings = relevant_eastings(unsquare_sheets[sheet].scheme, osng, osig, cdel, bons, boni)
		var northings = relevant_northings(unsquare_sheets[sheet].scheme, osng, osig, cdel, bons, boni)
		if (unsquare_sheets[sheet].is_place_on_unsquare_sheet(eastings, northings)) {
			stringSeriesName = series_name_by_number(unsquare_sheets[sheet].sheet_series);
			if (stringSeriesName != stringLastSeriesName) {
				stringResult += '<b>' + stringSeriesName + '</b><br />';
			} 
			stringResult += '&nbsp;&nbsp;Sheet ' + unsquare_sheets[sheet].sheet_number;
			stringLastSeriesName = stringSeriesName;
			if (unsquare_sheets[sheet].sheet_name != '') {
				stringResult += ', <i>' + unsquare_sheets[sheet].sheet_name + '</i><br />';
			} else {
				stringResult += '<br />';
			}
		}
	}	
	
	var stringLastSeriesName = '';
	for (sheet in square_sheets) {
		var eastings = relevant_eastings(square_sheets[sheet].scheme, osng, osig, cdel, bons, boni)
		var northings = relevant_northings(square_sheets[sheet].scheme, osng, osig, cdel, bons, boni)
		if (square_sheets[sheet].is_place_on_square_sheet(eastings, northings)) {
			stringSeriesName = series_name_by_number(square_sheets[sheet].sheet_series);
			if (stringSeriesName != stringLastSeriesName) {
				stringResult += '<b>' + stringSeriesName + '</b><br />';
			}
			if (square_sheets[sheet].sheet_url) {
				if (square_sheets[sheet].sheet_series == 5) {
					var nls_url = 'http://www.nls.uk:8080/StyleServer/calcrgn?cat=OneInchPopularEnglandWales&item=/' + square_sheets[sheet].sheet_url + '.sid&style=maps.xsl&wid=700&hei=500&browser=win_ie&plugin=false';
				} else {
					var nls_url = 'http://www.nls.uk:8080/StyleServer/calcrgn?cat=Maps&item=/' + square_sheets[sheet].sheet_url + '.sid&style=maps.xsl&wid=700&hei=500&browser=win_ie&plugin=false';
				}
				stringResult += '&nbsp;&nbsp;<a href="' + nls_url + '" target="_blank">';
			} else {
				stringResult += '&nbsp;&nbsp;';
			}
			stringResult += 'Sheet ' + square_sheets[sheet].sheet_number;
			if (square_sheets[sheet].sheet_name != '') {
				stringResult += ', <i>' + square_sheets[sheet].sheet_name + '</i>';
			}
			if (square_sheets[sheet].sheet_url) {
				stringResult += '</a>';
			}
			stringResult += '<br />';
			stringLastSeriesName = stringSeriesName;
		}
	}
	
	
 	var ctyres = Geo2CtyString(osgb36.latitude, osgb36.longitude);
 	if (ctyres.length>0) {
	 	stringResult += '<b>Six Inch County Series</b><br />';
 		for (i=0;i<ctyres.length;i++) {
	 		stringResult += '&nbsp;&nbsp;' + ctyres[i] + '<br />';
 		}
	}
 	
	return stringResult;
}

function is_in_Ireland(inlat, inlong) {
	var osi65 = WGS842OSI65(inlat, inlong); var osig = Geo2TM(osi65.latitude, osi65.longitude, OSIG);
	for (sheet in square_sheets) {
		if (square_sheets[sheet].scheme == 5) {
			if (square_sheets[sheet].is_place_on_square_sheet(osig.eastings/1000.0, osig.northings/1000.0)) {
				return true;
			}
		}
	}
	return false;
}

function relevant_eastings(scheme, osng, osig, cdel, bons, boni) {
	switch (scheme) {
		case 1:
			var eastings = osng.eastings / 1000.0;
			break;
		case 2:
			var eastings = cdel.eastings;
			break;
		case 3:
			var eastings = bons.eastings;
			break;
		case 4:
			var eastings = boni.eastings;
			break;
		case 5:
			var eastings = osig.eastings / 1000.0;
			break;
		case 6:
			var eastings = NG2YG(osng.eastings, osng.northings).eastings / 1000.0;
			break;
	}
	return eastings;
}

function relevant_northings(scheme, osng, osig, cdel, bons, boni) {
	switch (scheme) {
		case 1:
			var northings = osng.northings / 1000.0;
			break;
		case 2:
			var northings = cdel.northings;
			break;
		case 3:
			var northings = bons.northings;
			break;
		case 4:
			var northings = boni.northings;
			break;
		case 5:
			var northings = osig.northings / 1000.0;
			break;
		case 6:
			var northings = NG2YG(osng.eastings, osng.northings).northings / 1000.0;
			break;
	}
	return northings;
}
	


// Unused, I think...

function sheet_names(eastings, northings) {
	var stringResult = '';
	eastings = eastings / 1000.0;
	northings = northings / 1000.0;
	for (sheet in bng_sheets) {
		if (bng_sheets[sheet].is_place_on_sheet(eastings, northings)) {
			stringResult += 'Sheet ' + bng_sheets[sheet].sheet_number + ', ' + bng_sheets[sheet].sheet_name + '<br />';
		}
	}
	return stringResult;
}
			
function cassini_names(eastings, northings) {
	var stringResult = '';
	//eastings = eastings / 1000.0;
	//northings = northings / 1000.0;
	for (sheet in cassini_sheets) {
		if (cassini_sheets[sheet].is_place_on_sheet(eastings, northings)) {
			stringResult += 'Sheet ' + cassini_sheets[sheet].sheet_number + ', ' + cassini_sheets[sheet].sheet_name + '<br />';
		}
	}
	return stringResult;
}

function bonnes_names(eastings, northings) {
	var stringResult = '';
	//eastings = eastings / 1000.0;
	//northings = northings / 1000.0;
	for (sheet in bonnes_sheets) {
		if (bonnes_sheets[sheet].is_place_on_sheet(eastings, northings)) {
			stringResult += 'Sheet ' + bonnes_sheets[sheet].sheet_number + ', ' + bonnes_sheets[sheet].sheet_name + '<br />';
		}
	}
	return stringResult;
}
