		var map;
		var sqlLayer;
		var lon = "";
		var lat = "";
		var zoom = "";
		var xapi_url = "/xapi/json/"; //"http://xapi.openstreet.nl:8000/json/";
		var proxy_url = "http://devnext.openstreetmap.nl/xapi/"; //"http://devnext.openstreetmap.nl/xapi/json/";
		
		OpenLayers.Util.onImageLoadErrorColor = "transparent";
		Proj4js.defs["EPSG:28992"] = "+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.999908 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.2369,50.0087,465.658,-0.406857330322398,0.350732676542563,-1.8703473836068,4.0812 +units=m +no_defs";
		Proj4js.defs["EPSG:900913"] = "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs";

		function myFormat(lonLat) {
			var digits = parseInt(this.numdigits);
			var newHtml = "Lon: " + lonLat.lon.toFixed(digits) + " Lat: " +	lonLat.lat.toFixed(digits) + " Zoom: " + this.map.getZoom();
			return newHtml;
		};
			   
		OpenLayers.Format.DBSlayerJSON = OpenLayers.Class(OpenLayers.Format.JSON, {
			            initialize: function(options) {
			                OpenLayers.Format.JSON.prototype.initialize.apply(this, [options]);
		            },

		            read: function(json, filter) {
		                	var results = [];
					var g =  new OpenLayers.Format.JSON();
					var obj = g.read(json);
		                //obj = OpenLayers.Format.JSON.prototype.read.apply(this,  [json, filter]);
		           		var rows = obj[0]["RESULT"]["ROWS"];
		                for (var i=0, len=rows.length; i<len; ++i) {
							 var point = new OpenLayers.Geometry.Point(rows[i][0], rows[i][1]);
							 var wgs84 = new OpenLayers.Projection("EPSG:4326");
							 var sm = new OpenLayers.Projection("EPSG:900913");
							 point.transform(wgs84, sm);
		                     results.push(new OpenLayers.Feature.Vector(point));
		                }
		                return results;
		            },

		            CLASS_NAME: "OpenLayers.Format.DBSlayerJSON"
		            });


			    var styleRedCircle = new OpenLayers.StyleMap({
			    	"default": new OpenLayers.Style(null, {
						rules: [
							new OpenLayers.Rule({
							   symbolizer: {
										"Point": {
												pointRadius: 4,
												graphic: 'circle',
												fillColor: "red",
												strokeColor: "black",
												fillOpacity: 0.5
										}
								}
							})
						]
					})
				});
			    


		function init(){

			map = new OpenLayers.Map('map',	{
				maxExtent: new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508),
				numZoomLevels: 19,
				maxResolution: 156543,
				units: 'm',
				controls: [new OpenLayers.Control.MouseDefaults(),
				new OpenLayers.Control.LayerSwitcher(),
				new OpenLayers.Control.MousePosition({formatOutput: myFormat, numdigits:5, displayClass: "olMousePosition"}),
				new OpenLayers.Control.MousePosition ({prefix: "RD (", separator: ",", suffix: ")", displayProjection: new OpenLayers.Projection("EPSG:28992"), numdigits:0, displayClass: "olTilePosition" }),
				new OpenLayers.Control.Permalink(),
				new OpenLayers.Control.PanZoomBar({displayClass: "olPanZoomBar"})
				],
				displayProjection: new OpenLayers.Projection("EPSG:4326"),
				projection: new OpenLayers.Projection("EPSG:900913"),
			});
			
			var layerFastNL = new OpenLayers.Layer.TMS (
				"SpeedLayer",
				"http://nieuw.openstreet.nl/tiles/",
				{type:'png', getURL: get_osm_url, border:1, transitionEffect: 'resize'}
			);

	/*
			var layerATM = new OpenLayers.Layer.Vector("ATM", {
				strategies: [new OpenLayers.Strategy.Fixed()],
				protocol: new OpenLayers.Protocol.HTTP({
					url: xapi_url + "SELECT long, lat FROM nodes_legacy, node_tags WHERE id = node AND ((k = 'amenity' AND v = 'atm') OR (k = 'atm')) LIMIT 100000;",
					format: new OpenLayers.Format.DBSlayerJSON()
				}),
				styleMap: styleRedCircle
			});
*/
			//map.addLayers([layerFastNL, layerATM]);
			map.addLayers([layerFastNL]);

			// center that map
			var zoom;
			if(!map.getCenter()) {
				if (getCookie('lon') == "") {
					pos = new OpenLayers.LonLat(5,52.25);
					zoom = 10;
				} else {
					var cookie_longitude = getCookie('lon');
					var cookie_latitude = getCookie('lat');
					pos = new OpenLayers.LonLat(cookie_longitude, cookie_latitude);
					zoom = getCookie('zoom');
				}
				map.setCenter(pos.transform(map.displayProjection,map.projection), zoom);
			}							
		}


function get_osm_url (bounds) {
	var res = this.map.getResolution();
	var x = Math.round ((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
	var y = Math.round ((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
	var z = this.map.getZoom();
	var path = z + "/" + x + "/" + y + "." + this.type;
	var url = this.url;
	if (url instanceof Array) {
		url = this.selectUrl(path, url);
	}
	return url + path;
}

function getMapCenter(center, zoom) {
   return map.getCenter().clone().transform(map.getProjectionObject(), epsg4326);
}


function NewXapiLayer (title, sql) {
	
	$('#loading').show();
	$.jGrowl('Communicating', 'Fetching data...'); 
	 
	// remove any previous layer
	if (sqlLayer != null) {
		sqlLayer.destroy();
		sqlLayer = null;
	}
	
	sqlLayer = new OpenLayers.Layer.Vector(title, {
				strategies: [
					new OpenLayers.Strategy.Fixed(),
					new OpenLayers.Strategy.Cluster({distance:5})
				],
				protocol: new OpenLayers.Protocol.HTTP({
					url: xapi_url + sql,
					format: new OpenLayers.Format.DBSlayerJSON()
				}),
				styleMap: styleRedCircle
			});
	map.addLayer(sqlLayer);
	
	$('#loading').hide();
}
