var map;

function createMap(divName, centre, zoom, layer, force_dirty) {
	map = new OpenLayers.Map(
		divName,
		{
			controls: [
				new OpenLayers.Control.LayerSwitcher(),
				new OpenLayers.Control.Navigation(),
				new OpenLayers.Control.PanZoomBar()
			]
		}
	);

	if (force_dirty) args = "?dirty";
	else args = "";

	map.addLayer(new OpenLayers.Layer.OSM.opm("OpenPisteMap", null, args));
	map.addLayer(new OpenLayers.Layer.OSM.opm_nocontours("OPM (No Contours)", null, args));
	map.addLayer(new OpenLayers.Layer.OSM.Mapnik("Mapnik"));
	map.addLayer(new OpenLayers.Layer.OSM.Osmarender("Osmarender"));
	//map.addLayer(new OpenLayers.Layer.OSM.opm_debug_contours("OPM (Debug Contours)", null, args));

	map.setCenter(centre, zoom);
	setMapLayers(layer);

	map.events.register("moveend", map, updateLocation);
	map.events.register("changelayer", map, updateLocation);
	updateLocation();
	return map;
}

function mercatorToLonLat(merc) {
	var lon = (merc.lon / 20037508.34) * 180;
	var lat = (merc.lat / 20037508.34) * 180;

	lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);

	return new OpenLayers.LonLat(lon, lat);
}

function lonLatToMercator(ll) {
	var lon = ll.lon * 20037508.34 / 180;
	var lat = Math.log(Math.tan((90 + ll.lat) * Math.PI / 360)) / (Math.PI / 180);

	lat = lat * 20037508.34 / 180;

	return new OpenLayers.LonLat(lon, lat);
}

function updateLocation() {
	var lonlat = mercatorToLonLat(map.getCenter());
	var zoom = map.getZoom();
	var decimals = Math.pow(10, Math.floor(zoom/3));
	var layers = getMapLayers();
	var node;

	lat = Math.round(lonlat.lat * decimals) / decimals;
	lon = Math.round(lonlat.lon * decimals) / decimals;

	node = document.getElementById("permalinkanchor");
	if (node) {
		var args = getArgs(node.href);
		args["lat"] = lat;
		args["lon"] = lon;
		args["zoom"] = zoom;
		if (layers) {
			args["layers"] = layers;
		}
		node.href = setArgs(node.href, args);
	}

	var now = new Date();
	var expirydate = new Date(now.getTime() + 63072000000);	// 2 years
	document.cookie = "location=" + lonlat.lon + "," + lonlat.lat + "," + zoom + "," + layers + ";expires=" + expirydate.toGMTString();
}

function getArgs(url) {
	var args = new Object();
	var querystart = url.indexOf("?");

	if (querystart >= 0) {
		var querystring = url.substring(querystart + 1);
		var queryitems = querystring.split("&");

		for (var i = 0; i < queryitems.length; i++) {
			if (match = queryitems[i].match(/^(.*)=(.*)$/)) {
				args[unescape(match[1])] = unescape(match[2]);
			} else {
				args[unescape(queryitems[i])] = null
			}
		}
	}

	return args;
}

function setArgs(url, args) {
	var queryitems = new Array();

	for (arg in args) {
		if (args[arg] == null) {
			queryitems.push(escape(arg));
		} else {
			queryitems.push(escape(arg) + "=" + escape(args[arg]));
		}
	}

	return url.replace(/\?.*$/, "") + "?" + queryitems.join("&");
}

function getMapLayers() {
	var layers = "";

	for (var i=0; i< this.map.layers.length; i++) {
		var layer = this.map.layers[i];

		if (layer.isBaseLayer) {
			layers += (layer == this.map.baseLayer) ? "B" : "0";
		} else {
			layers += (layer.getVisibility()) ? "T" : "F";
		}
	}

	return layers;
}

function setMapLayers(layers) {
	for (var i=0; i < layers.length; i++) {
		var layer = map.layers[i];
		var c = layers.charAt(i);

		if (c == "B") {
			map.setBaseLayer(layer);
		} else if ( (c == "T") || (c == "F") ) {
			layer.setVisibility(c == "T");
		}
	}
}


