var debug = false;
var global = true;
var belgium = false;
var sweden = false;

var EPSG27700;
var EPSG4326 = new OpenLayers.Projection("EPSG:4326");
var EPSG900913 = new OpenLayers.Projection("EPSG:900913");

var map; //complex object of type OpenLayers.Map
var osmWasActive;
var aerialWasActive;

var lowZoomHiding;
var paper;
var scale;
var style;
var mapCentre;
var startCentre;
var controlsList;
var currControlNum = 0;
var titleText;
var titleFeature;
var scaleFeature;
var mapBound;

OpenLayers.Util.onImageLoadError = function() 
{
    	if (this.src != null && this.src.match(/tiles1/)) 
    	{
		this.src = this.src.replace("tiles1", "tiler1");
    	} 
    	else 
    	{	
		this.src = "img/404.png";
	}
};


OpenLayers.ImgPath = "http://js.mapbox.com/theme/dark/";

OpenLayers.Control.BorderClick = OpenLayers.Class(OpenLayers.Control, {                
	defaultHandlerOptions: {
	    'single': true,
	    'double': false,
	    'pixelTolerance': 0,
	    'stopSingle': false,
	    'stopDouble': false
	},
	
	initialize: function(options) {
	    this.handlerOptions = OpenLayers.Util.extend(
	        {}, this.defaultHandlerOptions
	    );
	    OpenLayers.Control.prototype.initialize.apply(
	        this, arguments
	    ); 
	    this.handler = new OpenLayers.Handler.Click(
	        this, {
	            'click': this.trigger
	        }, this.handlerOptions
	    );
	}, 
	
	trigger: function(e) {
	    mapCentre = map.getLonLatFromViewPortPx(e.xy);
	    showMapBorder(mapCentre);
	}
});

OpenLayers.Control.StartClick = OpenLayers.Class(OpenLayers.Control, {                
	defaultHandlerOptions: {
	    'single': true,
	    'double': false,
	    'pixelTolerance': 0,
	    'stopSingle': false,
	    'stopDouble': false
	},
	
	initialize: function(options) {
	    this.handlerOptions = OpenLayers.Util.extend(
	        {}, this.defaultHandlerOptions
	    );
	    OpenLayers.Control.prototype.initialize.apply(
	        this, arguments
	    ); 
	    this.handler = new OpenLayers.Handler.Click(
	        this, {
	            'click': this.trigger
	        }, this.handlerOptions
	    );
	}, 
	
	trigger: function(e) {
	    startCentre = map.getLonLatFromViewPortPx(e.xy);
	    showStart(startCentre);
	}
});

OpenLayers.Control.ControlsClick = OpenLayers.Class(OpenLayers.Control, {                
	defaultHandlerOptions: {
	    'single': true,
	    'double': false,
	    'pixelTolerance': 0,
	    'stopSingle': false,
	    'stopDouble': false
	},
	
	initialize: function(options) {
	    this.handlerOptions = OpenLayers.Util.extend(
	        {}, this.defaultHandlerOptions
	    );
	    OpenLayers.Control.prototype.initialize.apply(
	        this, arguments
	    ); 
	    this.handler = new OpenLayers.Handler.Click(
	        this, {
	            'click': this.trigger
	        }, this.handlerOptions
	    );
	}, 
	
	trigger: function(e) {
	    showControl(map.getLonLatFromViewPortPx(e.xy));
	}
});

var mapBorderClick  = new OpenLayers.Control.BorderClick();
var startClick  = new OpenLayers.Control.StartClick();
var controlsClick  = new OpenLayers.Control.ControlsClick();

function init() 
{
	Proj4js.defs["EPSG:27700"] = "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs";
	EPSG27700 = new OpenLayers.Projection("EPSG:27700");

	map = new OpenLayers.Map ("map", 
	{
	    	projection: EPSG900913,
		units: "m",
		numZoomLevels: 18,
		maxResolution: 156543.0339,
		maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
		//restrictedExtent: new OpenLayers.Bounds(-35, 40, 30, 68).transform(EPSG4326, EPSG900913),
    	    	controls:[
	                new OpenLayers.Control.Navigation(),
	                new OpenLayers.Control.PanZoomBar(),
			new OpenLayers.Control.Attribution(),
			new OpenLayers.Control.MouseDefaults(),
			new OpenLayers.Control.Permalink('permalink', null, { displayProjection: EPSG4326 }),
			new OpenLayers.Control.MousePosition({ displayProjection: EPSG4326 } )]
   	} );

	var suffix = "";
	var prefix = "http://casa.oobrien.com/maptiler/";
	if (global)
	{
		suffix = "_global";
	}
	if (belgium)
	{
		suffix = "_belgium";
	}
	if (sweden)
	{
		suffix = "_sweden";
	}


 	layerWhite = new OpenLayers.Layer.OSM("White", 
		"img/white.png", 
		{numZoomLevels: 18, transitionEffect: "resize", isBaseLayer: true, attribution: ""});
        layerMapnik = new OpenLayers.Layer.OSM(null, null, {transitionEffect: "resize", attribution: "CC-By_SA <a href='http://openstreetmap.org/'>OpenStreetMap</a> and contributors"});
	layerAerial = new OpenLayers.Layer.Google("Aerial Imagery", 
		{numZoomLevels: 18, type: G_SATELLITE_MAP, sphericalMercator: true});
	layerStreetO = new OpenLayers.Layer.OSM("Street-O", 
                prefix + "streeto" + suffix + "/${z}/${x}/${y}.png",
		{numZoomLevels: 18, transitionEffect: "none", isBaseLayer: false, attribution: "CC-BY-SA <a href='http://openstreetmap.org/'>OpenStreetMap</a> and contributors"});
	layerStreetONoRail = new OpenLayers.Layer.OSM("Street-O (No Rail)", 
                prefix + "streeto_norail" + suffix + "/${z}/${x}/${y}.png",
		{numZoomLevels: 18, transitionEffect: "none", isBaseLayer: false, attribution: "CC-BY-SA <a href='http://openstreetmap.org/'>OpenStreetMap</a> and contributors"});
	layerOTerrain = new OpenLayers.Layer.OSM("O Terrain", 
                prefix + "oterrain" + suffix + "/${z}/${x}/${y}.png",
		{numZoomLevels: 18, transitionEffect: "none", isBaseLayer: false, attribution: "CC-BY-SA <a href='http://openstreetmap.org/'>OpenStreetMap</a> and contributors"});
	layerNetworkG = new OpenLayers.Layer.OSM("Chorogen Context", 
                prefix + "labelsonly" + suffix + "/${z}/${x}/${y}.png",
		{numZoomLevels: 18, transitionEffect: "none", isBaseLayer: false, attribution: ""});
	layerStart = new OpenLayers.Layer.Vector("Start Point");
	layerControls = new OpenLayers.Layer.Vector("Controls");
	layerMapBorder = new OpenLayers.Layer.Vector("Map Border");

        layerOTerrain.setVisibility(true);
        layerStreetO.setVisibility(false);
        layerStreetONoRail.setVisibility(false);
	layerNetworkG.setVisibility(false);
	layerMapBorder.setVisibility(false);
	layerStart.setVisibility(false);
	layerControls.setVisibility(false);
        map.addLayers([layerWhite, layerMapnik, layerAerial, layerStreetO, layerStreetONoRail, layerOTerrain, layerNetworkG, layerMapBorder, layerStart, layerControls]);

	//If not using permalink, default to the world.
	if (map.getZoom() == 0)
	{
		if (global)
		{
			map.setCenter(new OpenLayers.LonLat(2.349909, 48.852984).transform(EPSG4326, EPSG900913), 3);
		}
		else if (belgium)
		{
			map.setCenter(new OpenLayers.LonLat(4.364, 50.843).transform(EPSG4326, EPSG900913), 7);
		}
		else if (sweden)
		{
			map.setCenter(new OpenLayers.LonLat(18.046, 59.327).transform(EPSG4326, EPSG900913), 7);
		}
		else
		{
		 	map.setCenter(new OpenLayers.LonLat(-0.92, 52.48).transform(EPSG4326, EPSG900913), 7);
		}
	}

	//Setup control defaults
	document.getElementById("streetoR").checked = layerStreetO.getVisibility();
	document.getElementById("streetonorailR").checked = layerStreetONoRail.getVisibility();
	document.getElementById("pseudoR").disabled = false;
	document.getElementById("pseudoR").checked = layerOTerrain.getVisibility();
	document.getElementById("plainR").checked = layerWhite.getVisibility();
	document.getElementById("osmR").checked = layerMapnik.getVisibility();
	document.getElementById("aerialR").checked = layerAerial.getVisibility();
	document.getElementById("contextC").checked = layerNetworkG.getVisibility();
	document.getElementById("postcodeT").value = "";

	setMapmakerDefaults();

	osmWasActive = layerMapnik.getVisibility();
	aerialWasActive = layerAerial.getVisibility();

	if (layerStreetO.getVisibility())
	{
		showStreetOMap();
	}
	else
	{
		showOTerrainMap();
	}

	var scalebar = new OpenLayers.Control.ScaleBar({ minWidth: 250, maxWidth: 500, divisions: 5, subdivisions: 1});
	map.addControl(scalebar);

	if (map.getZoom() < 14)
	{
		showHideOSMOverlay();
	}
	map.events.register("move", null, showHideOSMOverlay);
	map.events.register("move", null, redrawTitleFeature);
	map.events.register("move", null, drawScaleFeature);
		
}  

function showHideOSMOverlay()
{
	if (map.getZoom() < 14)
	{
		if (!lowZoomHiding)
		{
			layerStreetO.setVisibility(false);
			layerStreetONoRail.setVisibility(false);
			layerOTerrain.setVisibility(false);
			layerNetworkG.setVisibility(false);
			map.setBaseLayer(layerMapnik);
			lowZoomHiding = true;
			document.getElementById("lowZoomWarningPanel").style.display='block';
		}
	}
	else if (lowZoomHiding)
	{
		//Reset base-layer
		if (document.getElementById("aerialR").checked)
		{
			map.setBaseLayer(layerAerial);
		}
		else if (document.getElementById("plainR").checked)
		{
			map.setBaseLayer(layerWhite);
		}

		//Reset overlays
		if (document.getElementById("contextC").checked)
		{
			layerNetworkG.setVisibility(true);
		}
		if (document.getElementById("streetoR").checked)
		{
			layerStreetO.setVisibility(true);
		}
		else if (document.getElementById("streetonorailR").checked)
		{
			layerStreetONoRail.setVisibility(true);
		}
		else if (document.getElementById("pseudoR").checked)
		{
			layerOTerrain.setVisibility(true);
		}
		document.getElementById("lowZoomWarningPanel").style.display='none';
		lowZoomHiding = false;
	}
}

function showStreetOMap()
{
	document.getElementById("contextC").checked = false;
	layerStreetO.setVisibility(true);
	layerStreetONoRail.setVisibility(false);
	layerOTerrain.setVisibility(false);

	document.getElementById("plainR").disabled = false;
	document.getElementById("osmR").disabled = false;
	document.getElementById("aerialR").disabled = false;

	document.getElementById("osmR").checked = osmWasActive;
	document.getElementById("aerialR").checked = aerialWasActive;

	if (osmWasActive)
	{
		toggleBackground("osm");
	}
	else if (aerialWasActive)
	{
		toggleBackground("aerial");
	}
	else
	{
		toggleBackground("plain");
	}
}

function showStreetONoRailMap()
{
	document.getElementById("contextC").checked = false;
	layerStreetONoRail.setVisibility(true);
	layerStreetO.setVisibility(false);
	layerOTerrain.setVisibility(false);

	document.getElementById("plainR").disabled = false;
	document.getElementById("osmR").disabled = false;
	document.getElementById("aerialR").disabled = false;

	document.getElementById("osmR").checked = osmWasActive;
	document.getElementById("aerialR").checked = aerialWasActive;

	if (osmWasActive)
	{
		toggleBackground("osm");
	}
	else if (aerialWasActive)
	{
		toggleBackground("aerial");
	}
	else
	{
		toggleBackground("plain");
	}
}

function showOTerrainMap()
{
	document.getElementById("contextC").checked = false;
	layerOTerrain.setVisibility(true);
	layerStreetO.setVisibility(false);
	layerStreetONoRail.setVisibility(false);

	//Memorise existing settings for controls that are about to be disabled.
	osmWasActive = document.getElementById("osmR").checked;
	aerialWasActive = document.getElementById("aerialR").checked;

	//Disable layers that would not be visible anyway.
	document.getElementById("plainR").checked = true;
	toggleBackground("plain");
	
	//Disable controls for these layers.
	document.getElementById("plainR").disabled = true;
	document.getElementById("osmR").disabled = true;
	document.getElementById("aerialR").disabled = true;
}

function toggleBackground(background)
{
	if (background == "plain")
	{
		map.setBaseLayer(layerWhite);
		layerStreetO.setOpacity(1);
		layerStreetONoRail.setOpacity(1);
	}
	else if (background == "osm")
	{
		map.setBaseLayer(layerMapnik);
		layerStreetO.setOpacity(0.5);
		layerStreetONoRail.setOpacity(0.5);
	}
	else if (background == "aerial")
	{
		map.setBaseLayer(layerAerial);
		layerStreetO.setOpacity(0.5);
		layerStreetONoRail.setOpacity(0.5);
	}
	toggleContext();
}

function toggleContext()
{
	layerNetworkG.setVisibility(document.getElementById('contextC').checked);
}

function getPostcode()
{
	var pc = document.getElementById("postcodeT").value;
	if (pc.indexOf(',') != -1 && pc.indexOf(',') < (pc.length - 1))
	{
		lat = pc.substring(0, pc.indexOf(','));
		lon = pc.substring(pc.indexOf(',')+1);
		lat = lat*1;
		lon = lon*1;
		if (!isNaN(lat) && !isNaN(lon))
		{
			var ll1 = new OpenLayers.LonLat(lon, lat);
			var ll2 = ll1.transform(EPSG4326, EPSG900913);
			map.panTo(ll2);		
		}
		return;
	}

	request = getAjaxFunction();
	if (!request) return false; 
	request.onreadystatechange = zoomToLocation;
	var queryString = "?p=" + pc;
	request.open("GET", "getos.php" + queryString, true);
	request.send(null);
	document.getElementById('spinner').style.display = 'inline';
}

function zoomToLocation()
{
	if(request.readyState == 4)
    	{
		document.getElementById('spinner').style.display = 'none';
		var text = request.responseText;
		if (text != null && text.length > 2)
		{
			if (text.charAt(0) == "_")
			{
				results = text.split(",");
				current_postcode = results[1];
				easting = results[2]*1;
				northing = results[3]*1;
				var os1 = new OpenLayers.LonLat(easting, northing);
				var ll1 = os1.transform(EPSG27700, EPSG4326);
				var ll2 = ll1.transform(EPSG4326, EPSG900913);
				if (map.zoom > 15)
				{
					map.moveTo(ll2, 15);
				}
				else
				{
					map.panTo(ll2);
				}
           		}
			else
			{				
				alert(text);
			}
      	}
    	}
}

function setMapmakerDefaults()
{
	lowZoomHiding = false;
	paper = "0.2970,0.2100";
	scale = 10000;
	style = "streeto";	
	controlsList = new Array();
	mapCentre = null;
	startCentre = null;
 	currControlNum = 0;	
	titleText = "";
	titleFeature = null;
	scaleFeature = null;
	mapBound = null;
	
	document.getElementById("paperA4Landscape").checked = true;
	document.getElementById("paperA4Landscape").disabled = false;
	document.getElementById("paperA4Portrait").disabled = false;
	document.getElementById("paperA3Landscape").disabled = false;
	document.getElementById("paperA3Portrait").disabled = false;
	document.getElementById("paperA3PLandscape").disabled = false;
	document.getElementById("paperA3PPortrait").disabled = false;
	document.getElementById("usLetterLandscape").disabled = false;
	document.getElementById("usLetterPortrait").disabled = false;
	document.getElementById("scale").value = 10000;
	document.getElementById("scale").disabled = false;
	document.getElementById("style").value = "streeto";
	document.getElementById("centreSetOK").disabled = true;
	document.getElementById("startSetOK").disabled = true;
	document.getElementById("controlSetOK").disabled = true;
	document.getElementById("controlClearLast").disabled = true;
	document.getElementById("titleTextT").disabled = false;
	document.getElementById("titleTextT").value = "";
	document.getElementById("adornmentsSetOK").disabled = false;
	document.getElementById("includeControlsC").checked = true;
	document.getElementById("includeControlsC").disabled = false;
}

function startMapmaker()
{
	if (document.getElementById("mapmakerPanel").style.display == '' || document.getElementById("mapmakerPanel").style.display == 'none')
	{
		setMapmakerDefaults();
		document.getElementById("mapmakerPanel").style.display = 'block';
		layerMapBorder.setVisibility(true);
		map.addControl(mapBorderClick);
		mapBorderClick.activate();
	}
	else
	{
		closeMapmaker();
	}
}

function closeMapmaker()
{
	//Clear the extra layers used
	layerMapBorder.destroyFeatures();
	layerMapBorder.setVisibility(false);
	layerStart.destroyFeatures();
	layerStart.setVisibility(false);
	layerControls.destroyFeatures();
	layerControls.setVisibility(false);
	clearMapBorderClick();
	clearStartClick();
	clearControlsClick();

	titleText = "";	
	titleFeature = null;
	scaleFeature = null;

	currControlNum = 0;
	controlsList = new Array();
	mapBound = null;

	//Hide the extra panel
	document.getElementById("mapmakerPanel").style.display = 'none';
	document.getElementById("step3").style.display = 'none';
	document.getElementById("step4").style.display = 'none';
	document.getElementById("step5").style.display = 'none';
	document.getElementById("step6").style.display = 'none';
	document.getElementById("centreCoords").innerHTML = "Click on map to set";
	document.getElementById("startCoords").innerHTML = "Click on map to set";
	document.getElementById("numControlsAdded").innerHTML = "Click on map to set";
}

function clearMapBorderClick()
{
	mapBorderClick.deactivate();
	map.removeControl(mapBorderClick);
}

function clearStartClick()
{
	startClick.deactivate();
	map.removeControl(startClick);
}

function clearControlsClick()
{
	controlsClick.deactivate();
	map.removeControl(controlsClick);
}

function showStartAdd()
{
	clearMapBorderClick();
	document.getElementById("centreSetOK").disabled = true;
	document.getElementById("paperA4Landscape").disabled = true;
	document.getElementById("paperA4Portrait").disabled = true;
	document.getElementById("paperA3Landscape").disabled = true;
	document.getElementById("paperA3Portrait").disabled = true;
	document.getElementById("paperA3PLandscape").disabled = true;
	document.getElementById("paperA3PPortrait").disabled = true;
	document.getElementById("usLetterLandscape").disabled = true;
	document.getElementById("usLetterPortrait").disabled = true;
	document.getElementById("scale").disabled = true;
	document.getElementById("includeControlsC").disabled = true;
	if (document.getElementById("includeControlsC").checked)
	{
		document.getElementById("step3").style.display = 'block';
		layerStart.setVisibility(true);
		map.addControl(startClick);
		startClick.activate();
	}
	else
	{
		document.getElementById("step5").style.display = 'block';
	}
}

function showControlsAdd()
{
	alert("Warning: This application does not check for duplicate or missing control numbers!");
	clearStartClick();
	document.getElementById("startSetOK").disabled = true;
	document.getElementById("step4").style.display = 'block';
	layerControls.setVisibility(true);
	map.addControl(controlsClick);
	controlsClick.activate();
}

function showAdornmentBuilder()
{
	clearControlsClick();
	document.getElementById("controlSetOK").disabled = true;
	document.getElementById("controlClearLast").disabled = true;
	document.getElementById("step5").style.display = 'block';
}

function showReadyToPDF()
{
	redrawTitleFeature();
	document.getElementById("titleTextT").disabled = true;
	document.getElementById("adornmentsSetOK").disabled = true;
	document.getElementById("step6").style.display = 'block';	
}

function clearLastControl()
{
	layerControls.removeFeatures(layerControls.features[layerControls.features.length-1]);
	layerControls.removeFeatures(layerControls.features[layerControls.features.length-1]);
	controlsList.pop();
        document.getElementById("numControlsAdded").innerHTML = "No of controls: " + controlsList.length;		 
	if (controlsList.length < 1)
	{
		document.getElementById("controlSetOK").disabled = true;
		document.getElementById("controlClearLast").disabled = true;
	}
}

function setOrientation(paperName)
{
	paper = paperName;
	if (mapCentre != null)
	{
		showMapBorder(mapCentre);
	}
}

function setScale()
{
	if (mapCentre != null)
	{
		showMapBorder(mapCentre);
	}
}

function setStyle()
{
        style = document.getElementById("style").value;
}

function showMapBorder(cll)
{
	    layerMapBorder.destroyFeatures();
	    scale = document.getElementById("scale").value;
	    style = document.getElementById("style").value;

	    document.getElementById("centreSetOK").disabled = false;
	    var cllWGS84 = cll.clone().transform(EPSG900913, EPSG4326);
	    var fudgeFactor = Math.cos(cllWGS84.lat * Math.PI/180);
	    var trueScale = scale / fudgeFactor;

	    if (paper == "0.2970,0.2100")
	    {
		paper_dlon = 0.2970 * trueScale;
		paper_dlat = 0.2100 * trueScale;
	    }
	    else if (paper == "0.2100,0.2970")
            {
		paper_dlon = 0.2100 * trueScale;
		paper_dlat = 0.2970 * trueScale;
          }
	    else if (paper == "0.2970,0.4200")
	    {
		paper_dlon = 0.2970 * trueScale;
		paper_dlat = 0.4200 * trueScale;
	    }
	    else if (paper == "0.4200,0.2970")
	    {
		paper_dlon = 0.4200 * trueScale;
		paper_dlat = 0.2970 * trueScale;
	    }
	    else if (paper == "0.2794,0.2159")
	    {
		paper_dlon = 0.2794 * trueScale;
		paper_dlat = 0.2159 * trueScale;
	    }
	    else if (paper == "0.2159,0.2794")
	    {
		paper_dlon = 0.2159 * trueScale;
		paper_dlat = 0.2794 * trueScale;
            }
	    else if (paper == "0.4430,0.3140")
	    {
		paper_dlon = 0.4430 * trueScale;
		paper_dlat = 0.3140 * trueScale;
	    }
	    else if (paper == "0.3140,0.4430")
	    {
		paper_dlon = 0.3140 * trueScale;
		paper_dlat = 0.4430 * trueScale;
            }

	    map_nm_dlat = 0.017 * trueScale;
	    map_em_dlon = 0.005 * trueScale;
	    map_sm_dlat = 0.010 * trueScale;
	    map_wm_dlon = 0.005 * trueScale;

	    map_dlon = (paper_dlon - map_wm_dlon) - map_em_dlon
	    map_dlat = (paper_dlat - map_nm_dlat) - map_sm_dlat

	    mapBound = new OpenLayers.Bounds(cll.lon-map_dlon/2, cll.lat-map_dlat/2, cll.lon+map_dlon/2, cll.lat+map_dlat/2);
	    var paperBound = new OpenLayers.Bounds(
		(cll.lon - map_dlon/2) - map_wm_dlon, 			
		(cll.lat - map_dlat/2) - map_sm_dlat, 			
		(cll.lon + map_dlon/2) + map_em_dlon, 			
		(cll.lat + map_dlat/2) + map_nm_dlat);
	    var paperWMBound = new OpenLayers.Bounds(	paperBound.left,	mapBound.bottom, 	mapBound.left,		mapBound.top);
	    var paperEMBound = new OpenLayers.Bounds(	mapBound.right,		mapBound.bottom, 	paperBound.right,	mapBound.top);
	    var paperNMBound = new OpenLayers.Bounds(	paperBound.left, 	mapBound.top,		paperBound.right, 	paperBound.top);
	    var paperSMBound = new OpenLayers.Bounds(	paperBound.left, 	paperBound.bottom, 	paperBound.right, 	mapBound.bottom);

	    var marginStyle = OpenLayers.Util.applyDefaults({ fill: true, fillOpacity: 1, fillColor: '#ffffff', strokeColor: '#ffffff'}, OpenLayers.Feature.Vector.style["default"]);
	    var sheetStyle = OpenLayers.Util.applyDefaults({ fill: false, strokeWidth: 1, strokeColor: '#000000'}, OpenLayers.Feature.Vector.style["default"]);
	    var contentStyle = OpenLayers.Util.applyDefaults({ strokeColor: '#ffffff' }, OpenLayers.Feature.Vector.style["default"]);
	    var adornmentStyle = OpenLayers.Util.applyDefaults({ fill: false, stroke:false }, OpenLayers.Feature.Vector.style["default"]);

	    var sheet = new OpenLayers.Feature.Vector(paperBound.toGeometry(), {}, sheetStyle);
	    var content = new OpenLayers.Feature.Vector(mapBound.toGeometry(), contentStyle);
	    var westMargin = new OpenLayers.Feature.Vector(paperWMBound.toGeometry(), {}, marginStyle);
	    var eastMargin = new OpenLayers.Feature.Vector(paperEMBound.toGeometry(), {}, marginStyle);
	    var northMargin = new OpenLayers.Feature.Vector(paperNMBound.toGeometry(), {}, marginStyle);
	    var southMargin = new OpenLayers.Feature.Vector(paperSMBound.toGeometry(), {}, marginStyle);

	    titleFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(mapBound.left, mapBound.top + (0.003 * trueScale)), {}, adornmentStyle);
	    scaleFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(mapBound.right, mapBound.top + (0.003 * trueScale)), {}, adornmentStyle);

	    layerMapBorder.addFeatures([content, westMargin, eastMargin, northMargin, southMargin, sheet, titleFeature, scaleFeature]);
	    document.getElementById("centreCoords").innerHTML =  "Lat: " + cllWGS84.lat.toFixed(6) + "<br />Lon: " + cllWGS84.lon.toFixed(6);		 

	    drawScaleFeature();
}

function showStart(startLonLat)
{
	    if (!mapBound.containsLonLat(startLonLat))
	    {
		alert("This location is not in the map canvas.");
		return;
	    }
	    layerStart.destroyFeatures();
	    var style = OpenLayers.Util.applyDefaults({ pointRadius: 20, fill: false, strokeColor: "#ff00ff", strokeWidth: 2}, OpenLayers.Feature.Vector.style["default"]);
	    var innerStyle = OpenLayers.Util.applyDefaults({ pointRadius: 15}, style);
	    var startPoint = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(startLonLat.lon, startLonLat.lat), {}, style);
	    var innerStartPoint = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(startLonLat.lon, startLonLat.lat), {}, innerStyle);
	    layerStart.addFeatures([startPoint, innerStartPoint]);
	    var startLonLatWGS84 = startLonLat.clone().transform(EPSG900913, EPSG4326);
	    document.getElementById("startCoords").innerHTML =  "Lat: " + startLonLatWGS84.lat.toFixed(6) + "<br />Lon: " + startLonLatWGS84.lon.toFixed(6);		 
	    document.getElementById("startSetOK").disabled = false;
}

function isInteger(val)
{
	return (val == null || isNaN(val)) ? false : ((1.0 * val) == Math.floor(val) && (val + "").indexOf(".") == -1);
}

function showControl(controlLatLon)
{
	    if (!mapBound.containsLonLat(controlLatLon))
	    {
		alert("This location is not in the map canvas.");
		return;
	    }
		
	    var controlNum = 0;
	    controlNum = prompt("Enter a control number (integers only, e.g. 50)", currControlNum+1);

	    currControlNum = parseInt(controlNum);
	    labelAngleP = prompt("Enter label angle (e.g. 45 - N.B. rotated on final PDF only)", 45); // This can be altered on the URL (see base of the PDF) if desired. Angle is in degrees, clockwise from the top.
	    labelAngle = parseInt(labelAngleP);
	    controlsList.push(new Array([currControlNum, labelAngle, controlLatLon.lat.toFixed(0), controlLatLon.lon.toFixed(0)]));
	    var style = OpenLayers.Util.applyDefaults(
		{ 
			pointRadius: 15, 
			fill: false, 
			strokeColor: "#ff00ff", 
			strokeWidth: 2, 
			label: "" + currControlNum,
			labelAlign: "lb",
			labelXOffset: 15,
			labelYOffset: 15,
			fontColor: "#ff00ff",
			fontFamily: "arial, verdana, sans-serif",
			fontSize: "24px",
			fontWeight: "bold"
		}, OpenLayers.Feature.Vector.style["default"]);
	    var dotStyle = OpenLayers.Util.applyDefaults(
		{ 
			pointRadius: 2, 
			fill: true, 
			stroke: false, 
			fillColor: "#ff00ff", 
			fillOpacity: 1 
		}, OpenLayers.Feature.Vector.style["default"]);
	    var controlPoint = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(controlLatLon.lon, controlLatLon.lat), {}, style);
	    var controlDot = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(controlLatLon.lon, controlLatLon.lat), {}, dotStyle);
	    
	    layerControls.addFeatures([controlPoint, controlDot]);
	    document.getElementById("numControlsAdded").innerHTML = "No of controls: " + controlsList.length;		 
	    document.getElementById("controlClearLast").disabled = false;
	    document.getElementById("controlSetOK").disabled = false;
}

function redrawTitleFeature()
{
	titleText = document.getElementById("titleTextT").value;
	if (titleText == null)
	{
		titleText = "";
	}
	if (titleFeature != null)
	{
		var titleSizeArr = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 6, 10, 20, 40, 80, 160, 320];
		var fontSizeFromArr = (titleSizeArr[map.getZoom()]*(scale/10000)).toFixed(0);
	    	var titleStyle = OpenLayers.Util.applyDefaults(
			{ 
				fill: false,
				stroke: false,
				label: titleText,
				labelAlign: "lb",
				fontColor: "#000000",
				fontFamily: "arial, verdana, sans-serif",
				fontSize: fontSizeFromArr,
				fontWeight: "bold"
			}, OpenLayers.Feature.Vector.style["default"]);
		layerMapBorder.eraseFeatures([titleFeature]);
		titleFeature.style = titleStyle;
		layerMapBorder.addFeatures([titleFeature]);
	}
}

function drawScaleFeature()
{	
	if (scaleFeature != null)
	{
		var scaleSizeArr = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 5, 9, 18, 36, 72, 144, 288]
		var fontSizeFromArr = (scaleSizeArr[map.getZoom()]*(scale/10000)).toFixed(0);
	    	var scaleStyle = OpenLayers.Util.applyDefaults(
			{ 
				fill: false,
				stroke: false,
				label: "Scale 1:" . scale,
				labelAlign: "rb",
				fontColor: "#000000",
				fontFamily: "arial, verdana, sans-serif",
				fontSize: fontSizeFromArr
			}, OpenLayers.Feature.Vector.style["default"]);
		layerMapBorder.eraseFeatures([scaleFeature]);
		scaleFeature.style = scaleStyle;
		layerMapBorder.addFeatures([scaleFeature]);
	}
}

function generateMap()
{
	//Construct the URL to the PDF.
	//Not sure if we will need to use a specialised stylesheet or the regular one will do.
	//Also need to append the controls/start/adornments to the style, in the code - so may need to convert the stylesheet to code.
	//Or may be able to do it directly in cairo.
	//NB. URL safety-checking and cleaning goes in the python script.

	var escapeTitleText = escape(titleText);

	var startText = ""
	if (startCentre != null)
	{
		startText = startCentre.lat.toFixed(0) + "," + startCentre.lon.toFixed(0);
	}
	
	var prefix = "http://casa.oobrien.com/maptiler/";

	url = prefix + "pdf"
		+ "/?style=" + style 
		+ "|paper=" + paper 
		+ "|scale=" + scale 
		+ "|centre=" + mapCentre.lat.toFixed(0) + "," + mapCentre.lon.toFixed(0)
		+ "|title=" + escapeTitleText
		+ "|start=" + startText
		+ "|controls=";
		
	if (controlsList.length > 0)
	{
		for (var i = 0; i < controlsList.length; i++)
		{
			url += (controlsList[i])[0] + ",";
		}
		url  = url.substring(0, url.length - 1);
	}
	if (debug)
	{
		alert(url);
	}
	self.location=url;
	
}

function hideSplash()
{
	document.getElementById('splash').style.display = "None";
}

function getAjaxFunction()
{
  	request = false;
  	if (window.XMLHttpRequest) //IE7 & proper browsers
  	{
	    	request = new XMLHttpRequest();
	    	if (request.overrideMimeType) //Proper browsers
		{
			//This is needed when calling php page that echos back XML, but should not be set if returning XML file directly 
			//- as if the file doesn't exist, HTML 404 response will cause Firefox error if set. //(N.B. Not necessarily a problem.)
			request.overrideMimeType("text/plain");
		}
  	}
  	else if (window.ActiveXObject) //IE6-
  	{
		try { request = new ActiveXObject("Msxml2.XMLHTTP"); } 
		catch (e) 
		{ 
			try { request = new ActiveXObject("Microsoft.XMLHTTP"); } 
			catch (e) { }
		}   
  	}
	if (!request) 
	{
		alert("This web application requires an AJAX-compatable browser to operate.");
	}
	return request;
}
         


