
var loaded = new Object();
var bars = new Object();

function loadMap(element, point, zoom) {
	if (GBrowserIsCompatible()) {
		var map = new GMap2(element);
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(point, zoom);
		return map;
	}
	return null;
}

    // Creates a marker at the given point with the given number label
function createMarker(point, name, text) {
	var marker = new GMarker(point, {title:name});
	GEvent.addListener(marker, "click", function () {
		marker.openInfoWindowHtml(text);
	});
	return marker;
}
function toggleVisibility(id) {
	var map = document.getElementById(id);
	if (map.style.visibility == "visible") {
		map.style.visibility = "hidden";
	} else {
		map.style.visibility = "visible";
	}
}
function toggleDisplay(id) {
	var map = document.getElementById(id);
	if (map.style.display == "none") {
		map.style.display = "block";
	} else {
		map.style.display = "none";
	}
}
function toggleMap(id) {
	var mapId = "map" + id;
	var e = document.getElementById(mapId);
	toggleDisplay(mapId);
	if (loaded[id] == null) {
		var bar = bars[id];
		var point = bar.point;
		var map = loadMap(e, point, 17);
	   // Add all bars to map
		var marker = addBarsMarkerManager(map, id, false);
	   //	calcSetZoom(map, 1);
	   // Start with current marker open
		marker.openInfoWindowHtml(bar.description);
		loaded[id] = map;
	}
	toggleVisibility(mapId);
}


function addBarsMap(map, findId) {
	var marker = null;
	for (id in bars) {
		var bar = bars[id];
		newmarker = createMarker(bar.point, bar.name, bar.description);
		if (id == findId) {
			marker = newmarker;
		}
		map.addOverlay(newmarker);
	}
	return marker;
}

function addBarsMarkerManager(map, findId, external) {
	var mgr = new GMarkerManager(map);
	var marker = null;
	var batch = [];
	for (id in bars) {
		var bar = bars[id];
		var link = bar.description;
		if (external != false)
			link = bar.externalLink;
											
		var newmarker = createMarker(bar.point, bar.name, link);
		batch.push(newmarker);
		if (id == findId) {
			marker = newmarker;
		}
	}
	mgr.addMarkers(batch, 0);
	mgr.refresh();
	return marker;
}

function loadRegionMap(mapId) {
	loadMapWithMarkers(mapId, 0, true);
}

function toggleRegionMap(mapId) {
	toggleDisplay(mapId);
	loadRegionMap(mapId);
	toggleVisibility(mapId);
}

function loadSubRegionMapDelayed(mapId, zoomCorrection) {
	this.setTimeout(function() {
		loadMapWithMarkers(mapId, zoomCorrection, false)
	}, 0)
}

function loadSubRegionMap(mapId, zoomCorrection) {
	loadMapWithMarkers(mapId, zoomCorrection, false);
}

function loadMapWithMarkers(mapId, zoomCorrection, external) {
	var e = document.getElementById(mapId);
	if (loaded[mapId] != true) {
		var point = calcCenter();
		var map = loadMap(e, point, 13);
		calcSetZoom(map, zoomCorrection)
		addBarsMarkerManager(map, null, external);
		loaded[id] = true;
	}
}
function toggleSubRegionMap(mapId) {
	var e = document.getElementById(mapId);
	toggleDisplay(mapId);
	loadSubRegionMap(mapId);
	toggleVisibility(mapId);
}
function toggleVisKort(id) {
	var e = document.getElementById(id);
	var text = e.innerHTML;
	if (text == "Vis") {
		e.innerHTML = "Skjul";
	} else {
		e.innerHTML = "Vis";
	}
}
function min(value1, value2) {
	if (value1 == null) {
		return value2;
	}
	if (value1 < value2) {
		return value1;
	}
	return value2;
}
function max(value1, value2) {
	if (value1 == null) {
		return value2;
	}
	if (value1 > value2) {
		return value1;
	}
	return value2;
}
var minLatitude = null;
var maxLatitude = null;
var minLongitude = null;
var maxLongitude = null;

function findMinMax(latitude, longitude) {
	minLatitude = min(minLatitude, latitude);
	maxLatitude = max(maxLatitude, latitude);
	minLongitude = min(minLongitude, longitude);
	maxLongitude = max(maxLongitude, longitude);
}
function calcCenter() {
	var deltaLat = (maxLatitude - minLatitude) / 2;
	var deltaLong = (maxLongitude - minLongitude) / 2;
	return new GLatLng(minLatitude + deltaLat, minLongitude + deltaLong);
}
function calcSetZoom(map, adjustBy) {
	var sw = new GLatLng(minLatitude, minLongitude);
	var ne = new GLatLng(maxLatitude, maxLongitude);
	var bounds = new GLatLngBounds(sw, ne);
	map.setZoom(map.getBoundsZoomLevel(bounds) + adjustBy);
}
function addBar(id, latitude, longitude, name, adress, id_name, external_link) {
	var bar = new Object();

	// find min/max for calculating center
	findMinMax(latitude, longitude);
	bar.id_name = id_name;
	bar.name = name;
	bar.point = new GLatLng(latitude, longitude);
	bar.description  = "<a href=\"#" + id_name + "\">" + name + "</a><br>" + adress;
	bar.externalLink = "<a target=_top href=\"" + external_link + "\">" + name + "</a><br>" + adress;  
	bars[id] = bar;
}

