// Based on a script by Tom Anthony
// http://www.tomanthony.co.uk/blog/geocoding-uk-postcodes-with-google-map-api/
// modified to support Street View based on
// http://code.google.com/p/gmaps-samples/source/browse/trunk/streetview/angletowardsbuilding.html?r=2356

var map;
var localSearch = new GlocalSearch();

var icon = new GIcon();
icon.image = "http://www.google.com/mapfiles/marker.png";
icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
icon.iconSize = new GSize(20, 34);
icon.shadowSize = new GSize(37, 34);
icon.iconAnchor = new GPoint(10, 34);


function usePointFromPostcode(postcode, callbackFunction) {

	localSearch.setSearchCompleteCallback(null,
		function() {

			if (localSearch.results[0])
			{
				var resultLat = localSearch.results[0].lat;
				var resultLng = localSearch.results[0].lng;
				var point = new GLatLng(resultLat,resultLng);
				callbackFunction(point);
			}else{
				alert("Postcode not found!");
			}
		});

	localSearch.execute(postcode + ", UK");
}

function placeMarkerAtPoint(point)
{
	var marker = new GMarker(point,icon);
	map.addOverlay(marker);
}

function setCenterToPoint(point)
{
	map.setCenter(point, 17);
}

function mapLoad() {
    if (GBrowserIsCompatible())
    {
        document.getElementById('nomap').style.display = 'none';

        map = new GMap2(document.getElementById("map"));	
        map.addControl(new GLargeMapControl());
        map.setCenter(new GLatLng(51.48793, -0.22229), 17, G_HYBRID_MAP);

        panoClient = new GStreetviewClient();            
        myPano = new GStreetviewPanorama(document.getElementById("pano"));

        usePointFromPostcode(document.getElementById('postcode').value,
            function (point)
            {
                showPanoData.point = point;
                placeMarkerAtPoint(point);
                setCenterToPoint(point);
                panoClient.getNearestPanorama(point, showPanoData);
            }
        );

    }
}

function showPanoData(panoData)
{
    if (panoData.code != 200)
        return;

    var angle = computeAngle(showPanoData.point, panoData.location.latlng);
    myPano.setLocationAndPOV(panoData.location.latlng, {yaw: angle});

    document.getElementById('streetViewButton').style.display = 'inline';
}

function computeAngle(endLatLng, startLatLng)
{
    var DEGREE_PER_RADIAN = 57.2957795;
    var RADIAN_PER_DEGREE = 0.017453;

    var dlat = endLatLng.lat() - startLatLng.lat();
    var dlng = endLatLng.lng() - startLatLng.lng();

    // We multiply dlng with cos(endLat), since the two points are very closeby,
    // so we assume their cos values are approximately equal.
    var yaw = Math.atan2(dlng * Math.cos(endLatLng.lat() * RADIAN_PER_DEGREE), dlat)
        * DEGREE_PER_RADIAN;

    return wrapAngle(yaw);
}

function wrapAngle(angle)
{
    if (angle >= 360) {
        angle -= 360;
    } else if (angle < 0) {
        angle += 360;
    }
    
    return angle;
}



function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

function addUnLoadEvent(func) {
	var oldonunload = window.onunload;
	if (typeof window.onunload != 'function') {
	  window.onunload = func;
	} else {
	  window.onunload = function() {
	    oldonunload();
	    func();
	  }
	}
}

addLoadEvent(mapLoad);
addUnLoadEvent(GUnload);


function showMap(type)
{
    map.setMapType(type);
    document.getElementById('map').style.display = 'block';
    document.getElementById('pano').style.display = 'none';
}

function showStreetView()
{
    document.getElementById('map').style.display = 'none';
    document.getElementById('pano').style.display = 'block';
}
