/*-----------------------------------------------------------------------------
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 icon;
	var map;
	
	this.locationSearch = function(e) {
		var loc = document.getElementById('lsLocation').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);
			map.setCenter(point,12);
		  }else{
			alert("Location not found!");
		  }
		});
		localSearch.execute(loc+',uk');

		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		if (e && e.stopPropagation && e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		}
		return false;
	};


    
    function createMarker(point, sDate, name, count, total) {
	  var bIcon = new GIcon();
      if(count >1) {
        bIcon.image = "/images/icon_groupSighting.png";
        bIcon.iconSize = new GSize(28, 30);
        bIcon.iconAnchor = new GPoint(14, 15);
        bIcon.shadow = "/images/icon_groupSighting_shadow.png";
        bIcon.shadowSize = new GSize(41, 30);
      }
      else {
		bIcon.image = "/images/icon_sighting.png";
        bIcon.iconSize = new GSize(22, 23);
        bIcon.iconAnchor = new GPoint(0, 23);
        bIcon.shadow = "/images/icon_sighting_shadow.png";
        bIcon.shadowSize = new GSize(28, 23);
	  }
      bIcon.infoWindowAnchor = new GPoint(10, 0);
	  var markerOptions = { icon:bIcon };
      var marker = new GMarker(point, markerOptions);
      GEvent.addListener(marker, "click", function() {
        var windowOpts = { maxWidth:20 };
        var infoStr = "";

		  infoStr = "Sighting Date: "+ sDate + "\r\nNumber seen: " + total;

        //if(count >1)
		  //infoStr = count+" Sightings";
        //else
		  //infoStr = "Sighting Date: "+sDate;

		//if (name) infoStr += "<br/>Spotted by: "+name;
        marker.openInfoWindowHtml(infoStr, windowOpts);
      });
      return marker;
    };
   
    // 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;
        }
        GEvent.addDomListener(map.getContainer(), "DOMMouseScroll", wheelevent);
        GEvent.addListener(map, "moveend", function() {mapping.updatePoints()});
        GEvent.addListener(map, "zoomstart", function() {map.getInfoWindow().hide()});
        GEvent.addListener(map, "dragstart", function() {map.getInfoWindow().hide()});
        GEvent.addListener(map.getInfoWindow(), "closeclick", function() {mapping.updatePoints()});
        map.getContainer().onmousewheel = wheelevent;
        this.updatePoints();
	};

	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.updatePoints = function()
	{
	 //if(!mapping.checkBounds()) return;
	 if(!map.getInfoWindow().isHidden()) return;
	 var months ='';
	 var mc = document.getElementsByClassName('chksightingmonth',null);
	 for(i=0; i<mc.length; i++)
		if(mc[i].checked) months +=','+mc[i].value;
	 months = months.substring(1);
	 var params = '?type='+sightingType+'&sample=300&months='+months+'&minlat='+map.getBounds().getSouthWest().lat()+'&maxlat='+map.getBounds().getNorthEast().lat()+'&minlng='+map.getBounds().getSouthWest().lng()+'&maxlng='+map.getBounds().getNorthEast().lng();
	 GDownloadUrl(sightingData+params, function(data, responseCode) {
          var xml = GXml.parse(data);
          var root = xml.documentElement.getElementsByTagName("Sighting");
          updateTotalSightings(xml.documentElement.getAttribute("TotalSightings"));
          map.clearOverlays();
          for (var j = 0; j < root.length; j++) {
            var point = new GLatLng(parseFloat(root[j].getAttribute("Lat")), parseFloat(root[j].getAttribute("Lng")));
			map.addOverlay(createMarker(point, root[j].getAttribute("SightingDate"), root[j].getAttribute("SightingFullName"), root[j].getAttribute("SightingCount"), root[j].getAttribute("ButterflyCount")));
          }
       });
	};
	
	this.toggleZoom = function(isChecked) {
    if (isChecked) {
    	map.enableScrollWheelZoom();
    } else {
    	map.disableScrollWheelZoom();
    };
}


}
var mapping;
var localSearch;

function toggleMonth(month) {
	if(mapping) mapping.updatePoints();
}

function updateTotalSightings(num) {
	if(document.getElementById('totalSightingsNum') && num >0)
		document.getElementById('totalSightingsNum').innerHTML = num;
	else
		document.getElementById('totalSightingsNum').innerHTML = 0;
}

function loadMaps() {
	mapping = new myMap("locationMap");
	mapping.init();
	localSearch = new GlocalSearch();
	addEvent(document.getElementById('lsSubmit'),'click',mapping.locationSearch);
}

addEvent(window,'load',loadMaps);
addEvent(window,'unload',GUnload);
