/*-----------------------------------------------------------------------------
Sightings map functionality

version:   1.0
author:    Chris Sanderson
email:     chris.sanderson@headscape.co.uk
website:   http://www.headscape.co.uk
-----------------------------------------------------------------------------*/


var myMap = function(containerId) {

	// Sets the basic parameters for the map
	this.init = function() {
		
		if (GBrowserIsCompatible()) {
			this.createMap();
		}
	};
	var marker;
	var map;

    function createMarker(point) {
	  var bIcon = new GIcon();
	  bIcon.image = "/images/icon_sighting.png";
	  bIcon.iconSize = new GSize(22, 23);
	  bIcon.shadow = "/images/icon_sighting_shadow.png";
	  bIcon.shadowSize = new GSize(28, 23);
      bIcon.iconAnchor = new GPoint(0, 23);
      bIcon.infoWindowAnchor = new GPoint(10, 0);
	  var markerOptions = { icon:bIcon, draggable:true };
      var marker = new GMarker(point, markerOptions);
      GEvent.addListener(marker, "dragend", function() {
		mapping.updateFormLatLng();
      });
      return marker;
    }
    
	this.recenterPoint = function() {
		marker.setLatLng(map.getCenter());
		mapping.updateFormLatLng();
	};

	this.usePointFromPostcode = function(e) {
		var postcode = document.getElementById('map_postcode').value;

		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);
			marker.setLatLng(point);
			mapping.updateFormLatLng();
			map.panTo(point);
		  }else{
			alert("Postcode not found!");
		  }
		});
		localSearch.execute(postcode+',uk');
		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		if (e && e.stopPropagation && e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		}
		return false;
	};

	this.usePointFromGridRef = function(e) {
		var gridref = document.getElementById('map_grid_ref').value;
		
		GDownloadUrl('/_gridref_ajax.asp?gridref='+gridref, function(data, responseCode) {
			  var xml = GXml.parse(data);
			  var root = xml.documentElement.getElementsByTagName("GridRef");
			  var resultLat= xml.documentElement.getAttribute("latitude");
			  var resultLng= xml.documentElement.getAttribute("longitude");
			  if(resultLat && resultLng) {
				var point = new GLatLng(resultLat,resultLng);
				marker.setLatLng(point);
				mapping.updateFormLatLng();
				map.panTo(point);
			  }
		});
	    
		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		if (e && e.stopPropagation && e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		}
		return false;
	};

	this.updateFormLatLng = function() {
		document.getElementById('latitude').value = marker.getLatLng().lat();
		document.getElementById('longitude').value = marker.getLatLng().lng();
	};
    
    // Creates the map
	this.createMap = function() {
        var mapdiv = document.getElementById(containerId);
        map = new GMap2(mapdiv);
        map.addControl(new GOverviewMapControl());
        map.addControl(new GSmallMapControl());
        map.removeMapType(G_NORMAL_MAP);
        map.removeMapType(G_SATELLITE_MAP);
        //map.removeMapType(G_HYBRID_MAP);
        map.addMapType(G_PHYSICAL_MAP);
        map.addControl(new GMapTypeControl());
        map.enableScrollWheelZoom();
        map.enableContinuousZoom();
        map.setCenter(new GLatLng(defLong, defLat), defZoom);
        map.setMapType(G_PHYSICAL_MAP);

        // Set the maximum zoom out
        G_PHYSICAL_MAP.getMinimumResolution = function () { return 4 };
        G_NORMAL_MAP.getMinimumResolution = function () { return 4 };
        G_SATELLITE_MAP.getMinimumResolution = function () { return 4 };
        G_HYBRID_MAP.getMinimumResolution = function () { return 4 };
        
        // Prevent page scroll
        function wheelevent(e) {
            if (!e) {
                e = window.event;
            }
            if (e.preventDefault) {
                e.preventDefault();
            }
            e.returnValue = false;
        }
        map.getContainer().onmousewheel = wheelevent;
        
        if(document.getElementById('latitude').value !='' && document.getElementById('longitude').value !='')
			marker = createMarker(new GLatLng(document.getElementById('latitude').value, document.getElementById('longitude').value));
		else
			marker = createMarker(map.getCenter());
        map.addOverlay(marker);
	};

	this.checkBounds = function() {
		var lat, lng;
		lat = (map.getCenter().lat() < 50) ? 50 : (map.getCenter().lat() > 65) ? 65 : map.getCenter().lat();
		lng = (map.getCenter().lng() < -12) ? -12 : (map.getCenter().lng() > 3) ? 3 : map.getCenter().lng();
		//map.panTo(new GLatLng(lat, lng));
	};
	
	this.toggleZoom = function(isChecked) {
    if (isChecked) {
    	map.enableScrollWheelZoom();
    } else {
    	map.disableScrollWheelZoom();
    };
}
}
var mapping;
var localSearch;

function updateWithPostcode() {
	if(mapping) mapping.usePointFromPostcode();
}

function loadMaps() {
	if(document.getElementById('locationMap')) {
		mapping = new myMap("locationMap");
		localSearch = new GlocalSearch();
		mapping.init();
		addEvent(document.getElementById('recenterPoint'),'click',mapping.recenterPoint);
		addEvent(document.getElementById('postcodeSearchForm'),'submit',mapping.usePointFromPostcode);
		addEvent(document.getElementById('gridrefSearchForm'),'submit',mapping.usePointFromGridRef);
		addEvent(window,'unload',GUnload);
	}
}

addEvent(window,'load',loadMaps);

