/*
* map-functions.js - used by grantee.html and grantee_admin.html 
* includes all functions for map searching and results display
* 
*/

       //set up map variables
       var map = null;
       var mapserver_url = 'http://www.parkinfo.org/cgi-bin/mapserv?map=/home/user/mapfiles/wms_parkinfo_query.map&';
       var geocoder = null;
       var p = null;
       var pt = null;
       var OutlineLayer;
       var OutlineId = 0;
       var tile_park_outline;
       var marker;
       var poly;
       var parksterr;
       var parksmap;
       var parkssat;
       var toolId;
       var clickState = 'stats';
       var ovmap; 
       var statsRadius=0.804672;
       var lon;
       var lat;
	var coords;


	function onLoad() {
		if (GBrowserIsCompatible()) {		
    			map = new GMap2(document.getElementById("map"));
    			geocoder = new GClientGeocoder();
    			map.setCenter(new GLatLng(37.405074,-120.102539), 6);
    			map.addControl(new GLargeMapControl());
    			map.addControl(new GOverviewMapControl(new GSize(175,175)));
    			var mapControl = new GMapTypeControl();
    			map.addControl(mapControl);

    			var tileBasemap = new GTileLayer(null,null,null,{
    			tileUrlTemplate: 'http://www.parkinfo.org/tilecache/tilecache.py/1.0.0/parkinfo_basemap/{Z}/{X}/{Y}.png?type=google', isPng:true});
    			tileBasemap.getOpacity = function() { return 1; }

    			var tileParks = new GTileLayer(null,null,null,{
    			tileUrlTemplate: 'http://www.parkinfo.org/tilecache/tilecache.py/1.0.0/parkinfo_parks/{Z}/{X}/{Y}.png?type=google', isPng:true});
    			tileParks.getOpacity = function() { return .6; }

    			var tileLabels = new GTileLayer(null,null,null,{
    			tileUrlTemplate: 'http://www.parkinfo.org/tilecache/tilecache.py/1.0.0/parkinfo_labels/{Z}/{X}/{Y}.png?type=google', isPng:true});
    			tileLabels.getOpacity = function() { return 1; }

    			var tileUpdates = new GTileLayer(null,null,null,{
   			tileUrlTemplate: 'http://www.parkinfo.org/tilecache/tilecache.py/1.0.0/factfinder_updates/{Z}/{X}/{Y}.png?type=google', isPng:true});
    			tileUpdates.getOpacity = function() { return 1; }

    			var tileUpdates2 = new GTileLayer(null,null,null,{
   			tileUrlTemplate: 'http://www.parkinfo.org/tilecache/tilecache.py/1.0.0/factfinderupdates_outline/{Z}/{X}/{Y}.png?type=google', isPng:true});
    			tileUpdates2.getOpacity = function() { return 1; }
				
				var tileUpdates3 = new GTileLayer(null,null,null,{
   			    tileUrlTemplate: 'http://www.parkinfo.org/tilecache/tilecache.py/1.0.0/factfinderupdates_outline_Apr2010/{Z}/{X}/{Y}.png?type=google', isPng:true});
    			tileUpdates3.getOpacity = function() { return 1; }
				

    			var lyr_parks_map=[G_NORMAL_MAP.getTileLayers()[0],tileParks,tileUpdates3,tileLabels];
    			parksmap = new GMapType(lyr_parks_map, G_NORMAL_MAP.getProjection(), "Map", {errorMessage:"Data currently unavailable"});
    			map.addMapType(parksmap);

    			var lyr_parks_sat=[G_HYBRID_MAP.getTileLayers()[0],tileParks,tileUpdates3,tileLabels,G_HYBRID_MAP.getTileLayers()[1]];
    			parkssat = new GMapType(lyr_parks_sat, G_NORMAL_MAP.getProjection(), "Satellite", {errorMessage:"Data currently unavailable"});
    			map.addMapType(parkssat);
   
    			var lyr_park_map=[tileBasemap,tileParks,tileUpdates3,tileLabels,G_HYBRID_MAP.getTileLayers()[1]];
    			parksterr = new GMapType(lyr_park_map, G_NORMAL_MAP.getProjection(), "Terrain", {errorMessage:"Data currently unavailable"});
    
    			map.addMapType(parksterr);
    			map.setMapType(parksterr);

    			tile_park_outline = new GTileLayer(new GCopyrightCollection(""),1,17);
    			tile_park_outline.myMercZoomLevel=5;
    			tile_park_outline.myBaseURL= mapserver_url + 'unit_id=' + OutlineId + "&";
    			tile_park_outline.getTileUrl=CustomGetTileUrl;	
    			tile_park_outline.isPng = function () { return true; }; 
    			tile_park_outline.getOpacity = function() {return 1.0;}
    			OutlineLayer = new GTileLayerOverlay(tile_park_outline);
    			map.addOverlay(OutlineLayer);

    			map.removeMapType(G_HYBRID_MAP);
    			map.removeMapType(G_SATELLITE_MAP);
    			map.removeMapType(G_NORMAL_MAP);
    			map.getDragObject().setDraggableCursor("pointer");

   
      			// ====== Restricting the range of Zoom Levels =====
      			// Get the list of map types      
      			var mt = map.getMapTypes();
      			// Overwrite the getMinimumResolution() and getMaximumResolution() methods
      			for (var i=0; i<mt.length; i++) {
        			mt[i].getMinimumResolution = function() {return 5;}
        			mt[i].getMaximumResolution = function() {return 17;}
      			}

      			var myEventListener = GEvent.bind(this.map, "click", this, function(overlay,point) {             
				pt = new GLatLng(point.y,point.x);
              		map.clearOverlays();
              		if (clickState == 'parks'){
					addInfoTipMarker(pt);
              		} else if (clickState == 'stats'){
              			document.forms[0].addressquery.style.fontStyle = "italic";
              			document.forms[0].addressquery.value = "Type project address";
              			document.forms[0].idquery.style.fontStyle = "italic";
              			document.forms[0].idquery.value = "Type Project ID, then select a radius";
              			lat = Math.round(point.y*1000000)/1000000;
              			lon = Math.round(point.x*1000000)/1000000;
              			document.getElementById("latloncoords").value =lat + ", " + lon; 
              			var coords="<p>Coordinates: <br>Latitude: " + lat + "<br>Longitude: " + lon + "</p>";
              			map.addOverlay(createMarker (point, coords)); 
              			map.addOverlay (drawCircle(point, statsRadius, 60));
  
              			// set the IFRAME page source
       				var appVer = document.forms[0].appVer.value;
    					var txtResultsPage = 'http://www.parkinfo.org/caparks//widgets/Search/SearchResults.phtml?';
					if (appVer=="admin") {
						txtResultsPage = 'http://www.parkinfo.org/caparks//widgets/Search/SearchResults_block.phtml?';
					}
              			frames['queryres'].location.href = txtResultsPage + 'result_geom=halfmilestats&bound_geom=address_query&bound_field=&bound_value=' + statsRadius + '&lat=' + lat + '&lon=' + lon + '&map_event=click';		
              		} 
      			}); 

     			GEvent.addListener(map, "maptypechanged", function() {
          			if (map.getCurrentMapType() == parksterr) {
               			// show Map legend
              			document.getElementById("legend").src = "images/leg-map-pinfo.png"
          			} else if (map.getCurrentMapType() == parkssat) {
              			// show Satellite legend
              			document.getElementById("legend").src = "images/leg-sat-pinfo.png"          
          			} else if (map.getCurrentMapType() == parksmap) {
               			// show Map legend
              			document.getElementById("legend").src = "images/leg-gmap-pinfo.png"  
          			} 
      			}); 

     			GEvent.addListener(map, "zoomend", function() { 
           			var zoomLevel =14;
            			if (map.getZoom() >= zoomLevel) {
              			map.setMapType(parkssat);
            			}
         		}); 

      			var zoomOpts = { 
          			buttonStartingStyle: {background: 'transparent'},
          			buttonHTML: '<img title="Drag Zoom In" src="images/zoomin_off.png">',
          			buttonStyle: {background: 'transparent', padding:'0px', width:'30px', height:'30px',border:'none'},
          			buttonZoomingHTML: 'Drag a region on the map (click here to reset)',
          			buttonZoomingStyle: {background:'#EBEBEB',width:'80px',height:'100%',padding:'5px',fontFamily:'arial',fontSize:'80%',border:'1px solid #666666'},
          			backButtonHTML: '<img title="Zoom Back Out" src="images/zoomout_off.png">',  
          			backButtonStyle: {display:'none',marginTop:'5px',width:'30px', height:'30px'},
          			backButtonEnabled: true, 
          			overlayRemoveTime: 1500} 

          		map.addControl(new DragZoomControl({}, zoomOpts, {}), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(19,338)));
     
    		} else {
      			alert("Sorry, the Google Maps API is not compatible with this browser");
    		}
	}  //end function onLoad

       function createMarker(point,html) {
       	var Icon = new GIcon();
      		Icon.image = "images/pushpin.png";
      		Icon.iconSize = new GSize(25, 45);
      		Icon.iconAnchor = new GPoint(13, 46);
      		Icon.infoWindowAnchor = new GPoint(13, 2);
      		Icon.transparent = "images/pushpin_transparent.png";
      		Icon.printImage = "images/pushpin.gif";
      		Icon.mozPrintImage = "images/pushpin_nontransp.gif";
        	var marker = new GMarker(point,Icon);
          	GEvent.addListener(marker, "click", function() {
          		marker.openInfoWindowHtml(html);
        	});
        	return marker;
      }

	function drawCircle(center, radius, nodes) {
		//calculating km/degree
		var latConv = center.distanceFrom(new GLatLng(center.lat()+0.1, center.lng()))/100;
		var lngConv = center.distanceFrom(new GLatLng(center.lat(), center.lng()+0.1))/100;

		//Loop 
		var points = [];
		var step = parseInt(360/nodes)||10;
		for(var i=0; i<=360; i+=step)
		{
			var pint = new GLatLng(center.lat() + (radius/latConv * Math.cos(i * Math.PI/180)), center.lng() + 
			(radius/lngConv * Math.sin(i * Math.PI/180)));
			points.push(pint);
		}
		points.push(points[0]); // Closes the circle
		var poly = new GPolygon(points,"#43BDFF",2,".85","#43BDFF",".5");
       	GEvent.addListener(poly,"click",function(point){if (point) GEvent.trigger(map,"click",null,point)});
       	return poly;
	}

	//show selected park outline
	function show_outline(id) {
		if(id==0) {
			var tmp_oid = last_oid;
			last_oid = OutlineId;
			OutlineId = tmp_oid;
		} else {
			last_oid = 0;
			OutlineId = id; 
		}

		tile_park_outline.myBaseURL=mapserver_url + 'unit_id=' + OutlineId + "&";
              map.removeOverlay(OutlineLayer);
		map.addOverlay(OutlineLayer);
	}

	function getProjectLatLon () {
              var id = document.getElementById("idquery").value;
		var URL = "http://www.parkinfo.org/caparks//widgets/Search/projectLatLon.php?projectID=" + id;               
              GDownloadUrl(URL, showProject);
	}

	function showProject(a) {
    		if (a !="") {
          		var latlon = a;
          		//get the lat lon from the response
          		var latend =parseInt(latlon.indexOf(","));
          		var lonstart =parseInt(latlon.indexOf(",")) +1;
	   		var project_lat = parseFloat(latlon.slice(0, latend));
          		var project_lon = parseFloat(latlon.slice(lonstart));
          		map.clearOverlays();
         		pt = new GLatLng(project_lat,project_lon);
          		lat = Math.round(pt.y*1000000)/1000000;
          		lon = Math.round(pt.x*1000000)/1000000;
          		document.getElementById("latloncoords").value =lat + ", " + lon; 
          		coords="<p>Coordinates: <br>Latitude: " + lat + "<br>Longitude: " + lon + "</p>";
          		map.addOverlay(createMarker (pt, coords)); 
          		map.addOverlay(drawCircle(pt, statsRadius, 60));
          		map.setCenter(pt);
          		map.setMapType(parkssat);
          		map.setZoom(15);
    			txtResultsPage = 'http://www.parkinfo.org/caparks//widgets/Search/SearchResults_block.phtml';
          		frames['queryres'].location.href = txtResultsPage + '?result_geom=halfmilestats&bound_geom=address_query&bound_field=&bound_value='+statsRadius+'&lat=' + lat + '&lon=' + lon + '&map_event=click';		                       
    		} else {
          		alert ("Project with this ID is not found.");
    		}
	}

	//Triggers an info window when user clicks on a park
   	function addInfoTipMarker(pt){
   	      	p = new GPoint(pt);
		var b = map.getBounds();
		var sw = b.getSouthWest();
		var ne = b.getNorthEast();
		var w = sw.lng();
		var e = ne.lng();
		var n = ne.lat();
		var s = sw.lat();
		var ts = s;
		var tw = w;
		if(n<s) { s=n; n = ts; }
		if(e<w){ w=e; e = tw; }
		if(s<-90)s=-90;
		if(n>90)n=90;
		if(e>180)e=180;
		if(w<-180)w=-180;
		var span_ew = Math.abs(e - w);
		var span_ns = Math.abs(n - s);
		var width  = 768*span_ew/span_ns;
		var height = 768;
		var x = (pt.x - w) * width/span_ew;
		var y = (n - pt.y) * height/span_ns;
		var URL = GetURL(x, y, w, s, e, n, width, height);                 
              GDownloadUrl(URL, loadPopup);
    	}

       //Open the park info window if the response is not blank 
   	loadPopup = function(a) {
      		if (a !="") {
          		var aReplaceAccess = a.replace("Open Access", "Open to the Public");
          		var html1 = "";
	   		html1 += '<div class="popup"><a href="javascript:zoomIN('+p+');">Zoom In</a>&nbsp;|&nbsp;<a href="javascript:zoomOUT('+p+');">Zoom Out</a><br><br>';
	   		html1 += aReplaceAccess;
          		html1 += '</div>';
	   		map.openInfoWindowHtml(pt, html1);
          		var text = a;
          		//get the unit id from the response text
          		var start = parseInt(text.indexOf("<b>ID:</b> ")) + 11
	   		var id = text.slice(start, text.indexOf("<br><br>"));
          		show_outline(id);
       	}    
   	}

       //URL used to get info when user clicks on park
    	function GetURL(x, y, w, s, e, n, width, height){
       	query = mapserver_url;
		query+="SERVICE=WMS";
		query+="&SRS=EPSG:4326";
		query+="&VERSION=1.1.1";
		query+="&REQUEST=GetFeatureInfo";
		query+="&X=" + parseInt(x);
		query+="&Y=" + parseInt(y);
		query+="&QUERY_LAYERS=Parks_GetInfo";
		query+="&LAYERS=Parks_GetInfo";
		query+="&INFO_FORMAT=text/html";
		query+="&BBOX="+w+","+s+","+e+","+n;
		query+="&WIDTH="+parseInt(width)+"&HEIGHT="+ parseInt(height)+"&FORMAT=image/png&STYLES=";
		return query;           
    	}

    	//URL used to highlight selected park
    	function CustomGetTileUrl(a,b,c) {
		var lULP = new GPoint(a.x*256,(a.y+1)*256);
		var lLRP = new GPoint((a.x+1)*256,a.y*256);
		var lUL = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lULP,b,c);
		var lLR = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lLRP,b,c);
    		var lBbox=lUL.x+","+lUL.y+","+lLR.x+","+lLR.y;
    		var lSRS="EPSG:4326";
       	var lURL=this.myBaseURL;
		lURL+="&REQUEST=GetMap";
		lURL+="&SERVICE=WMS";
		lURL+="&VERSION=1.1.1";
		lURL+="&LAYERS=Parks_Hilite";
		lURL+="&FORMAT=AGGA";
		lURL+="&TRANSPARENT=TRUE";
		lURL+="&SRS="+lSRS;
		lURL+="&BBOX="+lBbox;
		lURL+="&STYLES=";
		lURL+="&WIDTH=256";
		lURL+="&HEIGHT=256";
		return lURL;	
    	}

	//Get the address and distance from the form and call the showAddress function
	function search() {
		// get selected FindBy radio button
    		var radFindByGrp = document.forms[0].radFindBy;
    		var szFindBy = '';
    		for( var i=0; i< radFindByGrp.length; i++ ) {
        		if ( radFindByGrp[i].checked ){
            			szFindBy = radFindByGrp[i].value;
            			break;
        		}
    		}
    		statsRadius = document.forms[0].geoDist.value;

    		if (szFindBy=='address_query') {
       		var appVer = document.forms[0].appVer.value;
    			var txtResultsPage = 'http://www.parkinfo.org/caparks//widgets/Search/SearchResults.phtml?';
			if (appVer=="admin") {
				txtResultsPage = 'http://www.parkinfo.org/caparks//widgets/Search/SearchResults_block.phtml?';
			}
    			showAddress('halfmilestats', 'address_query', '', statsRadius, txtResultsPage);
    		} else {
        		getProjectLatLon();
    		}
	}

    	function showAddress(szFindWhat, szFindBy, szField, statsRadius, txtResultsPage) {
      		map.clearOverlays();
      		var address = document.getElementById("addressquery").value;
      		if (geocoder) {
        		geocoder.getLatLng(
          		  address,
          		  function(point) {
            		    if (!point) {
              		alert(address + " not found");
            		    } else {
               		map.addOverlay (drawCircle(point, statsRadius, 60));
              		//get lat and lon from google point
              		var lat = point.lat();
              		var lon = point.lng();
              		document.getElementById("latloncoords").value =lat + ", " + lon;
              		// set the IFRAME page source
              		frames['queryres'].location.href = txtResultsPage + 'result_geom=' + szFindWhat + '&bound_geom=' + szFindBy + '&bound_field=' + szField + '&bound_value=' + statsRadius + '&lat=' + lat + '&lon=' + lon + '&map_event=search';              
            		    }
                      }
                    );
             }
    	}

	function setMapTool(toolId) {
		if (toolId == "parks") {
              	map.clearOverlays();
              	frames['queryres'].location.href ="blank_grantee.html";
			document.getElementById("parks").src = "images/parkstool_on.png"
              	document.getElementById("stats").src = "images/statstool_off.png"
              	document.getElementById("pan").src = "images/pantool_off.png"
              	map.getDragObject().setDraggableCursor("crosshair");
              	clickState ='parks';
		} else if (toolId == "stats") {
              	map.clearOverlays();
              	frames['queryres'].location.href ="blank_grantee.html";
			document.getElementById("parks").src = "images/parkstool_off.png"
			document.getElementById("stats").src = "images/statstool_on.png"
              	document.getElementById("pan").src = "images/pantool_off.png"
              	map.getDragObject().setDraggableCursor("pointer");
              	clickState ='stats';
		} else if (toolId == "pan") {
			document.getElementById("parks").src = "images/parkstool_off.png"
			document.getElementById("stats").src = "images/statstool_off.png"
              	document.getElementById("pan").src = "images/pantool_on.png"
              	map.getDragObject().setDraggableCursor("move");
              	clickState ='pan';
		} 
	}

    	function zoomIN(pt) {
      		map.setCenter(pt,map.getZoom()+1);
    	}

    	function zoomOUT(pt) {
      		map.setCenter(pt,map.getZoom()-1);
    	}

	function highlight(field) {
       	field.focus();
       	field.select();
	}

	//clears the text input box when user clicks on it
	function clearValue () {
		document.forms[0].addressquery.style.fontStyle = "normal";
		document.forms[0].addressquery.value ="";
		document.forms[0].idquery.style.fontStyle = "normal";
		document.forms[0].idquery.value ="";
	}

  	//Trigger the search submit if user presses enter
	function submitenter(myfield,e) {
		var keycode;
		var safari = navigator.userAgent.indexOf('Safari')>0;
		if (window.event) keycode = window.event.keyCode;
		else if (safari && keyCode==3) keycode = 13;
		else if (e) keycode = e.which;
		else return true;

		if (keycode == 13) {
   			search();
   			return false;
   		} else {
			return true;
              }
	}
