function resize() {
	location.reload(true);
}

function load(){

    xGetElementById("Theme0").checked=true;
    xGetElementById("Theme1").checked=false;
    xGetElementById("Theme2").checked=false;
    xGetElementById("Theme3").checked=false;
    xGetElementById("Theme4").checked=false;
    xGetElementById("Theme5").checked=false;
    xGetElementById("Theme6").checked=false;
    xGetElementById("Theme7").checked=false;
    xGetElementById("Theme8").checked=false;

    
    map = new GMap2(document.getElementById('mapdiv'));
      map.enableDoubleClickZoom();
      //map.enableScrollWheelZoom(); //messes up zoom box
      map.enableContinuousZoom();

    var otherOpts = { 
      buttonStartingStyle: {background: '#FFF', paddingTop: '4px', paddingLeft: '4px', border:'1px solid black'},
      buttonHTML: '<img title="Drag Zoom In" src="img/zoomin.gif">',
      buttonStyle: {width:'25px', height:'23px'},
      buttonZoomingHTML: 'Drag a region on the map (click here to reset)',
      buttonZoomingStyle: {background:'yellow',width:'75px', height:'100%'},
      backButtonHTML: '<img title="Zoom Back Out" src="img/zoomout.gif">',  
      backButtonStyle: {display:'none',marginTop:'5px',width:'25px', height:'23px'},
      backButtonEnabled: true, 
      overlayRemoveTime: 1500} 

    map.addControl(new DragZoomControl({}, otherOpts, {}), new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(10,15)));
 
    
    var mapTop = 20;
    var dataPanelHeight=parseInt(xClientHeight()*0.1);
    var infoPanelWidth=500;
    mapWidthPixel=xClientWidth()-infoPanelWidth;
    mapHeightPixel=xClientHeight()-dataPanelHeight-10-mapTop;

lastX = mapWidthPixel/2
lastY = mapHeightPixel/2

    xMoveTo('maptoolsdiv',mapWidthPixel+10,mapTop);
    xResizeTo('maptoolsdiv',infoPanelWidth-10,mapHeightPixel-10);
    
    //xMoveTo('maplayersdiv',mapWidthPixel+10,mapTop);
    //xResizeTo('maplayrersdiv',infoPanelWidth-10,mapHeightPixel*0.3);
    
    //xMoveTo('mapfinddiv',mapWidthPixel+10, mapTop + mapHeightPixel*0.3);
    //xResizeTo('mapfinddiv',infoPanelWidth-10,mapHeightPixel*0.3);
    
    //xMoveTo('mapmsgdiv',mapWidthPixel+10, mapTop + mapHeightPixel*0.6);
    //xResizeTo('mapmsgdiv',infoPanelWidth-10,mapTop + mapHeightPixel*0.1);


    //xMoveTo('dataframe',5,mapHeightPixel+10);
    //xResizeTo('dataframe',xClientWidth()-10,dataPanelHeight-5);

    xMoveTo('timer',5,mapTop);
    xResizeTo('timer',mapWidthPixel,mapHeightPixel);

    xMoveTo('mapdiv',5,mapTop);
    xResizeTo('mapdiv',mapWidthPixel,mapHeightPixel);
    
    xMoveTo('footerdiv',5,mapTop + mapHeightPixel);
    xResizeTo('footerdiv',xClientWidth()-10,50);

    xVisibility('mapdiv',true);
    xVisibility('footerdiv',true);
    xVisibility('toolsdiv',true);
    xVisibility('mapfinddiv',true);
    xVisibility('maplayersdiv',true);
    xVisibility('mapmsgdiv',true);
    xVisibility('maptoolsdiv',true);

    map.checkResize();

   
    GeoAccuracy[0] = 3 ; 
    GeoAccuracy[1] = 4 ; 
    GeoAccuracy[2] = 8 ; 
    GeoAccuracy[3] = 10 ; 
    GeoAccuracy[4] = 12 ; 
    GeoAccuracy[5] = 14 ; 
    GeoAccuracy[6] = 14 ; 
    GeoAccuracy[7] = 15 ; 
    GeoAccuracy[8] = 16 ; 
    			
    // ====== Array for decoding the failure codes ======
    reasons[G_GEO_SUCCESS]            = "Success";
    reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
    reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
    reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
    reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
    reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
    reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";  


    geocoder = new GClientGeocoder();
    geocoder.setBaseCountryCode("uk");
    //var countyBounds = new GLatLngBounds(new GLatLng(51.4,-2.4), new GLatLng(53.3,1.5))
    //geocoder.setViewport = countyBounds;
    

    //var myTileLayer = new GTileLayer(new GCopyrightCollection(""),1,17);
    //myTileLayer.myBaseURL='http://www.tilecache.no-ip.com/CallCropGIF.aspx?http://www.cambrianmountains.org/scripts/mapserv.exe?map=D:/Websites/CambrianMountains/mapserver/map/WMSPath.map';
    //myTileLayer.myLayers='Path';

    //myTileLayer.myFormat='image/gif';
    //myTileLayer.getTileUrl=CustomGetTileUrl;
    //myTileLayer.myOpacity=0.69;
    //myTileLayer.myOpacity=1;
    //myTileLayer.getOpacity=customOpacity;

    //var layer1=[G_NORMAL_MAP.getTileLayers()[0],myTileLayer];
    //custommap1 = new GMapType(G_NORMAL_MAP.getProjection(), "Map");
    //map.addMapType(custommap1);

    //var layer2=[G_SATELLITE_MAP.getTileLayers()[0],myTileLayer];
    //custommap2 = new GMapType(G_SATELLITE_MAP.getProjection(), "Aerial");
    //map.addMapType(custommap2);

    //var layer3=[G_HYBRID_MAP.getTileLayers()[0],G_HYBRID_MAP.getTileLayers()[1],myTileLayer];
    //custommap3 = new GMapType(G_HYBRID_MAP.getProjection(), "Hybrid");
    //map.addMapType(custommap3);
    
    //map.removeMapType(G_HYBRID_MAP);
    //map.removeMapType(G_SATELLITE_MAP);
   // map.removeMapType(G_NORMAL_MAP);


    var myTileLayerOS = new GTileLayer(new GCopyrightCollection(""),15,17);
    myTileLayerOS.myBaseURL='http://www.tilecache.no-ip.com/CallCache.aspx?http://www.cambrianmountains.org/scripts/mapserv.exe?map=D:/Websites/CambrianMountains/mapserver/map/WMSBase.map';
    myTileLayerOS.myLayers="OS25k";
    myTileLayerOS.myFormat='image/gif';
    myTileLayerOS.getTileUrl=CustomGetTileUrl;
    myTileLayerOS.myOpacity=1;
    myTileLayerOS.getOpacity=customOpacity;

    var layer1=[G_NORMAL_MAP.getTileLayers()[0],myTileLayerOS];
        custommap1 = new GMapType(layer1, G_NORMAL_MAP.getProjection(), "OS 1:25K");
       // map.addMapType(custommap1);

 //map.addMapType(G_SATELLITE_3D_MAP);


			      
	var x = getURLParameters("X");
	var y = getURLParameters("Y");
	var mapScale = getURLParameters("mapScale");
	
	if (x=='') {
		map.setCenter(new GLatLng(mapStartCentreY,mapStartCentreX), mapStartCentreZoom);
	} else {
		map.setCenter(new GLatLng(parseFloat(y),parseFloat(x)), parseFloat(mapScale));
	}

	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.addControl(new GScaleControl());
	
      // ===  wait for the aontrol_api mdocule to be loaded
    setTimeout("checkOverview()",100);


    //  ======== Add a map overview ==========
    //  ======== save a reference to the control =========
    ovcontrol = new GOverviewMapControl(); 
    map.addControl(ovcontrol);
	
    	overlayBounds = extendBounds(mapWidthPixel,mapHeightPixel,gutterPixelSize);
    	groundOverlay = new GGroundOverlay(getCustomGetTileUrl(overlayBounds,gutterPixelSize), overlayBounds)

LayersChangedButton();


	var center = map.getCenter();

//	map.setMapType(custommap1);

	GEvent.addListener(map,"click", function (overlay, point){
		if(overlay){ return; }
		var pt = new GLatLng(point.y,point.x);
		getInfo(pt);
		}
	);

	GEvent.addListener(map,"maptypechanged", function () {
	    checkOverview() }
	);

	//drawSite();


	//GEvent.addListener(map,"zoomend", function (oldzoom,newzoom) {
	//    checkZoom(oldzoom,newzoom) }
	//);


	            GEvent.addListener(map,"moveend", function () {
	                getWMS() }
	            );


	            GEvent.addListener(map,"dragstart", function () {
	                dragstart() }
	            );

	            GEvent.addListener(map,"dragend", function () {
	                dragend() }
	            );



}



function checkOverview() {
    var overmap = ovcontrol.getOverviewMap();
    if (overmap) {
      // ======== get a reference to the GMap2 ===========
      ovmap = ovcontrol.getOverviewMap();


      //  ======== change the overview map type AFTER the overview finisges initializing =====
      var layer4=[G_NORMAL_MAP.getTileLayers()[0]];
      custommap4 = new GMapType(layer4, G_NORMAL_MAP.getProjection(), "Just Map");
      map.addMapType(custommap4);

      setTimeout("ovmap.setMapType(custommap4);",1);
      map.removeMapType(custommap4);
    } else {
      setTimeout("checkOverview()",100);
    }
}


function setLayers(sLayers) {
   // GLog.write(sLayers);
    //var myTileLayer = new GTileLayer(new GCopyrightCollection(""),1,17);
    //myTileLayer.myBaseURL='http://www.tilecache.no-ip.com/CallCache.aspx?http://www.cambrianmountains.org/scripts/mapserv.exe?map=D:/Websites/CambrianMountains/mapserver/map/WMSPath.map&ESDMGIF=True';
    //myTileLayer.myBaseURL='http://www.cambrianmountains.org/fcgi/mapserv.fcgi?map=D:/Websites/CambrianMountains/mapserver/map/WMSPath.map';
    //myTileLayer.myBaseURL='http://www.cambrianmountains.org/fcgi/mapserv.exe?map=D:/Websites/CambrianMountains/mapserver/map/WMSPath.map';
    //myTileLayer.myLayers=sLayers;

    //myTileLayer.myFormat='image/gif';
    //myTileLayer.getTileUrl=CustomGetTileUrl;
    //myTileLayer.myOpacity=0.69;
    //myTileLayer.myOpacity=1;
    //myTileLayer.getOpacity=customOpacity;
    


    var myTileLayerOS = new GTileLayer(new GCopyrightCollection(""),15,17);
    //myTileLayerOS.myBaseURL='http://www.tilecache.no-ip.com/CallCrop.aspx?http://www.rutlandrow.no-ip.com/scripts/mapserv.exe?map=D:/Websites/rutlandROW/mapserver/map/WMSBase.map';
    myTileLayerOS.myBaseURL='http://www.cambrianmountains.org/scripts/mapserv.exe?map=D:/Websites/cambrianmountains/mapserver/map/WMSBase.map';

    myTileLayerOS.myLayers="OS25k";

    myTileLayerOS.myFormat='image/gif';
    myTileLayerOS.getTileUrl=CustomGetTileUrl;
    myTileLayerOS.myOpacity=1;
    myTileLayerOS.getOpacity=customOpacity;

    //some juggling required as the current map type cna't be removed ...
    
    var currentmapname = map.getCurrentMapType().getName();
    if (currentmapname=='Map') {
    
        map.setMapType(custommap2);
        map.removeMapType(custommap1);

	if ((xGetElementById("OSMapping").checked==true) & (gShowOS==true)) {
		var layer1=[G_NORMAL_MAP.getTileLayers()[0],myTileLayerOS,myTileLayer];
	} else {
		var layer1=[G_NORMAL_MAP.getTileLayers()[0],myTileLayer];
	}
        custommap1 = new GMapType(layer1, G_NORMAL_MAP.getProjection(), "Map");
        map.addMapType(custommap1);
        map.setMapType(custommap1);
    
        map.removeMapType(custommap2);
        map.removeMapType(custommap3);
    
        var layer2=[G_SATELLITE_MAP.getTileLayers()[0],myTileLayer];
        custommap2 = new GMapType(layer2, G_SATELLITE_MAP.getProjection(), "Aerial");
        map.addMapType(custommap2);

        var layer3=[G_HYBRID_MAP.getTileLayers()[0],G_HYBRID_MAP.getTileLayers()[1],myTileLayer];
        custommap3 = new GMapType(layer3, G_HYBRID_MAP.getProjection(), "Hybrid");
        map.addMapType(custommap3);
        
        map.setMapType(custommap1);

    } else {
    
        map.removeMapType(custommap1);
        var layer1=[G_NORMAL_MAP.getTileLayers()[0],myTileLayer];
        custommap1 = new GMapType(layer1, G_NORMAL_MAP.getProjection(), "Map");
        map.addMapType(custommap1);
        map.setMapType(custommap1);
    
        map.removeMapType(custommap2);
        map.removeMapType(custommap3);
    
        var layer2=[G_SATELLITE_MAP.getTileLayers()[0],myTileLayer];
        custommap2 = new GMapType(layer2, G_SATELLITE_MAP.getProjection(), "Aerial");
        map.addMapType(custommap2);

        var layer3=[G_HYBRID_MAP.getTileLayers()[0],G_HYBRID_MAP.getTileLayers()[1],myTileLayer];
        custommap3 = new GMapType(layer3, G_HYBRID_MAP.getProjection(), "Hybrid");
        map.addMapType(custommap3);
        
        if (currentmapname=='Aerial') {
            map.setMapType(custommap2);
        } else {
            map.setMapType(custommap3);
        }
    }
    checkOverview();
    map.removeMapType(G_NORMAL_MAP);
}

 function findNearest(search) {
 
  	var pt = map.getCenter()
  	//GLog.write(search);
	map.clearOverlays(); 
    GDownloadUrl("http://" + webhost + "/ESDMSpatialServices/ESDMspatialServices.asmx/GetXYLocationsNearest?sCategory=" + search + "&sSubcategory=&sCurrentCoord=" + pt.lng() + " " + pt.lat() + "&iBufferMeters=9999999&iMaxRows=5", function(data, responseCode) {
		    var xml = GXml.parse(data);
		    //GLog.write(data);
		    var result = xml.documentElement.getElementsByTagName("Location");
		    if (result.length > 0) {
		        document.getElementById("message").innerHTML = "Did you mean:";
                // Loop through the results
                for (var i=0; i<result.length; i++) {
                  lng = GXml.value(result[i].getElementsByTagName("X").item(0))
			      lat = GXml.value(result[i].getElementsByTagName("Y").item(0))
			      name = GXml.value(result[i].getElementsByTagName("Name").item(0))
			      dist = GXml.value(result[i].getElementsByTagName("Distance").item(0))
                  document.getElementById("message").innerHTML += "<br>"+(i+1)+": <a href='javascript:place(" +lat+","+lng+",17,\"" + name + "\")'>"+ name + " (" + dist + " m)</a>";
                }
		    } else {
			    //showNonPostcodeAddress(sPostcode);
		    }
	    });
}


function searchPostcode(sPostcode,X,Y) {

	GDownloadUrl("http://" + webhost + "/ESDMSpatialServices/ESDMspatialServices.asmx/GetXYFromPostcode?sValue=" + sPostcode + "&sCurrentCoord=" + X + " " + Y + "&iMaxRows=10", function(data, responseCode) {
		var xml = GXml.parse(data);
GLog.write(xml);
		var postcodes = xml.documentElement.getElementsByTagName("Location");
GLog.write(postcodes);
		if (postcodes.length > 0) {
			lng = GXml.value(postcodes[0].getElementsByTagName("X").item(0))
			lat = GXml.value(postcodes[0].getElementsByTagName("Y").item(0))
			place(lat,lng,16,sPostcode);
		} else {
			showNonPostcodeAddress(sPostcode);
		}
	});
}

function place(lat,lng,zoomlevel,label) {
    var point = new GLatLng(lat,lng);
    if (zoomlevel>8){
        map.setCenter(point,zoomlevel); 
    } else {
        map.setCenter(point,GeoAccuracy[zoomlevel]); 
    }
    map.addOverlay(createMarker(point, label));
    //document.getElementById("message").innerHTML = "";
}

// create a marker at the given point w/ the given label
function createMarker(point, label) {
    var marker = new GMarker(point);
    GEvent.addListener(marker, "click", function() {
       marker.openInfoWindowHtml(label);
    });
    return marker;
}

function usePointFromPostcode(postcode, callbackFunction) {
	
	localSearch.setSearchCompleteCallback(null, 
		function() {
			
		 map.clearOverlays(); 
			
		if (localSearch.results.length > 1) { 
                	document.getElementById("message").innerHTML = "Did you mean:";
                	// Loop through the results
                	for (var i=0; i<localSearch.results.length; i++) {
                		var resultLat = localSearch.results[i].lat;
				var resultLng = localSearch.results[i].lng;
                  		var p = new GLatLng(resultLat,resultLng); 
                  		document.getElementById("message").innerHTML += "<br>"+(i+1)+": <a href='javascript:place(" +resultLat+","+resultLng+",16,\"" + localSearch.results[i].title + "\")'>"+ localSearch.results[i].title +"</a>";
                	}
              	}
              	// ===== If there was a single marker =====
             	 else {
                	document.getElementById("message").innerHTML = "";
                	var resultLat = localSearch.results[0].lat;
			        var resultLng = localSearch.results[0].lng;
                  	var p = new GLatLng(resultLat,resultLng);                 	
                	place(resultLat,resultLng);
              	}

			
			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("Address not found!");
			}
		});	

	localSearch.setCenterPoint("London");
	localSearch.execute(postcode + ", UK");
}


function placeMarkerAtPoint(point)
{
	//var marker = new GMarker(point);
	//map.addOverlay(marker);
              //map.setCenter(point, 14);

}

 function showAddress() {
 	
 	var search = xGetElementById("address").value ;
 	var pt = map.getCenter()
	map.clearOverlays(); 
	showNonPostcodeAddress(search)
 	//searchPostcode(search,pt.lng(),pt.lat())
      }

 function showNonPostcodeAddress(search) {
 	
        //search = search + " ,UK";
        // ====== Perform the Geocoding ======        
        geocoder.getLocations(search, function (result)
          {
            //map.clearOverlays(); 
            var pCentre = new GLatLng(mapStartCentreY,mapStartCentreX);
            var mapViewCentre = map.getCenter()
            if (result.Status.code == G_GEO_SUCCESS) {
              // ===== If there was more than one result, "ask did you mean" on them all =====
              if (result.Placemark.length > 1) { 
                // Loop through the results
                var j=0;
                for (var i=0; i<result.Placemark.length; i++) {
                  var p = result.Placemark[i].Point.coordinates;
                  var pt = new GLatLng(p[1],p[0])
                  var dist = Math.floor(pt.distanceFrom(pCentre)/1000)
                  var dist2 = Math.floor(pt.distanceFrom(mapViewCentre)/1000)
                  if (dist<mapMaxDistanceKmForSearch) {
                     if (j==0) {
                        document.getElementById("message").innerHTML = "Did you mean:";
                     }
                     j=j+1;
                    document.getElementById("message").innerHTML += "<br>"+(j)+": <a href='javascript:place(" +p[1]+","+p[0]+","+ result.Placemark[i].AddressDetails.Accuracy +",\"" +search + "\")'>"+ result.Placemark[i].address+" ("+dist+" km)</a>";
                  }
                }
                if (j==0) {
                    document.getElementById("message").innerHTML = "No matching locations found";
                }
              }
              // ===== If there was a single marker =====
              else {
                document.getElementById("message").innerHTML = "";
                var p = result.Placemark[0].Point.coordinates;
                var pt = new GLatLng(p[1],p[0])
                var dist = Math.floor(pt.distanceFrom(pCentre)/1000)
                if (dist<mapMaxDistanceKmForSearch) {
                    place(p[1],p[0],result.Placemark[0].AddressDetails.Accuracy,search);
                } else {
                    document.getElementById("message").innerHTML = "No matching locations found";
                }
              }
            }
            // ====== Decode the error status ======
            else {
              var reason="Code "+result.Status.code;
              if (reasons[result.Status.code]) {
                reason = reasons[result.Status.code]
              } 
              alert('Could not find "'+search+ '" ' + reason);
            }
          }
        );
        
        }

    
    function showAddressx(address) {
      	usePointFromPostcode(address, placeMarkerAtPoint);

    }

	
		function drawSite() {
		//gets WKT from webservice and plots ..
		
			iNumSites = 0;
		
			GDownloadUrl("http://" + webhost + "/ESDMSpatialServices/ESDMspatialServices.asmx/GetSites?sSiteName=Barn elms", function(data, responseCode) {	
	

				var xml = GXml.parse(data);
				//alert(data);
				var sites = xml.documentElement.getElementsByTagName("Site");
				for (var i = 0; i < sites.length; i++) {
					iNumSites += 1;
					//alert(GXml.value(sites[i].getElementsByTagName("SiteName").item(0)))
					sWKT = GXml.value(sites[i].getElementsByTagName("WKT").item(0))
					
					sPrefix = sWKT.substr(0,sWKT.indexOf("("))
					//GLog.write(sPrefix)
					
					if (sPrefix=="MULTIPOLYGON") {
						sWKT = sWKT.replace("MULTIPOLYGON(((","")
						sWKT = sWKT.replace(")))","")
					}
					
					if (sPrefix=="POLYGON") {
						sWKT = sWKT.replace("POLYGON((","")
						sWKT = sWKT.replace("))","")
					}
										
					if (sPrefix=="POINT") {
						sWKT = sWKT.replace("POINT(","")
						sWKT = sWKT.replace(")","")
					}	
					
					if (sPrefix=="MULTIPOINT") {
						sWKT = sWKT.replace("MULTIPOINT(","")
						sWKT = sWKT.replace(")","")
					}	
					
					if (sPrefix=="LINESTRING") {
						sWKT = sWKT.replace("LINESTRING(","")
						sWKT = sWKT.replace(")","")
					}	
					
					if (sPrefix=="MULTILINESTRING") {
						sWKT = sWKT.replace("MULTILINESTRING((","")
						sWKT = sWKT.replace("))","")
					}				
					
					aWKT = sWKT.split(",")

					

					var alatlngs = new Array;
					
					for (var j = 0;j<aWKT.length;j++) {
					 aPt = aWKT[j].split(" ");
					 var gPt = new GLatLng(parseFloat(aPt[1]), parseFloat(aPt[0]))
					 alatlngs[j]=gPt
					}
					
					
					if ((sPrefix=="MULTIPOLYGON") || (sPrefix=="POLYGON")) {
						var polygon = new GPolygon(alatlngs,"#FF0000", 1)
						map.addOverlay(polygon);
					}

					if ((sPrefix=="MULTIPOINT") || (sPrefix=="POINT")) {
						var marker = new GMarker(alatlngs[0],"#FF0000", 1)
						map.addOverlay(marker);
					}

					if ((sPrefix=="LINESTRING") || (sPrefix=="MULTILINESTRING")) {
						var polyline = new GPolyline(alatlngs,"#FF0000", 1)
						map.addOverlay(polyline);
					}
										
					
					
				}
			});
		}


			function getURLParameters(paramName) {
				var sURL = window.document.URL.toString();
				var ans='';
				if (sURL.indexOf("?") > 0) {
					var arrURLParams = window.location.search.substring(1).split("&amp;");
					var arrParamNames = new Array(arrURLParams.length);
					var arrParamValues = new Array(arrURLParams.length);
					var i = 0;
					for (i=0;i<arrURLParams.length;i++) {
						var sParam =  arrURLParams[i].split("=");
						arrParamNames[i] = sParam[0];
						if (sParam[1] != "")
							arrParamValues[i] = unescape(sParam[1]);
						else
							arrParamValues[i] = "";
						if (arrParamNames[i]==paramName)
							ans = arrParamValues[i];
					}
				}
				return ans
			}


	function getInfo(pt){

		// code from Lance on the Google Maps Group

		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  = 256*span_ew/span_ns;
		var height = 256;

		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, function(data, responseCode) {
				gResult = data;
				gResult=gResult.replace(/&lt;/g,"<");
				gResult=gResult.replace(/&gt;/g,">");

				gResult=removeImg(gResult);
				gResult=removeTRO(gResult);
				gResult=removeTRO(gResult);
				addInfoTipMarker(pt);
		});
	}
	
	
function removeImg(s) {
    //removes <img> tag if no photo
    var p1;
    var p2;
    var t;
    
    key='<a href="http://www.cambrianmountains.org/photos/"'
    
    if (s.indexOf(key)>0) {
        p1 = s.indexOf(key) ;
        p2 = s.indexOf('</a>',p1 + key.length);
        t = s.substring(0,p1) + s.substring(p2+4,s.length);
    } else {
        t=s;
    }
    return t;
}

function removeTRO(s) {
    //removes tro tag if no date
    var p1;
    var p2;
    var t;
    t = s;    

    startkey='<tr><td><b>TRO'
    endkey='</td></tr>'
    p1 = s.indexOf(startkey) ;
    if (p1>0) {
	    p2 = s.indexOf(endkey,p1);

	    if (p2-p1<=45) {
    		t = s.substring(0,p1) + s.substring(p2+endkey.length,s.length);
	    }
    }
    return t;
}


function addInfoTipMarker(pt) {

	var p = new GPoint(pt);
	var label1 = 'Info';
	var label2 = 'Email';
	var htm = "";
	//var html2 = "You clicked on <br>" + pt;

    //create a wgs84 coordinate
    wgs84=new GT_WGS84();
    wgs84.setDegrees(pt.lat(), pt.lng());

    //convert to OSGB
    osgb=wgs84.getOSGB();

    //get a grid reference with 3 digits of precision
    gridref = osgb.getGridRef(4);

    if (gResult.length>0) {
        var layerName=getVal2(gResult,'Layer: ');
		sTitle = getVal(gResult,"<tr><td><b>Path number:</b></td><td>") + " at " + gridref
     		
		//document.getElementById('side_bar').innerHTML = URL;

        htm += '<div style="overflow:auto;wrap:auto;background-color:#FFFF88; font-family:verdana; border:solid 1px black;width:350px;height:200px;" >'
		htm += '<a href="javascript:zoomIn('+p+');">Zoom In</a>&nbsp;|&nbsp;<a href="javascript:zoomOut('+p+');">Zoom Out</a><br><br>';
		htm +=  gResult + '</div>'


        if (layerName=='Path') {
            htm2 = '<div style="wrap:auto;background-color:#FFFF88; font-family:verdana;border:solid 1px black;width:350px;text-align: center;" ><b>Email a comment or report a fault on this path</b><br/><br/>'
            //htm2 += "<div id='mailsection'>"
            htm2 += "<div id='mailstatus'>Status: Composing new message</div>"
            htm2 += "<form id='mail' action=''><table>"

            htm2 += "<tr><td>Subject:</td><td><input name='subject' type='text' class='mailfield' size='20' title='Enter message subject' DISABLED value='" + sTitle + "'/></td></tr>"
            htm2 += "<tr><td>Your email:</td><td><input name='from' type='text' class='mailfield' title='Enter your email address' size='20'/></td></tr></table>"
            htm2 += "<p><textarea class='msgfield' name='message' title='Type your message here' rows='3' cols='40' ></textarea></p>"
            htm2 += "<p><input name='send' type='button' value='Send Message' class='mailbutton' title='Send Message' onclick='sendEmailRequest();false' />"
            htm2 += "<input name='clear' type='reset' value='Clear Message' class='mailbutton' title='Clear Message' /></p>"
            htm2 += "</form>"
            htm2 += "</div>"
            //htm2 += "</div></div>"
            map.openInfoWindowTabsHtml(pt, [new GInfoWindowTab(label1,htm), new GInfoWindowTab(label2,htm2)])
        } else {
    		map.openInfoWindowHtml(pt, htm);
		}
		
gResult='';
} else {

}

	}
	
function getVal2(s,key) {
    var p1;
    var p2;
    var t;

    p1 = s.indexOf(key) + key.length;
    p2 = s.indexOf('<br>',p1);
    t = s.substring(p1,p2);
    return t;
}

	function zoomIn(pt) {
           map.setCenter(pt,map.getZoom()+1);

        }

	function zoomOut(pt) {
           map.setCenter(pt,map.getZoom()-1);
        }

	function GetURL(x, y, w, s, e, n, width, height){
		r = "http://www.cambrianmountains.org/fcgi/mapserv.fcgi?map=D:/Websites/CambrianMountains/mapserver/map/WMSPath.map";
		r+="&SERVICE=WMS";
		r+="&SRS=EPSG:4326";
		r+="&VERSION=1.1.1";
		r+="&REQUEST=GetFeatureInfo";
		r+="&X=" + parseInt(x);
		r+="&Y=" + parseInt(y);
		r+="&QUERY_LAYERS="+mapQLayers;
		r+="&LAYERS="+mapLayers;
		r+="&INFO_FORMAT=text/html";
		r+="&BBOX="+w+","+s+","+e+","+n;
		r+="&WIDTH="+parseInt(width)+"&HEIGHT="+ parseInt(height);
		return r;
	}



// getXMLHttpRequest object
function getXMLHttpRequestObject(){
    var xmlobj;
    // check for existing requests
    if(xmlobj!=null&&xmlobj.readyState!=0&&xmlobj.readyState!=4){
        xmlobj.abort();
    }
    try{
        // instantiate object for Mozilla, Nestcape, etc.
        xmlobj=new XMLHttpRequest();
    }
    catch(e){
        try{
            // instantiate object for Internet Explorer
            xmlobj=new ActiveXObject('Microsoft.XMLHTTP');
        }
        catch(e){
            // Ajax is not supported by the browser
            xmlobj=null;
            return false;
        }
    }
            return xmlobj;
}
    


//Not used at the moment    
function intitializeEmailClient(){
alert('init')
    if(document.getElementById&&document.getElementsByTagName&&document.createElement){
alert('init2')
        var sendbtn=document.getElementsByTagName('form')['mail'].elements['send'];
        if(!sendbtn){return};
        // assign 'onlick' event handler to 'send' button
        sendbtn.onclick=function(){
            // display message
            //document.getElementsByTagName('h3')['mailstatus'].firstChild.data='STATUS: SENDING MESSAGE...';
	    xGetElementById('mailstatus').innerHTML = 'STATUS: SENDING MESSAGE...';
            // send email request
            sendEmailRequest();     
        }
        var clearbtn=document.getElementsByTagName('form')['mail'].elements['clear'];
        if(!clearbtn){return};
        // assign 'onlick' event handler to 'clear message' button
        clearbtn.onclick=function(){xGetElementById('mailstatus').innerHTML='STATUS: COMPOSING NEW MESSAGE'};

    }
}


function sendEmailRequest(){

    var message=document.getElementsByTagName('form')['mail'].elements['message'].value;
    if(message.length>1000){message=message.substring(0,1000)};
    // open socket connection
    emailXMLHttpObj.open('POST','sendmail.aspx',true);
    // set form http header
    emailXMLHttpObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
    // get form values and send http request
    emailXMLHttpObj.send(getFormValues(document.getElementsByTagName('form')['mail']));
    emailXMLHttpObj.onreadystatechange=emailStatusChecker;
}
    
    
// get form values
function getFormValues(fobj){
    var str='';
    for(var i=0;i< fobj.elements.length;i++){
    	str+=fobj.elements[i].name+'='+ escape(fobj.elements[i].value)+'&';
    }
    str=str.substr(0,(str.length-1));
    return str;
}     
    
// check status of email requester object
function emailStatusChecker(){
    // if mail request is completed
    if(emailXMLHttpObj.readyState==4){
        if(emailXMLHttpObj.status==200){
            // if status == 200 display server response
            displayServerResponse();
        }
        else{
            alert('Failed to get response :'+emailXMLHttpObj.statusText);
        }
    }
}
// display server response
function displayServerResponse(){
    //var status=document.getElementsByTagName('h3')['mailstatus'].firstChild;
    var status=xGetElementById('mailstatus').innerHTML;
    if(!status){return};
    // display messages by <h1> header
    xGetElementById('mailstatus').innerHTML=emailXMLHttpObj.responseText;  
}

function getVal(s,key) {
	var p1;
	var p2;
	var t;

	p1 = s.indexOf(key) + key.length;
	p2 = s.indexOf('</td></tr>',p1);
	t = s.substring(p1,p2);
	return t;
}


function LayersChanged(sLayer) {

	//paths
	if (sLayer==0) {
		xGetElementById("Theme1").checked=false;
		xGetElementById("Theme2").checked=false;
		xGetElementById("Theme3").checked=false;
		xGetElementById("Theme4").checked=false;
		xGetElementById("Theme5").checked=false;
		xGetElementById("Theme6").checked=false;
	}

	//natural heritage
	if (sLayer==1) {
		xGetElementById("Theme0").checked=false;
		xGetElementById("Theme2").checked=false;
		xGetElementById("Theme3").checked=false;
		xGetElementById("Theme4").checked=false;
		xGetElementById("Theme5").checked=false;
		xGetElementById("Theme6").checked=false;
	}


	//archaeology
	if (sLayer==2) {
		xGetElementById("Theme0").checked=false;
		xGetElementById("Theme1").checked=false;
		xGetElementById("Theme3").checked=false;
		xGetElementById("Theme4").checked=false;
		xGetElementById("Theme5").checked=false;
		xGetElementById("Theme6").checked=false;
	}

	//remoteness
	if (sLayer==3) {
		xGetElementById("Theme0").checked=false;
		xGetElementById("Theme1").checked=false;
		xGetElementById("Theme2").checked=false;
		xGetElementById("Theme4").checked=false;
		xGetElementById("Theme5").checked=false;
		xGetElementById("Theme6").checked=false;
	}


	//surface
	if (sLayer==4) {
		xGetElementById("Theme0").checked=false;
		xGetElementById("Theme1").checked=false;
		xGetElementById("Theme2").checked=false;
		xGetElementById("Theme3").checked=false;
		xGetElementById("Theme5").checked=false;
		xGetElementById("Theme6").checked=false;
	}

	//overall
	if (sLayer==5) {
		xGetElementById("Theme0").checked=false;
		xGetElementById("Theme1").checked=false;
		xGetElementById("Theme2").checked=false;
		xGetElementById("Theme3").checked=false;
		xGetElementById("Theme4").checked=false;
	}

	//overall
	if (sLayer==6) {
		xGetElementById("Theme0").checked=false;
		xGetElementById("Theme1").checked=false;
		xGetElementById("Theme2").checked=false;
		xGetElementById("Theme3").checked=false;
		xGetElementById("Theme4").checked=false;
	}

}

function LayersChangedButton() {

  	mapLayers= "";
	mapQLayers= "";
	
	if (xGetElementById("Theme0").checked==true) {
			mapLayers=  mapLayers + "Footpath,";
	}

	if (xGetElementById("Theme1").checked==true) {
			mapLayers=  mapLayers + "Ecoheritage,";
	}
	
	if (xGetElementById("Theme2").checked==true) {
			mapLayers=  mapLayers + "Archaeology,ArcPaths,";
	}
	
	if (xGetElementById("Theme3").checked==true) {
			mapLayers=  mapLayers + "Remoteness,RemotePaths,";
	}
	

	if (xGetElementById("Theme4").checked==true) {
			mapLayers= mapLayers + "Surface,";
	}

	if (xGetElementById("Theme5").checked==true) {
			mapLayers= mapLayers + "Overall,";
	}

	if (xGetElementById("Theme6").checked==true) {
			mapLayers= mapLayers + "ManagedNetwork,Footpath,"  ;
	}

	if (xGetElementById("Theme7").checked==true) {
			mapLayers= mapLayers + "Photos,";
	}
	

	if (xGetElementById("Theme8").checked==true) {
			mapLayers=  mapLayers + "ProtectedAreas,";
	}
	
	//if nothing set - add paths back as default
	if (mapLayers.length==0) {
	    mapLayers="FootpathPath";
	    xGetElementById("Theme0").checked=true;
	    xGetElementById("Theme1").checked=false;
	    xGetElementById("Theme2").checked=false;
	    xGetElementById("Theme3").checked=false;
	    xGetElementById("Theme4").checked=false;
	    xGetElementById("Theme5").checked=false;
	    xGetElementById("Theme6").checked=false;
	    xGetElementById("Theme7").checked=false;
	    xGetElementById("Theme8").checked=false;
	} else {
	    mapLayers = mapLayers.substring(0,mapLayers.length-1);
	    mapQLayers = mapLayers;
	}
	
	//force redraw
	//setLayers(mapLayers);
	refreshLegend(mapLayers);
	getWMS();

//GLog.write(mapQLayers)

}


function refreshLegend(mapLayers) {

    for (i=0;i<8;i++) {
        xVisibility('legend'+i,false);
    }

    if (mapLayers.length > 0) {
        var aLayers = new Array();
        aLayers=mapLayers.split(",");
        var url = "http://www.cambrianmountains.org/fcgi/mapserv.fcgi?map=D:/Websites/cambrianmountains/mapserver/map/WMSPath.map&SERVICE=WMS&VERSION=1.1.1&REQUEST=getlegendgraphic&FORMAT=image/png&layer="

        for (i=0;i<aLayers.length;i++) {
            xGetElementById('legend' + i).src=url + aLayers[i]
            xVisibility('legend'+i,true);
        }    
    }

}


function helpwindow() 
{ 
r=window.open('help.htm','help','width=600,height=400,resizable=yes,scrollbars=yes'); 
r.focus();
} 

 
function resetMap() {
	location.reload(true);

}



    function extendBounds(mapWidth,mapHeight,gutterPixels) {
      	//pixels is the number of extra pixels you want in gutter
      	//remember mapserver can't return more than 2048x2048
      	
      	if (((mapWidth + (2 * gutterPixels)) > 2048) || ((mapHeight + (2 * gutterPixels)) > 2048)) {
      	   alert('Your map is too big -please reduce the size')
      	}
      	
      	var x1 = map.getBounds().getSouthWest().lng()
      	var x2 = map.getBounds().getNorthEast().lng()
      	var y1 = map.getBounds().getSouthWest().lat()
      	var y2 = map.getBounds().getNorthEast().lat()
      	
      	var newBnds;
        var newSW;
        var newNE;
      	
      	xdiff = Math.abs(x2-x1)
      	ydiff = Math.abs(y2-y1)
      	x1 = x1 - xdiff * (gutterPixels/mapWidth)
      	x2 = x2 + xdiff * (gutterPixels/mapWidth)
      	
      	y1 = y1 - ydiff * (gutterPixels/mapHeight)
      	y2 = y2 + ydiff * (gutterPixels/mapHeight)
      	
      	newSW = new GLatLng(y1,x1)
      	newNE = new GLatLng(y2,x2)
      	newBnds = new GLatLngBounds(newSW,newNE)

      	return newBnds
      }
      
      
      function getWMS() {
 	pt = map.fromLatLngToDivPixel(map.getCenter());


TLx=TLx + (pt.x-lastX)
TLy=TLy + (pt.y-lastY)
	
	if (dragactive) {
	    if ((Math.abs(pt.x-lastX) > pixelNudge) || (Math.abs(pt.y-lastY) > pixelNudge)) {
        	overlayBounds = extendBounds(mapWidthPixel,mapHeightPixel,gutterPixelSize);
      		wmsImg = new Image(mapWidthPixel,mapHeightPixel);
		wmsImg.src = getCustomGetTileUrl(overlayBounds,gutterPixelSize);
		wmsImg.onload = wmsLoaded;
		xVisibility('timer',true);
	    }
	} else {

        	overlayBounds = extendBounds(mapWidthPixel,mapHeightPixel,gutterPixelSize);
      		wmsImg = new Image(mapWidthPixel,mapHeightPixel);
		wmsImg.src = getCustomGetTileUrl(overlayBounds,gutterPixelSize);
		wmsImg.onload = wmsLoaded;
		xVisibility('timer',true);
	}
	
	lastX = pt.x;
	lastY = pt.y;

      }
      
     function wmsLoaded() {
      
//	newGroundOverlay = new GGroundOverlay(wmsImg.src, overlayBounds)
	newGroundOverlay = new ProjectedOverlay(wmsImg.src,overlayBounds,'?ZOOM=')
	map.removeOverlay(groundOverlay);
	groundOverlay = newGroundOverlay;
    	 // groundOverlay = new GGroundOverlay(wmsImg.src, overlayBounds)
    	map.addOverlay(groundOverlay);
	groundOverlay.setOpacity(75);
	xVisibility('timer',false);
	
      }





function getCustomGetTileUrl(overlayBounds,gutterPixel) {

	//bnd = map.getBounds();
	bnd = overlayBounds;

	if (this.myMercZoomLevel == undefined) {
    	this.myMercZoomLevel = MERC_ZOOM_DEFAULT;
	}

	if (this.myFormat == undefined) {
    	this.myFormat = FORMAT_DEFAULT;
	}

	if (typeof(window['this.myStyles'])=="undefined") this.myStyles="";

	//var lBbox=dd2MercMetersLng(bnd.getSouthWest().lng()) + "," + dd2MercMetersLat(bnd.getSouthWest().lat()) + ","+ dd2MercMetersLng(bnd.getNorthEast().lng()) + "," + dd2MercMetersLat(bnd.getNorthEast().lat());
	var lBbox=bnd.getSouthWest().lng() + "," + bnd.getSouthWest().lat() + ","+bnd.getNorthEast().lng() + "," + bnd.getNorthEast().lat();
		
	//var lSRS="EPSG:54004";
	var lSRS="EPSG:4326";

	var lURL='http://www.cambrianmountains.org/fcgi/mapserv.fcgi?map=D:/Websites/CambrianMountains/mapserver/map/WMSPath.map';
	lURL+="&REQUEST=GetMap";
	lURL+="&SERVICE=WMS";
	lURL+="&VERSION=1.1.1";
	lURL+="&LAYERS="+ mapLayers;
	lURL+="&STYLES="+this.myStyles;
	lURL+="&FORMAT="+'image/png';
	//lURL+="&BGCOLOR=0xFFFFFF";
	//lURL+="&TRANSPARENT=TRUE";
	lURL+="&SRS="+lSRS;
	lURL+="&BBOX="+lBbox;
	lURL+="&WIDTH=" + (mapWidthPixel + 2 * gutterPixel);		 
	lURL+="&HEIGHT=" + (mapHeightPixel + 2 * gutterPixel);
	lURL+="&reaspect=false";
	//document.write(lURL + "<br/>")
	//alert(" url is " + lURL);

//GLog.write(lURL,"#000000");
	return lURL;
}

function dragstart() {
	dragactive=true;
//GLog.write(dragactive,"#000000")
}


function dragend() {

	dragactive=false;
//GLog.write(dragactive,"#000000")
}
