//<![CDATA[

// global "map" variables
var markers;
var uMarkerLayer;
var gmarkers = [];
var htmls = [];
var umarkers = [];
var bounds = new OpenSpace.MapBounds();
var gridProjection = new OpenSpace.GridProjection(); 
var supportService = new OpenSpace.SupportService();

var osMap;
var boundaryLayer; var boundariesVisible;

var size = new OpenLayers.Size(17, 17);
var offset = new OpenLayers.Pixel(-size.w / 2, -12);
var uoffset = new OpenLayers.Pixel(-size.w / 2, -size.h / 2);
var uwindowsize = new OpenLayers.Size(475, 260);

var anchoroffset = new OpenLayers.Pixel(8, 0);
umarkers[0] = null;

var waypointSymbol;

var prevLatNE = null;
var prevLngNE = null;
var prevLatSW = null;
var prevLngSW = null;

var gpsdata = "";
var ugpsdata = "";

var rootlib = "http://www.hill-bagging.co.uk/";
//var rootlib = "http://localhost:8081/hill-bagging/";

var symbollib = rootlib + "symbols/";

    
function loadMap(eDefault, nDefault, zoomDefault) {
        var controls = [new OpenLayers.Control.Navigation(), 
                        new OpenLayers.Control.KeyboardDefaults(), 
                        new OpenSpace.Control.CopyrightCollection(), 
                        new OpenLayers.Control.ArgParser()]; 

	// Code to work around problem with Safari browser
	OpenLayers.Renderer.SVG.prototype.supported = function() {
		var svgFeature = "http://www.w3.org/TR/SVG11/feature#";
		return (document.implementation &&
			(document.implementation.hasFeature("org.w3c.svg", "1.0") ||
			document.implementation.hasFeature(svgFeature + "SVG", "1.1") ||
			document.implementation.hasFeature(svgFeature + "BasicStructure", "1.1") ));
	};
  
        osMap = new OpenSpace.Map('map', {controls: controls}); 

        OpenSpace.Control.Copyright.getDefaultCopyright=function()
         {var bounds=new OpenSpace.MapBounds(0,0,800000,1300000);
         return new OpenSpace.Control.Copyright(osCopy,bounds);                                         
        };
        
        // Anchor position at the top left, offset top by 30px 
        var controlOffset = new OpenLayers.Size(0, 30);
        var position = new OpenSpace.Control.ControlPosition(OpenSpace.Control.ControlAnchor.ANCHOR_TOP_LEFT, controlOffset);
        osMap.addControl(new OpenSpace.Control.SmallMapControl(), position); 
        
	osMap.setCenter(new OpenSpace.MapPoint(eDefault, nDefault), zoomDefault);

	markers = new OpenLayers.Layer.Markers("Markers");
	uMarkerLayer = new OpenLayers.Layer.Markers("uMarkerLayer");
	osMap.addLayers([markers,uMarkerLayer]);
	
	// set the zindex after the layers are added to the map 
	markers.setZIndex(335); 
	uMarkerLayer.setZIndex(330); 

	supportService.getTileCount(tileCountResults);
	
	waypointSymbol = "";
	document.getElementById('map').style.cursor = "default";
	
	if (document.getElementById("GPSFile"))
	document.getElementById("GPSFile").innerHTML = gpsFile();
					
	//Stuff to display position of cursor
	//var screenOverlay = new OpenSpace.Layer.ScreenOverlay("coords"); 
	//screenOverlay.setPosition(new OpenLayers.Pixel(60, 0)); 
	//osMap.addLayer(screenOverlay); 
	
	osMap.events.register("mousemove", osMap, function(evt) { 
		var pt = osMap.getLonLatFromViewPortPx(evt.xy); 
		var grstatus = getCoords(pt);

		document.getElementById('coords').innerHTML = grstatus;
		window.status = grstatus;
		Event.stop(evt);
	});
	
	osMap.events.register("click", osMap, function(evt) { 
		var pt = osMap.getLonLatFromViewPortPx(evt.xy); 
		
		if (waypointSymbol != "") {
    			var uMarker = addUserMarker(pt,waypointSymbol);
    		}

		if (document.getElementById('clickpos')) {
			var grstatus = getCoords(pt);
			document.getElementById('clickpos').innerHTML = "Last click coords = " + grstatus;
    		}
		Event.stop(evt);
	});

	osMap.events.register("mouseout", osMap, function(evt) {
		window.status='';
		Event.stop(evt);
	});
	
	osMap.events.register("moveend", osMap, function(evt) { 
		//var zoomLevel = osMap.getZoom();

 		//var pixel = new OpenLayers.Pixel(osMap.size.w, 0);
		//var mapNE = osMap.getLonLatFromPixel(pixel);
  		//var lonlat = gridProjection.getLonLatFromMapPoint(mapNE);
  		//var latNE = lonlat.lat;
  		//var lngNE = lonlat.lon;

 		//pixel = new OpenLayers.Pixel(0, osMap.size.h);
		//var mapSW = osMap.getLonLatFromPixel(pixel);
  		//lonlat = gridProjection.getLonLatFromMapPoint(mapSW);
  		//var latSW = lonlat.lat;
  		//var lngSW = lonlat.lon;

		//var alertString = "zoom=" + zoomLevel + "&latSW=" + latSW + "&lngSW=" + lngSW + "&latNE=" + latNE + "&lngNE=" + lngNE;
		//document.getElementById('clickpos').innerHTML = alertString;
		
		//searchMarkers("mapbounds");
		
		Event.stop(evt);
	});
}

function getCoords(pt) {
	
	var lonlat = gridProjection.getLonLatFromMapPoint(pt); 
	
	//osgb = new GT_OSGB();
	//osgb.eastings = pt.lon;
	//osgb.northings = pt.lat;
	//var gr = osgb.getGridRef(5);
	
	var gr = NE2NGR(pt.lon, pt.lat);	

	var grstatus = "OS Gridref: " + gr + 
		"   Lat: " + Math.round(lonlat.lat*1000000)/1000000 + "  Lon: " + Math.round(lonlat.lon*1000000)/1000000;
	return grstatus;
}
    
function createMarker(hillnumber, name, gridref, html, symbol, metres) {
	
	var easting = gridref.substr(2,6);
	var northing = gridref.substr(8,6);
	if (gridref.length > 14) {
		easting = gridref.substr(2,6);
		northing = gridref.substr(8,7);
	}
	
	var pos = new OpenSpace.MapPoint(easting, northing);
	icon = new OpenSpace.Icon(symbollib + symbol + ".png", size, offset, "", anchoroffset);
	icon.imageDiv.firstChild.setAttribute('title', name + " " + metres);
	
	var marker = osMap.createMarker(pos, icon, html);
	//markers.addMarker(new OpenLayers.Marker.Label(pos, icon, 'tooltip text', {mouseOver:true}));
	
	gmarkers[hillnumber] = marker;
	htmls[hillnumber] = html;
	
	// build a mouseover event for the individual marker
	marker.events.register("mouseover",marker, function(evt)
	{
		var marker = evt.object;
		document.getElementById('marker').innerHTML = name + " " + metres;
    		setVisibility('marker','visible');
		Event.stop(evt);
	} );

	// build a mouseout event for the individual marker
	marker.events.register("mouseout",marker,function(evt)
	{
		var marker = evt.object;
		document.getElementById('marker').innerHTML = "";
    		setVisibility('marker','hidden');
		Event.stop(evt);
	} );

	// build a mousemove event for the individual marker
	marker.events.register("mousemove",marker,function(evt)
	{
		var marker = evt.object;
		window.status = name + " " + metres;
		Event.stop(evt);
	} );
		
	return marker;
}
    
function userMarker(markerkey, description, gridref, symbol, metres, gpsid) {
	
	var easting = gridref.substr(2,6);
	var northing = gridref.substr(8,6);
	if (gridref.length > 14) {
		easting = gridref.substr(2,6);
		northing = gridref.substr(8,7);
	}
	gridref = gridref.substr(0,2) + " " + easting.substr(1) + " " + northing.substr(1);
	
	var pos = new OpenSpace.MapPoint(easting, northing);
	icon = new OpenSpace.Icon(symbollib + symbol + ".png", size, uoffset, "", anchoroffset);
	icon.imageDiv.firstChild.setAttribute('title', description);
	
	var htmlstr = userMarkerWindow(markerkey, description, gridref, symbol, metres, gpsid);

	//var marker = osMap.createMarker(pos, icon, htmlstr, uwindowsize);
	var marker = new OpenLayers.Marker(pos, icon.clone()); 
	uMarkerLayer.display(true);
	uMarkerLayer.addMarker(marker); 
	
	marker.markerkey = markerkey;
	marker.description = description;
	marker.gridref = gridref;
	marker.symbol = symbol;
	marker.metres = metres;
	marker.gpsid = gpsid;
	marker.infowindow = htmlstr;

	umarkers[markerkey] = marker;
	
	// build a mouseover event for the individual marker
	marker.events.register("click",marker, function(evt)
	{
		umarkers[markerkey].map.openInfoWindow(umarkers[markerkey].icon,umarkers[markerkey].lonlat,umarkers[markerkey].infowindow,uwindowsize);
		Event.stop(evt);
	});
	
	marker.events.register("mouseover",marker, function(evt)
	{
		var marker = evt.object;
		document.getElementById('marker').innerHTML = description;
    		setVisibility('marker','visible');
		Event.stop(evt);
	} );

	// build a mouseout event for the individual marker
	marker.events.register("mouseout",marker,function(evt)
	{
		var marker = evt.object;
		document.getElementById('marker').innerHTML = "";
    		setVisibility('marker','hidden');
		Event.stop(evt);
	} );

	// build a mousemove event for the individual marker
	marker.events.register("mousemove",marker,function(evt)
	{
		var marker = evt.object;
		window.status = description;
		Event.stop(evt);
	} );
		
	return marker;
}
    
function addUserMarker(pt,symbol) {
	
	var lonlat = gridProjection.getLonLatFromMapPoint(pt);
	
	//osgb = new GT_OSGB();
	//osgb.eastings = pt.lon;
	//osgb.northings = pt.lat;
	//var gr = osgb.getGridRef(5);
	
	var gr = NE2NGR(pt.lon, pt.lat);
	
	var pos = new OpenSpace.MapPoint(pt.lon, pt.lat);
	var userIcon = new OpenSpace.Icon(symbollib + symbol + ".png", size, uoffset, "", anchoroffset);
	userIcon.imageDiv.firstChild.setAttribute('title', symbol);
	
	//if (umarkers[0] != null) uMarkerLayer.removeMarker(umarkers[0]);
	var umarker = new OpenLayers.Marker(pt, userIcon.clone()); 

	uMarkerLayer.display(true);
	uMarkerLayer.addMarker(umarker); 

	document.getElementById('map').style.cursor = "default";
	document.getElementById(symbol).style.border="none";
    	waypointSymbol = "";
    	
    	umarker.markerkey = 0;
    	umarker.gridref = gr;
    	umarker.lat = Math.round(lonlat.lat*1000000)/1000000;
    	umarker.lng = Math.round(lonlat.lon*1000000)/1000000;
    	umarker.metres = "";
    	umarker.symbol = symbol;
    	umarker.description = "";
 	umarker.infowindow = userMarkerWindow(umarker.markerkey, umarker.description, umarker.gridref, umarker.symbol, umarker.metres, "New marker");
   	
    	umarkers[0] = umarker;
    	
    	if (loggedIn == "Y") {
		umarkers[0].map.openInfoWindow(umarkers[0].icon, umarkers[0].lonlat, umarkers[0].infowindow, uwindowsize);
	}

}

function addWaypoint(symbol) {
	waypointSymbol = symbol;
	document.getElementById('map').style.cursor = "crosshair";
	document.getElementById('Waypoint').style.border="none";
	document.getElementById('Car').style.border="none";
	document.getElementById('Campsite').style.border="none";
	document.getElementById(symbol).style.border="1px solid red";
}

function userMarkerWindow(markerkey, description, gridref, symbol, metres, gpsid) {
    	
    	var readonly = 'readonly ';
    	if (loggedIn == "Y") readonly = '';
	
	var htmlstr = '<b>' + gpsid + '</b><br>';
    	htmlstr += '<form name="frmMarker">';
	htmlstr += '<table width="400px" border="1">';
	htmlstr += '<tr><td style="width:100px">Grid Ref:</td>';
	htmlstr += '<td><input type="TEXT" size="14" readonly id="ugridref" value="' + gridref + '" title="OS grid reference">&nbsp;<img src="' + symbollib + symbol + '.png" border="0px"></td></tr>';
	htmlstr += '<tr><td style="width:100px">Elevation:</td>';
	htmlstr += '<td><input type="TEXT" size="5" ' + readonly + 'id="umetres" value="' + metres + '" title="Height above sea level"><br />(in metres - optional)</td></tr>';
	htmlstr += '<tr><td style="width:100px">Description:</td>';
	htmlstr += '<td><input type="TEXT" size="50" ' + readonly + 'id="udesc" value="' + unescape(description.replace(/\+/g," ")) + '" title="Enter your own brief description">';
	htmlstr += '<br />Enter a brief description for your marker<br />(50 characters max)</td></tr>';
	htmlstr += '</table>';
	
	htmlstr += '<div style="text-align:right;">';
	if (loggedIn == "Y") {
		htmlstr += '<a href="#" onclick="cancelUmarker(\'' + markerkey + '\'); return false;">[cancel]</a>';
		htmlstr += '&nbsp;&nbsp;<a href="#" onclick="updateMarker(\'' + markerkey + '\'); return false;">[save]</a>&nbsp;';
		if (markerkey > 0) {
			htmlstr += '&nbsp;<a href="#" onclick="deleteMarker(\'' + markerkey + '\'); return false;">[delete]</a>&nbsp;';
		}
	}
	else {
		htmlstr += '<a href="#" onclick="umarkers[' + markerkey + '].map.closeInfoWindow(); return false;">[close]</a>';
	}
	htmlstr += '</div></form>';
	
	return htmlstr;
}

function myclick(hillnumber) {

	gmarkers[hillnumber].map.openInfoWindow(gmarkers[hillnumber].icon,gmarkers[hillnumber].lonlat,htmls[hillnumber]);
}

function uclick(markerkey) {

	umarkers[markerkey].map.openInfoWindow(umarkers[markerkey].icon,umarkers[markerkey].lonlat,umarkers[markerkey].infowindow,uwindowsize);
}

function myLog(hillnumber,name,climbed,mydesc,mygridref,myfeature,queryString) {

	var htmlstr = '';
	htmlstr += '<fieldset><legend>My Log for ' + htmlspecialchars(name, "ENT_QUOTES") + '</legend>';
    	htmlstr += '<form name="frmLog">';

	htmlstr += '<p><label>Date of Ascent:</label>';
	htmlstr += '<input type="TEXT" size="10" id="climbed" value="' + climbed + '" title="Enter date of ascent (dd/mm/yyyy)">';
	htmlstr += '<br /><span class="formnote">&nbsp;&nbsp;(dd/mm/yyyy - include the slashes)</span>';
	htmlstr += '<br /><span class="formnote">...MUST BE ENTERED (estimate if actual date unknown)</span></p>';

	htmlstr += '<p><label>My Log:</label>';
	htmlstr += '<textarea rows="5" cols="51" id="mydesc" title="Enter a log of your ascent">' + unescape(mydesc.replace(/\+/g," ")) + '</textarea>';
	htmlstr += '<br /><span class="formnote">...Enter a log of your ascent (255 characters max), e.g. route, start point, access problems.</span>';
	htmlstr += '<br /><span class="formnote">N.B. Viewable by other users!</span></p>';
	
	htmlstr += '<p><span class="formnote" style="font-weight: bold;">Optional for GPS users only:</span>';
	htmlstr += '<br /><span class="formnote">If you recorded a grid reference for your summit on a GPS receiver, please enter</span>';
	htmlstr += '<br /><span class="formnote">the grid reference and a description of the summit feature you recorded.</span>';
	htmlstr += '<br /><span class="formnote">The data you enter will help to improve the accuracy of the <a href="http://www.biber.fsnet.co.uk/database_notes.html#GR10" target="_blank">Database of British Hills</a>.</span></p>';
	
	htmlstr += '<p><label>Summit Grid Ref:</label>';
	htmlstr += '<input type="TEXT" size="14" id="mygridref" value="' + mygridref + '" title="Enter your own recorded grid ref for the summit">';
	htmlstr += '<br /><span class="formnote">...Enter your own recorded grid ref for the summit (e.g. NY 12345 67890).</span>';
	htmlstr += '<br /><span class="formnote">Try to remember to switch on your GPS a few minutes before reaching the summit</span>';
	htmlstr += '<br /><span class="formnote">and leave the unit for a few minutes to settle before taking a reading.</span></p>';

	htmlstr += '<p><label>Summit Description:</label>';
	htmlstr += '<textarea rows="5" cols="51" id="myfeature" title="Enter a brief description of the summit feature">' + unescape(myfeature.replace(/\+/g," ")) + '</textarea>';
	htmlstr += '<br /><span class="formnote">...Enter a brief description of the summit feature, e.g. cairn, trig pillar, rocky outcrop, etc.</span>';
	htmlstr += '<br /><span class="formnote">It would help if you could also include the height as given by GPS, and precision of GPS</span>';
	htmlstr += '<br /><span class="formnote">at time of measurement, and mention any survey equipment used, e.g. Abney level.</span>';

	htmlstr += '<p class="noprint"><label>&nbsp;</label><input type="BUTTON" value="Save" onclick="updateLog(\'' + hillnumber + '\',\'' + queryString + '\'); setDisplay(\'MyLog\',\'none\');" />';
	htmlstr += '&nbsp;&nbsp;<label>&nbsp;</label><input type="BUTTON" value="Cancel" onclick="setDisplay(\'MyLog\',\'none\');" /></p>';
	htmlstr += '</form></fieldset><br />';
	
	if (document.getElementById("MyLog")) {
		document.getElementById("MyLog").innerHTML = htmlstr;
		setDisplay('MyLog','inline');
	}
}

function myLog2(hillnumber,name,climbed,mygridref,mydesc,queryString) {

	var htmlstr = '';
	htmlstr += '<fieldset><legend>My Log for ' + htmlspecialchars(name, "ENT_QUOTES") + '</legend>';
    	htmlstr += '<form name="frmLog">';

	htmlstr += '<p><label>Date of Ascent:</label>';
	htmlstr += '<input type="TEXT" size="10" id="climbed" value="' + climbed + '" title="Enter date of ascent (dd/mm/yyyy)">';
	htmlstr += '<br /><span class="formnote">&nbsp;&nbsp;(dd/mm/yyyy - include the slashes)</span>';
	htmlstr += '<br /><span class="formnote">...MUST BE ENTERED (estimate if actual date unknown)</span></p>';

	htmlstr += '<p><label>My Grid Ref:</label>';
	htmlstr += '<input type="TEXT" size="14" id="mygridref" value="' + mygridref + '" title="Enter your own recorded grid ref">';
	htmlstr += '<br /><span class="formnote">...Enter your own recorded grid ref for the summit (e.g. NY 12345 67890)</span></p>';

	htmlstr += '<p><label>My Description:</label>';
	htmlstr += '<textarea rows="5" cols="51" id="mydesc" title="Enter your own brief description">' + unescape(mydesc.replace(/\+/g," ")) + '</textarea>';
	htmlstr += '<br /><span class="formnote">...Enter your own brief description (255 characters max),</span>';
	htmlstr += '<br /><span class="formnote">e.g. summit description, route, start point, access problems, etc.</span>';
	htmlstr += '<br /><span class="formnote">N.B. Viewable by other users!</span></p>';

	htmlstr += '<p class="noprint"><label>&nbsp;</label><input type="BUTTON" value="Save" onclick="updateLog(\'' + hillnumber + '\',\'' + queryString + '\'); setDisplay(\'MyLog\',\'none\');" />';
	htmlstr += '&nbsp;&nbsp;<label>&nbsp;</label><input type="BUTTON" value="Cancel" onclick="setDisplay(\'MyLog\',\'none\');" /></p>';
	htmlstr += '</form></fieldset><br />';
	
	if (document.getElementById("MyLog")) {
		document.getElementById("MyLog").innerHTML = htmlstr;
		setDisplay('MyLog','inline');
	}
}

function setZoom() {

	// ===== Extend the bounds a little so markers not too close to edge of map ======
	// (Could check zoom level first and set different mapBuffer values)
	///var mapBuffer = 0.03;
	
	///var boundsNE = new GLatLng(bounds.getNorthEast().lat() + mapBuffer, bounds.getNorthEast().lng() + mapBuffer);
	///bounds.extend(boundsNE);
	///var boundsSW = new GLatLng(bounds.getSouthWest().lat() - mapBuffer, bounds.getSouthWest().lng() - mapBuffer);
	///bounds.extend(boundsSW);
	
	// ===== determine the zoom level from the bounds =====
	///map.setZoom(map.getBoundsZoomLevel(bounds));
	///if (map.getZoom() > 11) map.setZoom(11);
	
	///map.setCenter(bounds.getCenter());
	
	var center = bounds.getCenterLonLat();
	var zf = osMap.getZoomForExtent( bounds );
	if (zf > 8) zf = 8;
	osMap.setCenter( center, zf );
}

function updateLog(hillnumber,queryString) {

	var climbed = encodeURI(document.getElementById("climbed").value);
	var mydesc = encodeURI(document.getElementById("mydesc").value);
	var mygridref = encodeURI(document.getElementById("mygridref").value);
	var myfeature = encodeURI(document.getElementById("myfeature").value);
	
	var updateString = "hillnumber=" + hillnumber + "&climbed=" + climbed + "&mydesc=" + mydesc + "&mygridref=" + mygridref + "&myfeature=" + myfeature;

	var request = new Ajax.Request(rootlib + "xmlupdate.php", {method:'get', parameters:updateString, asynchronous:false, 
	    onComplete:function(transport) {
		
		var xmlDoc = transport.responseXML;	

		var totals = xmlDoc.documentElement.getElementsByTagName("totals");
		var alertmsg = totals[0].getAttribute("alert");

		if (alertmsg > "") {
			alert(alertmsg);
			return;
		}
	    }
	} );

	searchSubmit(queryString);
}

function updateMarker(markerkey) {

	var umetres = document.getElementById("umetres").value;
        if (isNaN(umetres)) {
           	alert("Metres must be numeric");
           	return;
        }
         
	var udesc = encodeURI(document.getElementById("udesc").value);
	
	var updateString = "umarkers=U&markerkey=" + umarkers[markerkey].markerkey + "&gridref=" + umarkers[markerkey].gridref + "&markertype=" + umarkers[markerkey].symbol + "&metres=" + umetres + "&desc=" + udesc + "&lat=" + umarkers[markerkey].lat + "&lng=" + umarkers[markerkey].lng;

	var request = new Ajax.Request(rootlib + "umarker.php", {method:'get', parameters:updateString, asynchronous:false, 
	    onComplete:function(transport) {
		
		var xmlDoc = transport.responseXML;	

		var totals = xmlDoc.documentElement.getElementsByTagName("totals");
		var alertmsg = totals[0].getAttribute("alert");

		if (alertmsg > "") {
			alert(alertmsg);
			return;
		}
	    }
	} );

	umarkers[markerkey].map.closeInfoWindow();
			
	searchMarkers("mapbounds");
}

function cancelMarker(markerkey) {
	gmarkers[markerkey].map.closeInfoWindow();
}

function cancelUmarker(markerkey) {
	umarkers[markerkey].map.closeInfoWindow();
	
	if (markerkey == 0) {
		uMarkerLayer.removeMarker(umarkers[0]);
		delete umarkers[0];
	}
}

function deleteMarker(markerkey) {

	if (!confirm("Are you sure you want to delete this marker?"))
		return;

	var deleteString = "umarkers=D&markerkey=" + umarkers[markerkey].markerkey;

	var request = new Ajax.Request(rootlib + "umarker.php", {method:'get', parameters:deleteString, asynchronous:false, 
	    onComplete:function(transport) {
		
		var xmlDoc = transport.responseXML;

		var totals = xmlDoc.documentElement.getElementsByTagName("totals");
		var alertmsg = totals[0].getAttribute("alert");

		if (alertmsg > "") {
			alert(alertmsg);
			return;
		}
	    }
	} );

	umarkers[markerkey].map.closeInfoWindow();
	uMarkerLayer.removeMarker(umarkers[markerkey]);
	delete umarkers[markerkey];
			
	searchMarkers("mapbounds");
}

function hideMarkers() {
	uMarkerLayer.display(false);
	document.getElementById("MarkerResults").innerHTML = "";
	setDisplay('MarkerResults','none');
}

function searchSubmit(queryString) {

	var htmlstr = "";
	var inString = queryString;
	
	var queryArray = parse_str(queryString);
	var gr = queryArray['gr'] ? queryArray['gr'].toUpperCase() : "";
	var qu = queryArray['qu'] ? queryArray['qu'] : "S";
	var mp = queryArray['mp'] ? queryArray['mp'] : "large";

	gpsdata = "";

	if (gr != "") {
		osgb = new GT_OSGB();
		osirish = new GT_Irish();
		if (osgb.parseGridRef(gr)) {
			wgs84=osgb.getWGS84();
		}
		else if (osirish.parseGridRef(gr)) {
			wgs84=osirish.getWGS84();
		}
		else {
			alert("Invalid grid reference");
			return;
		}
		
		osMap.setCenter(new OpenSpace.MapPoint(osgb.eastings, osgb.northings), 6);

		queryString = "mapbounds";
		inString = "mapbounds";
	}
	
	if (inString.indexOf("mapbounds") > -1) {
		if (osMap.getZoom() < 4) {
			alert("Function not available at this zoom level \r\n (zoom in and try again)");
			return;
		}

 		var pixel = new OpenLayers.Pixel(osMap.size.w, 0);
		var mapNE = osMap.getLonLatFromPixel(pixel);
  		var lonlat = gridProjection.getLonLatFromMapPoint(mapNE);
  		var latNE = lonlat.lat;
  		var lngNE = lonlat.lon;

 		pixel = new OpenLayers.Pixel(0, osMap.size.h);
		var mapSW = osMap.getLonLatFromPixel(pixel);
  		lonlat = gridProjection.getLonLatFromMapPoint(mapSW);
  		var latSW = lonlat.lat;
  		var lngSW = lonlat.lon;

//		queryString = "ct=XX&qu=S&latSW=" + latSW + "&lngSW=" + lngSW + "&latNE=" + latNE + "&lngNE=" + lngNE;
		queryString+= "&latSW=" + latSW + "&lngSW=" + lngSW + "&latNE=" + latNE + "&lngNE=" + lngNE;

	}

	// display the loading message
    	setVisibility('loading','visible');

	var request = new Ajax.Request(rootlib + "xmlsearch4.php", {method:'get', parameters:queryString, asynchronous:true, 
	    onComplete:function(transport) {
		
		var xmlDoc = transport.responseXML;
		// obtain the array of markers and loop through it
		var markers = xmlDoc.documentElement.getElementsByTagName("marker");

		if (mp != "none")
			hideall();			

		var totals = xmlDoc.documentElement.getElementsByTagName("totals");

		var rowcount = totals[0].getAttribute("rowcount");
		var climbed = totals[0].getAttribute("climbed");
		var myPercent = totals[0].getAttribute("percent");
		var alertmsg = totals[0].getAttribute("alert");

		// reset the results table
		document.getElementById("SearchResults").innerHTML = "";

		if (alertmsg > "") {
			setVisibility('loading','hidden');
			alert(alertmsg);
			return;
		}		

		htmlstr += '<table class=\"totals\">';
		htmlstr += '<tr>';
		htmlstr += '<td align="left" id="counts">Total listed: ' + rowcount + ',&nbsp; total climbed: <font color="red">' + climbed + ' (' + myPercent + '%)</font></td>';
		//htmlstr += '<td align="left">Show: <a href="#" onclick="searchSubmit(filterTable(queryString, \'cl=1\')); return false;">climbed only</a>';
		//htmlstr += ' / <a href="#" onclick="searchSubmit(filterTable(queryString, \'cl=2\')); return false;">unclimbed only</a>';
		//htmlstr += ' / <a href="#" onclick="searchSubmit(filterTable(queryString, \'cl=0\')); return false;">all</a></td>';
		htmlstr += '<td align="right" style="padding-right:60px"><a href="' + countrylib + 'helpnotes.php?qu=' + qu + '#TableNotes" target="_blank"><span class="noprint">Table Help</span></a></td>';
		htmlstr += '</tr>';
		htmlstr += '</table>';

		htmlstr += tableHdr(queryString);

		htmlstr += '<tfoot>';

		var homeMarker = xmlDoc.documentElement.getElementsByTagName("homemarker");
		if (homeMarker.length > 0) {
			var hhillnumber = homeMarker[0].getAttribute("hillnumber");
			var hname = homeMarker[0].getAttribute("mountain");
			var hlat = parseFloat(homeMarker[0].getAttribute("lat"));
			var hlng = parseFloat(homeMarker[0].getAttribute("lng"));
			var hgridref12 = homeMarker[0].getAttribute("gridref12");
			var hgridref = homeMarker[0].getAttribute("gridref");
			var hsymbol = homeMarker[0].getAttribute("symbol");

			var hhtml = "<b>My House</b>";
			var hgetamap = Getamap(hgridref);
			if (hgetamap != "") {
				hhtml += "<br>View on: ";
				hhtml += "<a href=\"" + hgetamap + "\" target=\"_blank\" title=\"View on OS Get-a-map\">Get-a-map</a>";
			}

			var osgb = new GT_OSGB();
			var homerow = "";
			if (osgb.parseGridRef(hgridref)) {
				if (mp != "none") {
					var hmarker = createMarker(hhillnumber, hname, hgridref.substr(0,2) + osgb.eastings + osgb.northings, hhtml, hsymbol, '');
					homerow += "<tr class=\"hdr\"><td style=\"width:80px\"><a href=\"#\" title=\"Click to locate on map\" onClick=\"javascript:myclick('0'); setScrollTop('120'); return false;\">";
					homerow += "<img src=\"" + symbollib + hsymbol + ".png\" border=\"0\"></a></td>";
				}
				else {
					homerow += "<tr class=\"hdr\"><td style=\"width:80px\"><img src=\"" + symbollib + hsymbol + ".png\" border=\"0\"></td>";
				}
				homerow += "<td>" + hname + "</td>";
				homerow += "<td>&nbsp;</td>";
				homerow += "<td style=\"width:50px\">&nbsp;</td>";
				homerow += "<td style=\"width:50px\">&nbsp;</td>";
				homerow += "<td style=\"width:60px\">&nbsp;</td>";
				homerow += "<td style=\"width:150px\"><a href=\"" + hgetamap + "\" target=\"_blank\" title=\"Click for detailed map\">" + hgridref + "</a></td>";
				homerow += "<td style=\"width:80px\">&nbsp;</td></tr>";

				htmlstr += homerow;
			}
		}

		htmlstr += '</tfoot>';

		htmlstr += '<tbody>';

		for (var i = 0; i < markers.length; i++) {
			// obtain the attributes of each marker
			var hillnumber = parseInt(markers[i].getAttribute("hillnumber"));
			var name = markers[i].getAttribute("mountain");
			var lat = parseFloat(markers[i].getAttribute("lat"));
			var lng = parseFloat(markers[i].getAttribute("lng"));
			var gridref12 = markers[i].getAttribute("gridref12");
			var gridref = markers[i].getAttribute("gridref");
			var source = markers[i].getAttribute("source");
			var gpsid = markers[i].getAttribute("gpsid");
			var classification = markers[i].getAttribute("classification");
			var rank = markers[i].getAttribute("rank");
			var area = markers[i].getAttribute("area");
			var symbol = markers[i].getAttribute("symbol");
			var metres = markers[i].getAttribute("metres");
			var feet = markers[i].getAttribute("feet");
			var drop = markers[i].getAttribute("drop");
			var climbed = markers[i].getAttribute("climbed");
			var mydesc = markers[i].getAttribute("mydesc");
			var mygridref = markers[i].getAttribute("mygridref");
			var myfeature = markers[i].getAttribute("myfeature");
			var countrylib = markers[i].getAttribute("countrylib");

			var html = infoWindow(queryString, hillnumber, name, metres, feet, classification, rank, gridref, lat, lng, climbed, mydesc, mygridref, myfeature, countrylib);

			if (mp != "none") {
				if (gmarkers[hillnumber]) {
					if (gmarkers[hillnumber].symbol == symbol) {
						gmarkers[hillnumber].show();
						bounds.extend(gmarkers[hillnumber].getPoint());
					}
					else {
						delete gmarkers[hillnumber];
					}
				}
				if (!gmarkers[hillnumber]) {
					// create the marker
					var marker = createMarker(hillnumber, name, gridref12, html, symbol, metres);
					bounds.extend(marker.lonlat);
					///markers.addMarker(marker);
				}
			}

			htmlstr += tableRow(i, queryString, hillnumber, name, metres, feet, drop, classification, rank, gridref, lat, lng, source, gpsid, symbol, area, climbed, mydesc, mygridref, myfeature, countrylib);
			gpsdata += gpsRow(gpsid, gridref, metres, name);

		}

		htmlstr += '</tbody>';
		htmlstr += '</table>';

		if (mp != "none") {
			if (inString != "mapbounds") {
				if (inString.indexOf("zm=N") < 0) 
					setZoom();
				else
					osMap.setCenter(bounds.getCenter());
			}
		}

		if (inString.indexOf("zm=N") < 0) 
			document.getElementById("SearchResults").innerHTML = htmlstr;

		if (inString.indexOf("mapbounds") > -1)
			setDisplay('SearchResults','inline');

		if (document.getElementById("GPSFile"))
			document.getElementById("GPSFile").innerHTML = gpsFile();

		// remove the loading message when the page has finished loading
		setVisibility('loading','hidden');

            }
	} );     
}

function searchMarkers(queryString) {

	var htmlstr = "";
	var inString = queryString;
	ugpsdata = "";
	
	if (inString.indexOf("mapbounds") > -1) {
		if (osMap.getZoom() < 4) {
			alert("Function not available at this zoom level \r\n (zoom in and try again)");
			return;
		}

 		var pixel = new OpenLayers.Pixel(osMap.size.w, 0);
		var mapNE = osMap.getLonLatFromPixel(pixel);
  		var lonlat = gridProjection.getLonLatFromMapPoint(mapNE);
  		var latNE = lonlat.lat;
  		var lngNE = lonlat.lon;

 		pixel = new OpenLayers.Pixel(0, osMap.size.h);
		var mapSW = osMap.getLonLatFromPixel(pixel);
  		lonlat = gridProjection.getLonLatFromMapPoint(mapSW);
  		var latSW = lonlat.lat;
  		var lngSW = lonlat.lon;
  		
  		if (prevLatNE == null) {
  			prevLatNE = latNE;
  			prevLngNE = lngNE;
  			prevLatSW = latSW;
  			prevLngSW = lngSW;
  		}
  		else {
  			if (latNE < prevLatNE) latNE = prevLatNE; else prevLatNE = latNE;
  			if (lngNE < prevLngNE) lngNE = prevLngNE; else prevLngNE = lngNE;
  			if (latSW > prevLatSW) latSW = prevLatSW; else prevLatSW = latSW;
  			if (lngSW > prevLngSW) lngSW = prevLngSW; else prevLngSW = lngSW;
  		}

		queryString+= "&latSW=" + latSW + "&lngSW=" + lngSW + "&latNE=" + latNE + "&lngNE=" + lngNE;

	}

	// display the loading message
    	setVisibility('loading','visible');

	var request = new Ajax.Request(rootlib + "umarker.php", {method:'get', parameters:"umarkers=S&" + queryString, asynchronous:true, 
	    onComplete:function(transport) {
		
		var xmlDoc = transport.responseXML;
		// obtain the array of markers and loop through it
		var markers = xmlDoc.documentElement.getElementsByTagName("marker");

		//hideall();			

		var totals = xmlDoc.documentElement.getElementsByTagName("totals");

		var rowcount = totals[0].getAttribute("rowcount");
		var alertmsg = totals[0].getAttribute("alert");

		// reset the results table
		document.getElementById("MarkerResults").innerHTML = "";

		if (alertmsg > "") {
			setVisibility('loading','hidden');
			alert(alertmsg);
			return;
		}	

		if (umarkers[0] != null) {
			uMarkerLayer.removeMarker(umarkers[0]);
			delete umarkers[0];
		}		
		
		htmlstr += "<table class=\"list\">";
		htmlstr += "<thead><tr class=\"hdr\">";
		htmlstr += "<th style=\"width:80px\" align=\"center\">Class</th>";
		htmlstr += "<th align=\"left\">Description</th>";
		htmlstr += "<th style=\"width:50px\" align=\"center\">Metres</th>";
		htmlstr += "<th style=\"width:50px\" align=\"center\">Feet</th>";
		htmlstr += "<th style=\"width:60px\" align=\"center\">GPS ID</th>";
		htmlstr += "<th style=\"width:150px\">Grid Reference</th>";
		htmlstr += "<th style=\"width:80px\">&nbsp;</th>";
		htmlstr += "</tr></thead>";
		htmlstr += "<tbody>";

		for (var i = 0; i < markers.length; i++) {
			// obtain the attributes of each marker
			var markerkey = parseInt(markers[i].getAttribute("markerkey"));
			var description = markers[i].getAttribute("description");
			var lat = parseFloat(markers[i].getAttribute("lat"));
			var lng = parseFloat(markers[i].getAttribute("lng"));
			var gridref12 = markers[i].getAttribute("gridref12");
			var gridref = markers[i].getAttribute("gridref");
			var symbol = markers[i].getAttribute("symbol");
			var metres = markers[i].getAttribute("metres");
			var feet = markers[i].getAttribute("feet");
			var gpsid = markers[i].getAttribute("gpsid");

			if (umarkers[markerkey]) {
				//if (umarkers[markerkey].symbol == symbol) {
				//	umarkers[markerkey].show();
				//}
				//else {
					delete umarkers[markerkey];
				//}
			}
			if (!umarkers[markerkey]) {
				// create the marker
				var marker = userMarker(markerkey, description, gridref12, symbol, metres, gpsid);
			}

			//htmlstr += GXml.value(markers[i].getElementsByTagName("tablerow")[0]);
			//ugpsdata += GXml.value(markers[i].getElementsByTagName("gpsrow")[0]);
			
			htmlstr += utableRow(i, markerkey, symbol, description, metres, feet, gpsid, gridref, lat, lng);
			ugpsdata += gpsRow(gpsid, gridref, metres, description);

		}

		htmlstr += '</tbody></table>';

		document.getElementById("MarkerResults").innerHTML = htmlstr;
		setDisplay('MarkerResults','inline');

		if (document.getElementById("GPSFile"))
			document.getElementById("GPSFile").innerHTML = gpsFile();

		// remove the loading message when the page has finished loading
		setVisibility('loading','hidden');

        }
     } );

}

function infoWindow(queryString, hillnumber, name, metres, feet, classification, rank, gridref, lat, lng, climbed, mydesc, mygridref, myfeature, countrylib) {

	var queryArray = parse_str(queryString);
	var mp = queryArray['mp'] ? queryArray['mp'] : "large";
	var qu = queryArray['qu'] ? queryArray['qu'] : "S";

	var infowindow = "";
	var mylog = "";
	var getamap = Getamap(gridref);
	var multimap = Multimap(lat, lng);

	if (climbed == "null") climbed = "";
	if (rank == "null") rank = "";
		
  	var climbedtext = climbed;
	var logtext = climbed;
	
	if (loggedIn == "Y") {
		if (climbed == "") logtext = "(add log)";
		mylog = "'" + hillnumber + "','" + addslashes(name) + "','" + climbed + "','" + mydesc + "','" + mygridref + "','" + myfeature + "','" + queryString + "'";
		climbedtext = "<a href=\"#\" title=\"Click to add log\" onClick=\"javascript:myLog(" + mylog + "); scrollTo('MyLog'); return false;\">" + logtext + "</a>";
	}
	
	if (mp == "small") {
		infowindow += "<b>" + stripslashes(name) + "</b>";
		infowindow += "<br>" + metres + "m / " + feet + "ft<br />(" + classification + ")";
		if (rank.substr(0, 4) != "") infowindow += "<br />(Rank: " + rank + ")";

		if (loggedIn == "Y" && climbed != "") {
			infowindow += "<br>Climbed: " + climbed;
		}
	}
	else {
		infowindow += "<b><a href=\"" + countrylib + "mountaindetails.php?qu=" + qu + "&rf=" + hillnumber + "\" target=\"_blank\" title=\"Click for more details\">" + stripslashes(name) + "</a></b>";

		infowindow += "<br />" + metres + "m / " + feet + "ft<br />(" + classification + ")";
		if (rank.substr(0, 4) != "") infowindow += "<br />(Rank: " + rank + ")";

		if (loggedIn == "Y") {
			climbedtext = "<a href=\"#\" title=\"Click to add log\" onClick=\"javascript:myLog(" + mylog + "); scrollTo('MyLog'); return false;\">" + logtext + "</a>";
		}
		if (climbedtext != "") infowindow += "<br>Climbed: " + climbedtext;

		infowindow += "<br /><a href=\"" + multimap + "\" target=\"_blank\" target=\"_blank\" title=\"View on Multimap\">Multimap</a>";
		if (gridref != "null") {
			if (getamap != "") infowindow += ", <a href=\"" + getamap + "\" target=\"_blank\" title=\"View on OS Get-a-map\">Get-a-map</a>";
		}

		infowindow += "<br /><a href=\"" + countrylib + "googlemaps.php?qu=" + qu + "&rf=" + hillnumber + "\" target=\"_blank\" title=\"View on Google Maps\">Google Maps</a>";
		infowindow += ", <a href=\"" + countrylib + "virtualearth.php?qu=" + qu + "&rf=" + hillnumber + "\" target=\"_blank\" title=\"View on Virtual Earth\">Virtual Earth</a>";
	}
	
	return infowindow;
}

function tableHdr(queryString) {

	var queryArray = parse_str(queryString);
	var qu = queryArray['qu'] ? queryArray['qu'] : "S";
	var rk = queryArray['rk'] ? queryArray['rk'] : "";
	var dr = queryArray['dr'] ? queryArray['dr'] : "";
	
	var hillRank = "Hill No.";
	if (rk > "" || qu == "8K" || qu == "N") hillRank = "Rank";
	var feetDrop = (dr > "") ? "Drop" : "Feet";
	var areaDesc = "";
	var areaHdr = "";

	if (qu.substr(0, 1) == "C") {
		areaDesc = (country == "WD") ? "Continent" : "County";
		areaHdr = "<a href=\"#\" onclick=\"searchSubmit('" + sortTable(queryString, 'ct') + "'); return false;\">" + areaDesc + "</a>";
	}
	else {
		areaHdr = "<a href=\"#\" onclick=\"searchSubmit('" + sortTable(queryString, 'gp') + "'); return false;\">Area</a>";
	}

	var headrow = "<table class=\"list\">";
	headrow += "<tr class=\"hdr\">";
	headrow += "<th style=\"width:60px\" align=\"center\">" + hillRank + "</th>";
	headrow += "<th align=\"center\"><a href=\"#\" onclick=\"searchSubmit('" + sortTable(queryString, 'nm') + "'); return false;\">Hill name</a></th>";
	headrow += "<th style=\"width:80px\" align=\"center\">Class</th>";
	headrow += "<th align=\"center\">" + areaHdr + "</th>";
	headrow += "<th style=\"width:50px\" align=\"center\"><a href=\"#\" onclick=\"searchSubmit('" + sortTable(queryString, 'ht') + "'); return false;\">Metres</a></th>";
	headrow += "<th style=\"width:50px\" align=\"center\">" + feetDrop + "</th>";
	headrow += "<th style=\"width:150px\">Grid Reference</th>";
	headrow += "<th style=\"width:80px\"><a href=\"#\" onclick=\"searchSubmit('" + sortTable(queryString, 'dt') + "'); return false;\">Date of Ascent</a></th>";
	headrow += "</tr>";

	return headrow;
}

function sortTable(queryString, sortkey) {

	var queryArray = parse_str(queryString);

	if (!queryArray['st'])
		queryArray['st'] = 'nm';

	if (queryArray['st'] == sortkey)
		queryArray['st'] = sortkey + 'd';
	else
		queryArray['st'] = sortkey;

	queryString = http_build_query(queryArray, '', '&');

	return queryString;
}

function tableRow(i, queryString, hillnumber, name, metres, feet, drop, classification, rank, gridref, lat, lng, source, gpsid, symbol, area, climbed, mydesc, mygridref, myfeature, countrylib) {

	var queryArray = parse_str(queryString);
	var mp = queryArray['mp'] ? queryArray['mp'] : "large";
	var qu = queryArray['qu'] ? queryArray['qu'] : "S";
	var rk = queryArray['rk'] ? queryArray['rk'] : "";
	var dr = queryArray['dr'] ? queryArray['dr'] : "";

	var hillRank = hillnumber;
	if (rk > "" || qu == "8K" || qu == "N") hillRank = rank;
	var feetdrop = (dr > "") ? drop : feet;
	
	var climbedclass = "";
	var climbedtext = "";
	
	if (climbed == "null") {
		climbed = "";
	}
	else {
  		climbedclass = " class=\"climbed\"";
  		climbedtext = climbed;
  	}

	var logtext = climbedtext;
	var mylog = "";
	
	if (loggedIn == "Y" && mp != "small") {
		if (climbed == "") logtext = "(add log)";
		mylog = "'" + hillnumber + "','" + addslashes(name) + "','" + climbed + "','" + mydesc + "','" + mygridref + "','" + myfeature + "','" + queryString + "'";
		climbedtext = "<a href=\"#\" title=\"Click to add log\" onClick=\"javascript:myLog(" + mylog + "); scrollTo('MyLog'); return false;\">" + logtext + "</a>";
	}
	
	var getamap = Getamap(gridref);
	var multimap = Multimap(lat, lng);
	
	var tablerow = "";
	tablerow += "<tr class=\"d" + (i % 2) + "\"><td style=\"width:60px\">";
	if (mp == "none") {
		tablerow += "<img src=\"" + symbollib + symbol + ".png\" border=\"0\"> " + hillRank + "</td>";
	}
	else {
		tablerow += "<a href=\"#\" title=\"Click to locate on map\" onClick=\"javascript:myclick('" + hillnumber + "'); setScrollTop('120'); return false;\">";
		tablerow += "<img src=\"" + symbollib + symbol + ".png\" border=\"0\"></a> " + hillRank + "</td>";
	}

	tablerow += "<td" + climbedclass + "><a href=\"" + countrylib + "mountaindetails.php?qu=" + qu + "&rf=" + hillnumber + "\" target=\"_blank\" title=\"Click for more details\">" + stripslashes(name) + "</a></td>";

	tablerow += "<td style=\"width:80px\">" + classification + "</td>";
	tablerow += "<td>" + area + "</td>";
	tablerow += "<td style=\"width:50px\" align=\"center\">" + metres + "</td>";
	tablerow += "<td style=\"width:50px\" align=\"center\">" + feetdrop + "</td>";
	
	source = (source == "") ? "" : "(" + source + ")";
	
	//if (gridref == "null")
	//	tablerow += "<td style=\"width:150px\">&nbsp;</td>";
	//else
	//	tablerow += "<td style=\"width:150px\"><a href=\"" + getamap + "\" target=\"_blank\" title=\"Click for detailed map\">" + gridref + "</a> " + source + "</td>";
	tablerow += "<td style=\"width:150px\"><a href=\"" + multimap + "\" target=\"_blank\" title=\"Click for detailed map\">" + gridref + "</a> " + source + "</td>";

	tablerow += "<td" + climbedclass + " style=\"width:80px\">" + climbedtext + "</td></tr>";
	
	//var mytable=document.getElementById("resulttable");
	//var newrow=mytable.insertRow(-1); //add new row to end of table
	//var newcell=newrow.insertCell(0); //insert new cell to row
	//var newcell=newrow.insertCell(1); 
	//var newcell=newrow.insertCell(2); 
	//var newcell=newrow.insertCell(3); 
	//newcell.innerHTML="Row: "+mytable.rows.length;
	//var newcell=newrow.insertCell(4); 
	//var newcell=newrow.insertCell(5); 
	//var newcell=newrow.insertCell(6); 
	//var newcell=newrow.insertCell(7); 
	
	return tablerow;
}

function gpsRow(gpsid, gridref, metres, name) {

	var gpsrow = 'W ' + str_pad(gpsid, 6) + ' ';
	gpsrow += str_pad(gridref, 14) + ' C ';
	gpsrow += str_pad(format_number(metres,1), 9, " ", "STR_PAD_LEFT") + ' ';
	gpsrow += name;         //gpsname;
	gpsrow += '\n';
	
	return gpsrow;
}

function gpsFile() {

	//htmlstr = "<h3>GPS File for mountains/markers shown on map</h3>";
	htmlstr = "<form name=\"frmGPS\">";
	htmlstr += "<textarea name=\"gpsfile\" wrap=\"off\" rows=\"15\" cols=\"68\" style=\"width:600px\">";

	htmlstr += "I  GPSU 4.15" + "\n";
	if (country == "IR") {
		htmlstr += "M E         Ireland 1965 039  7.9681100E+02  1.1960020E-05 506 -122 611" + "\n";
		htmlstr += "U  IRISH GRID" + "\n";
	}
	else {
		htmlstr += "M E   Ord Srvy Grt Britn 075  5.7360400E+02  1.1960020E-05 375 -111 431" + "\n";
		htmlstr += "U  BRITISH GRID" + "\n";
	}
	htmlstr += "\n";
	htmlstr += "F ID---- Zn East  North T  Alt(m)   Comment" + "\n";

	htmlstr += ugpsdata;
	htmlstr += gpsdata;

	htmlstr += "</textarea>";
	htmlstr += "</form>";

	return htmlstr;
}

function utableRow(i, markerkey, symbol, description, metres, feet, gpsid, gridref, lat, lng) {

	var getamap = Getamap(gridref);
	var multimap = Multimap(lat, lng);
	
	var tablerow = "";
	tablerow += "<tr class=\"d" + (i % 2) + "\">";
	
	tablerow += "<td style=\"width:80px\" align=\"center\"><a href=\"#\" title=\"Click to locate on map\" onClick=\"javascript:uclick('" + markerkey + "'); setScrollTop('120'); return false;\">";
	tablerow += "<img src=\"" + symbollib + symbol + ".png\" border=\"0\"></a></td>";

	tablerow += "<td>" + stripslashes(description) + "</td>";

	tablerow += "<td style=\"width:50px\" align=\"center\">" + metres + "</td>";
	tablerow += "<td style=\"width:50px\" align=\"center\">" + feet + "</td>";
	tablerow += "<td style=\"width:60px\">" + gpsid + "</td>";
	
	//if (gridref == "null")
	//	tablerow += "<td style=\"width:150px\">&nbsp;</td>";
	//else
	//	tablerow += "<td style=\"width:150px\"><a href=\"" + getamap + "\" target=\"_blank\" title=\"Click for detailed map\">" + gridref + "</a></td>";
	tablerow += "<td style=\"width:150px\"><a href=\"" + multimap + "\" target=\"_blank\" title=\"Click for detailed map\">" + gridref + "</a></td>";

	tablerow += "<td style=\"width:80px\">&nbsp;</td></tr>";
	
	return tablerow;
}

//convert northing and easting to letter and number grid system
function NE2NGR( east,  north)
{
	var eX = east / 500000;
	var nX = north / 500000;
	var tmp = Math.floor(eX) - 5.0 * Math.floor(nX) + 17.0; 
	nX = 5 * (nX - Math.floor(nX));
	eX = 20 - 5.0 * Math.floor(nX) + Math.floor(5.0 * (eX - Math.floor(eX)));
	if (eX > 7.5) eX = eX + 1; // I is not used
	if (tmp > 7.5) tmp = tmp + 1; // I is not used

	var eing = east - (Math.floor(east / 100000)*100000);
	var ning = north - (Math.floor(north / 100000)*100000);
	var estr = eing.toFixed(0);
	var nstr = ning.toFixed(0);
	while(estr.length < 5)
		estr = "0" + estr;
	while(nstr.length < 5)
		nstr = "0" + nstr;

	var ngr = String.fromCharCode(tmp + 65) + 
		  String.fromCharCode(eX + 65) + 
		  " " + estr + " " + nstr;
	return ngr;
}

function Getamap(inGridref) {
	if (country != "EW" && country != "SC") return "";

	var zone = inGridref.substr(0, 2);
	var easting5 = inGridref.substr(3, 5);
	var northing5 = inGridref.substr(9, 5);
	var easting6 = inGridref.substr(2, 6);
	var northing6 = inGridref.substr(8, 6);

	if (inGridref.length == 15) {
	   northing5 = inGridref.substr(10, 5);
	   northing6 = inGridref.substr(8, 7);
	}

	var getamap = "http://getamap.ordnancesurvey.co.uk/getamap/frames.htm?mapAction=gaz&gazName=g&gazString=" + zone + easting5 + northing5;

	return getamap;
}

function Multimap(inLat, inLng) {

	var dp = "os";
	var loc = "GB";
	if (country == "IR") {
		dp = "925,904";
		loc = "IE";
	}
	
	var multimap = "http://www.multimap.com/maps/#map=" + inLat + "," + inLng + "|15|4&dp=" + dp + "&loc=" + loc + ":" + inLat + ":" + inLng + ":15";
	//dp=925,904 for Northern Ireland,  925 for Eire, loc=IE
	
	return multimap;
}

// this function hides all markers
function hideall() {

	// hide the info window, otherwise it still stays open where the removed marker used to be
	///map.closeInfoWindow(); 
	bounds = new OpenSpace.MapBounds();

	///for (i=0; i < gmarkers.length; i++) {
	///	if (gmarkers[i])
	///		gmarkers[i].hide();
	///}
	
	osMap.closeInfoWindow();
	osMap.clearMarkers();
	
	prevLatNE = null;
	prevLngNE = null;
	prevLatSW = null;
	prevLngSW = null;

}

function resizeMap(aspect) {

	switch (aspect) {
		case 'portrait' :
			setSize('mapcell','630px','');
			setSize('map','630px','800px');
			break;
		case 'landscape' :
			setSize('mapcell','860px','');
			setSize('map','860px','580px');
			break;
		default :
			setSize('mapcell','600px','');
			setSize('map','600px','500px');
	}

}

function resizeMapWH(mapWidth, mapHeight) {

	setSize('mapcell', mapWidth, '');
	setSize('map', mapWidth, mapHeight);

}

function tileCountResults(tilesUsed, maxTiles) {
	if(parseFloat(tilesUsed) >= parseFloat(maxTiles)) {
		alert("I'm sorry, but this site will not be able to display any more OS maps today (due to an OS imposed limit of " + maxTiles + " map tile fetches per day). Please try the Google Maps link instead.");
	}

	document.getElementById('coords').innerHTML = "Tiles Used: " + tilesUsed + " of " + maxTiles;
}

function countyBoundaries() {
	var symbolizer = OpenLayers.Util.applyDefaults(
	      { }, OpenLayers.Feature.Vector.style["default"]);
	//and a new style map
	var styleMap = new OpenLayers.StyleMap(symbolizer);
	//this is our custom styling
	lookup = {
		   "CTY":
		   {fillColor: "red",
		    fillOpacity: 0.2,
		    strokeColor: "white",
		    strokeWidth: 3,
		    strokeOpacity: 0.7},
		   "MTD":
		   {fillColor: "blue",
		    fillOpacity: 0.2,
		    strokeColor: "white",
		    strokeWidth: 3,
		    strokeOpacity: 0.7},
		   "UTA":
		   {fillColor: "green",
		    fillOpacity: 0.2,
		    strokeColor: "white",
		    strokeWidth: 3,
		    strokeOpacity: 0.7},
		   "LBO":
		   {fillColor: "blue",
		    fillOpacity: 0.1,
		    strokeColor: "white",
		    strokeWidth: 3,
		    strokeOpacity: 1.0},
		   "GLA":
		   {fillColor: "blue",
		    fillOpacity: 0.1,
		    strokeColor: "white",
		    strokeWidth: 3,
		    strokeOpacity: 0.7}
		   };
	//add rules to the style map
	styleMap.addUniqueValueRules("default", "AREA_CODE", lookup);
	//create a new boundary using the above styling and a specific boundary
	boundaryLayer = new OpenSpace.Layer.Boundary("Boundaries", {
	     strategies: [new OpenSpace.Strategy.BBOX()],
	     area_code: ["CTY","MTD","UTA","GLA","LBO"],
	     styleMap: styleMap });
	     
	var hoverControl = new OpenLayers.Control.SelectFeature(boundaryLayer,
 		{multiple: false, hover:true, onSelect: onFeatureHover, onUnselect: offFeature });
 
	//add boundary to the map and refresh to make visible
	osMap.addControl(hoverControl);
	hoverControl.activate();
	osMap.addLayer(boundaryLayer);
	boundaryLayer.setZIndex(320);
	boundaryLayer.refresh();
	boundariesVisible = true;
}

function onFeatureHover(feature) {
	selectedFeature = feature;
	var countyName = feature.attributes.NAME
	document.getElementById('marker').innerHTML = countyName;
	setVisibility('marker','visible');
	//window.location = "http://www.google.com/"
	
	//if (typeof(hoverControl.handlers) != "undefined")
     	//{
     	//	hoverControl.handlers.feature.stopDown = false;
     	//}
}

function offFeature()
{
	document.getElementById('marker').innerHTML = "";
}
 
function searchurl() {

	if(window.location.search) {
		var u, n = window.location.search.substring(1).split(/&/), i = n.length;
  		while( i-- ) {
    		n[i] = n[i].split( /=/ );
    		u[n[i][0]] = n[i][1];
  		}
  		return u;
	}

	// e.g. var s=searchurl(); if( s['lang']==='en' ) { ... }
}

function addslashes(str) {
	//str=str.replace(/\'/g,'\\\'');
	//str=str.replace(/\"/g,'\\"');
	//str=str.replace(/\\/g,'\\\\');
	//str=str.replace(/\0/g,'\\0');
	str=str.replace(/'/g,"\\'");
	return str;
}

function stripslashes(str) {
	str=str.replace(/\\'/g,'\'');
	str=str.replace(/\\"/g,'"');
	str=str.replace(/\\\\/g,'\\');
	str=str.replace(/\\0/g,'\0');
	return str;
}
//]]>
